Merge tag 'v1.5.6' into sc

Change-Id: I4c39b35ff50c57cc9894b709a91691fa745cb0a6

Conflicts:
	dependencies.gradle
	matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt
	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt
	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/RoomSummaryMapper.kt
	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt
	matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt
	vector-app/src/debug/java/im/vector/app/flipper/VectorFlipperProxy.kt
	vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt
	vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt
This commit is contained in:
SpiritCroc 2022-11-03 09:24:24 +01:00
commit eab87760fe
188 changed files with 6595 additions and 1574 deletions

View File

@ -11,7 +11,7 @@ jobs:
- run: |
npm install --save-dev @babel/plugin-transform-flow-strip-types
- name: Danger
uses: danger/danger-js@11.1.3
uses: danger/danger-js@11.1.4
with:
args: "--dangerfile tools/danger/dangerfile.js"
env:

View File

@ -52,7 +52,7 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Start synapse server
uses: michaelkaye/setup-matrix-synapse@v1.0.3
uses: michaelkaye/setup-matrix-synapse@v1.0.4
with:
uploadLogs: true
httpPort: 8080

View File

@ -66,7 +66,7 @@ jobs:
yarn add danger-plugin-lint-report --dev
- name: Danger lint
if: always()
uses: danger/danger-js@11.1.3
uses: danger/danger-js@11.1.4
with:
args: "--dangerfile tools/danger/dangerfile-lint.js"
env:

View File

@ -50,7 +50,7 @@ jobs:
- uses: actions/setup-python@v4
with:
python-version: 3.8
- uses: michaelkaye/setup-matrix-synapse@v1.0.3
- uses: michaelkaye/setup-matrix-synapse@v1.0.4
with:
uploadLogs: true
httpPort: 8080

View File

@ -10,7 +10,7 @@ jobs:
# Skip in forks
if: github.repository == 'vector-im/element-android'
steps:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
- uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d
with:
project: Issue triage
column: Incoming

View File

@ -29,6 +29,23 @@ jobs:
labels: ['Z-Labs']
})
apply_Help-Wanted_label:
name: Add "Help Wanted" label to all "good first issue" and Hacktoberfest
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'good first issue') ||
contains(github.event.issue.labels.*.name, 'Hacktoberfest')
steps:
- uses: actions/github-script@v5
with:
script: |
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['Help Wanted']
})
move_needs_info_issues:
name: X-Needs-Info issues to Need info column on triage board
runs-on: ubuntu-latest
@ -48,7 +65,13 @@ jobs:
# Skip in forks
if: >
github.repository == 'vector-im/element-android' &&
contains(github.event.issue.labels.*.name, 'X-Needs-Design')
contains(github.event.issue.labels.*.name, 'X-Needs-Design') &&
(contains(github.event.issue.labels.*.name, 'S-Critical') &&
(contains(github.event.issue.labels.*.name, 'O-Frequent') ||
contains(github.event.issue.labels.*.name, 'O-Occasional')) ||
(contains(github.event.issue.labels.*.name, 'S-Major') &&
contains(github.event.issue.labels.*.name, 'O-Frequent')) ||
contains(github.event.issue.labels.*.name, 'A11y'))
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
@ -246,3 +269,105 @@ jobs:
env:
PROJECT_ID: "PN_kwDOAM0swc4ABTXY"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
ps_features1:
name: Add labelled issues to PS features team 1
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'A-Polls') ||
contains(github.event.issue.labels.*.name, 'A-Location-Sharing') ||
(contains(github.event.issue.labels.*.name, 'A-Voice-Messages') &&
!contains(github.event.issue.labels.*.name, 'A-Broadcast')) ||
(contains(github.event.issue.labels.*.name, 'A-Session-Mgmt') &&
contains(github.event.issue.labels.*.name, 'A-User-Settings'))
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4AHJKF"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
ps_features2:
name: Add labelled issues to PS features team 2
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'A-DM-Start') ||
contains(github.event.issue.labels.*.name, 'A-Broadcast')
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4AHJKd"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
ps_features3:
name: Add labelled issues to PS features team 3
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor')
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4AHJKW"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
voip:
name: Add labelled issues to VoIP project board
runs-on: ubuntu-latest
if: >
contains(github.event.issue.labels.*.name, 'Team: VoIP')
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
with:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
item {
id
}
}
}
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
PROJECT_ID: "PVT_kwDOAM0swc4ABMIk"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}

View File

@ -24,7 +24,7 @@ jobs:
contains(github.event.issue.labels.*.name, 'A11y') &&
contains(github.event.issue.labels.*.name, 'O-Frequent'))
steps:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
- uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d
with:
project: Android App Team
column: Important Issues & Topics (P1)
@ -50,7 +50,7 @@ jobs:
contains(github.event.issue.labels.*.name, 'A11y') &&
contains(github.event.issue.labels.*.name, 'O-Frequent')))
steps:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
- uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d
with:
project: Crypto Team
column: Ready

View File

@ -28,7 +28,7 @@ jobs:
echo "ALREADY_IN_BOARD=false" >> $GITHUB_ENV
fi
- name: Move issue
uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
uses: alex-page/github-project-automation-plus@1f8873e97e3c8f58161a323b7c568c1f623a1c4d
if: ${{ env.ALREADY_IN_BOARD == 'true' }}
with:
project: Issue triage

View File

@ -1,3 +1,34 @@
Changes in Element v1.5.6 (2022-11-02)
======================================
Features ✨
----------
- Add new UI for selecting an attachment ([#7429](https://github.com/vector-im/element-android/issues/7429))
- Multi selection in sessions list ([#7396](https://github.com/vector-im/element-android/issues/7396))
Bugfixes 🐛
----------
- New line and Enter hardware key presses deleting existing text in some keyboards. ([#7357](https://github.com/vector-im/element-android/issues/7357))
- Fix share actions using share dialog. ([#7400](https://github.com/vector-im/element-android/issues/7400))
- Fix crash by disabling Flipper on Android API 22 and below - only affects debug version of the application. ([#7428](https://github.com/vector-im/element-android/issues/7428))
In development 🚧
----------------
- [Voice Broadcast] Live listening support ([#7419](https://github.com/vector-im/element-android/issues/7419))
- [Voice Broadcast] Improve rendering in the timeline ([#7421](https://github.com/vector-im/element-android/issues/7421))
- Add logic for sign in with QR code ([#7369](https://github.com/vector-im/element-android/issues/7369))
SDK API changes ⚠️
------------------
- Add MetricPlugin interface to implement metrics in SDK clients. ([#7438](https://github.com/vector-im/element-android/issues/7438))
Other changes
-------------
- Upgrade Jitsi SDK to 6.2.2 and WebRtc to 1.106.1-jitsi-12039821. ([#6195](https://github.com/vector-im/element-android/issues/6195))
- Gets thread notifications from sync response ([#7424](https://github.com/vector-im/element-android/issues/7424))
- Replace org.apache.sanselan:sanselan by org.apache.commons:commons-imaging ([#7454](https://github.com/vector-im/element-android/issues/7454))
Changes in Element v1.5.4 (2022-10-19)
======================================

View File

@ -29,11 +29,11 @@ buildscript {
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
classpath "com.likethesalad.android:stem-plugin:2.2.3"
classpath 'org.owasp:dependency-check-gradle:7.2.1'
classpath 'org.owasp:dependency-check-gradle:7.3.0'
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.20"
classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0"
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
classpath 'app.cash.paparazzi:paparazzi-gradle-plugin:1.1.0'
classpath libs.squareup.paparazziPlugin
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
@ -45,7 +45,7 @@ plugins {
// Detekt
id "io.gitlab.arturbosch.detekt" version "1.21.0"
// Ksp
id "com.google.devtools.ksp" version "1.7.20-1.0.6"
id "com.google.devtools.ksp" version "1.7.20-1.0.7"
// Dependency Analysis
id 'com.autonomousapps.dependency-analysis' version "1.13.1"
@ -96,9 +96,9 @@ allprojects {
}
// Jitsi repo
maven {
url "https://github.com/vector-im/jitsi_libre_maven/raw/main/android-sdk-5.0.2"
url "https://github.com/vector-im/jitsi_libre_maven/raw/main/android-sdk-6.2.2"
// Note: to test Jitsi release you can use a local file like this:
// url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-3.10.0"
// url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-6.2.2"
content {
groups.jitsi.regex.each { includeGroupByRegex it }
groups.jitsi.group.each { includeGroup it }
@ -322,7 +322,7 @@ ext.initScreenshotTests = { project ->
if (hasScreenshots) {
project.apply plugin: 'app.cash.paparazzi'
}
project.dependencies { testCompileOnly "app.cash.paparazzi:paparazzi:1.0.0" }
project.dependencies { testCompileOnly libs.squareup.paparazzi }
project.android.testOptions.unitTests.all {
def screenshotTestCapture = "**/*ScreenshotTest*"
if (hasScreenshots) {

View File

@ -1,5 +1,4 @@
ext.versions = [
'minSdk' : 21,
'compileSdk' : 33,
'targetSdk' : 33,
@ -12,7 +11,7 @@ def gradle = "7.3.1"
def kotlin = "1.7.20"
def kotlinCoroutines = "1.6.4"
def dagger = "2.44"
def appDistribution = "16.0.0-beta04"
def appDistribution = "16.0.0-beta05"
def retrofit = "2.9.0"
def markwon = "4.6.2"
def moshi = "1.14.0"
@ -27,22 +26,20 @@ def jjwt = "0.11.5"
// Temporary version to unblock #6929. Once 0.16.0 is released we should use it, and revert
// the whole commit which set version 0.16.0-SNAPSHOT
def vanniktechEmoji = "0.16.0-SNAPSHOT"
def sentry = "6.4.3"
def fragment = "1.5.3"
def sentry = "6.6.0"
def fragment = "1.5.4"
// Testing
def mockk = "1.12.3" // We need to use 1.12.3 to have mocking in androidTest until a new version is released: https://github.com/mockk/mockk/issues/819
def espresso = "3.4.0"
def androidxTest = "1.4.0"
def androidxOrchestrator = "1.4.1"
def paparazzi = "1.1.0"
ext.libs = [
gradle : [
'gradlePlugin' : "com.android.tools.build:gradle:$gradle",
'kotlinPlugin' : "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin",
'hiltPlugin' : "com.google.dagger:hilt-android-gradle-plugin:$dagger"
],
jetbrains : [
'kotlinReflect' : "org.jetbrains.kotlin:kotlin-reflect:$kotlin",
@ -51,12 +48,12 @@ ext.libs = [
'coroutinesTest' : "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinCoroutines"
],
androidx : [
'activity' : "androidx.activity:activity-ktx:1.6.0",
'activity' : "androidx.activity:activity-ktx:1.6.1",
'appCompat' : "androidx.appcompat:appcompat:1.5.1",
'biometric' : "androidx.biometric:biometric:1.1.0",
'core' : "androidx.core:core-ktx:1.9.0",
'recyclerview' : "androidx.recyclerview:recyclerview:1.2.1",
'exifinterface' : "androidx.exifinterface:exifinterface:1.3.4",
'exifinterface' : "androidx.exifinterface:exifinterface:1.3.5",
'fragmentKtx' : "androidx.fragment:fragment-ktx:$fragment",
'fragmentTesting' : "androidx.fragment:fragment-testing:$fragment",
'constraintLayout' : "androidx.constraintlayout:constraintlayout:2.1.4",
@ -83,7 +80,7 @@ ext.libs = [
'transition' : "androidx.transition:transition:1.2.0",
],
google : [
'material' : "com.google.android.material:material:1.6.1",
'material' : "com.google.android.material:material:1.7.0",
//'appdistributionApi' : "com.google.firebase:firebase-appdistribution-api-ktx:$appDistribution",
//'appdistribution' : "com.google.firebase:firebase-appdistribution:$appDistribution",
// Phone number https://github.com/google/libphonenumber
@ -109,6 +106,8 @@ ext.libs = [
'moshiKt' : "com.squareup.moshi:moshi-kotlin:$moshi",
'moshiKotlin' : "com.squareup.moshi:moshi-kotlin-codegen:$moshi",
'moshiAdapters' : "com.squareup.moshi:moshi-adapters:$moshi",
'paparazzi' : "app.cash.paparazzi:paparazzi:$paparazzi",
'paparazziPlugin' : "app.cash.paparazzi:paparazzi-gradle-plugin:$paparazzi",
'retrofit' : "com.squareup.retrofit2:retrofit:$retrofit",
'retrofitMoshi' : "com.squareup.retrofit2:converter-moshi:$retrofit"
],
@ -162,13 +161,13 @@ ext.libs = [
'emojiGoogle' : "com.vanniktech:emoji-google:$vanniktechEmoji"
],
apache : [
'commonsImaging' : "org.apache.sanselan:sanselan:0.97-incubator"
'commonsImaging' : "org.apache.commons:commons-imaging:1.0-alpha3"
],
sentry: [
'sentryAndroid' : "io.sentry:sentry-android:$sentry"
],
tests : [
'kluent' : "org.amshove.kluent:kluent-android:1.68",
'kluent' : "org.amshove.kluent:kluent-android:1.72",
'timberJunitRule' : "net.lachlanmckee:timber-junit-rule:1.0.1",
'junit' : "junit:junit:4.13.2",
]

View File

@ -177,7 +177,6 @@ ext.groups = [
'org.apache.ant',
'org.apache.commons',
'org.apache.httpcomponents',
'org.apache.sanselan',
'org.bouncycastle',
'org.ccil.cowan.tagsoup',
'org.checkerframework',

View File

@ -93,4 +93,4 @@ url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.10.
- Build the project and perform the sanity tests again.
- Update the file `/CHANGES.md` to notify about the library upgrade, and create a regular PR for project Element Android.
- Create a PR for project Element Android and add a changelog file `<PR_NUMBER>.misc` to notify about the library upgrade.

View File

@ -0,0 +1,2 @@
Hlavní změny v této verzi: Nové funkce v Experimentálních funkcích: Rozšířený editor zpráv, nová správa zařízení, hlasové vysílání. Stále v aktivním vývoji!
Úplný seznam změn: https://github.com/vector-im/element-android/releases

View File

@ -1,2 +1,2 @@
Die wichtigste Änderung in dieser Version: Verzögerte Direktnachrichten standardmäßig aktiviert!
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.2.0
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases

View File

@ -1,2 +1,2 @@
Die wichtigste Änderung in dieser Version: Neues App-Layout standardmäßig aktiviert!
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.2.0
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Die wichtigste Änderung in dieser Version: Neue Funktionen in den Labor-Einstellungen: Textverarbeitungs-Editor, neue Geräteverwaltung, Sprachübertragung. Noch in aktiver Entwicklung!
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Main changes in this version: new UI for selecting an attachment.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Põhilised muutused selles versioonis: Uued võimalused katsete all: vormindatud teksti põhine toimeti, uus seadmehaldus, ringhäälingukõned (kõik on hetkel aktiivsel arendamisel).
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
تغییرات اصلی در این نگارش: قابلیت‌های جدید در تنظیمات آزمایشگاه‌ها: نگارندهٔ متن غنی، مدیریت افزارهٔ جدید، پخش صدا. هنوز زیر توسعهٔ فعّال!
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principaux changements pour cette version : Nouvelles fonctionnalités expérimentales : éditeur de texte formaté, nouveau gestionnaire dappareils, diffusion audio. Cest toujours en cours de développement !
Intégralité des changements : https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Fitur baru di belakang pengaturan uji coba: Komposer teks kaya, pengelolaan perangkat baru, siaran suara. Masih dalam pengembangan aktif!
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Modifiche principali in questa versione: nuove funzioni nelle impostazioni Laboratori: compositore in rich text, nuova gestione dispositivi, trasmissione voce. Ancora in sviluppo attivo!
Cronologia completa: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Novas funcionalidades sob as configurações de labs: Compositor de texto rico, novo gerenciador de dispositivo, broadcast de voz. Ainda sob desenvolvimento ativo!
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: различные исправления ошибок и улучшения стабильности.
Полный список изменений: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,3 @@
Новый вид приложения можно включить в настройках лаборатории. Пожалуйста, попробуйте!
Исправлены проблемы, связанные с отсутствием уведомлений и длительной инкрементной синхронизацией.
Полный список изменений: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: новый вид приложения включён по умолчанию!
Весь список изменений: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии — новые возможности в настройках лаборатории: наглядный текстовый редактор, новое управление устройствами, голосовая трансляция. Всё это ещё находится в активной разработке!
Весь список изменений: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Hlavné zmeny v tejto verzii: Nové funkcie v rámci laboratórnych nastavení: Rozšírený textový editor, nová správa zariadení, hlasové vysielanie. Stále prebieha aktívny vývoj!
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Huvudsakliga ändringar i den här versionen: Nya funktioner under experimentinställningarna: Rik-text-redigerare, ny enhetshantering, röstsändning. Fortfarande under aktiv utveckling!
Full ändringslogg: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Основні зміни в цій версії: Нові можливості в налаштуваннях лабораторії: Текстовий редактор, нове керування пристроями, голосові повідомлення. Досі в активній розробці!
Список усіх змін: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
此版本中的主要變動:實驗室設定下有新功能:格式化文字編輯器、新裝置管理、語音廣播。仍在積極開發中!
完整的變更紀錄https://github.com/vector-im/element-android/releases

View File

@ -69,4 +69,68 @@
<string name="notice_room_third_party_registered_invite_with_reason">%1$s %2$s üçün dəvəti qəbul etdi. Səbəb: %3$s</string>
<string name="notice_room_withdraw_with_reason">%1$s %2$s dəvətini geri götürdü. Səbəb: %3$s</string>
<string name="notice_room_created_by_you">Otağ yaratdınız</string>
<string name="denied_permission_camera">Bu əməliyyatı yerinə yetirmək üçün sistem tənzimləmələrindən Kameraya icazə verin.</string>
<string name="title_activity_settings">Tənzimləmələr</string>
<string name="notice_direct_room_join">%1$s qoşuldu</string>
<string name="notice_room_join_by_you">Otağa qoşuldunuz</string>
<string name="notice_room_invite_by_you">%1$s-ı dəvət etdiniz</string>
<string name="notice_direct_room_created_by_you">Müzakirə yaratdınız</string>
<string name="notice_room_created">%1$s otağı yaratdı</string>
<string name="notification_noisy_notifications">Səsli bildirişlər</string>
<string name="notification_listening_for_notifications">Bildirişləri dinləmək</string>
<string name="create_spaces_default_public_room_name">Ümumi</string>
<string name="settings_general_title">Ümumi</string>
<string name="room_participants_action_ignore_prompt_msg">Bu istifadəçiyə məhəl qoymamaq onun mesajlarını paylaşdığınız otaqlardan siləcək.
\n
\nBu əməliyyatı istənilən vaxt ümumi tənzimləmələrdə geri qaytara bilərsiniz.</string>
<string name="denied_permission_generic">Bu tələbi yerinə yetirmək üçün bəzi icazələr yoxdur, lütfən, sistem tənzimləmələrindən icazələr verin.</string>
<string name="notice_room_avatar_removed_by_you">Otaq avatarını sildiniz</string>
<string name="notice_room_avatar_removed">%1$s otaq avatarını sildi</string>
<string name="notice_room_topic_removed_by_you">Otaq mövzusunu sildiniz</string>
<string name="notice_room_name_removed_by_you">Otağın adını sildiniz</string>
<string name="notice_room_server_acl_allow_is_empty">🎉 Bütün serverlərin iştirakı qadağandır! Bu otaq artıq istifadə edilə bilməz.</string>
<string name="notice_room_server_acl_updated_no_change">Dəyişiklik yoxdur.</string>
<string name="notice_room_server_acl_updated_title_by_you">Bu otaq üçün server ACL-lərini dəyişdirdiniz.</string>
<string name="notice_room_server_acl_set_banned">• %s ilə uyğunlaşan serverlər qadağan edilib.</string>
<string name="notice_room_server_acl_set_title_by_you">Bu otaq üçün server ACL-lərini təyin etdiniz.</string>
<string name="notice_room_server_acl_set_title">%s bu otaq üçün server ACL-lərini təyin etdi.</string>
<string name="notice_direct_room_update_by_you">Burada təkmilləşdirdiniz.</string>
<string name="notice_direct_room_update">%s burada təkmilləşdi.</string>
<string name="notice_room_update_by_you">Bu otağı təkmilləşdirdiniz.</string>
<string name="notice_made_future_direct_room_visibility_by_you">Gələcək mesajları %1$s üçün görünən etdiniz</string>
<string name="notice_made_future_direct_room_visibility">%1$s gələcək mesajları %2$s üçün görünən etdi</string>
<string name="notice_made_future_room_visibility_by_you">Gələcək otaq tarixçəsini %1$s üçün görünən etdiniz</string>
<string name="notice_ended_call_by_you">Zəngi bitirdiniz.</string>
<string name="notice_answered_call_by_you">Zəngə cavab verdiniz.</string>
<string name="notice_call_candidates_by_you">Zəngi qurmaq üçün məlumat göndərdiniz.</string>
<string name="notice_call_candidates">%s zəngi qurmaq üçün məlumat göndərdi.</string>
<string name="notice_placed_voice_call_by_you">Səsli zəng etdiniz.</string>
<string name="notice_placed_video_call_by_you">Video zəng etdiniz.</string>
<string name="notice_room_name_changed_by_you">Otağın adını buna dəyişdiniz: %1$s</string>
<string name="notice_room_avatar_changed_by_you">Otaq avatarını dəyişdiniz</string>
<string name="notice_room_avatar_changed">%1$s otaq avatarını dəyişdi</string>
<string name="notice_room_topic_changed_by_you">Mövzunu buna dəyişdiniz: %1$s</string>
<string name="notice_display_name_removed_by_you">Ekran adınızı sildiniz (bu, %1$s idi)</string>
<string name="notice_display_name_changed_from_by_you">%1$s ekran adınızı %2$s olaraq dəyişdiniz</string>
<string name="notice_display_name_set_by_you">Ekran adınızı %1$s qoydunuz</string>
<string name="notice_avatar_url_changed_by_you">Avatarınızı dəyişdirmisiniz</string>
<string name="notice_room_withdraw_by_you">%1$s dəvətini geri götürdünüz</string>
<string name="notice_room_ban_by_you">%1$s adlı istifadəçini qadağan etdiniz</string>
<string name="notice_room_unban_by_you">%1$s adlı istifadəçini qadağan etdiniz</string>
<string name="notice_room_remove_by_you">%1$s adlı istifadəçini qovdunuz</string>
<string name="notice_room_reject_by_you">Dəvəti rədd etdiniz</string>
<string name="notice_direct_room_leave_by_you">Otağı tərk etdiniz</string>
<string name="notice_direct_room_leave">%1$s otaqdan çıxdı</string>
<string name="notice_room_leave_by_you">Otağı tərk etdiniz</string>
<string name="notice_direct_room_join_by_you">Qoşuldunuz</string>
<string name="notice_direct_room_created">%1$s müzakirə yaratdı</string>
<string name="notice_room_invite_no_invitee_by_you">Sizin dəvətiniz</string>
<plurals name="x_selected">
<item quantity="one">%1$d seçildi</item>
<item quantity="other">%1$d seçildi</item>
</plurals>
<string name="notice_direct_room_third_party_invite">%1$s, %2$s-ı dəvət etdi</string>
<string name="notice_room_third_party_invite_by_you">Otağa qoşulmaq üçün %1$s-a dəvət göndərdiniz</string>
<string name="notice_room_server_acl_updated_title">%s, bu otaq üçün server ACL-lərini dəyişdi.</string>
<string name="notice_room_server_acl_set_allowed">• %s ilə uyğunlaşan serverlərə icazə verildi.</string>
</resources>

View File

@ -381,7 +381,7 @@
<string name="settings_version">Versió</string>
<string name="settings_olm_version">Versió d\'OLM</string>
<string name="settings_app_term_conditions">Termes i condicions</string>
<string name="settings_third_party_notices">Avisos de terceres parts</string>
<string name="settings_third_party_notices">Avisos de tercers</string>
<string name="settings_copyright">Copyright</string>
<string name="settings_privacy_policy">Política de privacitat</string>
<string name="settings_clear_cache">Esborra la memòria cau</string>
@ -1198,8 +1198,8 @@
<string name="login_reset_password_success_notice_2">Se t\'ha desconnectat de totes les teves sessions i no rebràs més notificacions. Per reactivar les notificacions, torna a iniciar sessió a cada dispositiu.</string>
<string name="push_gateway_item_format">Format:</string>
<string name="push_gateway_item_url">Url:</string>
<string name="push_gateway_item_device_name">session_name:</string>
<string name="push_gateway_item_push_key">push_key:</string>
<string name="push_gateway_item_device_name">Àlies de la sessió:</string>
<string name="push_gateway_item_push_key">Clau \'push\':</string>
<string name="push_gateway_item_app_id">ID d\'aplicació:</string>
<string name="alert_push_are_disabled_description">Revisa la configuració per activar les notificacions</string>
<string name="settings_troubleshoot_test_push_notification_content">Estàs veient la notificació! Clica\'m!</string>
@ -1376,7 +1376,7 @@
<string name="room_participants_unban_prompt_msg">Si treus el vet a un usuari podrà tornar a unir-se a la sala.</string>
<string name="failed_to_unban">No s\'ha pogut treure el vet a l\'usuari</string>
<string name="room_participants_unban_title">Treu el vet a l\'usuari</string>
<string name="push_gateway_item_app_display_name">app_display_name:</string>
<string name="push_gateway_item_app_display_name">Àlies de l\'aplicació:</string>
<string name="room_widget_permission_display_name">El teu àlies</string>
<string name="room_settings_set_avatar">Estableix la foto</string>
<string name="room_widget_permission_avatar_url">URL de la teva foto</string>
@ -1630,7 +1630,7 @@
<string name="default_message_emote_snow">ha enviat una nevada ❄️</string>
<string name="user_code_my_code">El meu codi</string>
<string name="user_code_share">Comparteix el meu codi</string>
<string name="user_code_scan">Escaneja un codi QR</string>
<string name="user_code_scan">Escaneja codi QR</string>
<string name="not_a_valid_qr_code">No és un codi QR de Matrix vàlid</string>
<string name="settings_failed_to_get_crypto_device_info">No hi ha informació criptogràfica disponible</string>
<string name="verification_conclusion_ok_self_notice">La nova sessió s\'ha verificat. Tindrà accés als teus missatges xifrats i es mostrarà de confiança per als altres usuaris.</string>
@ -2745,4 +2745,95 @@
<string name="device_manager_verification_status_unknown">Estat de verificació desconegut</string>
<string name="login_scan_qr_code">Escaneja codi QR</string>
<string name="push_gateway_item_device_id">ID de sessió:</string>
<string name="permissions_rationale_msg_notification">${app_name} necessita permís per mostrar notificacions. Les notificacions poden mostrar missatges, invitacions, etc.
\n
\nConcedeix els permisos a les següents finestres emergents per poder veure les notificacions correctament.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">S\'ha detectat un problema de seguretat en configurar la missatgeria segura. Algun dels següents elements pot estar compromès: el servidor que utilitzes; alguna de les teves connexions a Internet; algun dels teus dispositius;</string>
<string name="qr_code_login_header_connected_description">Comprova el dispositiu amb la sessió iniciada, s\'hauria de mostrar el codi de sota. Verifica que el codi de sota coincideix amb el del dispositiu:</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Comença a la pantalla d\'inici de sessió</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Comença a la pantalla d\'inici de sessió</string>
<string name="qr_code_login_signing_in_a_mobile_device">Iniciant sessió a un dispositiu mòbil\?</string>
<string name="qr_code_login_show_qr_code_button">Mostra codi QR</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">Selecciona \'Escaneja codi QR\'</string>
<string name="qr_code_login_new_device_instruction_3">Selecciona \'Mostra codi QR\'</string>
<string name="qr_code_login_new_device_instruction_2">Ves a Configuració -&gt; Seguretat i privadesa</string>
<string name="qr_code_login_new_device_instruction_1">Obre l\'aplicació en l\'altre dispositiu</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Inici de sessió cancel·lat per l\'altre dispositiu.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">El codi QR és invàlid.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">L\'altre dispositiu ha d\'haver iniciat sessió.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">L\'altre dispositiu ja ha iniciat sessió.</string>
<string name="qr_code_login_header_failed_other_description">Ha fallat la petició.</string>
<string name="qr_code_login_header_failed_denied_description">Petició denegada per l\'altre dispositiu.</string>
<string name="qr_code_login_header_failed_timeout_description">La vinculació no s\'ha completat en el temps permès.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">La vinculació amb aquest dispositiu no està admesa.</string>
<string name="qr_code_login_header_failed_title">Connexió sense èxit</string>
<string name="qr_code_login_header_connected_title">Connexió segura establerta</string>
<string name="qr_code_login_header_show_qr_code_link_a_device_description">Escaneja el codi QR de sota amb el dispositiu amb la sessió tancada.</string>
<string name="qr_code_login_header_show_qr_code_new_device_description">Utilitza el dispositiu amb la sessió iniciada per escanejar el codi QR següent:</string>
<string name="qr_code_login_try_again">Torna-ho a provar</string>
<string name="qr_code_login_status_no_match">No coincideix\?</string>
<string name="qr_code_login_signing_in">Iniciant sessió</string>
<string name="qr_code_login_connecting_to_device">Connectant al dispositiu</string>
<string name="qr_code_login_scan_qr_code_button">Escaneja codi QR</string>
<string name="qr_code_login_confirm_security_code">Confirma</string>
<string name="qr_code_login_confirm_security_code_description">Assegura\'t que coneixes l\'origen d\'aquest codi. L\'enllaç de dispositius, proporciona a algú accés complet al teu compte.</string>
<string name="rich_text_editor_format_underline">Aplica subratllat</string>
<string name="rich_text_editor_format_strikethrough">Ratlla-ho</string>
<string name="rich_text_editor_format_bold">Aplica negreta</string>
<string name="rich_text_editor_format_italic">Aplica cursiva</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Selecciona \'Inicia sessió amb codi QR\'</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">El servidor no és compatible amb l\'inici de sessió mitjançant codi QR.</string>
<string name="qr_code_login_header_show_qr_code_title">Inicia sessió amb codi QR</string>
<string name="qr_code_login_header_scan_qr_code_description">Utilitza la càmera d\'aquest dispositiu per escanejar el codi QR que es mostra a l\'altre dispositiu:</string>
<string name="qr_code_login_header_scan_qr_code_title">Escaneja codi QR</string>
<string name="three">3</string>
<string name="two">2</string>
<string name="one">1</string>
<string name="labs_enable_voice_broadcast_summary">Permet enregistrar i enviar emissions de veu dins una sala.</string>
<string name="labs_enable_voice_broadcast_title">Activa l\'emissió de veu (en desenvolupament)</string>
<string name="labs_enable_client_info_recording_title">Activa la gravació d\'informació de client</string>
<string name="labs_enable_client_info_recording_summary">Desa el nom de client, la versió i l\'URL per reconèixer les sessions més fàcilment dins el gestor de sessions.</string>
<string name="labs_enable_session_manager_summary">Obté un millor control i visibilitat de totes les teves sessions.</string>
<string name="labs_enable_session_manager_title">Activa el nou gestor de sessions</string>
<string name="device_manager_sessions_sign_in_with_qr_code_description">Pots utilitzar aquest dispositiu per iniciar la sessió amb un codi QR a un dispositiu mòbil o web. Ho pots fer de dues maneres:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Inicia sessió amb codi QR</string>
<string name="device_manager_session_details_device_operating_system">Sistema operatiu</string>
<string name="device_manager_session_details_device_model">Model</string>
<string name="device_manager_session_details_device_browser">Navegador</string>
<string name="device_manager_session_details_application_url">URL</string>
<string name="device_manager_session_details_application_version">Versió</string>
<string name="device_manager_session_details_application_name">Nom</string>
<string name="device_manager_session_details_application">Aplicació</string>
<string name="device_manager_verification_status_detail_other_session_unknown">Verifica la teva sessió actual per mostrar l\'estat de verificació d\'aquesta sessió.</string>
<string name="push_gateway_item_enabled">Activat:</string>
<string name="error_check_network">Alguna cosa ha anat malament. Comprova la teva connexió i torna-ho a provar.</string>
<string name="grant_permission">Concedir permís</string>
<string name="settings_troubleshoot_test_system_settings_permission_failed">${app_name} necessita permís per mostrar notificacions.
\nSi us plau, concedeix-li el permís.</string>
<string name="labs_enable_rich_text_editor_summary">Prova l\'editor de text enriquit (el mode text pla arribarà aviat)</string>
<string name="labs_enable_rich_text_editor_title">Activa l\'editor de text enriquit</string>
<string name="device_manager_push_notifications_description">Rep notificacions en aquesta sessió.</string>
<string name="device_manager_push_notifications_title">Notificacions</string>
<string name="a11y_voice_broadcast_buffering">Carregant</string>
<string name="a11y_pause_voice_broadcast">Pausa l\'emissió de veu</string>
<string name="a11y_play_voice_broadcast">Reprodueix o reprèn l\'emissió de veu</string>
<string name="a11y_stop_voice_broadcast_record">Atura l\'enregistrament d\'emissió de veu</string>
<string name="a11y_pause_voice_broadcast_record">Pausa l\'enregistrament d\'emissió de veu</string>
<string name="a11y_resume_voice_broadcast_record">Reprèn l\'enregistrament d\'emissió de veu</string>
<string name="voice_broadcast_live">En directe</string>
<string name="action_deselect_all">Deselecciona-ho tot</string>
<string name="action_select_all">Selecciona-ho tot</string>
<plurals name="x_selected">
<item quantity="one">%1$d seleccionat</item>
<item quantity="other">%1$d seleccionats</item>
</plurals>
<string name="attachment_type_selector_poll">Enquestes</string>
<string name="device_manager_other_sessions_select">Selecciona sessions</string>
<string name="attachment_type_selector_contact">Contacte</string>
<string name="attachment_type_selector_camera">Càmera</string>
<string name="attachment_type_selector_location">Ubicació</string>
<string name="attachment_type_selector_voice_broadcast">Emissió de veu</string>
<string name="attachment_type_selector_file">Adjunts</string>
<string name="attachment_type_selector_sticker">Adhesius</string>
<string name="attachment_type_selector_gallery">Galeria</string>
</resources>

View File

@ -351,7 +351,7 @@
<string name="call_in_progress">Hovor probíhá…</string>
<string name="call_error_user_not_responding">Protější strana hovor nepřijala.</string>
<string name="permissions_rationale_popup_title">Informace</string>
<string name="permissions_rationale_msg_record_audio">${app_name} potřebuje oprávnění pro přístup k Vašemu mikrofonu pro uskutečnění hlasových hovorů.</string>
<string name="permissions_rationale_msg_record_audio">${app_name} potřebuje oprávnění pro přístup k vašemu mikrofonu pro uskutečnění hlasových hovorů.</string>
<string name="yes">ANO</string>
<string name="no">NE</string>
<string name="_continue">Pokračovat</string>
@ -411,12 +411,12 @@
<string name="done">Hotovo</string>
<string name="action_sign_out_confirmation_simple">Opravdu se chcete odhlásit\?</string>
<string name="video_call_in_progress">Video hovor probíhá…</string>
<string name="permissions_rationale_msg_camera_and_audio">${app_name} potřebuje oprávnění pro přístup k Vaší kameře a mikrofonu pro uskutečnění video hovoru.
<string name="permissions_rationale_msg_camera_and_audio">${app_name} potřebuje oprávnění pro přístup k vaší kameře a mikrofonu pro uskutečnění video hovoru.
\n
\nProsím, povolte přístup na následující hlášce abyste mohli uskutečnit hovor.</string>
<string name="room_participants_power_level_prompt">Tuto změnu nelze zvrátit, protože povyšujete uživatele na stejnou úroveň, jakou máte vy.
\nOpravdu to chcete udělat\?</string>
<string name="ssl_cert_not_trust">Toto by mohlo znamenat, že někdo škodlivě zachytává Vaši komunikaci nebo že Váš telefon nedůvěřuje certifikátu poskytnutému vzdáleným serverem.</string>
<string name="ssl_cert_not_trust">Toto by mohlo znamenat, že někdo škodlivě zachytává vaši komunikaci nebo že Váš telefon nedůvěřuje certifikátu poskytnutému vzdáleným serverem.</string>
<string name="ssl_cert_new_account_expl">Pokud administrátor serveru řekl, že toto je předpokládané, ujistěte se, že otisk níže se shoduje s otiskem který Vám poskytl.</string>
<string name="ssl_unexpected_existing_expl">Certifikát se změnil z toho, kterému Váš telefon důvěřoval. Toto je VELMI NEOBVYKLÉ. Je doporučeno, abyste NEPŘIJALI tento nový certifikát.</string>
<string name="ssl_expected_existing_expl">Certifikát se změnil z původně důvěryhodného na nyní nedůvěryhodný. Server patrně obnovil svůj certifikát. Kontaktujte administrátora kvůli očekávanému otisku.</string>
@ -578,7 +578,7 @@
<string name="settings_deactivate_account_section">Deaktivace účtu</string>
<string name="settings_deactivate_my_account">Deaktivovat můj účet</string>
<string name="settings_discovery_category">Objevování</string>
<string name="settings_discovery_manage">Správa Vašich nastavení pro objevování.</string>
<string name="settings_discovery_manage">Správa vašich nastavení pro objevování.</string>
<string name="settings_analytics">Analýza</string>
<string name="settings_opt_in_of_analytics">Odeslat analytická data</string>
<string name="settings_opt_in_of_analytics_summary">${app_name} sbírá anonymní analytická data pro vylepšení aplikace.</string>
@ -848,7 +848,7 @@
<string name="keys_backup_setup">Začít používat zálohu klíčů</string>
<string name="keys_backup_setup_step1_advanced">(Pokročilé)</string>
<string name="keys_backup_setup_step2_text_title">Zabezpečit zálohu přístupovou frází.</string>
<string name="keys_backup_setup_step2_text_description">Uložíme zašifrovanou kopii Vašich klíčů na Vašem domovském serveru. Chraňte svoji zálohu přístupovou frází, abyste ji udrželi v bezpečí.
<string name="keys_backup_setup_step2_text_description">Uložíme zašifrovanou kopii vašich klíčů na Vašem domovském serveru. Chraňte svoji zálohu přístupovou frází, abyste ji udrželi v bezpečí.
\n
\nZ důvodu nejvyšší bezpečnosti by se měla lišit od hesla účtu.</string>
<string name="keys_backup_setup_step2_button_title">Nastavit přístupovou frází</string>
@ -856,7 +856,7 @@
<string name="keys_backup_setup_step1_recovery_key_alternative">Nebo zabezpečte svoji zálohu pomocí klíče obnovy, uloženého někde v bezpečí.</string>
<string name="keys_backup_setup_step2_skip_button_title">(Pokročilé) Nastavit s klíčem obnovy</string>
<string name="keys_backup_setup_step3_success_title">Podařilo se!</string>
<string name="keys_backup_setup_step3_text_line2">Váš klíč obnovy je záchranná síť - lze jej použít pro obnovu Vašich šifrovaných zpráv, pokud zapomenete svou přístupovou frázi.
<string name="keys_backup_setup_step3_text_line2">Váš klíč obnovy je záchranná síť - lze jej použít pro obnovu vašich šifrovaných zpráv, pokud zapomenete svou přístupovou frázi.
\nUchovávejte svůj klíč obnovy velmi bezpečně, např. ve správci hesel (nebo trezoru)</string>
<string name="keys_backup_setup_step3_text_line2_no_passphrase">Uchovávejte svůj klíč obnovy velmi bezpečně, např. ve správci hesel (nebo trezoru)</string>
<string name="keys_backup_setup_step3_button_title">Hotovo</string>
@ -971,7 +971,7 @@
<string name="preference_voice_and_video">Hlas a video</string>
<string name="preference_root_help_about">Nápověda a O aplikaci</string>
<string name="settings_troubleshoot_test_token_registration_quick_fix">Registrovat token</string>
<string name="send_suggestion">Učinit návrh</string>
<string name="send_suggestion">Poslat návrh</string>
<string name="send_suggestion_content">Prosím, zapište svůj návrh níže.</string>
<string name="send_suggestion_report_placeholder">Popište svůj návrh tady</string>
<string name="send_suggestion_sent">Děkujeme, návrh byl úspěšně odeslán</string>
@ -1023,7 +1023,7 @@
<string name="labs_allow_extended_logging">Zapnout podrobné záznamy.</string>
<string name="labs_allow_extended_logging_summary">Podrobné záznamy pomohou vývojářům mnoha podrobnostmi, odešlete-li RageShake. I když jsou zapnuty, aplikace nezaznamenává obsah zpráv nebo jakákoli soukromá data.</string>
<string name="error_terms_not_accepted">Prosím, opakujte, jakmile jste přijali všeobecné podmínky svého domovského serveru.</string>
<string name="error_network_timeout">Vypadá to, že serveru dlouho trvá odpovědět, to může být způsobeno buď slabým spojením nebo chybou na serveru. Prosím, opakujte za chvíli.</string>
<string name="error_network_timeout">Vypadá to, že serveru trvá příliš dlouho, než odpoví, což může být způsobeno buď špatným připojením, nebo chybou serveru. Zkuste to prosím za chvíli znovu.</string>
<string name="send_attachment">Poslat přílohu</string>
<string name="a11y_open_drawer">Otevřít navigační zásuvku</string>
<string name="a11y_create_menu_open">Otevřít menu založení místnosti</string>
@ -1106,7 +1106,7 @@
<string name="login_server_url_form_modular_text">Prémiový hosting pro organizace</string>
<string name="login_server_url_form_modular_notice">Zadejte adresu Modular Element nebo serveru, který chcete použít</string>
<string name="login_sso_error_message">Při načítání stránky došlo k chybě: %1$s (%2$d)</string>
<string name="login_mode_not_supported">Aplikace se nemůže přihlásit k tomuto homeserveru. Homeserver podporuje následující typy přihlášení: %1$s.
<string name="login_mode_not_supported">Aplikace se nemůže přihlásit k tomuto domovskému serveru. Domovský server podporuje následující typy přihlášení: %1$s.
\n
\nChcete se přihlásit webovým klientem\?</string>
<string name="login_registration_disabled">Omlouváme se, tento server již nepřijímá nové účty.</string>
@ -1279,7 +1279,7 @@
<string name="rendering_event_error_type_of_event_not_handled">${app_name} neobstarává události typu \'%1$s\'</string>
<string name="rendering_event_error_exception">${app_name} narazil na chybu při převádění obsahu události s id \'%1$s\'</string>
<string name="unignore">Odignorovat</string>
<string name="verify_cannot_cross_sign">Tato relace nemůže sdílet toto ověření s jinými z Vašich relací.
<string name="verify_cannot_cross_sign">Tato relace nemůže sdílet toto ověření s jinými z vašich relací.
\nToto ověření bude uloženo místně a sdíleno v budoucí verzi aplikace.</string>
<string name="command_description_rainbow">Odešle danou zprávu zabarvenou jako duha</string>
<string name="command_description_rainbow_emote">Odešle daný emote zabarvený jako duha</string>
@ -1475,7 +1475,7 @@
<string name="cross_signing_verify_by_text">Manuálně ověřit textem</string>
<string name="crosssigning_verify_session">Ověřit přihlášení</string>
<string name="cross_signing_verify_by_emoji">Interaktivně ověřit pomocí Emoji</string>
<string name="confirm_your_identity">Potvrďte svou identitu ověřením tohoto přihlášení v některé z Vašich dalších relacích a udělte přístup k zašifrovaným zprávám.</string>
<string name="confirm_your_identity">Potvrďte svou identitu ověřením tohoto přihlášení v některé z vašich dalších relacích a udělte přístup k zašifrovaným zprávám.</string>
<string name="error_empty_field_choose_user_name">Zvolte si, prosím, uživatelské jméno.</string>
<string name="error_empty_field_choose_password">Prosím, zvolte heslo.</string>
<string name="external_link_confirmation_title">Překontrolovat tento odkaz</string>
@ -1517,7 +1517,7 @@
<string name="no_permissions_to_start_conf_call">Nemáte povolení zahájit konferenční hovor v této místnosti</string>
<string name="video_meeting">Zahájit video schůzku</string>
<string name="audio_meeting">Zahájit hlasovou schůzku</string>
<string name="audio_video_meeting_description">Schůzky používají pravidla zabezpečení a přístupu Jitsi. Všichni lidé nyní v místnosti uvidí pozvánku k připojení, zatímco Vaše schůzka probíhá.</string>
<string name="audio_video_meeting_description">Schůzky používají pravidla zabezpečení a přístupu Jitsi. Všichni lidé nyní v místnosti uvidí pozvánku k připojení, zatímco vaše schůzka probíhá.</string>
<string name="cannot_call_yourself">Nemůžete zahájit hovor se sebou</string>
<string name="cannot_call_yourself_with_invite">Nemůžete zahájit hovor se sebou, počkejte, až účastníci přijmou pozvánku</string>
<string name="failed_to_add_widget">Přidání widgetu se nezdařilo</string>
@ -1567,9 +1567,9 @@
<string name="room_participants_ban_reason">Důvod k vykázání</string>
<string name="room_participants_unban_title">Zrušit vykázání uživatele</string>
<string name="room_participants_unban_prompt_msg">Zrušení vykázání uživatele jim opět umožní vstoupit do místnosti.</string>
<string name="settings_phone_number_empty">Žádné telefonní číslo nebylo zadáno do Vašeho účtu</string>
<string name="settings_phone_number_empty">Žádné telefonní číslo nebylo zadáno do vašeho účtu</string>
<string name="settings_emails">Emailová adresa</string>
<string name="settings_emails_empty">Žádná emailová adresa nebyla zadána do Vašeho účtu</string>
<string name="settings_emails_empty">Žádná emailová adresa nebyla zadána do vašeho účtu</string>
<string name="settings_phone_numbers">Telefonní čísla</string>
<string name="settings_remove_three_pid_confirmation_content">Ostranit %s\?</string>
<string name="error_threepid_auth_failed">Ujistěte se, že kliknete na odkaz v e-mailu, který jsme Vám poslali.</string>
@ -1577,7 +1577,7 @@
<string name="settings_secure_backup_setup">Vytvořit bezpečnou zálohu</string>
<string name="settings_secure_backup_reset">Resetovat bezpečnou zálohu</string>
<string name="settings_secure_backup_enter_to_setup">Nastavit na tomto zařízení</string>
<string name="settings_secure_backup_section_info">Ochrana před ztrátou přístupu k šifrovaným zprávám a datům pomocí zálohy šifrovacích klíčů na Vašem serveru.</string>
<string name="settings_secure_backup_section_info">Ochrana před ztrátou přístupu k šifrovaným zprávám a datům pomocí zálohy šifrovacích klíčů na vašem serveru.</string>
<string name="reset_secure_backup_title">Generovat nový bezpečnostní klíč nebo nastavit novou bezpečnostní frázi pro existující zálohu.</string>
<string name="reset_secure_backup_warning">To nahradí Váš nynější klíč nebo frázi.</string>
<string name="disabled_integration_dialog_title">Integrace jsou vypnuty</string>
@ -1641,7 +1641,7 @@
<string name="a11y_stop_camera">Zastavit fotoaparát</string>
<string name="a11y_start_camera">Spustit fotoaparát</string>
<string name="bottom_sheet_setup_secure_backup_title">Bezpečná záloha</string>
<string name="bottom_sheet_setup_secure_backup_subtitle">Ochrana před ztrátou přístupu k šifrovaným zprávám a datům pomocí zálohy šifrovacích klíčů na Vašem serveru.</string>
<string name="bottom_sheet_setup_secure_backup_subtitle">Ochrana před ztrátou přístupu k šifrovaným zprávám a datům pomocí zálohy šifrovacích klíčů na vašem serveru.</string>
<string name="bottom_sheet_setup_secure_backup_submit">Nastavit</string>
<string name="bottom_sheet_setup_secure_backup_security_key_title">Použít bezpečnostní klíč</string>
<string name="bottom_sheet_setup_secure_backup_security_key_subtitle">Generovat bezpečnostní klíč k uložení na bezpečném místě např. správci hesel nebo sejfu.</string>
@ -2104,13 +2104,13 @@
<string name="space_settings_alias_subtitle">Prohlédnout a spravovat adresy tohoto prostoru.</string>
<string name="space_settings_alias_title">Adresy prostorů</string>
<string name="room_upgrade_to_recommended_version">Aktualizujte na doporučenou verzi místnosti</string>
<string name="room_using_unstable_room_version">Tato místnost používá místnost verze %s, kterou homeserver označil za nestabilní.</string>
<string name="room_using_unstable_room_version">Tato místnost používá verzi místnosti %s, kterou domovský server označil za nestabilní.</string>
<string name="upgrade_room_no_power_to_manage">K aktualizaci místnosti potřebujete oprávnění</string>
<string name="upgrade_room_update_parent_space">Automaticky aktualizovat mateřský prostor</string>
<string name="upgrade_room_auto_invite">Automaticky pozvat uživatele</string>
<string name="upgrade_public_room_from_to">Budete aktualizovat tuto místnost z %1$s na %2$s.</string>
<string name="upgrade_room_warning">Aktualizace místnosti je pokročilá akce a obvykle se doporučuje tehdy, je-li místnost nestabilní kvůli chybám, chybějícím funkcím nebo slabým místům v zabezpečení.
\nObvykle má vliv pouze na to, jak server místnost zpracovává.</string>
<string name="upgrade_room_warning">Aktualizace místnosti je pokročilá akce a obvykle se doporučuje, pokud je místnost nestabilní kvůli chybám, chybějícím funkcím nebo bezpečnostním zranitelnostem.
\nObvykle ovlivňuje pouze způsob zpracování místnosti na serveru.</string>
<string name="upgrade_private_room">Aktualizovat soukromou místnost</string>
<string name="upgrade_public_room">Aktualizovat veřejnou místnost</string>
<string name="upgrade">Aktualizace</string>
@ -2124,7 +2124,7 @@
<string name="verification_scan_self_emoji_subtitle">Raději ověřit porovnáním emoji</string>
<string name="verification_scan_with_this_device">Oskenovat tímto zařízením</string>
<string name="verification_scan_self_notice">Oskenujte kód svým dalším zařízením nebo přepněte a oskenujte tímto zařízením</string>
<string name="hs_client_url">URL API Homeserveru</string>
<string name="hs_client_url">URL API domovského serveru</string>
<string name="missing_permissions_title">Chybějící oprávnění</string>
<string name="denied_permission_camera">Pro provedení této akce udělte, prosím, oprávnění Fotoaparát v systémových nastaveních.</string>
<string name="denied_permission_generic">Některá z oprávnění potřebných k provedení akce chybí, prosím, udělte oprávnění v systémových nastaveních.</string>
@ -2762,7 +2762,7 @@
<string name="labs_enable_deferred_dm_summary">Vytvořit přímou zprávu pouze při první zprávě</string>
<string name="labs_enable_deferred_dm_title">Povolit odložené přímé zprávy</string>
<string name="labs_enable_new_app_layout_summary">Zjednodušený Element s volitelnými kartami</string>
<string name="labs_enable_new_app_layout_title">Povolit nový vzhled</string>
<string name="labs_enable_new_app_layout_title">Zapnout nové uspořádání</string>
<string name="device_manager_learn_more_session_rename">Ostatní uživatelé v přímých zprávách a místnostech, ke kterým se připojíte, si mohou prohlédnout úplný seznam vašich relací.
\n
\nTo jim poskytuje jistotu, že s vámi skutečně mluví, ale také to znamená, že mohou vidět název relace, který zde zadáte.</string>
@ -2839,9 +2839,9 @@
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Začněte na přihlašovací obrazovce</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Vyberte možnost \"Přihlásit se pomocí QR kódu\"</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Začněte na přihlašovací obrazovce</string>
<string name="qr_code_login_new_device_instruction_3">Vyberte možnost \"Zobrazit QR kód na tomto zařízení\"</string>
<string name="qr_code_login_new_device_instruction_2">Přejděte do Nastavení -&gt; Zabezpečení a soukromí -&gt; Zobrazit všechny relace</string>
<string name="qr_code_login_new_device_instruction_1">Otevřete ${app_name} na vašem druhém zařízení</string>
<string name="qr_code_login_new_device_instruction_3">Vyberte možnost \"Zobrazit QR kód\"</string>
<string name="qr_code_login_new_device_instruction_2">Přejděte do Nastavení -&gt; Zabezpečení a soukromí</string>
<string name="qr_code_login_new_device_instruction_1">Otevřete aplikaci na vašem druhém zařízení</string>
<string name="qr_code_login_header_failed_denied_description">Žádost byla na druhém zařízení zamítnuta.</string>
<string name="qr_code_login_header_failed_timeout_description">Propojení nebylo dokončeno v požadovaném čase.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Propojení s tímto zařízením není podporováno.</string>
@ -2859,4 +2859,36 @@
<string name="device_manager_sessions_sign_in_with_qr_code_description">Pomocí tohoto zařízení se můžete přihlásit do mobilního nebo webového zařízení pomocí QR kódu. Můžete to provést dvěma způsoby:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Přihlásit se pomocí QR kódu</string>
<string name="login_scan_qr_code">Naskenovat QR kód</string>
<string name="labs_enable_voice_broadcast_summary">Možnost nahrávat a odesílat hlasové vysílání na časové ose místnosti.</string>
<string name="labs_enable_voice_broadcast_title">Povolit hlasové vysílání (v aktivním vývoji)</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Domovský server nepodporuje přihlášení pomocí QR kódu.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Přihlášení bylo na druhém zařízení zrušeno.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Tento QR kód je neplatný.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Druhé zařízení musí být přihlášeno.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Druhé zařízení je již přihlášeno.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Při nastavování zabezpečeného zasílání zpráv se vyskytl problém se zabezpečením. Může být napadena jedna z následujících věcí: váš domovský server; vaše internetové připojení; vaše zařízení;</string>
<string name="qr_code_login_header_failed_other_description">Žádost se nezdařila.</string>
<string name="a11y_voice_broadcast_buffering">Ukládání do vyrovnávací paměti</string>
<string name="a11y_pause_voice_broadcast">Pozastavit hlasové vysílání</string>
<string name="a11y_play_voice_broadcast">Přehrát nebo obnovit hlasové vysílání</string>
<string name="a11y_stop_voice_broadcast_record">Ukončit záznam hlasového vysílání</string>
<string name="a11y_pause_voice_broadcast_record">Pozastavit záznam hlasového vysílání</string>
<string name="a11y_resume_voice_broadcast_record">Obnovit záznam hlasového vysílání</string>
<string name="voice_broadcast_live">Živě</string>
<string name="device_manager_other_sessions_select">Vybrat relace</string>
<string name="attachment_type_selector_contact">Kontakt</string>
<string name="attachment_type_selector_camera">Fotoaparát</string>
<string name="attachment_type_selector_location">Poloha</string>
<string name="attachment_type_selector_poll">Hlasování</string>
<string name="attachment_type_selector_voice_broadcast">Hlasové vysílání</string>
<string name="attachment_type_selector_file">Přílohy</string>
<string name="attachment_type_selector_sticker">Nálepky</string>
<string name="attachment_type_selector_gallery">Knihovna fotografií</string>
<string name="action_deselect_all">Zrušit výběr všech</string>
<string name="action_select_all">Vybrat všechny</string>
<plurals name="x_selected">
<item quantity="one">%1$d vybraný</item>
<item quantity="few">%1$d vybrané</item>
<item quantity="other">%1$d vybraných</item>
</plurals>
</resources>

View File

@ -42,7 +42,7 @@
<string name="notice_room_update">%s hat diesen Raum aufgewertet.</string>
<string name="event_status_sending_message">Sende eine Nachricht </string>
<string name="initial_sync_start_importing_account">Erste Synchronisation:
\nImportiere Benutzerkonto </string>
\nImportiere Konto </string>
<string name="initial_sync_start_importing_account_crypto">Erste Synchronisation:
\nImportiere Kryptoschlüssel</string>
<string name="initial_sync_start_importing_account_rooms">Erste Synchronisation:
@ -57,7 +57,7 @@
<string name="initial_sync_start_importing_account_data">Erste Synchronisation:
\nImportiere Benutzerdaten</string>
<string name="notice_room_third_party_revoked_invite">%1$s hat die Einladung an %2$s, den Raum zu betreten, zurückgezogen</string>
<string name="notice_room_invite_no_invitee_with_reason">%1$s\'s Einladung. Grund: %2$s</string>
<string name="notice_room_invite_no_invitee_with_reason">Einladung von %1$s. Grund: %2$s</string>
<string name="notice_room_invite_with_reason">%1$s hat %2$s eingeladen. Grund: %3$s</string>
<string name="notice_room_invite_you_with_reason">%1$s hat dich eingeladen. Grund: %2$s</string>
<string name="notice_room_join_with_reason">%1$s ist dem Raum beigetreten. Grund: %2$s</string>
@ -67,7 +67,7 @@
<string name="notice_room_unban_with_reason">%1$s hat Sperre von %2$s aufgehoben. Grund: %3$s</string>
<string name="notice_room_ban_with_reason">%1$s hat %2$s verbannt. Grund: %3$s</string>
<string name="notice_room_third_party_registered_invite_with_reason">%1$s hat die Einladung für %2$s angenommen. Grund: %3$s</string>
<string name="notice_room_withdraw_with_reason">%1$s hat Einladung für %2$s verworfen. Grund: %3$s</string>
<string name="notice_room_withdraw_with_reason">%1$s hat die Einladung für %2$s zurückgezogen. Grund: %3$s</string>
<plurals name="notice_room_aliases_added">
<item quantity="one">%1$s fügt %2$s als eine Adresse für diesen Raum hinzu.</item>
<item quantity="other">%1$s fügt %2$s als Adressen für diesen Raum hinzu.</item>
@ -263,13 +263,13 @@
<string name="matrix_only_filter">Nur Matrix-Kontakte</string>
<string name="no_result_placeholder">Keine Ergebnisse</string>
<string name="rooms_header">Räume</string>
<string name="send_bug_report_include_logs">Logdateien übermitteln</string>
<string name="send_bug_report_include_logs">Sende Protokolle</string>
<string name="send_bug_report_include_crash_logs">Absturzberichte übermitteln</string>
<string name="send_bug_report_include_screenshot">Bildschirmfoto übermitteln</string>
<string name="send_bug_report">Problem melden</string>
<string name="send_bug_report_description">Bitte beschreibe das Problem. Was hast du genau gemacht\? Was sollte passieren\? Was ist tatsächlich passiert\?</string>
<string name="send_bug_report_placeholder">Problembeschreibung</string>
<string name="send_bug_report_logs_description">Um Probleme diagnostizieren zu können, werden Protokolle der Anwendung zusammen mit dem Fehlerbericht übermittelt. Dieser Fehlerbericht wird, wie die Protokolle und das Bildschirmfoto, nicht öffentlich sichtbar sein. Wenn du nur den oben eingegebenen Text senden möchtest, die nachfolgenden Haken entsprechend entfernen:</string>
<string name="send_bug_report_logs_description">Um Probleme diagnostizieren zu können, werden Protokolle der Anwendung zusammen mit dem Fehlerbericht übermittelt. Dieser Fehlerbericht wird, inklusive der Protokolle und des Bildschirmfotos, nicht öffentlich sichtbar sein. Wenn du nur den oben eingegebenen Text senden möchtest, entferne die Häkchen:</string>
<string name="send_bug_report_alert_message">Du scheinst dein Telefon frustriert zu schütteln. Möchtest du das Fenster zum Senden eines Fehlerberichts öffnen\?</string>
<string name="send_bug_report_sent">Dein Fehlerbericht wurde erfolgreich übermittelt</string>
<string name="send_bug_report_failed">Der Fehlerbericht konnte nicht übermittelt werden (%s)</string>
@ -353,7 +353,7 @@
<string name="settings_add_phone_number">Telefonnummer hinzufügen</string>
<string name="settings_app_info_link_summary">Anwendungsinformationen in den Systemeinstellungen anzeigen.</string>
<string name="settings_app_info_link_title">Anwendungsinformationen</string>
<string name="settings_enable_all_notif">Benachrichtigungen für diesen Account</string>
<string name="settings_enable_all_notif">Benachrichtigungen für dieses Konto</string>
<string name="settings_enable_this_device">Benachrichtigungen für diese Sitzung</string>
<string name="settings_messages_in_one_to_one">Direktnachrichten</string>
<string name="settings_messages_in_group_chat">Gruppenunterhaltungen</string>
@ -408,7 +408,7 @@
<string name="room_settings_read_history_entry_anyone">Alle</string>
<string name="room_settings_read_history_entry_members_only_option_time_shared">Nur Mitglieder</string>
<string name="room_settings_read_history_entry_members_only_invited">Nur Mitglieder (ab Einladung)</string>
<string name="room_settings_read_history_entry_members_only_joined">Nur Mitglieder (ab Beitreten)</string>
<string name="room_settings_read_history_entry_members_only_joined">Nur Mitglieder (ab Betreten)</string>
<string name="room_settings_banned_users_title">Verbannte Benutzer</string>
<string name="room_settings_category_advanced_title">Erweitert</string>
<string name="room_settings_room_internal_id">Interne ID dieses Raumes</string>
@ -438,8 +438,8 @@
<string name="encryption_information_verify_device_warning">Vergleiche die folgenden Zeichen mit den Einstellungen in der Sitzung des anderen Nutzers und bestätige:</string>
<string name="encryption_information_verify_device_warning2">Falls sie nicht übereinstimmen, wurde die Kommunikation vielleicht kompromittiert.</string>
<string name="select_room_directory">Raumverzeichnis auswählen</string>
<string name="directory_server_placeholder">Server-Name</string>
<string name="directory_server_all_rooms_on_server">Alle Räume auf dem %s-Server</string>
<string name="directory_server_placeholder">Name des Servers</string>
<string name="directory_server_all_rooms_on_server">Alle Räume auf %s</string>
<string name="directory_server_native_rooms">Alle nativen %s-Räume</string>
<string name="settings_user_interface">Bedienoberfläche</string>
<string name="settings_interface_language">Sprache</string>
@ -467,20 +467,20 @@
<string name="widget_integration_positive_power_level">Berechtigungslevel muss eine positive ganze Zahl sein.</string>
<string name="widget_integration_must_be_in_room">Du bist nicht Mitglied in diesem Raum.</string>
<string name="widget_integration_no_permission_in_room">Du hast keine Berechtigung, diese Aktion in diesem Raum auszuführen.</string>
<string name="widget_integration_missing_room_id">Anfrage beinhaltet keine Raum-ID.</string>
<string name="widget_integration_missing_room_id">room_id fehlt in der Anfrage.</string>
<string name="widget_integration_room_not_visible">Raum %s ist nicht sichtbar.</string>
<string name="room_add_matrix_apps">Integrationen hinzufügen</string>
<string name="settings_notification_ringtone">Benachrichtigungston</string>
<string name="widget_integration_failed_to_send_request">Anfrage konnte nicht gesendet werden.</string>
<string name="widget_integration_missing_user_id">Anfrage enthält keine user_id.</string>
<string name="widget_integration_missing_user_id">user_id fehlt in der Anfrage.</string>
<string name="light_theme">Helles Design</string>
<string name="dark_theme">Dunkles Design</string>
<string name="black_theme">Schwarzes Design</string>
<string name="notification_listening_for_events">Auf Ereignisse lauschen</string>
<string name="settings_containing_my_display_name">Nachrichten mit meinem Anzeigenamen</string>
<string name="settings_containing_my_user_name">Nachrichten mit meinen Benutzernamen</string>
<string name="you_added_a_new_device">Du hast die neue Sitzung \'%s\' hinzugefügt, die jetzt Verschlüsselungs-Schlüssel anfordert.</string>
<string name="your_unverified_device_requesting">Deine bislang nicht verifiziertes Sitzung \'%s\' fordert Verschlüsselungs-Schlüssel an.</string>
<string name="you_added_a_new_device">Du hast die neue Sitzung „%s“ hinzugefügt, die jetzt Verschlüsselungs-Schlüssel anfordert.</string>
<string name="your_unverified_device_requesting">Deine bislang nicht verifizierte Sitzung „%s“ fordert Verschlüsselungs-Schlüssel an.</string>
<string name="start_verification">Verifizierung beginnen</string>
<string name="call">Anruf</string>
<string name="notification_noisy_notifications">Laute Benachrichtigungen</string>
@ -572,7 +572,7 @@
<string name="command_description_op_user">Bestimmt das Berechtigungslevel des Benutzers</string>
<string name="command_description_deop_user">Setzt Berechtigungen des Benutzers zurück</string>
<string name="command_description_invite_user">Lädt Benutzer mit angegebener Kennung in den aktuellen Raum ein</string>
<string name="command_description_join_room">Raum mit angegebener Adresse beitreten</string>
<string name="command_description_join_room">Raum mit angegebener Adresse betreten</string>
<string name="command_description_part_room">Verlasse Raum</string>
<string name="command_description_topic">Raumthema ändern</string>
<string name="command_description_remove_user">Entfernt die Person angegebener ID</string>
@ -609,7 +609,7 @@
<string name="settings_send_typing_notifs">Schreibbenachrichtigungen senden</string>
<string name="settings_send_typing_notifs_summary">Lasse andere Benutzer wissen, dass du tippst.</string>
<string name="settings_send_markdown">Markdown-Formatierung</string>
<string name="settings_send_markdown_summary">Formatiere Nachrichten mittels Markdown-Syntax, bevor sie gesendet werden. Dies erlaubt erweiterte Formatierungen wie Sternchen (*), um kursiven Text anzuzeigen.</string>
<string name="settings_send_markdown_summary">Formatiere Nachrichten mittels Markdown-Syntax, bevor sie gesendet werden. Dies erlaubt erweiterte Formatierungen wie Sternchen, um kursiven Text anzuzeigen.</string>
<string name="settings_show_read_receipts">Lesebestätigungen zeigen</string>
<string name="settings_show_read_receipts_summary">Klicke auf die Lesebestätigungen für eine detailliertere Liste.</string>
<string name="settings_show_join_leave_messages_summary">Einladungen, Entfernungen und Verbannungen bleiben sichtbar.</string>
@ -626,7 +626,7 @@
<string name="settings_call_ringtone_title">Klingelton für eingehende Anrufe</string>
<string name="settings_call_ringtone_dialog_title">Wähle Klingelton für Anrufe:</string>
<string name="action_accept">Akzeptieren</string>
<string name="auth_accept_policies">Bitte lese und akzeptiere die Richtlinien dieses Homeservers:</string>
<string name="auth_accept_policies">Bitte lese und akzeptiere die Richtlinien dieses Heim-Servers:</string>
<string name="settings_troubleshoot_diagnostic_run_button_title">Tests ausführen</string>
<string name="settings_troubleshoot_diagnostic_running_status">Läuft … (%1$d von %2$d)</string>
<string name="settings_troubleshoot_diagnostic_failure_status_with_quickfix">Einer oder mehrere Tests sind fehlgeschlagen. Versuche vorgeschlagene Lösung(en).</string>
@ -637,7 +637,7 @@
\nBitte überprüfe die Systemeinstellungen.</string>
<string name="open_settings">Öffne Einstellungen</string>
<string name="settings_troubleshoot_test_account_settings_title">Kontoeinstellungen.</string>
<string name="settings_troubleshoot_test_account_settings_success">Benachrichtigungen sind für dein Konto eingeschaltet.</string>
<string name="settings_troubleshoot_test_account_settings_success">Benachrichtigungen sind für dein Konto aktiviert.</string>
<string name="settings_troubleshoot_test_account_settings_failed">Benachrichtigungen sind für dein Konto deaktiviert.
\nBitte überprüfe die Kontoeinstellungen.</string>
<string name="settings_troubleshoot_test_account_settings_quickfix">Aktiviere</string>
@ -686,7 +686,7 @@
<string name="done">Fertig</string>
<string name="settings_notification_advanced">Erweiterte Benachrichtigungseinstellungen</string>
<string name="settings_troubleshoot_test_bing_settings_title">Angepasste Einstellungen.</string>
<string name="settings_troubleshoot_test_bing_settings_success_with_warn">Beachte, dass einige Nachrichtentypen leise sind (erzeugen eine Benachrichtigung aber keinen Ton).</string>
<string name="settings_troubleshoot_test_bing_settings_success_with_warn">Beachte, dass einige Nachrichtentypen leise sind (erzeugen eine Benachrichtigung, aber keinen Ton).</string>
<string name="settings_troubleshoot_test_bing_settings_failed">Einige Benachrichtigungen sind in deinen erweiterten Einstellungen deaktiviert.</string>
<string name="settings_troubleshoot_test_fcm_failed_account_missing_quick_fix">Konto hinzufügen</string>
<string name="settings_noisy_notifications_preferences">Laute Benachrichtigungen einstellen</string>
@ -721,7 +721,7 @@
\nDieser Fehler liegt nicht unter der Kontrolle von ${app_name}. Er kann aus verschiedenen Gründen auftreten. Vielleicht wird es funktionieren, wenn du es später noch einmal probierst. Außerdem kannst Du prüfen, ob die Datennutzung der Google-Play-Dienste unbeschränkt ist und die Geräteuhr richtig eingestellt ist. Der Fehler kann aber auch unter Custom-ROMs auftreten.</string>
<string name="settings_troubleshoot_test_fcm_failed_account_missing">[%1$s]
\nDieser Fehler ist außerhalb von ${app_name} passiert. Es gibt kein Google-Konto auf dem Gerät. Bitte füge ein Google-Konto hinzu.</string>
<string name="settings_cryptography_manage_keys">Verwaltung der Kryptoschlüssel</string>
<string name="settings_cryptography_manage_keys">Verwaltung der Verschlüsselungs-Schlüssel</string>
<string name="encryption_settings_manage_message_recovery_summary">Schlüsselsicherung verwalten</string>
<string name="keys_backup_setup_step1_description">Nachrichten in verschlüsselten Räumen sind mit Ende-zu-Ende-Verschlüsselung gesichert. Nur du und der Empfänger haben die Schlüssel um diese Nachrichten zu lesen.
\n
@ -759,7 +759,7 @@
<string name="keys_backup_settings_untrusted_backup">Um die Schlüsselsicherung für diese Sitzung zu verwenden, stelle sie jetzt mit deiner Passphrase oder deinem Wiederherstellungsschlüssel wieder her.</string>
<string name="keys_backup_settings_delete_confirm_message">Deine gesicherten Schlüssel vom Server löschen\? Du wirst deinen Wiederherstellungsschlüssel nicht mehr nutzen können, um deinen verschlüsselten Nachrichtenverlauf zu lesen.</string>
<string name="sign_out_bottom_sheet_warning_no_backup">Beim Abmelden gehen deine verschlüsselten Nachrichten verloren</string>
<string name="sign_out_bottom_sheet_warning_backing_up">Schlüssel-Sicherung wird durchgeführt. Wenn du dich jetzt abmeldest, gehen deine verschlüsselten Nachrichten verloren.</string>
<string name="sign_out_bottom_sheet_warning_backing_up">Schlüsselsicherung läuft. Wenn du dich jetzt abmeldest, verlierst du den Zugriff auf deine verschlüsselten Nachrichten.</string>
<string name="sign_out_bottom_sheet_warning_backup_not_active">Schlüsselsicherung sollte bei allen Sitzungen aktiviert sein, um den Verlust verschlüsselter Nachrichten zu verhindern.</string>
<string name="sign_out_bottom_sheet_dont_want_secure_messages">Ich möchte meine verschlüsselten Nachrichten nicht</string>
<string name="sign_out_bottom_sheet_backing_up_keys">Sichere Schlüssel </string>
@ -781,7 +781,7 @@
<string name="keys_backup_setup_step2_skip_button_title">(Erweitert) Wiederherstellungsschlüssel einrichten</string>
<string name="keys_backup_setup_step3_success_title">Erfolg!</string>
<string name="keys_backup_setup_step3_text_line1">Deine Schlüssel wurden gesichert.</string>
<string name="keys_backup_setup_step3_text_line2">Dein Wiederherstellungsschlüssel ist ein Sicherungsnetz - du kannst es benutzen um den Zugriff auf deine verschlüsselten Nachrichten wiederherzustellen, falls du deine Passphrase vergisst.
<string name="keys_backup_setup_step3_text_line2">Dein Wiederherstellungsschlüssel ist ein Sicherungsnetz du kannst es benutzen, um den Zugriff auf deine verschlüsselten Nachrichten wiederherzustellen, falls du deine Passphrase vergisst.
\nVerwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie einem Passwortmanager (oder Safe)</string>
<string name="keys_backup_setup_step3_text_line2_no_passphrase">Bewahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie einem Passwortmanager (oder Safe) auf</string>
<string name="keys_backup_setup_step3_button_title_no_passphrase">Ich habe eine Kopie angefertigt</string>
@ -877,7 +877,7 @@
<string name="create_room_action_create">ERSTELLEN</string>
<string name="create_room_name_hint">Name</string>
<string name="create_room_public_title">Öffentlich</string>
<string name="create_room_public_description">Jeder wird diesem Raum beitreten können</string>
<string name="create_room_public_description">Jeder wird diesen Raum betreten können</string>
<string name="settings_integration_manager">Integrationsmanager</string>
<string name="key_share_request">Schlüsselaustausch anfragen</string>
<string name="keys_backup_setup_override_backup_prompt_description">Es sieht so aus, als hättest du bereits ein Setup-Schlüssel-Backup von einer anderen Sitzung. Möchtest du es durch das, was du gerade erstellt hast, ersetzen\?</string>
@ -1024,21 +1024,21 @@
<string name="report_content_inappropriate">Es ist unangebracht</string>
<string name="report_content_custom">Benutzerdefinierte Meldung </string>
<string name="report_content_custom_title">Diesen Inhalt melden</string>
<string name="report_content_custom_hint">Meldegrund</string>
<string name="report_content_custom_hint">Grund für Meldung des Inhalts</string>
<string name="report_content_custom_submit">MELDEN</string>
<string name="block_user">NUTZER IGNORIEREN</string>
<string name="content_reported_title">Inhalt gemeldet</string>
<string name="content_reported_content">Dieser Inhalt wurde gemeldet.
\n
\nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden.</string>
\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden.</string>
<string name="content_reported_as_spam_title">Als Spam gemeldet</string>
<string name="content_reported_as_spam_content">Dieser Inhalt wurde als Spam gemeldet.
\n
\nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden.</string>
\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden.</string>
<string name="content_reported_as_inappropriate_title">Als unangebracht gemeldet</string>
<string name="content_reported_as_inappropriate_content">Dieser Inhalt wurde als unangebracht gemeldet.
\n
\nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden.</string>
\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden.</string>
<string name="message_ignore_user">Nutzer ignorieren</string>
<string name="room_list_quick_actions_notifications_all_noisy">Alle Nachrichten (laut)</string>
<string name="room_list_quick_actions_notifications_all">Alle Nachrichten</string>
@ -1066,7 +1066,7 @@
<string name="settings_discovery_disconnect_identity_server_info">Eine Trennung von deinem Identitäts-Server würde bedeuten, dass du weder von anderen gefunden werden, noch diese per E-Mail oder Telefonnummer einladen kannst.</string>
<string name="settings_discovery_disconnect_with_bound_pid">Du teilst deine E-Mail-Adressen oder Telefonnummern momentan auf dem Identitäts-Server %1$s. Du wirst dich erneut mit %2$s verbinden müssen, um mit dem Teilen aufzuhören.</string>
<string name="settings_agree_to_terms">Stimme den Nutzungsbedingungen des Identitäts-Servers (%s) zu, um per E-Mail-Adresse oder Telefonnummer auffindbar zu sein zu können.</string>
<string name="error_handling_incoming_share">Zu teilende Daten nicht verarbeitbar</string>
<string name="error_handling_incoming_share">Konnte zu teilende Daten nicht verarbeiten</string>
<string name="login_splash_text3">Erweitere und personalisiere deine Erfahrung</string>
<string name="login_connect_to">Mit %1$s verbinden</string>
<string name="login_connect_to_modular">Mit Element Matrix Services verbinden</string>
@ -1092,7 +1092,7 @@
<string name="login_reset_password_error_not_found">Diese E-Mail-Adresse ist mit keinem Konto verknüpft</string>
<string name="login_reset_password_mail_confirmation_title">Prüfe deinen Posteingang</string>
<string name="login_reset_password_mail_confirmation_notice">Eine Bestätigungsmail wurde an %1$s versendet.</string>
<string name="login_reset_password_mail_confirmation_notice_2">Klicke auf den Link um dein neues Passwort zu bestätigen. Sobald du dem enthaltenen Link gefolgt bist, klicke unten.</string>
<string name="login_reset_password_mail_confirmation_notice_2">Tippe auf den Link um dein neues Passwort zu bestätigen. Sobald du dem enthaltenen Link gefolgt bist, klicke unten.</string>
<string name="login_reset_password_mail_confirmation_submit">Ich habe meine E-Mail-Adresse bestätigt</string>
<string name="login_reset_password_success_title">Erfolgreich!</string>
<string name="login_reset_password_success_notice">Dein Passwort wurde zurückgesetzt.</string>
@ -1140,7 +1140,7 @@
<string name="login_set_msisdn_notice2">Bitte verwende das internationale Format.</string>
<string name="login_set_msisdn_submit">Weiter</string>
<string name="login_msisdn_confirm_submit">Weiter</string>
<string name="login_msisdn_error_not_international">Internationale Telefonnummern müssen mit \'+\' beginnen</string>
<string name="login_msisdn_error_not_international">Internationale Telefonnummern müssen mit „+“ beginnen</string>
<string name="login_msisdn_error_other">Die Telefonnummer scheint ungültig zu sein. Bitte prüfen</string>
<string name="login_signup_to">Registrieren bei %1$s</string>
<string name="login_signup_username_hint">Benutzername</string>
@ -1221,10 +1221,10 @@
<string name="verification_sent">Verifizierung gesendet</string>
<string name="verification_request">Verifizierung angefragt</string>
<string name="verification_verify_device">Verifiziere diese Sitzung</string>
<string name="verification_scan_notice">Scanne den Code mit dem Gerät des Gegenüber für eine gegenseitige Überprüfung</string>
<string name="verification_scan_notice">Lasse den Code mit dem Gerät deines Gegenüber für eine gegenseitige Verifizierung einlesen</string>
<string name="verification_scan_their_code">Scanne Code des Anderen</string>
<string name="verification_scan_emoji_title">Kann nicht scannen</string>
<string name="verification_scan_emoji_subtitle">Wenn ihr nicht am selben Ort seid, vergleicht Emoji stattdessen</string>
<string name="verification_scan_emoji_title">Kann nicht einlesen</string>
<string name="verification_scan_emoji_subtitle">Wenn ihr nicht am selben Ort seid, vergleicht stattdessen Emoji</string>
<string name="verification_no_scan_emoji_title">Verifizieren via Emoji-Vergleich</string>
<string name="verification_verify_user">%s verifizieren</string>
<string name="verification_verified_user">%s verifiziert</string>
@ -1253,8 +1253,8 @@
<string name="room_member_power_level_admin_in">Administrator in %1$s</string>
<string name="room_member_power_level_moderator_in">Moderator in %1$s</string>
<string name="room_member_jump_to_read_receipt">Springen und als gelesen markieren</string>
<string name="rendering_event_error_type_of_event_not_handled">${app_name} kann keine Ereignisse vom Typ \'%1$s\'</string>
<string name="rendering_event_error_exception">${app_name} ist beim Verarbeiten des Ereignisinhalts mit der ID \'%1$s\' auf ein Problem gestoßen</string>
<string name="rendering_event_error_type_of_event_not_handled">${app_name} unterstützt keine Ereignisse vom Typ „%1$s“</string>
<string name="rendering_event_error_exception">${app_name} ist beim Verarbeiten des Ereignisinhalts mit der ID „%1$s“ auf ein Problem gestoßen</string>
<string name="unignore">Nicht ignorieren</string>
<string name="verify_cannot_cross_sign">Diese Sitzung kann diese Verifizierung nicht mit deinen anderen Sitzungen teilen.
\nDie Überprüfung wird lokal gespeichert und in einer zukünftigen Version der App freigegeben.</string>
@ -1269,8 +1269,8 @@
<string name="verification_request_notice">Um sicher zu gehen, verifiziere %s, indem ein einmaliger Code überprüft wird.</string>
<string name="verification_request_start_notice">Um sicher zu sein, tut dies persönlich oder verwendet einen anderen Kommunikationsweg.</string>
<string name="verification_emoji_notice">Vergleiche die einzigartigen Emoji und stell sicher, dass sie in derselben Reihenfolge angezeigt werden.</string>
<string name="verification_code_notice">Vergleiche den Code mit dem Code auf dem Bildschirm deines Gegenübers.</string>
<string name="verification_conclusion_ok_notice">Nachrichten mit diesem Gegenüber sind Ende-zu-Ende-verschlüsselt und können nicht von Dritten gelesen werden.</string>
<string name="verification_code_notice">Vergleiche den Code mit dem Code auf dem Bildschirm deines Gegenüber.</string>
<string name="verification_conclusion_ok_notice">Nachrichten mit dieser Person sind Ende-zu-Ende-verschlüsselt und können nicht von Dritten gelesen werden.</string>
<string name="verification_conclusion_ok_self_notice">Deine neue Sitzung ist jetzt verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Benutzer sehen sie als vertrauenswürdig an.</string>
<string name="encryption_information_cross_signing_state">Quersignierung</string>
<string name="encryption_information_dg_xsigning_complete">Quersignierung ist aktiviert,
@ -1374,7 +1374,7 @@
<string name="settings_notification_configuration">Benachrichtigungskonfiguration</string>
<string name="settings_messages_at_room">Nachrichten mit \"@room\"</string>
<string name="settings_messages_in_e2e_group_chat">Verschlüsselte Gruppenunterhaltungen</string>
<string name="command_description_plain">Sendet eine Nachricht als einfachen Text, ohne sie als Markdown zu interpretieren</string>
<string name="command_description_plain">Sendet eine Nachricht als Klartext, ohne sie als Markdown darzustellen</string>
<string name="auth_invalid_login_param_space_in_password">Inkorrekter Benutzername und/oder Passwort. Das eingegebene Passwort beginnt oder endet mit Leerzeichen, bitte kontrolliere es.</string>
<string name="message_key">Nachrichtenschlüssel</string>
<string name="recovery_passphrase">Wiederherstellungs-Passphrase</string>
@ -1494,7 +1494,7 @@
<string name="room_participants_ban_title">Benutzer bannen</string>
<string name="room_participants_ban_reason">Grund für den Bann</string>
<string name="room_participants_unban_title">Bann des Benutzers aufheben</string>
<string name="room_participants_unban_prompt_msg">Das Aufheben des Bannes wird dem Benutzer erlauben dem Raum wieder beizutreten.</string>
<string name="room_participants_unban_prompt_msg">Wenn du die Person entbannst, kann sie den Raum wieder betreten.</string>
<string name="settings_secure_backup_section_title">Verschlüsselte Sicherung</string>
<string name="settings_secure_backup_setup">Sicherung einrichten</string>
<string name="settings_secure_backup_reset">Sicherung zurücksetzen</string>
@ -1503,7 +1503,7 @@
<string name="reset_secure_backup_title">Generiere einen neuen Sicherheitsschlüssel oder setze eine neue Sicherheitspassphrase für dein existierendes Backup.</string>
<string name="reset_secure_backup_warning">Dieses wird deinen aktuellen Schlüssel oder deine aktuelle Phrase ersetzen.</string>
<string name="disabled_integration_dialog_title">Integrationen sind deaktiviert</string>
<string name="disabled_integration_dialog_content">Aktiviere \'Erlaube Integrationen\' in den Einstellungen um dies zu machen.</string>
<string name="disabled_integration_dialog_content">Aktiviere hierfür „Integrationen erlauben“ in den Einstellungen.</string>
<plurals name="room_settings_banned_users_count">
<item quantity="one">%d gebannter Benutzer</item>
<item quantity="other">%d gebannte Benutzer</item>
@ -1537,7 +1537,7 @@
<string name="login_signin_matrix_id_notice">Falls du ein Konto auf einem Heim-Server eingerichtet hast, verwende nachstehend deine Matrix-ID (z. B. @benutzer:domain.com) und dein Passwort.</string>
<string name="login_signin_matrix_id_hint">Matrix-ID</string>
<string name="login_signin_matrix_id_password_notice">Wenn du dein Passwort nicht weißt, gehe zurück um es zurücksetzen zu lassen.</string>
<string name="login_signin_matrix_id_error_invalid_matrix_id">Dies ist keine gültige Benutzerkennung. Erwartetes Format: \'@benutzer:homeserver.org\'</string>
<string name="login_signin_matrix_id_error_invalid_matrix_id">Dies ist keine gültige Benutzerkennung. Erwartetes Format: „@benutzer:homeserver.org“</string>
<string name="autodiscover_well_known_error">Es konnte kein gültiger Homeserver gefunden werden. Bitte prüfe deine Kennung</string>
<string name="send_a_sticker">Sticker</string>
<string name="room_profile_section_admin">Administrative Aktionen</string>
@ -1592,7 +1592,7 @@
<string name="room_settings_save_success">Du hast die Raumeinstellungen erfolgreich geändert</string>
<string name="notice_crypto_unable_to_decrypt_final">Du kannst auf diese Nachricht nicht zugreifen</string>
<string name="notice_crypto_unable_to_decrypt_friendly">Warte auf diese Nachricht. Das könnte eine Weile dauern</string>
<string name="notice_crypto_unable_to_decrypt_friendly_desc">Wegen der Ende-zu-Ende-Verschlüsselung könnte es sein, dass du auf jemandes Nachricht warten musst, weil die Schlüssel nicht ordnungsgemäß gesendet worden sind.</string>
<string name="notice_crypto_unable_to_decrypt_friendly_desc">Wegen der Ende-zu-Ende-Verschlüsselung könnte es sein, dass du auf jemandes Nachricht warten musst, weil die Schlüssel nicht ordnungsgemäß gesendet wurden.</string>
<string name="crypto_error_withheld_blacklisted">Du kannst auf diese Nachricht nicht zugreifen, weil der Sender dich blockiert hat</string>
<string name="crypto_error_withheld_unverified">Du kannst auf diese Nachricht nicht zugreifen, weil der Sender deiner Sitzung nicht vertraut</string>
<string name="crypto_error_withheld_generic">Du kannst auf diese Nachricht nicht zugreifen, weil der Sender absichtlich die Schlüssel nicht gesendet hat</string>
@ -1620,13 +1620,13 @@
<string name="auth_pin_new_pin_action">Neue PIN</string>
<string name="auth_pin_reset_content">Um deine PIN zurückzusetzen, musst du dich erneut anmelden und eine neue erstellen.</string>
<string name="settings_security_pin_code_title">Aktiviere PIN</string>
<string name="settings_security_pin_code_summary">Wenn du deine PIN zurücksetzen möchtest, tippe \"PIN vergessen\" um dich abzumelden und sie anschließend zurückzusetzen.</string>
<string name="settings_security_pin_code_summary">Wenn du deine PIN zurücksetzen möchtest, tippe auf „PIN vergessen“, um dich abzumelden und sie zurückzusetzen.</string>
<string name="settings_call_show_confirmation_dialog_title">Versehentliche Anrufe verhindern</string>
<string name="settings_call_show_confirmation_dialog_summary">Bitte um Bestätigung, bevor du einen Anruf tätigst</string>
<string name="bottom_sheet_setup_secure_backup_submit">Einrichten</string>
<string name="no_permissions_to_start_conf_call">Dir fehlt die Berechtigung in diesem Raum eine Konferenz zu starten</string>
<string name="video_meeting">Starte eine Videokonferenz</string>
<string name="audio_meeting">Starte eine Audiokonferenz</string>
<string name="video_meeting">Beginne eine Videokonferenz</string>
<string name="audio_meeting">Beginne eine Audiokonferenz</string>
<string name="audio_video_meeting_description">Konferenzen nutzen die Jitsi-Sicherheits- und Berechtigungsrichtlinien. Alle im Raum Anwesenden können während der Konferenz beitreten.</string>
<string name="cannot_call_yourself">Du kannst dich nicht selbst anrufen</string>
<string name="cannot_call_yourself_with_invite">Du kannst dich nicht selbst anrufen, warte bis Teilnehmer die Einladung annehmen</string>
@ -1650,7 +1650,7 @@
<item quantity="other">Falscher Code, %d verbleibende Versuche</item>
</plurals>
<string name="wrong_pin_message_last_remaining_attempt">Warnung! Letzter Versuch bevor du ausgeloggt wirst!</string>
<string name="too_many_pin_failures">Zu viele Fehler. Du wurdest ausgeloggt</string>
<string name="too_many_pin_failures">Zu viele Fehler, du wurdest abgemeldet</string>
<string name="auth_msisdn_already_defined">Diese Telefonnummer ist bereits registriert.</string>
<string name="settings_phone_number_empty">Deinem Konto wurde keine Telefonnummer hinzugefügt</string>
<string name="settings_emails">E-Mail-Adressen</string>
@ -1661,10 +1661,10 @@
<string name="settings_emails_and_phone_numbers_title">E-Mail und Telefon</string>
<string name="settings_emails_and_phone_numbers_summary">Verwalte E-Mail-Adressen und Telefonnummern, die mit deinem Matrix-Konto verknüpft sind</string>
<string name="settings_text_message_sent_hint">Code</string>
<string name="login_msisdn_notice">Verwende das internationale Format (Telefonnummer muss mit \'+\' beginnen)</string>
<string name="login_msisdn_notice">Bitte nutze das internationale Format (muss mit „+“ beginnen)</string>
<string name="confirm_your_identity_quad_s">Bestätige deine Identität, indem du dieses Login verifizierst, um Zugriff auf verschlüsselte Nachrichten zu erhalten.</string>
<string name="error_opening_banned_room">Raum, indem du gebannt wurdest, kann nicht geöffnet werden.</string>
<string name="room_error_not_found">Raum kann nicht gefunden werden. Stelle sicher, dass er existiert.</string>
<string name="error_opening_banned_room">Ein Raum, aus dem du verbannt wurdest, kann nicht geöffnet werden.</string>
<string name="room_error_not_found">Kann diesen Raum nicht finden. Stelle sicher, dass er existiert.</string>
<plurals name="seconds">
<item quantity="one">%d Sekunde</item>
<item quantity="other">%d Sekunden</item>
@ -1672,7 +1672,7 @@
<string name="sent_a_poll">Umfrage</string>
<string name="sent_a_reaction">Reagierte mit: %s</string>
<string name="universal_link_malformed">Der Link war fehlerhaft</string>
<string name="no_permissions_to_start_webrtc_call">Du bist nicht berechtigt, einen Anruf in diesem Raum zu starten</string>
<string name="no_permissions_to_start_webrtc_call">Du bist nicht berechtigt, einen Anruf in diesem Raum zu beginnen</string>
<string name="sent_verification_conclusion">Ergebnis der Überprüfung</string>
<string name="delete_account_data_warning">Kontodaten vom Typ %1$s löschen\?
\n
@ -1683,12 +1683,12 @@
<string name="settings_troubleshoot_test_push_loop_waiting_for_push">Die Applikation wartet auf den PUSH</string>
<string name="settings_troubleshoot_test_push_loop_title">Push testen</string>
<string name="search_banned_user_hint">Gebannte Nutzer filtern</string>
<string name="no_permissions_to_start_webrtc_call_in_direct_room">Du bist nicht berechtigt einen Anruf zu starten</string>
<string name="no_permissions_to_start_webrtc_call_in_direct_room">Du bist nicht berechtigt einen Anruf zu beginnen</string>
<string name="no_permissions_to_start_conf_call_in_direct_room">Du hast keine Berechtigung ein Konferenzgespräch zu starten</string>
<string name="settings_security_pin_code_notifications_summary_on">Details wie Raumnamen und Nachrichteninhalt zeigen.</string>
<string name="settings_security_pin_code_notifications_title">Inhalt in Benachrichtigungen anzeigen</string>
<string name="settings_security_pin_code_use_biometrics_summary_off">PIN-Code ist die einzige Möglichkeit ${app_name} zu entsperren.</string>
<string name="settings_security_pin_code_use_biometrics_summary_on">Aktiviere Gerät-spezifische Biometrie wie Fingerabdrücke und Gesichtserkennung.</string>
<string name="settings_security_pin_code_use_biometrics_summary_on">Aktiviere gerätespezifische Biometrie wie Fingerabdrücke und Gesichtserkennung.</string>
<string name="settings_security_pin_code_use_biometrics_title">Biometrie aktivieren</string>
<string name="settings_security_application_protection_screen_title">Schutz konfigurieren</string>
<string name="settings_security_application_protection_title">Zugriffsschutz</string>
@ -1726,10 +1726,10 @@
<string name="settings_troubleshoot_test_push_notification_content">Du siehst die Benachrichtigung! Klick mich!</string>
<string name="settings_troubleshoot_test_notification_title">Benachrichtigungsanzeige</string>
<string name="settings_security_pin_code_grace_period_summary_off">Bei jedem Öffnen von ${app_name} ist der PIN-Code erforderlich.</string>
<string name="settings_security_pin_code_grace_period_summary_on">PIN-Code ist erforderlich, nachdem ${app_name} 2 Minuten lang nicht verwendet wurde.</string>
<string name="settings_security_pin_code_grace_period_title">Fordere PIN nach 2 Minuten an</string>
<string name="settings_security_pin_code_grace_period_summary_on">PIN-Code ist erforderlich, nachdem ${app_name} zwei Minuten lang nicht verwendet wurde.</string>
<string name="settings_security_pin_code_grace_period_title">Erfrage PIN nach zwei Minuten</string>
<string name="settings_security_pin_code_notifications_summary_off">Nur die Anzahl ungelesener Nachrichten in der Benachrichtigung zeigen.</string>
<string name="attachment_type_dialog_title">Bild hinzufügen mit</string>
<string name="attachment_type_dialog_title">Füge Bild hinzu per</string>
<string name="warning_room_not_created_yet">Der Raum ist noch nicht erstellt. Raumerstellung abbrechen\?</string>
<string name="room_list_quick_actions_low_priority_add">Zu niedrige Priorität hinzufügen</string>
<string name="create_room_topic_hint">Thema</string>
@ -1742,7 +1742,7 @@
<string name="create_room_name_section">Raumname</string>
<string name="settings_export_trail">Prüfung exportieren</string>
<string name="room_member_open_or_create_dm">Direktnachricht</string>
<string name="send_bug_report_include_key_share_history">Verlauf der Anfragen von Schlüsselfreigaben senden</string>
<string name="send_bug_report_include_key_share_history">Schlüsselfreigabe-Anfragen übermitteln</string>
<string name="no_more_results">Keine weiteren Ergebnisse</string>
<string name="start_chatting">Beginne eine Unterhaltung</string>
<string name="settings_discovery_consent_action_give_consent">Autorisieren</string>
@ -1752,7 +1752,7 @@
<string name="direct_room_user_list_suggestions_title">Vorschläge</string>
<string name="direct_room_user_list_known_title">Bekannte Personen</string>
<string name="qr_code">QR-Code</string>
<string name="add_by_qr_code">Hinzufügen via QR-Code</string>
<string name="add_by_qr_code">Per QR-Code hinzufügen</string>
<string name="permissions_denied_add_contact">Gib die Erlaubnis, um auf die Kamera zu zugreifen.</string>
<string name="permissions_denied_qr_code">Um den QR-Code zu scannen, muss der Zugriff auf die Kamera erlaubt werden.</string>
<string name="room_alias_published_alias_title">Öffentliche Adressen</string>
@ -1762,7 +1762,7 @@
<string name="room_settings_room_read_history_dialog_subtitle">Änderungen daran, wer die Chronik lesen kann, gelten nur für kommende Nachrichten in diesem Raum. Die Sichtbarkeit der bestehenden Chronik bleibt unverändert.</string>
<string name="action_unpublish">Zurückziehen</string>
<string name="action_add">Hinzufügen</string>
<string name="share_by_text">Mit Nachricht teilen</string>
<string name="share_by_text">Per Nachricht teilen</string>
<string name="hide_advanced">Erweiterte Optionen ausblenden</string>
<string name="show_advanced">Erweiterte Optionen anzeigen</string>
<string name="room_alias_publish_to_directory_error">Die Sichtbarkeit des Raums konnte nicht abgerufen werden (%1$s).</string>
@ -1778,7 +1778,7 @@
<string name="user_code_share">Meinen Code teilen</string>
<string name="user_code_my_code">Mein Code</string>
<string name="user_code_scan">QR-Code einlesen</string>
<string name="not_a_valid_qr_code">Das ist kein korrekter QR-Code von Matrix</string>
<string name="not_a_valid_qr_code">Das ist kein korrekter Matrix-QR-Code</string>
<string name="invite_friends_rich_title">🔐️ Komm mit zu ${app_name}</string>
<string name="invite_friends_text">Hey, schreibe mit mir auf ${app_name}: %s</string>
<string name="invite_friends">Freunde einladen</string>
@ -1797,7 +1797,7 @@
<string name="create_room_disable_federation_description">Aktivieren, wenn der Raum nur von Mitgliedern deines Heim-Servers zur internen Kommunikation verwendet wird. Das kann später nicht mehr geändert werden.</string>
<string name="create_room_disable_federation_title">Begrenze Zugang zu diesem Raum (für immer!) auf Mitglieder von %s</string>
<string name="attachment_viewer_item_x_of_y">%1$d von %2$d</string>
<string name="room_preview_no_preview_join">Keine Vorschau für diesen Raum verfügbar. Willst du direkt beitreten\?</string>
<string name="room_preview_no_preview_join">Keine Vorschau für diesen Raum verfügbar. Willst du ihn betreten\?</string>
<string name="room_preview_not_found">Der Raum ist gerade nicht zugänglich.
\nVersuche es später nochmal, oder bitte einen Raum-Admin um Hilfe.</string>
<string name="room_alias_published_alias_add_manually">Eine neue Adresse veröffentlichen</string>
@ -1820,9 +1820,9 @@
<string name="room_permissions_change_room_name">Raumname ändern</string>
<string name="room_permissions_change_history_visibility">Sichtbarkeit des Verlaufs ändern</string>
<string name="room_permissions_enable_room_encryption">Raum-Verschlüsselung aktivieren</string>
<string name="room_permissions_change_main_address_for_the_room">Haupt-Adresse des Raums ändern</string>
<string name="room_permissions_change_main_address_for_the_room">Hauptadresse des Raums ändern</string>
<string name="room_permissions_change_room_avatar">Raumbild ändern</string>
<string name="room_permissions_modify_widgets">Widgets verändern</string>
<string name="room_permissions_modify_widgets">Widgets ändern</string>
<string name="room_permissions_notify_everyone">Jeden benachrichtigen</string>
<string name="room_permissions_remove_messages_sent_by_others">Von anderen gesendete Nachrichten entfernen</string>
<string name="room_permissions_ban_users">Nutzer verbannen</string>
@ -1830,7 +1830,7 @@
<string name="room_permissions_change_settings">Einstellungen ändern</string>
<string name="room_permissions_invite_users">Nutzer einladen</string>
<string name="room_permissions_send_messages">Nachrichten senden</string>
<string name="room_permissions_default_role">Standard Rolle</string>
<string name="room_permissions_default_role">Standard-Rolle</string>
<string name="room_permissions_title">Berechtigungen</string>
<string name="room_settings_permissions_title">Berechtigungen</string>
<string name="room_permissions_notice_read_only">Du hast nicht die Berechtigung zum Aktualisieren der Rollen, die zum Ändern verschiedener Teile des Raums erforderlich sind</string>
@ -1918,9 +1918,9 @@
</plurals>
<string name="settings_server_upload_size_unknown">Die Obergrenze ist nicht bekannt.</string>
<string name="settings_server_upload_size_content">Dein Heim-Server akzeptiert Anhänge (wie Dateien, Medien, etc.) mit einer Größe bis zu %s.</string>
<string name="settings_server_upload_size_title">Datei-Upload-Obergrenze des Servers</string>
<string name="settings_server_upload_size_title">Dateigrößenlimit des Servers</string>
<string name="settings_server_version">Serverversion</string>
<string name="settings_server_name">Servername</string>
<string name="settings_server_name">Server-Name</string>
<string name="room_list_quick_actions_room_settings">Raumeinstellungen</string>
<string name="jitsi_leave_conf_to_join_another_one_content">Derzeitige Konferenz verlassen und zu einer anderen wechseln\?</string>
<string name="room_settings_room_version_title">Raum-Version</string>
@ -1947,9 +1947,9 @@
<string name="space_type_public">Öffentlich</string>
<string name="create_spaces_you_can_change_later">Du kannst dies später ändern</string>
<string name="a11y_unchecked">Ungeprüft</string>
<string name="room_settings_room_access_public_description">Jeder kann den Raum finden und beitreten</string>
<string name="room_settings_room_access_public_description">Jeder kann den Raum finden und betreten</string>
<string name="room_settings_room_access_public_title">Öffentlich</string>
<string name="room_settings_room_access_private_description">Nur Eingeladene können es finden und beitreten</string>
<string name="room_settings_room_access_private_description">Nur sichtbar und zu betreten für Eingeladene</string>
<string name="room_settings_room_access_private_title">Privat</string>
<string name="room_settings_room_access_entry_unknown">Unbekannte Zugriffseinstellung (%s)</string>
<string name="room_settings_guest_access_title">Gästen erlauben beizutreten</string>
@ -1957,8 +1957,8 @@
<string name="spaces_header">Spaces</string>
<string name="room_settings_room_access_entry_knock">Jeder kann im Raum anklopfen, Mitglieder können dann zustimmen oder ablehnen</string>
<string name="invite_people_to_your_space_desc">Momentan bist nur du hier. Mit anderen Leuten wird %s noch viel besser.</string>
<string name="invite_to_space_with_name_desc">Diese werden in der Lage sein, %s zu durchsuchen</string>
<string name="invite_just_to_this_room_desc">Diese werden kein Teil von %s sein</string>
<string name="invite_to_space_with_name_desc">Sie wird in der Lage sein, %s zu durchsuchen</string>
<string name="invite_just_to_this_room_desc">Sie wird kein Teil von %s sein</string>
<string name="share_space_link_message">Tritt meinem Space %1$s %2$s bei</string>
<string name="spaces_beta_welcome_to_spaces_desc">Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren.</string>
<string name="space_add_existing_rooms">Räume oder Spaces hinzufügen</string>
@ -1975,11 +1975,11 @@
<string name="leave_space">Verlassen</string>
<string name="space_add_child_title">Räume hinzufügen</string>
<string name="space_explore_activity_title">Räume erkunden</string>
<string name="join_anyway">Trotzdem beitreten</string>
<string name="join_space">Space beitreten</string>
<string name="join_anyway">Dennoch betreten</string>
<string name="join_space">Space betreten</string>
<string name="create_space">Space erstellen</string>
<string name="invite_just_to_this_room">Nur zu diesem Raum</string>
<string name="invite_to_space_with_name">In Space \"%s\" einladen</string>
<string name="invite_to_space_with_name">Zu %s einladen</string>
<string name="invite_by_link">Link teilen</string>
<string name="invite_by_email">Mithilfe einer E-Mail-Adresse einladen</string>
<string name="invite_people_menu">Personen einladen</string>
@ -2002,7 +2002,7 @@
<string name="create_spaces_choose_type_label">Welche Art von Space möchtest du erstellen\?</string>
<string name="add_space">Space erstellen</string>
<string name="command_description_create_space">Space erstellen</string>
<string name="room_settings_room_access_restricted_description">Jeder, der sich in einem Space mit diesem Raum befindet, kann diesen Raum finden und ihm beitreten. Nur die Admins des Raums können diesen zu einem Space hinzufügen.</string>
<string name="room_settings_room_access_restricted_description">Jeder, der sich in einem Space mit diesem Raum befindet, kann diesen Raum finden und ihn betreten. Nur die Administration des Raums kann diesen zu einem Space hinzufügen.</string>
<string name="room_settings_room_access_restricted_title">Nur Space-Mitglieder</string>
<plurals name="space_people_you_know">
<item quantity="one">%d Person, die du kennst, ist bereits beigetreten</item>
@ -2031,7 +2031,7 @@
<string name="send_file_step_compressing_image">Komprimiere Bild </string>
<string name="use_as_default_and_do_not_ask_again">Als Standard festsetzen und nicht mehr fragen</string>
<string name="option_always_ask">Jedes Mal fragen</string>
<string name="directory_add_a_new_server_prompt">Gib den Namen eines neuen Servers ein, den du erkunden möchtest.</string>
<string name="directory_add_a_new_server_prompt">Gib den Namen des neuen Servers ein, den du erkunden möchtest.</string>
<string name="directory_add_a_new_server">Neuen Server hinzufügen</string>
<string name="directory_your_server">Dein Server</string>
<string name="send_feedback_space_info">Du verwendest die Betaversion von Spaces. Mit Feedback hilfst du uns, die nächsten Versionen zu verbessern. Dabei wird uns deine Platform übermittelt, damit wir deine Rückmeldung optimal nutzen können.</string>
@ -2044,7 +2044,7 @@
<string name="this_space_has_no_rooms">Dieser Space hat noch keine Räume</string>
<string name="spaces_no_server_support_description">Für weitere Infos kontaktiere bitte die Administration des Homeservers</string>
<string name="spaces_no_server_support_title">Dein Homeserver scheint Spaces noch nicht zu unterstützen</string>
<string name="space_leave_prompt_msg_as_admin">Du bist der einzige Admin von diesem Space. Wenn du ihn verlässt, hat niemand Kontrolle über ihn.</string>
<string name="space_leave_prompt_msg_as_admin">Du bist der einzige Admin dieses Spaces. Wenn du ihn verlässt, hat niemand Kontrolle über ihn.</string>
<string name="space_leave_prompt_msg_private">Du wirst diesen Raum ohne erneute Einladung nicht betreten können.</string>
<string name="space_leave_prompt_msg_only_you">Du bist die einzige Person hier. Wenn du den Space verlässt, ist er für immer verloren (eine lange Zeit).</string>
<string name="invite_to_space">Einladen in %s</string>
@ -2067,7 +2067,7 @@
<string name="error_failed_to_join_room">Beim Versuch %s beizutreten, ist leider ein Fehler aufgetreten</string>
<string name="room_upgrade_to_recommended_version">Zur empfohlenen Raumversion upgraden</string>
<string name="joining_replacement_room">Ersatzraum betreten</string>
<string name="command_description_upgrade_room">Raum zu neuer Version upgraden</string>
<string name="command_description_upgrade_room">Aktualisiert den Raum auf eine neue Version</string>
<string name="settings_server_room_version_stable">stabil</string>
<string name="settings_server_room_version_unstable">instabil</string>
<string name="settings_server_room_versions">Raumversionen 👓</string>
@ -2090,7 +2090,7 @@
<string name="upgrade_room_no_power_to_manage">Du benötigst die Berechtigung, um einen Raum upzugraden</string>
<string name="upgrade_room_update_parent_space">Übergeordneten Space automatisch updaten</string>
<string name="upgrade_room_auto_invite">Benutzer automatisch einladen</string>
<string name="upgrade_public_room_from_to">Du upgradest diesen Raum von %1$s zu %2$s.</string>
<string name="upgrade_public_room_from_to">Du aktualisierst diesen Raum von %1$s zu %2$s.</string>
<string name="upgrade_room_warning">Das Raumupgrade ist eine erweiterte Option und ist empfohlen wenn sich der Raum instabil verhält, von Sicherheitslücken betroffen ist oder Features fehlen.
\nNormalerweise ändert sich dadurch nur wie der Raum am Server verarbeitet wird.</string>
<string name="upgrade_private_room">Privaten Raum upgraden</string>
@ -2108,7 +2108,7 @@
<string name="select_spaces">Spaces wählen</string>
<string name="room_create_member_of_space_name_can_join">Mitglieder von %s können Räume finden, betrachten und betreten.</string>
<string name="room_settings_room_access_private_invite_only_title">Privat (Zutritt nur mit Einladung)</string>
<string name="settings_room_upgrades">Raumupgrades</string>
<string name="settings_room_upgrades">Raumaktualisierungen</string>
<string name="settings_messages_by_bot">Nachrichten von Bots</string>
<string name="settings_room_invitations">Raumeinladungen</string>
<string name="settings_encrypted_group_messages">Verschlüsselte Gruppennachrichten</string>
@ -2157,7 +2157,7 @@
<string name="call_tile_voice_call_has_ended">Sprachanruf beendet • %1$s</string>
<string name="room_settings_room_notifications_notify_me">Benachrichtige mich bei</string>
<string name="settings_mentions_at_room">\@room</string>
<string name="settings_notification_keyword_contains_invalid_character">Schlüsselwörter dürfen kein \"%s\" enthalten</string>
<string name="settings_notification_keyword_contains_invalid_character">Schlüsselwörter dürfen kein „%s“ enthalten</string>
<string name="settings_notification_keyword_contains_dot">Schlüsselwörter können nicht mit einem Punkt beginnen</string>
<string name="room_settings_none">Nichts</string>
<string name="call_ended_invite_timeout_title">Nicht erreicht</string>
@ -2187,14 +2187,14 @@
<string name="create_space_in_progress">Erstelle Space </string>
<string name="settings_developer_mode_show_info_on_screen_summary">Hilfreiche Informationen zur Fehlersuche anzeigen</string>
<string name="settings_developer_mode_show_info_on_screen_title">Debug-Info anzeigen</string>
<string name="does_not_look_like_valid_email">Das schaut nicht nach einer gültigen E-Mail-Adresse aus</string>
<string name="does_not_look_like_valid_email">Das scheint keine gültige E-Mail-Adresse zu sein</string>
<string name="user_directory_search_hint_2">Mittels Name, ID oder E-Mail-Adresse suchen</string>
<string name="create_new_space">Neuen Space erstellen</string>
<string name="room_settings_space_access_title">Zugriff</string>
<string name="room_settings_access_rules_pref_dialog_title">Wer hat Zugriff\?</string>
<string name="settings_notification_emails_enable_for_email">Benachrichtigungen per Email für %s aktivieren</string>
<string name="settings_notification_emails_enable_for_email">Benachrichtigungen per E-Mail für %s aktivieren</string>
<string name="settings_notification_emails_no_emails">Um Benachrichtigungen per E-Mail zu empfangen, musst du eine E-Mail-Adresse hinzufügen</string>
<string name="settings_notification_emails_category">Emailbenachrichtigungen</string>
<string name="settings_notification_emails_category">E-Mail-Benachrichtigungen</string>
<string name="room_permissions_upgrade_the_space">Space upgraden</string>
<string name="room_permissions_change_space_name">Namen vom Space ändern</string>
<string name="room_permissions_enable_space_encryption">Space verschlüsseln</string>
@ -2202,7 +2202,7 @@
<string name="room_permissions_change_space_avatar">Space-Icon ändern</string>
<string name="space_permissions_notice_read_only">Du hast nicht die Berechtigung, Rollenrechte zu bearbeiten</string>
<string name="space_settings_permissions_title">Space-Berechtigungen</string>
<string name="space_participants_unban_prompt_msg">Wenn du die Person entbannst, kann sie wieder beitreten.</string>
<string name="space_participants_unban_prompt_msg">Wenn du die Person entbannst, kann sie den Space wieder betreten.</string>
<string name="space_participants_ban_prompt_msg">Die Verbannung einer Person entfernt sie aus diesem Space und hindert sie am erneuten Beitritt.</string>
<string name="space_participants_remove_prompt_msg">Kicken entfernt die Person aus dem Space
\n
@ -2222,9 +2222,9 @@
<string name="command_description_room_name">Ändert den Raumnamen</string>
<string name="command_description_unignore_user">Entblockt eine Person und zeigt deren Nachrichten wieder an</string>
<string name="command_description_ignore_user">Blockiert eine Person und versteckt deren Nachrichten</string>
<string name="room_settings_space_access_public_description">Jeder kann den Space finden und beitreten</string>
<string name="room_settings_space_access_public_description">Jeder kann den Space finden und betreten</string>
<string name="room_settings_room_notifications_manage_notifications">Du kannst deine Benachrichtigungen in den %1$s verwalten.</string>
<string name="room_settings_room_notifications_encryption_notice">Beachte, dass Benachrichtigungen zu Erwähnungen und Schlüsselwörtern in verschlüsselten Räumen momentan nicht verfügbar sind.</string>
<string name="room_settings_room_notifications_encryption_notice">Bitte beachte, dass Benachrichtigungen zu Erwähnungen und Schlüsselwörtern in verschlüsselten Räumen mobil nicht verfügbar sind.</string>
<string name="space_permissions_notice">Wähle die Berechtigungen der Rollen aus</string>
<string name="space_settings_permissions_subtitle">Rollen deren Berechtigungen einsehen und bearbeiten.</string>
<plurals name="create_poll_not_enough_options_error">
@ -2252,8 +2252,8 @@
<string name="notification_listening_for_notifications">Auf Benachrichtigungen warten</string>
<string name="legals_third_party_notices">Externe Bibliotheken</string>
<string name="analytics_opt_in_list_item_3">Du kannst dies jederzeit in den Einstellungen deaktivieren</string>
<string name="analytics_opt_in_list_item_2">Wir teilen <b>keine</b> Informationen mit Drittpersonen</string>
<string name="analytics_opt_in_list_item_1">Wir erfassen und analysieren <b>keine</b> Accountdaten</string>
<string name="analytics_opt_in_list_item_2">Wir teilen <b>keine</b> Informationen mit Dritten</string>
<string name="analytics_opt_in_list_item_1">Wir erfassen und analysieren <b>keine</b> Kontodaten</string>
<string name="analytics_opt_in_content">Hilf uns dabei Probleme zu identifizieren und ${app_name} zu verbessern, indem du anonyme Nutzungsdaten teilst. Um zu verstehen, wie Personen mehrere Geräte benutzen, werden wir eine zufällige Kennung generieren, die zwischen deinen Geräten geteilt wird.
\n
\n%s kannst du alle unsere Bedingungen lesen.</string>
@ -2269,7 +2269,7 @@
<string name="preference_help">Hilfe</string>
<string name="preference_root_legals">Rechtliches</string>
<string name="decide_which_spaces_can_access">Entscheide, welche Spaces Zugriff auf den Raum haben sollen. Die Mitglieder der Spaces können diesen Räumen betreten.</string>
<string name="analytics_opt_in_content_link">hier</string>
<string name="analytics_opt_in_content_link">Hier</string>
<string name="analytics_opt_in_title">Hilf mit, ${app_name} zu verbessern</string>
<string name="action_enable">Aktivieren</string>
<string name="room_member_override_nick_color">Farbe des Anzeigenamens ändern</string>
@ -2305,14 +2305,14 @@
<string name="legals_no_policy_provided">Dieser Server stellt keine Richtlinie bereit.</string>
<string name="legals_identity_server_title">Richtlinie deines Identitäts-Servers</string>
<string name="legals_home_server_title">Richtlinie deines Heim-Servers</string>
<string name="legals_application_title">${app_name} Richtlinie</string>
<string name="legals_application_title">Richtlinie von ${app_name}</string>
<string name="tooltip_attachment_poll">Abstimmung erstellen</string>
<string name="tooltip_attachment_contact">Kontakte öffnen</string>
<string name="tooltip_attachment_sticker">Sticker verschicken</string>
<string name="tooltip_attachment_file">Datei hochladen</string>
<string name="tooltip_attachment_gallery">Verschicke Fotos und Videos</string>
<string name="tooltip_attachment_photo">Kamera öffnen</string>
<string name="delete_poll_dialog_content">Willst du diese Umfrage wirklich entfernen\? Du wirst sie nicht wiederherstellen können.</string>
<string name="delete_poll_dialog_content">Willst du diese Abstimmung wirklich entfernen\? Du wirst sie nicht wiederherstellen können.</string>
<string name="delete_poll_dialog_title">Abstimmung entfernen</string>
<string name="poll_end_room_list_preview">Abstimmung beendet</string>
<string name="poll_response_room_list_preview">Stimme abgegeben</string>
@ -2332,12 +2332,12 @@
<string name="location_not_available_dialog_content">${app_name} konnte nicht auf deinen Standort zugreifen. Bitte versuche es später noch einmal.</string>
<string name="location_not_available_dialog_title">${app_name} konnte nicht auf deinen Standort zugreifen</string>
<string name="location_activity_title_preview">Standort</string>
<string name="closed_poll_option_description">Ergebnisse werden erst angezeigt, wenn du die Umfrage beendest</string>
<string name="closed_poll_option_title">Geschlossene Umfrage</string>
<string name="open_poll_option_description">Ergebnisse werden direkt nach Stimmabgabe angezeigt</string>
<string name="open_poll_option_title">Offene Umfrage</string>
<string name="poll_type_title">Umfragetyp</string>
<string name="edit_poll_title">Umfrage bearbeiten</string>
<string name="closed_poll_option_description">Die Ergebnisse werden erst sichtbar, sobald du die Umfrage beendest</string>
<string name="closed_poll_option_title">Abgeschlossene Abstimmung</string>
<string name="open_poll_option_description">Abstimmende können die Ergebnisse nach Stimmabgabe sehen</string>
<string name="open_poll_option_title">Laufende Abstimmung</string>
<string name="poll_type_title">Abstimmungsart</string>
<string name="edit_poll_title">Abstimmung bearbeiten</string>
<string name="poll_no_votes_cast">Keine Stimmen abgegeben</string>
<string name="login_splash_create_account">Konto erstellen</string>
<string name="ftue_auth_carousel_workplace_title">Kommunikation für dein Team.</string>
@ -2362,7 +2362,7 @@
<string name="ftue_auth_use_case_join_existing_server">Möchtest du einem existierenden Server beitreten\?</string>
<string name="ftue_auth_use_case_option_three">Communities</string>
<string name="ftue_auth_use_case_option_two">Teams</string>
<string name="ftue_auth_use_case_subtitle">Wir helfen dir, in Verbindung zu kommen</string>
<string name="ftue_auth_use_case_subtitle">Wir helfen dir, dich zu vernetzen</string>
<string name="ftue_auth_use_case_title">Mit wem wirst du am meisten schreiben\?</string>
<string name="action_thread_copy_link_to_thread">Link zu Thread kopieren</string>
<string name="action_view_threads">Threads anzeigen</string>
@ -2416,7 +2416,7 @@
<string name="call_start_screen_sharing">Bildschirm teilen</string>
<string name="action_try_it_out">Probiere es aus</string>
<string name="location_share_live_until">Echtzeit bis %1$s</string>
<string name="unifiedpush_getdistributors_dialog_title">Wähle Deine Benachrichtigungsmethode</string>
<string name="unifiedpush_getdistributors_dialog_title">Wähle deine Benachrichtigungsmethode</string>
<string name="labs_enable_live_location_summary">Vorläufige Implementierung: Standorte verbleiben im Raumverlauf</string>
<string name="push_gateway_item_profile_tag">Profil-Tag:</string>
<string name="time_unit_hour_short">h</string>
@ -2523,7 +2523,7 @@
<string name="send_feedback_threads_info">Threads sind noch in Arbeit, und es stehen neue, aufregende Funktionen an, wie z. B. verbesserte Benachrichtigungen. Wir würden uns sehr über Dein Feedback freuen!</string>
<string name="direct_room_encryption_enabled_tile_description_future">Nachrichten in dieser Unterhaltung werden Ende-zu-Ende-verschlüsselt.</string>
<string name="ftue_auth_captcha_title">Bist du ein Mensch\?</string>
<string name="ftue_auth_terms_subtitle">Bitte lies dir %ss Bedingungen und Richtlinien durch</string>
<string name="ftue_auth_terms_subtitle">Bitte lies dir die Bedingungen und Richtlinien von %s durch</string>
<string name="ftue_auth_terms_title">Server-Richtlinien</string>
<string name="ftue_auth_email_verification_subtitle">Folge den Anweisungen, die an %s gesendet wurden</string>
<string name="ftue_auth_email_verification_title">E-Mail bestätigen</string>
@ -2741,8 +2741,8 @@
<string name="some_devices_will_not_be_able_to_decrypt">⚠ Es befinden sich nicht verifizierte Geräte in diesem Raum. Sie werden deine Nachrichten nicht entschlüsseln können.</string>
<string name="encryption_never_send_to_unverified_devices_in_room">Niemals verschlüsselte Nachrichten zu unverifizierten Sitzungen in diesem Raum senden.</string>
<string name="action_got_it">Verstanden</string>
<string name="labs_enable_rich_text_editor_summary">Probiere den Rich-Text-Editor aus (bald auch mit Plain-Text-Modus)</string>
<string name="labs_enable_rich_text_editor_title">Aktiviere Rich-Text-Editor</string>
<string name="labs_enable_rich_text_editor_summary">Probiere den Textverarbeitungs-Editor (bald auch mit Klartext-Modus)</string>
<string name="labs_enable_rich_text_editor_title">Textverarbeitungs-Editor aktivieren</string>
<string name="device_manager_session_details_device_browser">Browser</string>
<string name="rich_text_editor_format_strikethrough">Durchgestrichen formatieren</string>
<string name="rich_text_editor_format_italic">Kursiv formatieren</string>
@ -2784,9 +2784,9 @@
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Beginne auf dem Anmeldebildschirm</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Wähle „Mit QR-Code anmelden“</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Beginne auf dem Anmeldebildschirm</string>
<string name="qr_code_login_new_device_instruction_3">Wähle \'QR-Code auf diesem Gerät anzeigen\'</string>
<string name="qr_code_login_new_device_instruction_2">Gehe zu Einstellungen -&gt; Sicherheit und Privatsphäre -&gt; Alle Sitzungen anzeigen</string>
<string name="qr_code_login_new_device_instruction_1">Öffne ${app_name} auf deinem anderen Gerät</string>
<string name="qr_code_login_new_device_instruction_3">Wähle „QR-Code anzeigen“</string>
<string name="qr_code_login_new_device_instruction_2">Gehe zu Einstellungen -&gt; Sicherheit und Privatsphäre</string>
<string name="qr_code_login_new_device_instruction_1">Öffne die App auf deinem anderen Gerät</string>
<string name="qr_code_login_header_failed_denied_description">Die Anfrage wurde auf dem anderen Gerät abgelehnt.</string>
<string name="qr_code_login_header_failed_timeout_description">Die Verbindung konnte nicht in der erforderlichen Zeit hergestellt werden.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Verbindung mit diesem Gerät nicht unterstützt.</string>
@ -2797,11 +2797,42 @@
<string name="qr_code_login_header_show_qr_code_new_device_description">Benutze dein angemeldetes Gerät um den unten angezeigten QR-Code einzulesen:</string>
<string name="qr_code_login_header_show_qr_code_title">Mit QR-Code anmelden</string>
<string name="qr_code_login_header_scan_qr_code_description">Benutze die Kamera auf diesem Gerät um den vom anderen Gerät angezeigten QR-Code zu scannen:</string>
<string name="qr_code_login_header_scan_qr_code_title">QR-Code scannen</string>
<string name="qr_code_login_header_scan_qr_code_title">QR-Code einlesen</string>
<string name="three">3</string>
<string name="two">2</string>
<string name="one">1</string>
<string name="device_manager_sessions_sign_in_with_qr_code_description">Du kannst dieses Gerät benutzen um ein anderes Gerät per QR-Code anzumelden. Dafür gibt es zwei Wege:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Mit QR-Code anmelden</string>
<string name="login_scan_qr_code">QR-Code scannen</string>
<string name="login_scan_qr_code">QR-Code einlesen</string>
<string name="labs_enable_voice_broadcast_summary">Zeichne Sprachnachrichten auf, während du sie in Echtzeit in den Raumverlauf sendest.</string>
<string name="labs_enable_voice_broadcast_title">Sprachübertragung aktivieren (in aktiver Entwicklung)</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Der Heim-Server unterstützt Anmelden per QR-Code nicht.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Die Anmeldung wurde vom anderen Gerät abgebrochen.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Der QR-Code ist ungültig.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Das andere Gerät muss angemeldet sein.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Das andere Gerät ist bereits angemeldet.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Es ist ein Problem bei der Herstellung der sicheren Kommunikation aufgetreten. Eines der folgenden Dinge könnte kompromittiert sein: Dein Heim-Server; deine Internetverbindung(en); dein(e) Gerät(e);</string>
<string name="qr_code_login_header_failed_other_description">Die Anfrage ist fehlgeschlagen.</string>
<string name="a11y_play_voice_broadcast">Abspielen oder fortsetzen der Sprachübertragung</string>
<string name="a11y_resume_voice_broadcast_record">Fortsetzen der Sprachübertragung</string>
<string name="a11y_voice_broadcast_buffering">Puffere</string>
<string name="a11y_pause_voice_broadcast">Pausiere Sprachübertragung</string>
<string name="a11y_stop_voice_broadcast_record">Stoppe Aufzeichnung der Sprachübertragung</string>
<string name="a11y_pause_voice_broadcast_record">Pausiere Aufzeichnung der Sprachübertragung</string>
<string name="voice_broadcast_live">Live</string>
<string name="attachment_type_selector_sticker">Sticker</string>
<string name="device_manager_other_sessions_select">Sitzungen auswählen</string>
<string name="attachment_type_selector_contact">Kontakt</string>
<string name="attachment_type_selector_camera">Kamera</string>
<string name="attachment_type_selector_location">Standort</string>
<string name="attachment_type_selector_poll">Umfragen</string>
<string name="attachment_type_selector_voice_broadcast">Sprachübertragung</string>
<string name="attachment_type_selector_file">Anhänge</string>
<string name="attachment_type_selector_gallery">Fotobibliothek</string>
<string name="action_deselect_all">Alle abwählen</string>
<string name="action_select_all">Alle auswählen</string>
<plurals name="x_selected">
<item quantity="one">%1$d ausgewählt</item>
<item quantity="other">%1$d ausgewählt</item>
</plurals>
</resources>

View File

@ -2754,9 +2754,9 @@
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Alusta sisselogimisvaatest</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Vali „Logi võrku QR-koodi abil“</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Alusta sisselogimisvaatest</string>
<string name="qr_code_login_new_device_instruction_3">Vali „Näita selles seadmes QR-koodi“</string>
<string name="qr_code_login_new_device_instruction_2">Ava Seadistused -&gt; Turvalisus ja privaatsus -&gt; Näita kõiki sessioone</string>
<string name="qr_code_login_new_device_instruction_1">Ava ${app_name} oma teises seades</string>
<string name="qr_code_login_new_device_instruction_3">Vali „Näita QR-koodi“</string>
<string name="qr_code_login_new_device_instruction_2">Ava Seadistused -&gt; Turvalisus ja privaatsus</string>
<string name="qr_code_login_new_device_instruction_1">Ava sama rakendus oma teises seades</string>
<string name="qr_code_login_header_failed_denied_description">Teine seade lükkas päringu tagasi.</string>
<string name="qr_code_login_header_failed_timeout_description">Sidumine ei lõppenud etteantud aja jooksul.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Sidumine selle seadmega ei ole toetatud.</string>
@ -2796,4 +2796,35 @@
<string name="permissions_rationale_msg_notification">${app_name} vajab teavituste näitamiseks õigusi. Teavituste sisuks võivad olla sulle saadetud sõnumid, kutsed ja muud olulist.
\n
\nJärgmistes vaadetes palun anna sellele rakendusele teavituste kuvamiseks vajalikud õigused.</string>
<string name="labs_enable_voice_broadcast_summary">Võimalus salvestada ja postitada ringhäälingukõnesid jututoa ajajoonele.</string>
<string name="labs_enable_voice_broadcast_title">Võta kasutusele ringhäälingukõned (aktiivses arenduses)</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Koduserver ei toeta muude seadmete võrku logimise võimalust.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Sisselogimine katkestati teises seadmes.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">See QR-kood on vigane.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Teine seade peab olema võrku loginud.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Teine seade on juba võrku loginud.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Turvalise sõnumivahetuse ülesseadmisel tekkis turvaviga. Üks kolmest võib olla sattunud vale osapoole kontrolli alla: sinu koduserver, sinu internetiühendus või sinu seade;</string>
<string name="qr_code_login_header_failed_other_description">Päring ei õnnestunud.</string>
<string name="a11y_voice_broadcast_buffering">Andmed on puhverdamisel</string>
<string name="a11y_play_voice_broadcast">Alusta või jätka ringhäälingukõne esitamist</string>
<string name="a11y_stop_voice_broadcast_record">Lõpeta ringhäälingukõne salvestamine</string>
<string name="a11y_pause_voice_broadcast_record">Peata ringhäälingukõne salvestamine</string>
<string name="a11y_resume_voice_broadcast_record">Jätka ringhäälingukõne salvestamist</string>
<string name="a11y_pause_voice_broadcast">Peata ringhäälingukõne esitamine</string>
<string name="voice_broadcast_live">Otse eetris</string>
<string name="device_manager_other_sessions_select">Vali sessioonid</string>
<string name="attachment_type_selector_contact">Kontakt</string>
<string name="attachment_type_selector_camera">Kaamera</string>
<string name="attachment_type_selector_location">Asukoht</string>
<string name="attachment_type_selector_poll">Küsitlused</string>
<string name="attachment_type_selector_voice_broadcast">Ringhäälingukõne</string>
<string name="attachment_type_selector_file">Manused</string>
<string name="attachment_type_selector_sticker">Kleepsud</string>
<string name="attachment_type_selector_gallery">Fotode kogu</string>
<string name="action_deselect_all">Eemalda kõik valikud</string>
<string name="action_select_all">Vali kõik</string>
<plurals name="x_selected">
<item quantity="one">%1$d valitud</item>
<item quantity="other">%1$d valitud</item>
</plurals>
</resources>

View File

@ -2726,4 +2726,80 @@
<string name="grant_permission">اعطای دسترسی</string>
<string name="labs_enable_rich_text_editor_summary">ویرایشگر متن غنی را بیازمایید (حالت متن خام به زودی)</string>
<string name="labs_enable_rich_text_editor_title">به کار انداختن ویرایشگر متن غنی</string>
<string name="device_manager_verification_status_detail_other_session_unknown">برای آشکارسازی وضعیت تأیید نشست کنونیتان، تأییدش کنید.</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">کارساز خانگی از ورود با کد QR پشتیبانی نمی‌کند.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">ورود روی افزارهٔ دیگر لغو شد.</string>
<string name="labs_enable_session_manager_summary">دید و واپایش بیش‌تری روی نشست‌هایتان داشته باشید.</string>
<string name="qr_code_login_header_failed_denied_description">درخواست روی افزارهٔ دیگر رد شد.</string>
<string name="qr_code_login_header_failed_timeout_description">پیوند در مدّت مقرّر کامل نشد‌.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">افزارهٔ دیگر باید وارد شده باشد.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">افزارهٔ دیگر از پیش وارد شده.</string>
<string name="qr_code_login_new_device_instruction_2">به تنظیمات -&gt; امنیت و محرمانگی بروید</string>
<string name="qr_code_login_new_device_instruction_1">کاره را روی افزارهٔ دیگرتان بگشایید</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">پیوند دادن با این افزاره پشتیبانی نمی‌شود.</string>
<string name="labs_enable_voice_broadcast_title">به کار انداختن پخش صدا (زیر توسعهٔ فعّال)</string>
<string name="qr_code_login_show_qr_code_button">نمایش کد QR روی این افزاره</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">آغاز در صفحهٔ ورود</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">گزینش‌«ورود با کد QR»</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">آغاز در صفحهٔ ورود</string>
<string name="device_manager_push_notifications_description">گرفتن آگاهی‌های ارسالی روی این نشست.</string>
<string name="a11y_play_voice_broadcast">پخش یا مکث پخش صدا</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">کد QR نامعتبر است.</string>
<string name="qr_code_login_signing_in_a_mobile_device">وارد شدن در افزاره‌ای همراه؟</string>
<string name="qr_code_login_header_show_qr_code_title">ورود با کد QR</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">ورود با کد QR</string>
<string name="a11y_stop_voice_broadcast_record">توقّف ضبط پخش صدا</string>
<string name="a11y_pause_voice_broadcast_record">مکث ضبط پخش صدا</string>
<string name="a11y_resume_voice_broadcast_record">از سر گیری ضبط پخش صدا</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">گزینش «نمایش کد QR»</string>
<string name="qr_code_login_new_device_instruction_3">گزینش «نمایش کد QR»</string>
<string name="labs_enable_client_info_recording_title">به کار انداختن ضبط اطّلاعات کارخواه</string>
<string name="labs_enable_session_manager_title">به کار انداختن مدیر نشست جدید</string>
<string name="a11y_pause_voice_broadcast">مکث پخش صدا</string>
<string name="qr_code_login_header_failed_other_description">درخواست شکست خورد.</string>
<string name="qr_code_login_signing_in">وارد کردنتان</string>
<string name="qr_code_login_connecting_to_device">وصل شدن به افزاره</string>
<string name="qr_code_login_scan_qr_code_button">پویش کد QR</string>
<string name="qr_code_login_header_connected_title">اتّصال امن برقرار شده</string>
<string name="qr_code_login_header_scan_qr_code_title">پویش کد QR</string>
<string name="login_scan_qr_code">پویش کد QR</string>
<string name="rich_text_editor_format_underline">اعمال قالب زیرخط‌دار</string>
<string name="rich_text_editor_format_strikethrough">اعمال قالب خط‌خورده</string>
<string name="rich_text_editor_format_italic">اعمال قالب کج</string>
<string name="rich_text_editor_format_bold">اعمال قالب توپر</string>
<string name="device_manager_verification_status_unknown">وضعیت تأیید نامعلوم</string>
<string name="device_manager_other_sessions_select">گزینش نشست‌ها</string>
<string name="attachment_type_selector_voice_broadcast">پخش صدا</string>
<string name="attachment_type_selector_gallery">کتابخانهٔ عکس</string>
<string name="qr_code_login_try_again">دوباره تلاش کنید</string>
<string name="qr_code_login_status_no_match">مطابق نیستند؟</string>
<string name="qr_code_login_header_failed_title">اتّصال ناموفّق</string>
<string name="device_manager_session_details_device_operating_system">سیستم‌عامل</string>
<string name="device_manager_push_notifications_title">آگاهی‌های ارسالی</string>
<string name="push_gateway_item_device_id">شناسهٔ نشست:</string>
<string name="attachment_type_selector_contact">آشنا</string>
<string name="attachment_type_selector_camera">دوربین</string>
<string name="attachment_type_selector_location">مکان</string>
<string name="attachment_type_selector_poll">نظرسنجی‌ها</string>
<string name="attachment_type_selector_file">پیوست‌ها</string>
<string name="attachment_type_selector_sticker">برچسب‌ها</string>
<string name="a11y_voice_broadcast_buffering">میانگیری</string>
<string name="voice_broadcast_live">زنده</string>
<string name="qr_code_login_confirm_security_code">تأیید</string>
<string name="three">۳</string>
<string name="two">۲</string>
<string name="one">۱</string>
<string name="device_manager_session_details_device_model">مدل</string>
<string name="device_manager_session_details_device_browser">مرورگر</string>
<string name="device_manager_session_details_application_url">نشانی</string>
<string name="device_manager_session_details_application_version">نگارش</string>
<string name="device_manager_session_details_application_name">نام</string>
<string name="device_manager_session_details_application">برنامه</string>
<string name="push_gateway_item_enabled">به کار افتاده:</string>
<string name="action_deselect_all">ناگزینش همه</string>
<string name="action_select_all">گزینش همه</string>
<plurals name="x_selected">
<item quantity="one">۱ گزیده</item>
<item quantity="other">%1$d گزیده</item>
</plurals>
</resources>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="notice_room_invite_no_invitee">Käyttäjän %s kutsu</string>
<string name="notice_room_invite">%1$s kutsui käyttäjän %2$s</string>
<string name="notice_room_invite_you">%1$s kutsui sinut</string>
@ -401,7 +401,7 @@
<string name="media_saving_period_1_month">1 kuukausi</string>
<string name="media_saving_period_forever">Ikuisesti</string>
<string name="settings_theme">Teema</string>
<string name="font_size">Kirjaisinkoko</string>
<string name="font_size">Fontin koko</string>
<string name="tiny">Pienin</string>
<string name="small">Pieni</string>
<string name="normal">Normaali</string>
@ -955,8 +955,8 @@
<string name="settings_push_gateway_no_pushers">Ei rekisteröityjä viesti-ilmoitusten yhdyskäytäviä</string>
<string name="push_gateway_item_app_id">app_id:</string>
<string name="push_gateway_item_push_key">push_key:</string>
<string name="push_gateway_item_app_display_name">app_display_name:</string>
<string name="push_gateway_item_device_name">device_name:</string>
<string name="push_gateway_item_app_display_name">Sovelluksen näyttönimi:</string>
<string name="push_gateway_item_device_name">Istunnon näyttönimi:</string>
<string name="push_gateway_item_format">Formaatti:</string>
<string name="settings_troubleshoot_test_token_registration_quick_fix">Rekisteröi tunniste</string>
<string name="send_file_step_encrypting_thumbnail">Salataan pikkukuvaa…</string>
@ -1039,7 +1039,7 @@
<string name="login_registration_not_supported">Sovellus ei pysty luomaan uusia tunnuksia tälle kotipalvelimelle.
\n
\nHaluatko rekisteröityä web-klientillä\?</string>
<string name="login_login_with_email_error">Tämä sähköpostiosoite ei ole liitettynä mihinkään tunnukseen.</string>
<string name="login_login_with_email_error">Tämä sähköpostiosoite ei ole liitettynä mihinkään tiliin.</string>
<string name="login_reset_password_on">Palauta salasana palvelimella %1$s</string>
<string name="login_reset_password_notice">Sähköpostiisi lähetetään viesti uuden salananan asettamiseksi.</string>
<string name="login_reset_password_submit">Seuraava</string>
@ -1048,7 +1048,7 @@
<string name="login_reset_password_warning_title">Varoitus!</string>
<string name="login_reset_password_warning_content">Salasanan vaihtaminen nollaa kaikki osapuolten välisen salauksen avaimet kaikilla laitteillasi, joka estää sinua lukemasta vanhoja viestejä. Ota käyttöön avainten varmuuskopiointi tai vie huoneen avaimet toiselta laitteelta ennen kuin vaihdat salasanasi.</string>
<string name="login_reset_password_warning_submit">Jatka</string>
<string name="login_reset_password_error_not_found">Tämä sähköposti ei ole liitettynä mihinkään tunnukseen</string>
<string name="login_reset_password_error_not_found">Tämä sähköposti ei ole liitettynä mihinkään tiliin</string>
<string name="login_reset_password_mail_confirmation_title">Tarkista sähköpostisi</string>
<string name="login_reset_password_mail_confirmation_notice">Vahvistusviesti lähetettiin osoitteeseen %1$s.</string>
<string name="login_reset_password_mail_confirmation_notice_2">Näpäytä linkkiä vahvistaaksesi uuden salasanasi. Seurattuasi siinä olevaa linkkiä, klikkaa alapuolelta.</string>
@ -1062,7 +1062,7 @@
\n
\nPeru salasananvaihtoprosessi\?</string>
<string name="login_set_email_title">Aseta sähköpostiosoite</string>
<string name="login_set_email_notice">Aseta sähköpostiosoite palauttaaksesi tunnuksesi. Myöhemmin, voit antaa muiden löytää sinut sähköpostillasi.</string>
<string name="login_set_email_notice">Aseta sähköpostiosoite palauttaaksesi tilisi. Myöhemmin voit antaa muiden löytää sinut sähköpostiosoitettasi etsimällä.</string>
<string name="login_set_email_mandatory_hint">Sähköposti</string>
<string name="login_set_email_optional_hint">Sähköposti (vapaaehtoinen)</string>
<string name="login_set_email_submit">Seuraava</string>
@ -2116,4 +2116,197 @@
<string name="notice_room_canonical_alias_alternative_changed">%1$s muutti tämän huoneen vaihtoehtoisia osoitteita.</string>
<string name="initial_sync_request_title">Alkusynkronointipyyntö</string>
<string name="room_alias_action_unpublish">Poista tämän osoitteen julkaisu</string>
<string name="device_manager_other_sessions_recommendation_title_unverified">Vahvistamaton</string>
<string name="device_manager_other_sessions_recommendation_description_verified">Parhaan turvallisuuden takaamiseksi kirjaudu ulos istunnoista, joita et tunnista tai et enää käytä.</string>
<string name="device_manager_other_sessions_recommendation_title_verified">Vahvistetu</string>
<string name="a11y_device_manager_filter">Suodata</string>
<plurals name="device_manager_filter_option_inactive_description">
<item quantity="one">Käyttämättä %1$d päivän tai pidempään</item>
<item quantity="other">Käyttämättä %1$d päivää tai pidempään</item>
</plurals>
<string name="device_manager_filter_option_inactive">Käyttämätön</string>
<string name="device_manager_filter_option_unverified_description">Ei valmis turvallista viestintää varten</string>
<string name="device_manager_filter_option_unverified">Vahvistamaton</string>
<string name="device_manager_filter_option_verified_description">Valmis turvallista viestintää varten</string>
<string name="device_manager_filter_option_verified">Vahvistettu</string>
<string name="device_manager_filter_option_all_sessions">Kaikki istunnot</string>
<string name="device_manager_filter_bottom_sheet_title">Suodata</string>
<string name="device_manager_session_last_activity">Viimeisin toiminta %1$s</string>
<string name="device_manager_device_title">Laite</string>
<string name="device_manager_session_title">Istunto</string>
<string name="device_manager_current_session_title">Nykyinen istunto</string>
<string name="device_manager_inactive_sessions_title">Käyttämättä olevat istunnot</string>
<string name="device_manager_unverified_sessions_description">Vahvista nämä istunnot tai kirjaudu niistä ulos.</string>
<string name="device_manager_unverified_sessions_title">Vahvistamattomat istunnot</string>
<string name="device_manager_header_section_security_recommendations_description">Paranna tilisi turvallisuutta seuraamalla näitä suosituksia.</string>
<string name="device_manager_header_section_security_recommendations_title">Turvallisuussuositukset</string>
<plurals name="device_manager_other_sessions_description_inactive">
<item quantity="one">Käyttämättä %1$d+ päivän (%2$s)</item>
<item quantity="other">Käyttämättä %1$d+ päivää (%2$s)</item>
</plurals>
<string name="device_manager_other_sessions_description_unverified_current_session">Vahvistamaton · Nykyinen istuntosi</string>
<string name="device_manager_other_sessions_description_unverified">Vahvistamaton · Viimeisin toiminta %1$s</string>
<string name="device_manager_other_sessions_description_verified">Vahvistettu · Viimeisin toiminta %1$s</string>
<string name="device_manager_other_sessions_view_all">Näytä kaikki (%1$d)</string>
<string name="device_manager_view_details">Näytä tiedot</string>
<string name="device_manager_verify_session">Vahvista istunto</string>
<string name="device_manager_verification_status_unknown">Tuntematon vahvistuksen tila</string>
<string name="device_manager_verification_status_unverified">Vahvistamaton istunto</string>
<string name="device_manager_verification_status_verified">Vahvistettu istunto</string>
<string name="a11y_device_manager_device_type_unknown">Tuntematon laitetyyppi</string>
<string name="a11y_device_manager_device_type_desktop">Työpöytä</string>
<string name="a11y_device_manager_device_type_mobile">Mobiili</string>
<string name="device_manager_sessions_other_description">Turvallisuuden vuoksi vahvista istunnot ja kirjaudu ulos niistä istunnoista, joita et tunnista tai et enää käytä.</string>
<string name="device_manager_sessions_other_title">Muut istunnot</string>
<plurals name="room_removed_messages">
<item quantity="one">%d viesti poistettu</item>
<item quantity="other">%d viestiä poistettu</item>
</plurals>
<string name="live_location_labs_promotion_switch_title">Käytä sijainnin jakamista</string>
<string name="settings_troubleshoot_test_current_distributor">Tällä hetkellä käytössä %s.</string>
<string name="settings_troubleshoot_test_current_distributor_title">Menetelmä</string>
<plurals name="settings_troubleshoot_test_distributors_many">
<item quantity="one">Löytyi %d menetelmä.</item>
<item quantity="other">Löytyi %d menetelmää.</item>
</plurals>
<string name="settings_troubleshoot_test_distributors_title">Saatavilla olevat menetelmät</string>
<string name="settings_notification_method">Ilmoitusmenetelmä</string>
<string name="unifiedpush_distributor_background_sync">Taustasynkronointi</string>
<string name="unifiedpush_getdistributors_dialog_title">Valitse miten ilmoitukset vastaanotetaan</string>
<string name="screen_sharing_notification_description">Näytönjako on päällä</string>
<string name="screen_sharing_notification_title">${app_name}-näytönjako</string>
<string name="room_message_autocomplete_notification">Huoneilmoitus</string>
<string name="room_message_notify_everyone">Ilmoita koko huoneelle</string>
<string name="live_location_share_location_item_share">Jaa sijainti</string>
<string name="live_location_bottom_sheet_last_updated_at">Päivitetty %1$s sitten</string>
<string name="location_share_live_remaining_time">%1$s jäljellä</string>
<string name="location_share_external">Avaa sovelluksella</string>
<string name="location_share_live_select_duration_option_3">8 tuntia</string>
<string name="location_share_live_select_duration_option_2">1 tunti</string>
<string name="location_share_live_select_duration_option_1">15 minuuttia</string>
<string name="closed_poll_option_description">Tulokset näytetään vain kun lopetat kyselyn</string>
<string name="poll_end_room_list_preview">Kysely lopetettu</string>
<string name="end_poll_confirmation_approve_button">Lopeta kysely</string>
<string name="end_poll_confirmation_title">Lopetetaanko tämä kysely\?</string>
<string name="poll_undisclosed_not_ended">Tulokset tulevat näkyviin kun kysely lopetetaan</string>
<string name="poll_end_action">Lopeta kysely</string>
<string name="audio_message_file_size">(%1$s)</string>
<string name="audio_message_reply_content">%1$s (%2$s)</string>
<string name="error_audio_message_unable_to_play">Ei voi toistaa %1$s</string>
<string name="a11y_pause_audio_message">Keskeytä %1$s</string>
<string name="a11y_play_audio_message">Toista %1$s</string>
<string name="a11y_audio_playback_duration" tools:ignore="PluralsCandidate">%1$d minuuttia %2$d sekuntia</string>
<string name="space_explore_filter_no_result_title">Tuloksia ei löydy</string>
<string name="a11y_open_settings">Avaa asetukset</string>
<string name="settings_security_incognito_keyboard_title">Incognito-näppäimistö</string>
<string name="settings_sessions_list">Istunnot</string>
<string name="permalink_unsupported_groups">Tätä linkkiä ei voi avata: yhteisöt on korvattu avaruuksilla</string>
<string name="login_scan_qr_code">Skannaa QR-koodi</string>
<string name="ftue_auth_login_username_entry">Käyttäjänimi / sähköposti / puhelin</string>
<string name="ftue_auth_captcha_title">Olethan ihminen\?</string>
<string name="ftue_auth_password_reset_email_confirmation_subtitle">Seuraa sähköpostiosoitteeseen %s lähetettyjä ohjeita</string>
<string name="ftue_auth_password_reset_confirmation">Salasanan nollaus</string>
<string name="ftue_auth_forgot_password">Unohtunut salasana</string>
<string name="ftue_auth_email_resend_email">Lähetä sähköposti uudelleen</string>
<string name="ftue_auth_email_verification_footer">Etkö saanut sähköpostia\?</string>
<string name="ftue_auth_email_verification_subtitle">Seuraa sähköpostiosoitteeseen %s lähetettyjä ohjeita</string>
<string name="ftue_auth_email_verification_title">Vahvista sähköpostiosoitteesi</string>
<string name="ftue_auth_phone_confirmation_resend_code">Lähetä koodi uudelleen</string>
<string name="ftue_auth_phone_confirmation_subtitle">Koodi lähetettiin numeroon %s</string>
<string name="ftue_auth_phone_confirmation_title">Vahvista puhelinnumerosi</string>
<string name="ftue_auth_sign_out_all_devices">Kirjaudu ulos kaikilta laitteilta</string>
<string name="ftue_auth_reset_password">Nollaa salasana</string>
<string name="ftue_auth_new_password_subtitle">Vähintään kahdeksan merkkiä.</string>
<string name="ftue_auth_new_password_title">Valitse uusi salasana</string>
<string name="ftue_auth_new_password_entry_title">Uusi salasana</string>
<string name="ftue_auth_reset_password_breaker_title">Tarkista sähköpostisi.</string>
<string name="ftue_auth_reset_password_email_subtitle">%s lähettää sinulle vahvistuslinkin</string>
<string name="ftue_auth_phone_confirmation_entry_title">Vahvistuskoodi</string>
<string name="ftue_auth_phone_entry_title">Puhelinnumero</string>
<string name="ftue_auth_phone_subtitle">%s haluaa vahvistaa tilisi</string>
<string name="ftue_auth_phone_title">Anna puhelinnumerosi</string>
<string name="ftue_auth_email_entry_title">Sähköpostiosoite</string>
<string name="ftue_auth_email_subtitle">%s haluaa vahvistaa tilisi</string>
<string name="ftue_auth_email_title">Anna sähköpostiosoitteesi</string>
<string name="ftue_auth_terms_subtitle">Lue palvelimen %s käyttöehdot</string>
<string name="ftue_auth_terms_title">Palvelimen käytännöt</string>
<string name="ftue_auth_choose_server_ems_title">Haluatko ylläpitää omaa palvelinta\?</string>
<string name="ftue_auth_choose_server_entry_hint">Palvelimen verkko-osoite</string>
<string name="ftue_auth_choose_server_sign_in_subtitle">Mikä on palvelimesi osoite\?</string>
<string name="ftue_auth_choose_server_subtitle">Mikä on palvelimesi osoite\? Se on kuin koti kaikille tiedoillesi</string>
<string name="ftue_auth_choose_server_title">Valitse palvelin</string>
<string name="ftue_auth_welcome_back_title">Tervetuloa takaisin!</string>
<string name="ftue_auth_create_account_edit_server_selection">Muokkaa</string>
<string name="ftue_auth_create_account_password_entry_footer">Vähintään kahdeksan merkkiä</string>
<string name="ftue_auth_create_account_title">Luo tili</string>
<string name="ftue_account_created_take_me_home">Vie minut kotiin</string>
<string name="ftue_auth_use_case_join_existing_server">Aikeissa liittyä olemassa olevalle palvelimelle\?</string>
<string name="ftue_auth_use_case_option_three">Yhteisöt</string>
<string name="ftue_auth_use_case_option_two">Tiimit</string>
<string name="ftue_auth_use_case_option_one">Kaverit ja perhe</string>
<string name="a11y_open_spaces">Avaa avaruusluettelo</string>
<string name="a11y_create_message">Luo uusi keskustelu tai huone</string>
<string name="give_feedback_threads">Anna palautetta</string>
<string name="push_gateway_item_enabled">Käytössä:</string>
<string name="push_gateway_item_device_id">Istunnon ID:</string>
<string name="navigate_to_thread_when_already_in_the_thread">Katselet jo tätä ketjua!</string>
<string name="updating_your_data">Päivitetään tietojasi…</string>
<string name="error_check_network">Jokin meni vikaan. Tarkista verkkoyhteys ja yritä uudelleen.</string>
<string name="room_list_filter_people">Ihmiset</string>
<string name="room_list_filter_favourites">Suosikit</string>
<string name="room_list_filter_unreads">Lukemattomat</string>
<string name="room_list_filter_all">Kaikki</string>
<string name="font_size_use_system">Käytä järjestelmän oletusta</string>
<string name="font_size_section_manually">Valitse itse</string>
<string name="font_size_section_auto">Aseta automaattisesti</string>
<string name="font_size_title">Valitse fontin koko</string>
<string name="grant_permission">Myönnä oikeus</string>
<plurals name="search_space_multiple_parents">
<item quantity="one">%1$s ja %2$d muu</item>
<item quantity="other">%1$s ja %2$d muuta</item>
</plurals>
<string name="search_space_two_parents">%1$s ja %2$s</string>
<string name="thread_list_empty_title">Pidä keskustelut organisoituna ketjujen avulla</string>
<string name="thread_list_modal_my_threads_title">Omat ketjut</string>
<string name="thread_list_modal_all_threads_title">Kaikki ketjut</string>
<string name="room_permissions_change_main_address_for_the_space">Muuta avaruuden pääosoitetta</string>
<string name="invites_empty_message">Täällä näkyvät uudet pyynnöt ja kutsut.</string>
<string name="invites_empty_title">Ei mitään uutta.</string>
<string name="invites_title">Kutsut</string>
<string name="space_list_empty_message">Avaruudet ovat uusi tapa ryhmitellä huoneita ja ihmisiä. Luo avaruus aloittaaksesi.</string>
<string name="space_list_empty_title">Ei avaruuksia vielä.</string>
<string name="action_got_it">Selvä</string>
<string name="action_next">Seuraava</string>
<string name="action_view_threads">Näytä ketjut</string>
<string name="onboarding_new_app_layout_spaces_message">Käytä avaruuksia (oikealla alhaalla) nopeammin ja helpommin kuin koskaan aiemmin.</string>
<string name="onboarding_new_app_layout_spaces_title">Käytä avaruuksia</string>
<string name="explore_rooms">Selaa huoneita</string>
<string name="change_space">Vaihda avaruutta</string>
<string name="create_room">Luo huone</string>
<string name="start_chat">Aloita keskustelu</string>
<string name="all_chats">Kaikki keskustelut</string>
<string name="onboarding_new_app_layout_button_try">Kokeile</string>
<string name="onboarding_new_app_layout_feedback_message">Anna palautetta napauttamalla oikeaa yläkulmaa.</string>
<string name="onboarding_new_app_layout_feedback_title">Anna palautetta</string>
<string name="onboarding_new_app_layout_welcome_message">${app_name}in yksinkertaistaminen asetti välilehdet valinnaiseksi. Hallitse välilehtiä oikean yläkulman valikosta.</string>
<string name="onboarding_new_app_layout_welcome_title">Tervetuloa uuteen näkymään!</string>
<string name="labs_enable_new_app_layout_summary">Yksinkertaistettu Element valinnaisilla välilehdillä</string>
<string name="labs_enable_new_app_layout_title">Ota uusi asettelu käyttöön</string>
<string name="home_layout_preferences_sort_name">A - Ö</string>
<string name="home_layout_preferences_sort_activity">Aktiivisuus</string>
<string name="home_layout_preferences_sort_by">Järjestysperuste</string>
<string name="home_layout_preferences_recents">Näytä viimeisimmät</string>
<string name="home_layout_preferences_filters">Näytä suodattimet</string>
<string name="home_layout_preferences">Asettelun asetukset</string>
<string name="home_empty_space_no_rooms_title">%s
\nvaikuttaa hieman tyhjältä.</string>
<string name="create_spaces_invite_public_header">Ketkä ovat tiimikavereitasi\?</string>
<string name="create_spaces_private_teammates">Yksityinen avaruus sinulle ja tiimikavereillesi</string>
<string name="create_spaces_me_and_teammates">Minä ja tiimikaverit</string>
<string name="room_permissions_upgrade_the_space">Päivitä avaruus</string>
<string name="room_permissions_change_space_avatar">Vaihda avaruuden kuva</string>
<plurals name="x_selected">
<item quantity="one">%1$d valittu</item>
<item quantity="other">%1$d valittu</item>
</plurals>
</resources>

View File

@ -2772,4 +2772,68 @@
\nVeuillez autoriser laccès sur la prochaine fenêtre pour pouvoir voir des notifications.</string>
<string name="labs_enable_rich_text_editor_summary">Essayer léditeur de texte formaté (le mode texte brut arrive bientôt)</string>
<string name="labs_enable_rich_text_editor_title">Activer léditeur de texte formaté</string>
<string name="qr_code_login_confirm_security_code_description">Vérifiez lorigine de ce code. En appairant un appareil, vous lui fournissez un accès complet à votre compte.</string>
<string name="qr_code_login_confirm_security_code">Confirmer</string>
<string name="qr_code_login_try_again">Réessayez</string>
<string name="qr_code_login_status_no_match">Pas de correspondance \?</string>
<string name="qr_code_login_signing_in">Connexion</string>
<string name="qr_code_login_connecting_to_device">Connexion à lappareil</string>
<string name="qr_code_login_scan_qr_code_button">Scanner le QR code</string>
<string name="qr_code_login_signing_in_a_mobile_device">Connexion sur un appareil mobile \?</string>
<string name="qr_code_login_show_qr_code_button">Afficher le QR code sur cet appareil</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">Sélectionnez « Scanner le QR code »</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Démarrez à lécran de connexion</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Sélectionnez « Se connecter avec un QR code »</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Démarrez à lécran de connexion</string>
<string name="qr_code_login_new_device_instruction_3">Sélectionnez « Afficher le QR code »</string>
<string name="qr_code_login_new_device_instruction_2">Allez dans Réglages -&gt; Confidentialité et sécurité</string>
<string name="qr_code_login_new_device_instruction_1">Ouvrez lapplication sur votre autre appareil</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Le serveur daccueil ne prend pas en charge la connexion avec un QR code.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">La connexion a été annulée sur lautre appareil.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Ce QR code est invalide.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Lautre appareil doit être connecté.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Lautre appareil est déjà connecté.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">La configuration de la messagerie sécurisée a rencontré un problème de sécurité. Un des éléments suivants pourrait être compromis: votre serveur daccueil; votre connexion Internet; votre (vos) appareil(s);</string>
<string name="qr_code_login_header_failed_other_description">La requête a échoué.</string>
<string name="qr_code_login_header_failed_denied_description">La requête a été refusée sur lautre appareil.</string>
<string name="qr_code_login_header_failed_timeout_description">Lappairage na pas été effectué dans le temps imparti.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Lappairage avec cet appareil nest pas pris en charge.</string>
<string name="qr_code_login_header_failed_title">Échec de la connexion</string>
<string name="qr_code_login_header_connected_description">Vérifiez votre appareil connecté, le code ci-dessous devrait y être affiché. Confirmez que le code ci-dessous correspond à celui de lautre appareil :</string>
<string name="qr_code_login_header_connected_title">Connexion sécurisée établie</string>
<string name="qr_code_login_header_show_qr_code_link_a_device_description">Scannez le QR code ci-dessous avec lappareil qui nest pas connecté.</string>
<string name="qr_code_login_header_show_qr_code_new_device_description">Utilisez votre appareil connecté pour scanner le QR code ci-dessous :</string>
<string name="qr_code_login_header_show_qr_code_title">Se connecter avec un QR code</string>
<string name="qr_code_login_header_scan_qr_code_description">Utilisez lappareil photo de cet appareil pour scanner le QR code affiché sur votre autre appareil :</string>
<string name="qr_code_login_header_scan_qr_code_title">Scanner le QR code</string>
<string name="three">3</string>
<string name="two">2</string>
<string name="one">1</string>
<string name="labs_enable_voice_broadcast_summary">Pouvoir enregistrer et envoyer une diffusion audio dans lhistorique du salon.</string>
<string name="labs_enable_voice_broadcast_title">Activer la diffusion audio (en cours de développement)</string>
<string name="device_manager_sessions_sign_in_with_qr_code_description">Vous pouvez utiliser cet appareil pour connecter un appareil mobile ou un client web avec un QR code. Il y a deux façons de le faire :</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Se connecter avec un QR code</string>
<string name="login_scan_qr_code">Scanner le QR code</string>
<string name="a11y_voice_broadcast_buffering">Mise en mémoire tampon</string>
<string name="a11y_pause_voice_broadcast">Mettre en pause la diffusion audio</string>
<string name="a11y_play_voice_broadcast">Lire ou continuer la diffusion audio</string>
<string name="a11y_stop_voice_broadcast_record">Arrêter lenregistrement de la diffusion audio</string>
<string name="a11y_pause_voice_broadcast_record">Mettre en pause lenregistrement de la diffusion audio</string>
<string name="a11y_resume_voice_broadcast_record">Continuer lenregistrement de la diffusion audio</string>
<string name="voice_broadcast_live">Direct</string>
<string name="device_manager_other_sessions_select">Sélectionner des sessions</string>
<string name="attachment_type_selector_contact">Contact</string>
<string name="attachment_type_selector_camera">Appareil photo</string>
<string name="attachment_type_selector_location">Position</string>
<string name="attachment_type_selector_poll">Sondages</string>
<string name="attachment_type_selector_voice_broadcast">Diffusion audio</string>
<string name="attachment_type_selector_file">Pièces jointes</string>
<string name="attachment_type_selector_sticker">Autocollants</string>
<string name="attachment_type_selector_gallery">Galerie photo</string>
<string name="action_deselect_all">Tout désélectionner</string>
<string name="action_select_all">Tout sélectionner</string>
<plurals name="x_selected">
<item quantity="one">%1$d sélectionné</item>
<item quantity="other">%1$d sélectionnés</item>
</plurals>
</resources>

View File

@ -2788,9 +2788,9 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
<string name="qr_code_login_show_qr_code_button">QR kód megjelenítése ezen az eszközön</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">Válaszd ezt: „QR kód beolvasása”</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Válaszd ezt: „Belépés QR kóddal”</string>
<string name="qr_code_login_new_device_instruction_3">Válaszd ezt: „QR kód megjelenítése ezen az eszközön</string>
<string name="qr_code_login_new_device_instruction_2">Menj a Beállítások -&gt; Biztonság és Adatvédelem -&gt; Minden munkamenet megjelenítése menübe</string>
<string name="qr_code_login_new_device_instruction_1">Nyisd meg a(z) ${app_name} alkalmazást a másik eszközön</string>
<string name="qr_code_login_new_device_instruction_3">Válaszd ezt: „QR kód megjelenítése”</string>
<string name="qr_code_login_new_device_instruction_2">Menj a Beállítások -&gt; Biztonság és Adatvédelem</string>
<string name="qr_code_login_new_device_instruction_1">Nyisd meg az alkalmazást a másik eszközön</string>
<string name="qr_code_login_header_failed_denied_description">A kérést elutasították a másik eszközön.</string>
<string name="qr_code_login_header_failed_timeout_description">Az összekötés az elvárt időn belül nem fejeződött be.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Összekötés ezzel az eszközzel nem támogatott.</string>
@ -2805,4 +2805,35 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
<string name="one">1</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Belépés QR kóddal</string>
<string name="login_scan_qr_code">QR kód beolvasása</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">A matrix szerver nem támogatja más eszköz bejelentkeztetését.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">A bejelentkezés a másik eszköz által meg lett szakítva.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">QR kód érvénytelen.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">A másik eszköznek már bejelentkezve kell lennie.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">A másik eszköz már bejelentkezett.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Biztonsági probléma lépett fel a biztonságos üzenetküldés beállításánál. Valamihez illetéktelenül fértek hozzá: Matrix szervered, Internet kapcsolatod, Eszközöd,</string>
<string name="qr_code_login_header_failed_other_description">A kérés sikertelen.</string>
<string name="labs_enable_voice_broadcast_summary">Hang közvetítés felvételéhez és a szoba idővonalára küldéséhez.</string>
<string name="labs_enable_voice_broadcast_title">Hang közvetítés engedélyezése (aktív fejlesztés alatt)</string>
<string name="a11y_voice_broadcast_buffering">Pufferelés</string>
<string name="a11y_pause_voice_broadcast">Hang közvetítés szüneteltetése</string>
<string name="a11y_play_voice_broadcast">Hang közvetítés lejátszása vagy lejátszás folytatása</string>
<string name="a11y_stop_voice_broadcast_record">Hang közvetítés felvétel leállítása</string>
<string name="a11y_pause_voice_broadcast_record">Hang közvetítés felvétel megállítása</string>
<string name="a11y_resume_voice_broadcast_record">Hang közvetítés felvétel újraindítása</string>
<string name="voice_broadcast_live">Élő</string>
<string name="device_manager_other_sessions_select">Munkamenetek kiválasztása</string>
<string name="attachment_type_selector_contact">Névjegy</string>
<string name="attachment_type_selector_camera">Kamera</string>
<string name="attachment_type_selector_location">Földrajzi helyzet</string>
<string name="attachment_type_selector_poll">Szavazások</string>
<string name="attachment_type_selector_voice_broadcast">Hang közvetítés</string>
<string name="attachment_type_selector_file">Mellékletek</string>
<string name="attachment_type_selector_sticker">Matricák</string>
<string name="attachment_type_selector_gallery">Fénykép könyvtár</string>
<string name="action_deselect_all">Semmit nem jelöl ki</string>
<string name="action_select_all">Mindet kijelöli</string>
<plurals name="x_selected">
<item quantity="one">%1$d kiválasztva</item>
<item quantity="other">%1$d kiválasztva</item>
</plurals>
</resources>

View File

@ -2729,13 +2729,13 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.</string>
<string name="qr_code_login_scan_qr_code_button">Pindai kode QR</string>
<string name="qr_code_login_signing_in_a_mobile_device">Ingin masuk di perangkat ponsel\?</string>
<string name="qr_code_login_show_qr_code_button">Tampilkan kode QR di perangkat ini</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">Pilih \'Pindai dengan kode QR\'</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">Pilih \'Pindai kode QR\'</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Mulai dari layar masuk</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Pilih \'Masuk dengan kode QR\'</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Mulai dari layar masuk</string>
<string name="qr_code_login_new_device_instruction_3">Pilih \'Tampilkan kode QR di perangkat ini\'</string>
<string name="qr_code_login_new_device_instruction_2">Pergi ke Pengaturan → Keamanan &amp; Privasi → Tampilkan Semua Sesi</string>
<string name="qr_code_login_new_device_instruction_1">Buka ${app_name} di perangkat Anda yang lain</string>
<string name="qr_code_login_new_device_instruction_3">Pilih \'Tampilkan kode QR\'</string>
<string name="qr_code_login_new_device_instruction_2">Pergi ke Pengaturan → Keamanan &amp; Privasi</string>
<string name="qr_code_login_new_device_instruction_1">Buka aplikasi di perangkat Anda yang lain</string>
<string name="qr_code_login_header_failed_denied_description">Permintaan ditolak di perangkat lain.</string>
<string name="qr_code_login_header_failed_timeout_description">Penautan tidak selesai dalam waktu yang dibutuhkan.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Penautan dengan perangkat ini tidak didukung.</string>
@ -2753,4 +2753,34 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.</string>
<string name="device_manager_sessions_sign_in_with_qr_code_description">Anda dapat menggunakan perangkat ini untuk masuk ke perangkat ponsel atau web dengan sebuah kode QR. Ada dua cara untuk melalukan ini:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Masuk dengan Kode QR</string>
<string name="login_scan_qr_code">Pindai kode QR</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Sebuah masalah keamanan ditemukan ketika menyiapkan perpesanan aman. Salah satu dari berikut mungkin dikompromikan: homeserver Anda; koneksi internet Anda; perangkat Anda;</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Pemasukan dibatalkan di perangkat yang lain.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Kode QR tidak absah.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Perangkat yang lain harus masuk.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Perangkat yang lain sudah masuk.</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Homeserver tidak mendukung masuk dengan kode QR.</string>
<string name="qr_code_login_header_failed_other_description">Permintaan gagal.</string>
<string name="labs_enable_voice_broadcast_summary">Memungkinkan untuk merekam dan mengirim siaran suara dalam linimasa ruangan.</string>
<string name="labs_enable_voice_broadcast_title">Aktifkan siaran suara (dalam pengembangan aktif)</string>
<string name="a11y_voice_broadcast_buffering">Memuat</string>
<string name="a11y_pause_voice_broadcast">Jeda siaran suara</string>
<string name="a11y_play_voice_broadcast">Mainkan atau lanjutkan siaran suara</string>
<string name="a11y_stop_voice_broadcast_record">Hentikan rekaman siaran suara</string>
<string name="a11y_pause_voice_broadcast_record">Jeda rekaman siaran suara</string>
<string name="a11y_resume_voice_broadcast_record">Lanjutkan rekaman siaran suara</string>
<string name="voice_broadcast_live">Langsung</string>
<string name="device_manager_other_sessions_select">Pilih sesi</string>
<string name="attachment_type_selector_contact">Kontak</string>
<string name="attachment_type_selector_camera">Kamera</string>
<string name="attachment_type_selector_location">Lokasi</string>
<string name="attachment_type_selector_poll">Pemungutan suara</string>
<string name="attachment_type_selector_voice_broadcast">Siaran suara</string>
<string name="attachment_type_selector_file">Lampiran</string>
<string name="attachment_type_selector_sticker">Stiker</string>
<string name="attachment_type_selector_gallery">Pustaka foto</string>
<string name="action_deselect_all">Batalkan semua pilihan</string>
<string name="action_select_all">Pilih semua</string>
<plurals name="x_selected">
<item quantity="other">%1$d dipilih</item>
</plurals>
</resources>

View File

@ -2722,12 +2722,12 @@
<string name="device_manager_session_rename">Rinomina sessione</string>
<string name="device_manager_session_overview_signout">Disconnetti questa sessione</string>
<string name="device_manager_other_sessions_description_unverified_current_session">Non verificata · La sessione attuale</string>
<string name="tooltip_attachment_voice_broadcast">Inizia un broadcast vocale</string>
<string name="tooltip_attachment_voice_broadcast">Inizia una trasmissione vocale</string>
<string name="key_authenticity_not_guaranteed">L\'autenticità di questo messaggio cifrato non può essere garantita su questo dispositivo.</string>
<string name="settings_security_incognito_keyboard_summary">Richiedi che la tastiera non debba aggiornare dati personalizzati come la cronologia di digitazione e il dizionario in base a cosa digiti nelle conversazioni. Nota che alcune tastiere potrebbero non rispettare questa impostazione.</string>
<string name="settings_security_incognito_keyboard_title">Tastiera incognito</string>
<string name="command_description_table_flip">Antepone (╯°□°)╯︵ ┻━┻ ad un messaggio di testo</string>
<string name="attachment_type_voice_broadcast">Broadcast voce</string>
<string name="attachment_type_voice_broadcast">Trasmissione vocale</string>
<string name="command_description_devtools">Apri la schermata degli strumenti per sviluppatori</string>
<string name="room_settings_global_block_unverified_info_text">🔒 Hai attivato la crittografia solo per sessioni verificate in tutte le stanze nelle impostazioni di sicurezza.</string>
<string name="some_devices_will_not_be_able_to_decrypt">⚠ Ci sono dispositivi non verificati in questa stanza, non potranno decifrare i messaggi che invii.</string>
@ -2776,9 +2776,9 @@
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Inizia nella schermata di accesso</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Seleziona Accedi con codice QR</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Inizia nella schermata di accesso</string>
<string name="qr_code_login_new_device_instruction_3">Seleziona Mostra codice QR in questo dispositivo</string>
<string name="qr_code_login_new_device_instruction_2">Vai in Impostazioni -&gt; Sicurezza e privacy -&gt; Mostra tutte le sessioni</string>
<string name="qr_code_login_new_device_instruction_1">Apri ${app_name} sull\'altro dispositivo</string>
<string name="qr_code_login_new_device_instruction_3">Seleziona Mostra codice QR</string>
<string name="qr_code_login_new_device_instruction_2">Vai in Impostazioni -&gt; Sicurezza e privacy</string>
<string name="qr_code_login_new_device_instruction_1">Apri l\'app sull\'altro dispositivo</string>
<string name="qr_code_login_header_failed_denied_description">La richiesta è stata negata sull\'altro dispositivo.</string>
<string name="qr_code_login_header_failed_timeout_description">Il collegamento non è stato completato nel tempo previsto.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Il collegamento con questo dispositivo non è supportato.</string>
@ -2796,4 +2796,35 @@
<string name="device_manager_sessions_sign_in_with_qr_code_description">Puoi usare questo dispositivo per accedere in un dispositivo mobile o web con un codice QR. Ci sono due modi:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Accedi con codice QR</string>
<string name="login_scan_qr_code">Scansiona codice QR</string>
<string name="labs_enable_voice_broadcast_summary">Registra e invia trasmissioni vocali nella linea temporale della stanza.</string>
<string name="labs_enable_voice_broadcast_title">Attiva trasmissione vocale (in sviluppo attivo)</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">L\'homeserver non supporta l\'accesso con codice QR.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">L\'accesso è stato annullato sull\'altro dispositivo.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Quel codice QR non è valido.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">L\'altro dispositivo deve fare l\'accesso.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">L\'altro dispositivo ha già fatto l\'accesso.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Si è verificato un problema di sicurezza configurando i messaggi sicuri. Una delle seguenti cose potrebbe essere compromessa: il tuo homeserver; la/e connessione/i internet; il/i dispositivo/i;</string>
<string name="qr_code_login_header_failed_other_description">La richiesta è fallita.</string>
<string name="a11y_voice_broadcast_buffering">Buffering</string>
<string name="a11y_pause_voice_broadcast">Sospendi trasmissione vocale</string>
<string name="a11y_play_voice_broadcast">Avvia o riprendi trasmissione vocale</string>
<string name="a11y_stop_voice_broadcast_record">Ferma registrazione trasmissione vocale</string>
<string name="a11y_pause_voice_broadcast_record">Sospendi registrazione trasmissione vocale</string>
<string name="a11y_resume_voice_broadcast_record">Riprendi registrazione trasmissione vocale</string>
<string name="voice_broadcast_live">In diretta</string>
<string name="device_manager_other_sessions_select">Seleziona sessioni</string>
<string name="attachment_type_selector_contact">Contatto</string>
<string name="attachment_type_selector_camera">Fotocamera</string>
<string name="attachment_type_selector_location">Posizione</string>
<string name="attachment_type_selector_poll">Sondaggi</string>
<string name="attachment_type_selector_voice_broadcast">Trasmissione vocale</string>
<string name="attachment_type_selector_file">Allegati</string>
<string name="attachment_type_selector_sticker">Adesivi</string>
<string name="attachment_type_selector_gallery">Album di foto</string>
<string name="action_deselect_all">Deseleziona tutto</string>
<string name="action_select_all">Seleziona tutto</string>
<plurals name="x_selected">
<item quantity="one">%1$d selezionato</item>
<item quantity="other">%1$d selezionati</item>
</plurals>
</resources>

View File

@ -36,7 +36,7 @@
<string name="copied_to_clipboard">Kopiert til utklippstavle</string>
<string name="dialog_title_warning">Advarsel</string>
<string name="dialog_title_error">Feil</string>
<string name="bottom_action_people">Folk</string>
<string name="bottom_action_people">Personer</string>
<string name="bottom_action_rooms">Rom</string>
<string name="invitations_header">Invitasjoner</string>
<string name="low_priority_header">Lavprioritet</string>
@ -65,10 +65,6 @@
<string name="action_remove">Fjern</string>
<string name="action_join">Bli med</string>
<string name="action_reject">Avvis</string>
<string name="room_participants_action_invite">Inviter</string>
<string name="room_participants_action_ban">Utesteng</string>
<string name="room_participants_action_unban">Opphev utestengelse</string>
@ -265,7 +261,6 @@
<string name="room_one_user_is_typing">%s skriver …</string>
<string name="search_hint">Søk</string>
<string name="search_members_hint">Filtrer rommets medlemmer</string>
<string name="room_settings_all_messages">Alle meldinger</string>
<string name="settings_olm_version">olm-versjon</string>
<string name="settings_deactivate_account_section">Deaktiver kontoen</string>
@ -314,8 +309,6 @@
<string name="notification_noisy">Bråkete</string>
<string name="encrypted_message">Kryptert melding</string>
<string name="rooms">Rom</string>
<string name="reason_colon">Årsak: %1$s</string>
<string name="x_plus">%d+</string>
<string name="keys_backup_setup">Begynn å bruke Nøkkelsikkerhetskopiering</string>
@ -379,7 +372,6 @@
<string name="sign_out_bottom_sheet_will_lose_secure_messages">Du kommer til å miste tilgang til dine enkrypterte meldinger med mindre du sikkerhetskopierer nøklene dine før du logger av.</string>
<string name="view_decrypted_source">Se dekryptert kilde</string>
<string name="report_content">Rapporter innhold</string>
<string name="action_sign_out_confirmation_simple">Er du sikker på at vil logge ut\?</string>
<string name="action_voice_call">Telefonsamtale</string>
<string name="action_video_call">Videosamtale</string>
@ -393,7 +385,6 @@
<string name="system_alerts_header">Systemadvarsler</string>
<string name="direct_chats_header">Samtaler</string>
<string name="matrix_only_filter">Bare matrix-kontakter</string>
<string name="send_bug_report_include_crash_logs">Send kjæsjlogg</string>
<string name="send_bug_report_include_screenshot">Send skjermbilde</string>
<string name="send_bug_report_description">Vennligst forklar feilen. Hva gjorde du\? Hva forventet du at skulle skje\? Hva skjedde i stedet\?</string>
@ -446,7 +437,6 @@
<string name="auth_invalid_email">Dette ser ikke ut som en gyldig E-postadresse</string>
<string name="login_error_ssl_other">SSL-feil.</string>
<string name="login_error_limit_exceeded">For mange forespørsler har blitt sendt</string>
<string name="room_participants_leave_prompt_title">Forlat rommet</string>
<string name="room_participants_header_direct_chats">Direktemeldinger</string>
<string name="room_participants_action_ignore_title">Ignorer bruker</string>
@ -600,13 +590,10 @@
<string name="no_permissions_to_start_conf_call_in_direct_room">Du har ikke tillatelse til å starte en konferansesamtale</string>
<string name="action_reset">Tilbakestill</string>
<string name="auth_accept_policies">Vennligst gjennomgå og godta retningslinjene til denne hjemmeserveren:</string>
<string name="auth_reset_password_error_unauthorized">Klarte ikke verifisere e-postadressen: Pass på at du har klikket på lenken i e-posten</string>
<string name="auth_recaptcha_message">Denne hjemmetjeneren vil vite om du er en robot</string>
<string name="call_failed_no_connection_description">Klarte ikke å starte en sanntidskopling.
\nVennligst be hjemmetjeneradministratoren din om å sette opp en TURN server så samtaler blir mer stabile.</string>
<string name="login_error_not_json">Inneholdt ikke gyldig JSON</string>
<string name="login_error_bad_json">Ugyldig JSON</string>
<string name="set_a_security_phrase_hint">Sikkerhetsfrase</string>
@ -702,7 +689,6 @@
<string name="settings_app_info_link_title">App info</string>
<string name="settings_phone_number_empty">Ingen telefonnummer er lagt til kontoen din</string>
<string name="room_settings_add_homescreen_shortcut">Legg til på startskjerm</string>
<string name="ssl_only_accept">Godta bare sertifikatet hvis serveradministratoren har publisert et fingeravtrykk som samsvarer med det over.</string>
<string name="ssl_expected_existing_expl">Sertifikatet er endret fra en tidligere klarert til en som ikke er klarert. Serveren kan ha fornyet sertifikatet. Kontakt serveradministratoren for forventet fingeravtrykk.</string>
<string name="ssl_unexpected_existing_expl">Sertifikatet har endret seg fra et som telefonen din klarerte. Dette er veldig uvanlig. Det anbefales at du IKKE godtar dette nye sertifikatet.</string>
@ -734,19 +720,14 @@
<string name="room_participants_action_mention">Nevne</string>
<string name="room_participants_action_cancel_invite">Avbryt invitasjonen</string>
<string name="room_participants_leave_prompt_msg">Er du sikker på at du vil forlate rommet\?</string>
<string name="room_jump_to_first_unread">Gå til første uleste melding.</string>
<string name="list_members">Liste medlemmer</string>
<string name="permissions_denied_add_contact">Tillat tillatelse til å få tilgang til kontaktene dine.</string>
<string name="permissions_denied_qr_code">For å skanne en QR-kode, må du gi tilgang til kameraet.</string>
<string name="permissions_rationale_msg_camera_and_audio">${app_name} trenger tillatelse for å få tilgang til kameraet og mikrofonen for å utføre videosamtaler.
\n
\nTillat tilgang til de neste popup-vinduene for å kunne ringe.</string>
<string name="permissions_rationale_msg_record_audio">${app_name} trenger tillatelse for å få tilgang til mikrofonen din for å utføre lydanrop.</string>
<string name="incoming_voice_call">Innkommende taleanrop</string>
<string name="incoming_video_call">Innkommende videosamtale</string>
<string name="call_ended">Anrop avsluttet</string>
@ -770,7 +751,6 @@
<string name="start_chatting">Begynn å chatte</string>
<string name="settings_troubleshoot_test_fcm_failed_too_many_registration">[%1$s]
\nDenne feilen er utenfor kontroll av ${app_name}, og ifølge Google indikerer denne feilen at enheten har for mange apper registrert hos FCM. Feilen oppstår bare i tilfeller der det er ekstremt mange apper, så det bør ikke påvirke gjennomsnittsbrukeren.</string>
<string name="call_error_user_not_responding">Ekstern vert kunne ikke plukke opp.</string>
<string name="video_call_in_progress">Pågående videosamtale…</string>
<string name="call_in_progress">Pågående samtale…</string>
@ -1137,7 +1117,6 @@
<string name="settings_integrations_summary">Bruk en integrasjonshåndterer til å administrere botter, broer, widgets og klistremerkepakker.
\nIntegrasjonshåndterere mottar konfigurasjonsdata, og kan endre moduler, sende rominvitasjoner og angi maktnivåer på dine vegne.</string>
<string name="settings_set_sync_delay">Forsinkelse mellom hver synkronisering</string>
<string name="settings_set_sync_timeout">Tidsavbrudd for synkroniseringsforespørsel</string>
<string name="settings_background_fdroid_sync_mode_disabled_description">Du vil ikke bli varslet om innkommende meldinger når appen er i bakgrunnen.</string>
<string name="settings_background_fdroid_sync_mode_real_time_description">${app_name} vil synkroniseres i bakgrunnen med jevne mellomrom på presis tid (konfigurerbar).
@ -1251,7 +1230,6 @@
<string name="spaces_no_server_support_description">Ta kontakt med din hjemmetjener -administrator for mer informasjon</string>
<string name="this_space_has_no_rooms_not_admin">Noen rom kan være skjult fordi de er private, og du trenger en invitasjon.
\nDu har ikke tillatelse til å legge til rom.</string>
<string name="upgrade_required">Oppgradering kreves</string>
<string name="upgrade_public_room">Oppgrader offentlig rom</string>
<string name="upgrade_private_room">Oppgrader privat rom</string>

File diff suppressed because it is too large Load Diff

View File

@ -2785,9 +2785,9 @@
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Comece na tela de signin</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Selecione \'Fazer signin com QR code\'</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Comece na tela de signin</string>
<string name="qr_code_login_new_device_instruction_3">Selecione \'Mostrar QR code neste dispositivo\'</string>
<string name="qr_code_login_new_device_instruction_2">Vá para Configurações -&gt; Segurança &amp; Privacidade -&gt; Mostrar Todas as Sessões</string>
<string name="qr_code_login_new_device_instruction_1">Obra ${app_name} em seu outro dispositivo</string>
<string name="qr_code_login_new_device_instruction_3">Selecione \'Mostrar QR code\'</string>
<string name="qr_code_login_new_device_instruction_2">Vá para Configurações -&gt; Segurança &amp; Privacidade</string>
<string name="qr_code_login_new_device_instruction_1">Abra o app em seu outro dispositivo</string>
<string name="qr_code_login_header_failed_denied_description">A requisição foi negada no outro dispositivo.</string>
<string name="qr_code_login_header_failed_timeout_description">A linkagem não foi completada no tempo requerido.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Linkagem com este dispositivo não é suportado.</string>
@ -2805,4 +2805,35 @@
<string name="device_manager_sessions_sign_in_with_qr_code_description">Você pode usar este dispositivo para fazer signin com um dispositivo móvel ou web com um QR code. Existem duas maneiras de fazer isto:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Fazer signin com QR Code</string>
<string name="login_scan_qr_code">Scannar QR code</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">O servidorcasa não suporta sign in com QR code.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">O sign in foi cancelado no outro dispositivo.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">O QR code é inválido.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">O outro dispositivo deve estar feito signin.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">O outro dispositivo já está feito signin.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Um problema de segurança foi encontrado ao configurar mensageria segura. Um dos seguintes pode ter sido comprometido: Seu servidorcasa; Sua(s) conexão(ões) de internet; Seu(s) dispositivo(s);</string>
<string name="qr_code_login_header_failed_other_description">A requisição falhou.</string>
<string name="labs_enable_voice_broadcast_summary">Seja capaz de gravar e enviar broadcast de voz em timeline de sala.</string>
<string name="labs_enable_voice_broadcast_title">Broadcast de voz (sob desenvolvimento ativo)</string>
<string name="a11y_voice_broadcast_buffering">Buffering</string>
<string name="a11y_pause_voice_broadcast">Pausar broadcast de voz</string>
<string name="a11y_play_voice_broadcast">Tocar ou retomar broadcast de voz</string>
<string name="a11y_stop_voice_broadcast_record">Parar gravação de broadcast de voz</string>
<string name="a11y_pause_voice_broadcast_record">Pausar gravação de broadcast de voz</string>
<string name="a11y_resume_voice_broadcast_record">Retomar gravação de broadcast de voz</string>
<string name="voice_broadcast_live">Ao vivo</string>
<string name="device_manager_other_sessions_select">Selecionar sessões</string>
<string name="attachment_type_selector_contact">Contato</string>
<string name="attachment_type_selector_camera">Câmera</string>
<string name="attachment_type_selector_location">Localização</string>
<string name="attachment_type_selector_poll">Sondagens</string>
<string name="attachment_type_selector_voice_broadcast">Broadcast de voz</string>
<string name="attachment_type_selector_file">Anexos</string>
<string name="attachment_type_selector_sticker">Stickers</string>
<string name="attachment_type_selector_gallery">Biblioteca de fotos</string>
<string name="action_deselect_all">Desselecionar todas(os)</string>
<string name="action_select_all">Selecionar todas(os)</string>
<plurals name="x_selected">
<item quantity="one">%1$d selecionada(o)</item>
<item quantity="other">%1$d selecionadas(os)</item>
</plurals>
</resources>

View File

@ -367,8 +367,8 @@
<string name="settings_add_phone_number">Добавить телефон</string>
<string name="settings_app_info_link_summary">Системные настройки приложения.</string>
<string name="settings_app_info_link_title">Сведения о приложении</string>
<string name="settings_enable_all_notif">Включить уведомления для этой учетной записи</string>
<string name="settings_enable_this_device">Включить уведомления для этой сессии</string>
<string name="settings_enable_all_notif">Уведомления для этой учётной записи</string>
<string name="settings_enable_this_device">Уведомления для этой сессии</string>
<string name="settings_messages_in_one_to_one">В персональных чатах</string>
<string name="settings_messages_in_group_chat">В групповых чатах</string>
<string name="settings_invited_to_room">Когда меня приглашают в комнату</string>
@ -434,14 +434,14 @@
<string name="encryption_information_device_name">Публичное название</string>
<string name="device_manager_session_details_session_id">ID сессии</string>
<string name="encryption_information_device_key">Ключ сессии</string>
<string name="encryption_export_e2e_room_keys">Экспорт E2E ключей комнаты</string>
<string name="encryption_export_room_keys">Экспорт ключей комнаты</string>
<string name="encryption_export_e2e_room_keys">Экспорт E2E ключей</string>
<string name="encryption_export_room_keys">Экспорт ключей</string>
<string name="encryption_export_room_keys_summary">Экспорт ключей в локальный файл</string>
<string name="encryption_export_export">Экспорт</string>
<string name="passphrase_enter_passphrase">Введите мнемоническую фразу</string>
<string name="passphrase_confirm_passphrase">Подтвердите мнемоническую фразу</string>
<string name="encryption_import_e2e_room_keys">Импорт E2E ключей комнаты</string>
<string name="encryption_import_room_keys">Импорт ключей комнаты</string>
<string name="encryption_import_e2e_room_keys">Импорт E2E ключей</string>
<string name="encryption_import_room_keys">Импорт ключей</string>
<string name="encryption_import_room_keys_summary">Импортировать ключи из локального файла</string>
<string name="encryption_import_import">Импорт</string>
<string name="encryption_never_send_to_unverified_devices_title">Шифровать только для проверенных сессий</string>
@ -618,7 +618,7 @@
<string name="system_alerts_header">Системные оповещения</string>
<string name="dialog_title_error">Ошибка</string>
<string name="passphrase_create_passphrase">Создать мнемоническую фразу</string>
<string name="passphrase_passphrase_does_not_match">Парольные фразы не совпадают</string>
<string name="passphrase_passphrase_does_not_match">Мнемонические фразы не совпадают</string>
<string name="resource_limit_contact_admin">свяжитесь с вашим администратором</string>
<string name="resource_limit_soft_default">Превышен один из ресурсных лимитов сервера, по этому <b>некоторые пользователи не смогут авторизоваться</b>.</string>
<string name="resource_limit_hard_default">Превышен один из ресурсных лимитов сервера.</string>
@ -663,7 +663,7 @@
<string name="settings_troubleshoot_test_account_settings_quickfix">Включить</string>
<string name="settings_troubleshoot_test_device_settings_title">Настройки сессии.</string>
<string name="settings_troubleshoot_test_device_settings_success">Уведомления включены для этой сессии.</string>
<string name="settings_troubleshoot_test_device_settings_failed">Уведомления не включено для этой сессии.
<string name="settings_troubleshoot_test_device_settings_failed">Уведомления не включены для этой сессии.
\nПожалуйста, проверьте настройки ${app_name}.</string>
<string name="settings_troubleshoot_test_device_settings_quickfix">Включить</string>
<string name="settings_troubleshoot_test_play_services_title">Проверка сервисов Play</string>
@ -725,14 +725,14 @@
<string name="settings_cryptography_manage_keys">Управление криптографическими ключами</string>
<string name="encryption_settings_manage_message_recovery_summary">Управление резервным копированием ключей</string>
<string name="notification_silent">Беззвучный</string>
<string name="passphrase_empty_error_message">Пожалуйста, введите мнемоническую фразу</string>
<string name="passphrase_passphrase_too_weak">Парольная фраза слишком простая</string>
<string name="passphrase_empty_error_message">Введите мнемоническую фразу</string>
<string name="passphrase_passphrase_too_weak">Мнемоническая фраза слишком проста</string>
<string name="keys_backup_passphrase_not_empty_error_message">Пожалуйста, удалите мнемоническую фразу, если хотите, чтобы ${app_name} сгенерировал бумажный ключ.</string>
<string name="keys_backup_setup_step1_title">Никогда не теряйте зашифрованных сообщений</string>
<string name="keys_backup_setup_step1_description">Сообщения в зашифрованных комнатах защищены сквозным шифрованием. Ключи для прочтения этих сообщений есть только у вас и получателя(ей).
\n
\nНадёжно сохраните резервную копию ключей, чтобы не потерять их.</string>
<string name="keys_backup_setup_step2_button_title">Установите парольную фразу</string>
<string name="keys_backup_setup_step2_button_title">Задайте мнемоническую фразу</string>
<string name="keys_backup_setup_step3_copy_button_title">Сохранить бумажный ключ</string>
<string name="keys_backup_setup_step3_button_title">Готово</string>
<string name="keys_backup_setup_step3_save_button_title">Сохранить как файл</string>
@ -744,7 +744,7 @@
<string name="keys_backup_settings_delete_confirm_message">Удалить резервную копию ключей шифрования с сервера\? Вы больше не сможете использовать бумажный ключ для чтения истории зашифрованных сообщений.</string>
<string name="keys_backup_settings_delete_confirm_title">Удалить резервную копию</string>
<string name="keys_backup_settings_deleting_backup">Удаление резервной копии…</string>
<string name="keys_backup_settings_untrusted_backup">Чтобы использовать резервную копию ключа в этой сессии, восстановите его с помощью своей парольной фразы или ключа восстановления.</string>
<string name="keys_backup_settings_untrusted_backup">Чтобы использовать резервное копирование ключей в этой сессии, восстановите их с помощью мнемонической фразы или бумажного ключа.</string>
<string name="keys_backup_settings_invalid_signature_from_verified_device">Резервная копия имеет недействительную подпись из подтвержденной сессии %s</string>
<string name="keys_backup_settings_valid_signature_from_unverified_device">Резервная копия имеет действительную подпись из неподтвержденной сессии %s</string>
<string name="keys_backup_settings_valid_signature_from_verified_device">Резервная копия имеет действительную подпись из подтверждённой сессии %s.</string>
@ -782,7 +782,7 @@
</plurals>
<string name="keys_backup_recovery_code_error_decrypt">Невозможно расшифровать резервную копию с помощью этого бумажного ключа: пожалуйста, убедитесь, что вы ввели правильный бумажный ключ.</string>
<string name="keys_backup_passphrase_error_decrypt">Невозможно расшифровать резервную копию с помощью этой мнемонической фразы: пожалуйста, убедитесь, что вы ввели правильную мнемоническую фразу.</string>
<string name="keys_backup_setup_step3_generating_key_status">Генерация бумажного ключа с использованием мнемонической фразы может занять несколько секунд.</string>
<string name="keys_backup_setup_step3_generating_key_status">Создание бумажного ключа с использованием мнемонической фразы может занять несколько секунд.</string>
<string name="settings_troubleshoot_test_fcm_failed_account_missing">[%1$s]
\nЭта ошибка вне контроля ${app_name}. На телефоне нет учетной записи Google. Пожалуйста, добавьте аккаунт Google.</string>
<string name="settings_troubleshoot_test_fcm_failed_service_not_available">[%1$s]
@ -830,8 +830,8 @@
<string name="keys_backup_setup_step2_text_description">Зашифрованная копия ключей будет храниться на вашем сервере. Для безопасности защитите её мнемонической фразой.
\n
\nДля максимальной безопасности мнемоническая фраза должна отличаться от пароля вашей учётной записи.</string>
<string name="keys_backup_setup_step3_text_line2">Ключ восстановления — это страховка, вы можете использовать его для восстановления доступа к вашим зашифрованным сообщениям, если забудете вашу парольную фразу.
\nХраните ключ восстановления в надёжном месте, например, в диспетчере паролей (или в сейфе)</string>
<string name="keys_backup_setup_step3_text_line2">Бумажный ключ — это подстраховка: вы можете использовать его для восстановления доступа к своим зашифрованным сообщениям, если забудете свою мнемоническую фразу.
\nХраните свой бумажный ключ в очень надёжном месте, например, в менеджере паролей (или в сейфе)</string>
<string name="keys_backup_restoring_importing_keys_waiting_message">Импортирование ключей…</string>
<string name="keys_backup_restoring_downloading_backup_waiting_message">Скачивание ключей…</string>
<string name="keys_backup_restoring_computing_key_waiting_message">Вычисление бумажного ключа…</string>
@ -1520,16 +1520,16 @@
\n
\nМы рекомендуем вам немедленно изменить свой пароль и ключ восстановления в настройках.</string>
<string name="verification_cancelled">Подтверждение отменено</string>
<string name="bootstrap_crosssigning_progress_pbkdf2">Генерация ключа безопасности из парольной фразы</string>
<string name="bootstrap_progress_generating_ssss">Генерация ключа SSSS из парольной фразы</string>
<string name="bootstrap_progress_generating_ssss_with_info">Генерация ключа SSSS из парольной фразы (%s)</string>
<string name="bootstrap_crosssigning_progress_pbkdf2">Создание бумажного ключа из мнемонической фразы</string>
<string name="bootstrap_progress_generating_ssss">Создание ключа SSSS из мнемонической фразы</string>
<string name="bootstrap_progress_generating_ssss_with_info">Создание ключа SSSS из мнемонической фразы (%s)</string>
<string name="bootstrap_migration_enter_backup_password">Чтобы продолжить работу, введите парольную фразу для резервного копирования ключа.</string>
<string name="bootstrap_migration_with_passphrase_helper_with_link">Если вы не знаете вашу парольную фразу для резервного копирования ключей, вы можете %s.</string>
<string name="power_level_edit_title">Задать роль</string>
<string name="bootstrap_info_text_2">Введите секретную фразу, известную только вам, для защиты данных на вашем сервере.</string>
<string name="bootstrap_info_text_2">Введите мнемоническую фразу, известную только вам, которая используется для защиты данных на вашем сервере.</string>
<string name="bootstrap_loading_title">Настройка восстановления.</string>
<string name="bootstrap_finish_title">Готово!</string>
<string name="keep_it_safe">Храните его в безопасности</string>
<string name="keep_it_safe">Храните его в надёжном месте</string>
<string name="finish">Завершить</string>
<string name="bootstrap_crosssigning_progress_initializing">Публикация созданных ключей идентификации</string>
<string name="bootstrap_crosssigning_progress_default_key">Определение ключа SSSS по умолчанию</string>
@ -1572,8 +1572,8 @@
<string name="or_other_mx_capable_client">или другой клиент Matrix поддерживающий перекрестную подпись</string>
<string name="command_description_discard_session">Принудительно отбрасывает текущую групповую сессию для отправки сообщений в зашифрованную комнату</string>
<string name="enter_secret_storage_passphrase_or_key">Чтобы продолжить, используйте %1$s или %2$s.</string>
<string name="use_recovery_key">Используйте ключ восстановления</string>
<string name="enter_secret_storage_input_key">Выберите ключ восстановления или введите его вручную, введя или вставив из буфера обмена</string>
<string name="use_recovery_key">Используйте бумажный ключ</string>
<string name="enter_secret_storage_input_key">Выберите бумажный ключ или введите его вручную, введя или вставив из буфера обмена</string>
<string name="failed_to_access_secure_storage">Не удалось получить доступ к защищенному хранилищу данных</string>
<string name="unencrypted">Не зашифровано</string>
<string name="encrypted_unverified">Зашифровано неподтверждённой сессией</string>
@ -1625,13 +1625,13 @@
<string name="bottom_sheet_setup_secure_backup_security_key_title">Используйте ключ безопасности</string>
<string name="bottom_sheet_setup_secure_backup_security_key_subtitle">Создайте ключ безопасности для хранения в надежном месте, например в менеджере паролей или сейфе.</string>
<string name="bottom_sheet_setup_secure_backup_security_phrase_title">Использовать мнемоническую фразу</string>
<string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">Введите секретную фразу, известную только вам, и создайте ключ для резервного копирования.</string>
<string name="bottom_sheet_setup_secure_backup_security_phrase_subtitle">Введите мнемоническую фразу, известную только вам, и создайте ключ для резервного копирования.</string>
<string name="bottom_sheet_save_your_recovery_key_title">Сохраните свой ключ безопасности</string>
<string name="bottom_sheet_save_your_recovery_key_content">Храните бумажный ключ в надёжном месте, например, в менеджере паролей или в сейфе.</string>
<string name="set_a_security_phrase_title">Задайте секретную фразу</string>
<string name="set_a_security_phrase_notice">Введите секретную фразу, известную только вам, для защиты данных на вашем сервере.</string>
<string name="set_a_security_phrase_title">Задайте мнемоническую фразу</string>
<string name="set_a_security_phrase_notice">Введите мнемоническую фразу, известную только вам, которая используется для защиты данных на вашем сервере.</string>
<string name="set_a_security_phrase_hint">Мнемоническая фраза</string>
<string name="set_a_security_phrase_again_notice">Для подтверждения введите вашу секретную фразу ещё раз.</string>
<string name="set_a_security_phrase_again_notice">Введите мнемоническую фразу ещё раз, чтобы подтвердить её.</string>
<string name="room_settings_name_hint">Название комнаты</string>
<string name="room_settings_topic_hint">Тема</string>
<string name="room_settings_save_success">Вы успешно изменили настройки комнаты</string>
@ -1679,7 +1679,8 @@
<plurals name="encryption_import_room_keys_success">
<item quantity="one">%1$d/%2$d ключ успешно импортирован.</item>
<item quantity="few">%1$d/%2$d ключа успешно импортированы.</item>
<item quantity="many">%1$d/%2$d ключей успешно импортировано.</item>
<item quantity="many">%1$d/%2$d ключей успешно импортированы.</item>
<item quantity="other">%1$d/%2$d ключей успешно импортированы.</item>
</plurals>
<string name="room_manage_integrations">Управление интеграциями</string>
<string name="room_no_active_widgets">Нет активных виджетов</string>
@ -2765,7 +2766,7 @@
<string name="device_manager_learn_more_session_rename">Другие пользователи в личных сообщениях и комнатах, к которым вы присоединились, могут просматривать весь список ваших сессий.
\n
\nЭто даёт им уверенность в том, что они действительно общаются с вами, но это также означает, что они могут видеть название сессии, которое вы ввели здесь.</string>
<string name="labs_enable_rich_text_editor_title">Визуальный редактор текста</string>
<string name="labs_enable_rich_text_editor_title">Наглядный текстовый редактор</string>
<string name="push_gateway_item_device_id">ID сессии:</string>
<string name="device_manager_push_notifications_title">Уведомления</string>
<string name="device_manager_push_notifications_description">Получать push-уведомления в этой сессии.</string>
@ -2792,4 +2793,16 @@
<item quantity="many">Рассмотрите возможность выхода из старых сессий (%1$d дней или дольше), которые вы более не используете.</item>
<item quantity="other">Рассмотрите возможность выхода из старых сессий (%1$d дней или дольше), которые вы более не используете.</item>
</plurals>
<string name="attachment_type_voice_broadcast">Голосовая трансляция</string>
<string name="labs_enable_voice_broadcast_title">Голосовые трансляции (в активной разработке)</string>
<string name="labs_enable_client_info_recording_summary">Записывает название клиента, версию и URL-адрес для более лёгкого распознавания сессий в менеджере сессий.</string>
<string name="labs_enable_client_info_recording_title">Записывать информацию о клиенте</string>
<string name="attachment_type_selector_gallery">Галерея</string>
<string name="attachment_type_selector_sticker">Наклейки</string>
<string name="attachment_type_selector_file">Вложения</string>
<string name="attachment_type_selector_voice_broadcast">Голосовая трансляция</string>
<string name="attachment_type_selector_poll">Опрос</string>
<string name="attachment_type_selector_location">Местоположение</string>
<string name="attachment_type_selector_camera">Камера</string>
<string name="attachment_type_selector_contact">Контакт</string>
</resources>

View File

@ -2692,7 +2692,7 @@
<string name="home_empty_no_unreads_message">Tu sa zobrazia neprečítané správy, ak nejaké máte.</string>
<string name="home_empty_no_unreads_title">Nič, o čom by bolo potrebné podať správu.</string>
<string name="home_empty_no_rooms_message">Kompletná zabezpečená aplikácia na komunikáciu pre tímy, priateľov a organizácie. Začnite konverzáciu alebo sa pridajte k existujúcej miestnosti.</string>
<string name="home_empty_no_rooms_title">Vitajte v aplikácii ${názov_aplikácie},
<string name="home_empty_no_rooms_title">Vitajte v aplikácii ${app_name},
\n%s.</string>
<string name="home_empty_space_no_rooms_message">Priestory sú novým spôsobom zoskupovania miestností a ľudí. Pomocou tlačidla vpravo dole môžete pridať existujúcu miestnosť alebo vytvoriť novú.</string>
<string name="home_empty_space_no_rooms_title">%s
@ -2839,9 +2839,9 @@
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Začnite na prihlasovacej obrazovke</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Vyberte možnosť \"Prihlásiť sa pomocou QR kódu\"</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Začnite na prihlasovacej obrazovke</string>
<string name="qr_code_login_new_device_instruction_3">Vyberte možnosť \"Zobraziť QR kód na tomto zariadení\"</string>
<string name="qr_code_login_new_device_instruction_2">Prejdite do Nastavenia -&gt; Zabezpečenie a súkromie -&gt; Zobraziť všetky relácie</string>
<string name="qr_code_login_new_device_instruction_1">Otvorte ${app_name} na vašom druhom zariadení</string>
<string name="qr_code_login_new_device_instruction_3">Vyberte možnosť \"Zobraziť QR kód\"</string>
<string name="qr_code_login_new_device_instruction_2">Prejdite do Nastavenia -&gt; Zabezpečenie a súkromie</string>
<string name="qr_code_login_new_device_instruction_1">Otvorte aplikáciu na vašom druhom zariadení</string>
<string name="qr_code_login_header_failed_denied_description">Žiadosť bola na druhom zariadení zamietnutá.</string>
<string name="qr_code_login_header_failed_timeout_description">Prepojenie nebolo dokončené v požadovanom čase.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Prepojenie s týmto zariadením nie je podporované.</string>
@ -2859,4 +2859,36 @@
<string name="device_manager_sessions_sign_in_with_qr_code_description">Pomocou tohto zariadenia sa môžete prihlásiť do mobilného alebo webového zariadenia pomocou QR kódu. Môžete to urobiť dvoma spôsobmi:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Prihlásiť sa pomocou QR kódu</string>
<string name="login_scan_qr_code">Skenovať QR kód</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Domovský server nepodporuje prihlásenie pomocou QR kódu.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Prihlasovanie bolo zrušené na druhom zariadení.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">QR kód nie je platný.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Druhé zariadenie musí byť prihlásené.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Druhé zariadenie je už prihlásené.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Pri nastavovaní zabezpečeného zasielania správ sa vyskytol bezpečnostný problém. Jedna z nasledujúcich možností môže byť kompromitovaná: Váš domovský server; Vaše internetové pripojenie (pripojenia); Vaše zariadenie (zariadenia);</string>
<string name="qr_code_login_header_failed_other_description">Žiadosť zlyhala.</string>
<string name="labs_enable_voice_broadcast_summary">Možnosť nahrávania a odosielania hlasového vysielania v časovej osi miestnosti.</string>
<string name="labs_enable_voice_broadcast_title">Zapnúť hlasové vysielanie (v štádiu aktívneho vývoja)</string>
<string name="a11y_voice_broadcast_buffering">Načítavanie do vyrovnávacej pamäte</string>
<string name="a11y_pause_voice_broadcast">Pozastaviť hlasové vysielanie</string>
<string name="a11y_play_voice_broadcast">Prehrať alebo pokračovať v nahrávaní hlasového vysielania</string>
<string name="a11y_stop_voice_broadcast_record">Zastaviť nahrávanie hlasového vysielania</string>
<string name="a11y_pause_voice_broadcast_record">Pozastaviť nahrávanie hlasového vysielania</string>
<string name="a11y_resume_voice_broadcast_record">Pokračovať v nahrávaní hlasového vysielania</string>
<string name="voice_broadcast_live">Naživo</string>
<string name="device_manager_other_sessions_select">Vyberte relácie</string>
<string name="attachment_type_selector_contact">Kontakt</string>
<string name="attachment_type_selector_camera">Kamera</string>
<string name="attachment_type_selector_location">Poloha</string>
<string name="attachment_type_selector_poll">Ankety</string>
<string name="attachment_type_selector_voice_broadcast">Hlasové vysielanie</string>
<string name="attachment_type_selector_file">Prílohy</string>
<string name="attachment_type_selector_sticker">Nálepky</string>
<string name="attachment_type_selector_gallery">Knižnica fotografií</string>
<string name="action_deselect_all">Zrušiť výber všetkých</string>
<string name="action_select_all">Vybrať všetko</string>
<plurals name="x_selected">
<item quantity="one">%1$d vybraté</item>
<item quantity="few">%1$d vybraté</item>
<item quantity="other">%1$d vybraných</item>
</plurals>
</resources>

View File

@ -2544,7 +2544,7 @@
<string name="ftue_auth_email_resend_email">Skicka e-brev igen</string>
<string name="ftue_auth_email_verification_footer">Fick du inget e-brev\?</string>
<string name="ftue_auth_email_verification_subtitle">För att bekräfta din e-post, tryck på knappen i e-brevet vi just skickade till %s</string>
<string name="ftue_auth_email_verification_title">Kolla din e-post för att verifiera.</string>
<string name="ftue_auth_email_verification_title">Verifiera din e-post</string>
<string name="ftue_auth_phone_confirmation_resend_code">Skicka kod igen</string>
<string name="ftue_auth_phone_confirmation_subtitle">En kod skickades till %s</string>
<string name="ftue_auth_phone_confirmation_title">Bekräfta ditt telefonnummer</string>
@ -2718,4 +2718,122 @@
\nVänligen ge åtkomst på nästa pop-uper för att kunna se aviseringar.</string>
<string name="labs_enable_rich_text_editor_title">Aktivera rik-text-redigerare</string>
<string name="labs_enable_rich_text_editor_summary">Testa den nya rik-text-redigeraren</string>
<string name="onboarding_new_app_layout_welcome_title">Välkommen till en ny vy!</string>
<string name="home_empty_no_unreads_message">Det här är vart dina olästa meddelanden hamnar, när du har några.</string>
<string name="home_empty_no_unreads_title">Inget att rapportera.</string>
<string name="home_empty_no_rooms_message">Den säkra allt-i-ett-chattappen för teams, vänner och organisationer. Skapa en chatt eller gå med i ett existerande rum för att komma igång.</string>
<string name="home_empty_no_rooms_title">Välkommen till ${app_name},
\n%s.</string>
<string name="home_empty_space_no_rooms_message">Utrymmen är ett nytt sätt att gruppera rum och personer. Lägg till ett existerande rum, eller skapa ett nytt, med knappen nere till höger.</string>
<string name="home_empty_space_no_rooms_title">%s
\nser lite tom ut.</string>
<string name="labs_enable_voice_broadcast_summary">Möjliggör att spela in och skicka röstsändning i rummets tidslinje.</string>
<string name="labs_enable_voice_broadcast_title">Aktivera röstsändning (under aktiv utveckling)</string>
<string name="labs_enable_client_info_recording_summary">Spara klientnamnet, versionen, och URL:en för att enklare känna igen sessioner i sessionehanteraren.</string>
<string name="labs_enable_client_info_recording_title">Aktivera klientinforapportering</string>
<string name="labs_enable_session_manager_summary">Ha bättre insyn i och kontroll över alla dina sessioner.</string>
<string name="labs_enable_session_manager_title">Aktivera den nya sessionshanteraren</string>
<string name="device_manager_learn_more_session_rename">Andra användare i direktmeddelanden och rum du går med in kan se en full lista över dina sessioner.
\n
\nDet försäkrar dem om att de verkligen pratar med dig, men det betyder också att de kan se sessionsnamnet du anger här.</string>
<string name="device_manager_learn_more_session_rename_title">Döper om sessioner</string>
<string name="device_manager_learn_more_sessions_verified">Verifierade sessioner har loggat in med dina uppgifter och har sedan verifierats, antingen med din säkra lösenfras eller genom att kors-verifiera.
\n
\nDet betyder att det har krypteringsnycklar för dina tidigare meddelanden, bekräftar för andra användare du kommunicerar med att dessa sessioner verkligen är du.</string>
<string name="device_manager_learn_more_sessions_verified_title">Verifierade sessioner</string>
<string name="device_manager_learn_more_sessions_unverified">Overifierade sessioner är sessioner som har loggat in med dina uppgifter men som inte har kors-verifierats.
\n
\nDu bör speciellt försäkra dig om att du känner igen dessa sessioner eftersom att de kan utgöra otillåten användning av ditt konto.</string>
<string name="device_manager_learn_more_sessions_unverified_title">Overifierade sessioner</string>
<string name="device_manager_learn_more_sessions_inactive">Inaktiva sessioner är sessioner du inte har använt på länge, men de tar fortfarande emot krypteringsnycklar.
\n
\nBorttagning av inaktiva sessioner förbättrar säkerhet och prestanda, och gör det lättare för dig att se om en ny session ser misstänkt ut.</string>
<string name="device_manager_learn_more_sessions_inactive_title">Inaktiva sessioner</string>
<string name="device_manager_sessions_sign_in_with_qr_code_description">Du kan använda den här enheten för att logga in på en mobil- eller webbenhet med en QR-kod. Det finns två sätt att göra detta:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Logga in med QR-kod</string>
<string name="device_manager_session_rename_warning">Observera att sessionsnamnen också kan ses av folk du kommunicerar med.</string>
<string name="device_manager_session_rename_description">Anpassade namn kan hjälpa dig att känna igen dina enheter lättare.</string>
<string name="device_manager_session_rename_edit_hint">Sessionsnamn</string>
<string name="device_manager_session_rename">Döp om session</string>
<string name="device_manager_session_details_device_ip_address">IP-adress</string>
<string name="device_manager_session_details_device_operating_system">Operativsystem</string>
<string name="device_manager_session_details_device_model">Modell</string>
<string name="device_manager_session_details_device_browser">Webbläsare</string>
<string name="device_manager_session_details_application_url">URL</string>
<string name="device_manager_session_details_application_version">Version</string>
<string name="device_manager_session_details_application_name">Namn</string>
<string name="device_manager_session_details_application">Applikation</string>
<string name="device_manager_session_details_session_last_activity">Senaste aktiviteten</string>
<string name="device_manager_session_details_session_name">Sessionsnamn</string>
<string name="device_manager_push_notifications_description">Ta emot pushnotiser i den här sessionen.</string>
<string name="login_scan_qr_code">Skanna QR-kod</string>
<string name="rich_text_editor_format_underline">Använd understrykning</string>
<string name="rich_text_editor_format_strikethrough">Använd överstrykning</string>
<string name="rich_text_editor_format_italic">Använd kursiv stil</string>
<string name="rich_text_editor_format_bold">Använd fetstil</string>
<string name="qr_code_login_confirm_security_code_description">Se till att du känner till ursprunget till denna kod. Genom att länka enheter ger du någon full åtkomst till ditt konto.</string>
<string name="qr_code_login_confirm_security_code">Bekräfta</string>
<string name="qr_code_login_try_again">Pröva igen</string>
<string name="qr_code_login_status_no_match">Ingen match\?</string>
<string name="qr_code_login_signing_in">Loggar in dig</string>
<string name="qr_code_login_connecting_to_device">Ansluter till enhet</string>
<string name="qr_code_login_scan_qr_code_button">Skanna QR-kod</string>
<string name="qr_code_login_signing_in_a_mobile_device">Loggar du in en mobil\?</string>
<string name="qr_code_login_show_qr_code_button">Visa QR-kod på den här enheten</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">Välj \'Skanna QR-kod\'</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Börja på inloggningsskärmen</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Välj \'Logga in med QR-kod\'</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Börja på inloggningsskärmen</string>
<string name="qr_code_login_new_device_instruction_3">Välj \'Visa QR-kod\'</string>
<string name="qr_code_login_new_device_instruction_2">Gå till Inställningar -&gt; Säkerhet och sekretess</string>
<string name="qr_code_login_new_device_instruction_1">Öppna appen på din andra enhet</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Hemservern stöder inte inloggning med QR-kod.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Inloggningen avbröts på den andra enheten.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Den QR-koden är ogiltig.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Den andra enheten måste vara inloggad.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Den andra enheten är redan inloggad.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Ett säkerhetsproblem påträffades vid konfigurering av säker meddelandehantering. En av följande kan vara äventyrad: Din hemserver; Din internetuppkoppling Din enhet;</string>
<string name="qr_code_login_header_failed_other_description">Begäran misslyckades.</string>
<string name="qr_code_login_header_failed_denied_description">Begäran nekades på den andra enheten.</string>
<string name="qr_code_login_header_failed_timeout_description">Länkningen slutfördes inte inom den krävda tiden.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Länkning med den här enheten stöds inte.</string>
<string name="qr_code_login_header_failed_title">Misslyckad anslutning</string>
<string name="qr_code_login_header_connected_description">Kolla din inloggade enhet, koden nedan borde visas. Bekräfta att koden nedan matchar den enheten:</string>
<string name="qr_code_login_header_connected_title">Säker anslutning etablerad</string>
<string name="qr_code_login_header_show_qr_code_link_a_device_description">Skanna QR-koden nedan med din utloggade enhet.</string>
<string name="qr_code_login_header_show_qr_code_new_device_description">Använd din inloggade enhet för att skanna QR-koden nedan:</string>
<string name="qr_code_login_header_show_qr_code_title">Logga in med QR-kod</string>
<string name="qr_code_login_header_scan_qr_code_description">Använd den här enhetens kamera för att skanna QR-koden på din andra enhet:</string>
<string name="a11y_voice_broadcast_buffering">Buffrar</string>
<string name="a11y_pause_voice_broadcast">Pausa röstsändning</string>
<string name="a11y_play_voice_broadcast">Spela eller återuppta röstsändning</string>
<string name="a11y_stop_voice_broadcast_record">Avsluta inspelning av röstsändning</string>
<string name="a11y_pause_voice_broadcast_record">Pausa inspelning av röstsändning</string>
<string name="a11y_resume_voice_broadcast_record">Återuppta inspelning av röstsändning</string>
<string name="voice_broadcast_live">Live</string>
<string name="qr_code_login_header_scan_qr_code_title">Skanna QR-kod</string>
<string name="three">3</string>
<string name="two">2</string>
<string name="one">1</string>
<string name="onboarding_new_app_layout_button_try">Pröva</string>
<string name="onboarding_new_app_layout_feedback_message">Tryck uppe till höger för att se alternativet att ge återkoppling.</string>
<string name="onboarding_new_app_layout_feedback_title">Ge återkoppling</string>
<string name="onboarding_new_app_layout_spaces_message">Kom åt dina utrymmen (nere till höger) snabbare och enklare än någonsin förut.</string>
<string name="onboarding_new_app_layout_spaces_title">Kom åt utrymmen</string>
<string name="onboarding_new_app_layout_welcome_message">För att förenkla din ${app_name} så är flikar nu valfria. Hantera dem i menyn uppe till höger.</string>
<string name="device_manager_other_sessions_select">Välj sessioner</string>
<string name="attachment_type_selector_contact">Kontakt</string>
<string name="attachment_type_selector_camera">Kamera</string>
<string name="attachment_type_selector_location">Plats</string>
<string name="attachment_type_selector_poll">Omröstningar</string>
<string name="attachment_type_selector_voice_broadcast">Röstsändning</string>
<string name="attachment_type_selector_file">Bilagor</string>
<string name="attachment_type_selector_sticker">Dekaler</string>
<string name="attachment_type_selector_gallery">Fotobibliotek</string>
<string name="action_deselect_all">Avmarkera alla</string>
<string name="action_select_all">Välj alla</string>
<plurals name="x_selected">
<item quantity="one">%1$d vald</item>
<item quantity="other">%1$d valda</item>
</plurals>
</resources>

View File

@ -2839,12 +2839,12 @@
<string name="device_manager_session_rename">Перейменувати сеанс</string>
<string name="device_manager_session_overview_signout">Вийти з цього сеансу</string>
<string name="device_manager_other_sessions_description_unverified_current_session">Не звірений - Ваш поточний сеанс</string>
<string name="tooltip_attachment_voice_broadcast">Розпочати голосове мовлення</string>
<string name="tooltip_attachment_voice_broadcast">Розпочати трансляцію голосового повідомлення</string>
<string name="key_authenticity_not_guaranteed">Справжність цього зашифрованого повідомлення не може бути гарантована на цьому пристрої.</string>
<string name="settings_security_incognito_keyboard_summary">Заборонити клавіатурі оновлювати будь-які персоналізовані дані, як-от історію набору тексту та словник, на основі того, що ви набрали в розмовах. Зверніть увагу, що деякі клавіатури можуть не дотримуватися цього налаштування.</string>
<string name="settings_security_incognito_keyboard_title">Клавіатура інкогніто</string>
<string name="command_description_table_flip">Надсилає (╯°□°)╯︵ ┻━┻ на початку текстового повідомлення</string>
<string name="attachment_type_voice_broadcast">Голосове мовлення</string>
<string name="attachment_type_voice_broadcast">Голосові повідомлення</string>
<string name="command_description_devtools">Відкрийте інструменти розробника</string>
<string name="room_settings_global_block_unverified_info_text">🔒 Ви увімкнули шифрування лише для перевірених сеансів для всіх кімнат у налаштуваннях безпеки.</string>
<string name="some_devices_will_not_be_able_to_decrypt">У цій кімнаті є неперевірені пристрої, вони не зможуть розшифрувати повідомлення, які ви надсилаєте.</string>
@ -2892,9 +2892,9 @@
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Виберіть «Увійти за допомогою QR-коду»</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Почніть з екрана входу</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Почніть з екрана входу</string>
<string name="qr_code_login_new_device_instruction_3">Виберіть «Показати QR-код на цьому пристрої»</string>
<string name="qr_code_login_new_device_instruction_2">Перейдіть до Налаштування -&gt; Безпека й приватність -&gt; Показати всі сеанси</string>
<string name="qr_code_login_new_device_instruction_1">Відкрийте ${app_name} на іншому своєму пристрої</string>
<string name="qr_code_login_new_device_instruction_3">Виберіть «Показати QR-код»</string>
<string name="qr_code_login_new_device_instruction_2">Перейдіть до Налаштування -&gt; Безпека й приватність</string>
<string name="qr_code_login_new_device_instruction_1">Відкрийте застосунок на іншому своєму пристрої</string>
<string name="qr_code_login_header_failed_denied_description">Запит на іншому пристрої було відхилено.</string>
<string name="qr_code_login_header_failed_timeout_description">Пов\'язування не було завершено у встановлені терміни.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Пов\'язування з цим пристроєм не підтримується.</string>
@ -2913,4 +2913,37 @@
<string name="qr_code_login_scan_qr_code_button">Сканувати QR-код</string>
<string name="qr_code_login_header_scan_qr_code_title">Сканувати QR-код</string>
<string name="login_scan_qr_code">Сканувати QR-код</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">Домашній сервер не підтримує вхід за допомогою QR-коду.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Вхід на іншому пристрої було скасовано.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Цей QR-код недійсний.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Повинен бути виконаний вхід з іншого пристрою.</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Вхід з іншого пристрою вже виконано.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">Під час налаштування захищеного обміну повідомленнями виникла проблема з безпекою. Можливо, порушено одне з таких налаштувань: Ваш домашній сервер; Ваше інтернет-з\'єднання; Ваш пристрій;</string>
<string name="qr_code_login_header_failed_other_description">Запит не виконаний.</string>
<string name="labs_enable_voice_broadcast_summary">Можливість записувати та надсилати голосові повідомлення до стрічки кімнати.</string>
<string name="labs_enable_voice_broadcast_title">Увімкнути голосові повідомлення (в активній розробці)</string>
<string name="a11y_voice_broadcast_buffering">Буферизація</string>
<string name="a11y_pause_voice_broadcast">Призупинити голосове повідомлення</string>
<string name="a11y_play_voice_broadcast">Відтворити або поновити відтворення голосового повідомлення</string>
<string name="a11y_stop_voice_broadcast_record">Припинити запис голосового повідомлення</string>
<string name="a11y_pause_voice_broadcast_record">Призупинити запис голосового повідомлення</string>
<string name="a11y_resume_voice_broadcast_record">Відновити запис голосового повідомлення</string>
<string name="voice_broadcast_live">Наживо</string>
<string name="device_manager_other_sessions_select">Вибрати сеанси</string>
<string name="attachment_type_selector_contact">Контакт</string>
<string name="attachment_type_selector_camera">Камера</string>
<string name="attachment_type_selector_location">Місце перебування</string>
<string name="attachment_type_selector_poll">Опитування</string>
<string name="attachment_type_selector_voice_broadcast">Голосові повідомлення</string>
<string name="attachment_type_selector_file">Вкладення</string>
<string name="attachment_type_selector_sticker">Наліпки</string>
<string name="attachment_type_selector_gallery">Фотобібліотека</string>
<string name="action_deselect_all">Скасувати вибір усіх</string>
<plurals name="x_selected">
<item quantity="one">Вибрано %1$d</item>
<item quantity="few">Вибрано %1$d</item>
<item quantity="many">Вибрано %1$d</item>
<item quantity="other">Вибрано %1$d</item>
</plurals>
<string name="action_select_all">Вибрати все</string>
</resources>

File diff suppressed because it is too large Load Diff

View File

@ -942,7 +942,7 @@
<string name="settings_discovery_no_msisdn">在您新增電話號碼後,探索選項將會出現。</string>
<string name="settings_discovery_disconnect_identity_server_info">與您的身份識別伺服器斷線代表您無法被其他使用者探索,且您將無法透過電子郵件或電話邀請其他人。</string>
<string name="settings_discovery_msisdn_title">可探索的電話號碼</string>
<string name="settings_discovery_confirm_mail">我們將會傳送電子郵件到 %s請檢查您的電子郵件並在確認連結上點選</string>
<string name="settings_discovery_confirm_mail">我們傳送電子郵件到 %s請檢查您的電子郵件並在確認連結上點選</string>
<string name="settings_discovery_enter_identity_server">輸入身份識別伺服器 URL</string>
<string name="settings_discovery_bad_identity_server">無法連線到身份識別伺服器</string>
<string name="settings_discovery_please_enter_server">請輸入身份識別伺服器 URL</string>
@ -2731,9 +2731,9 @@
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">從登入畫面開始</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">選取「使用 QR code 登入」</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">從登入畫面開始</string>
<string name="qr_code_login_new_device_instruction_3">選取「在此裝置上顯示 QR code」</string>
<string name="qr_code_login_new_device_instruction_2">到「設定」→「安全與隱私」→「顯示所有工作階段」</string>
<string name="qr_code_login_new_device_instruction_1">在您的其他裝置上開啟 ${app_name}</string>
<string name="qr_code_login_new_device_instruction_3">選取「顯示 QR code」</string>
<string name="qr_code_login_new_device_instruction_2">到「設定」→「安全與隱私」</string>
<string name="qr_code_login_new_device_instruction_1">在您的其他裝置上開啟應用程式</string>
<string name="qr_code_login_header_failed_denied_description">請求在另一台裝置上被拒絕。</string>
<string name="qr_code_login_header_failed_timeout_description">連結未在規定時間內完成。</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">不支援與其裝置連結。</string>
@ -2751,4 +2751,34 @@
<string name="device_manager_sessions_sign_in_with_qr_code_description">您可以使用此裝置透過 QR code 登入移動裝置或網路裝置。有兩種方法可以作到:</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">使用 QR code 登入</string>
<string name="login_scan_qr_code">掃描 QR code</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">家伺服器不支援使用 QR code 登入。</string>
<string name="qr_code_login_header_failed_user_cancelled_description">登入已在其他裝置上取消。</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">該 QR code 無效。</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">其他裝置必須登入。</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">其他裝置已登入。</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">設定安全訊息傳遞時遇到安全問題。以下其中一項可能已被駭入:您的家伺服器、您的網際網路連線、您的裝置;</string>
<string name="qr_code_login_header_failed_other_description">請求失敗。</string>
<string name="labs_enable_voice_broadcast_summary">可以在聊天室時間軸中錄製並傳送語音廣播。</string>
<string name="labs_enable_voice_broadcast_title">啟用語音廣播(正在積極開發中)</string>
<string name="a11y_voice_broadcast_buffering">正在緩衝</string>
<string name="a11y_pause_voice_broadcast">暫停語音廣播</string>
<string name="a11y_play_voice_broadcast">播放或繼續語音廣播</string>
<string name="a11y_stop_voice_broadcast_record">停止語音廣播錄製</string>
<string name="a11y_pause_voice_broadcast_record">暫停語音廣播錄製</string>
<string name="a11y_resume_voice_broadcast_record">繼續語音廣播錄製</string>
<string name="voice_broadcast_live">直播</string>
<string name="device_manager_other_sessions_select">選取工作階段</string>
<string name="attachment_type_selector_contact">聯絡人</string>
<string name="attachment_type_selector_camera">相機</string>
<string name="attachment_type_selector_location">位置</string>
<string name="attachment_type_selector_poll">投票</string>
<string name="attachment_type_selector_voice_broadcast">音訊廣播</string>
<string name="attachment_type_selector_file">附件</string>
<string name="attachment_type_selector_sticker">貼圖</string>
<string name="attachment_type_selector_gallery">照片媒體庫</string>
<string name="action_deselect_all">取消選取全部</string>
<string name="action_select_all">選取全部</string>
<plurals name="x_selected">
<item quantity="other">已選取 %1$d</item>
</plurals>
</resources>

View File

@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Cross feature -->
<plurals name="x_selected">
<item quantity="one">%1$d selected</item>
<item quantity="other">%1$d selected</item>
</plurals>
<!-- Notice -->
<string name="notice_room_invite_no_invitee">%s\'s invitation</string>
<string name="notice_room_invite_no_invitee_by_you">Your invitation</string>
<string name="notice_room_created">%1$s created the room</string>
@ -407,6 +414,8 @@
<string name="action_learn_more">Learn more</string>
<string name="action_next">Next</string>
<string name="action_got_it">Got it</string>
<string name="action_select_all">Select all</string>
<string name="action_deselect_all">Deselect all</string>
<string name="copied_to_clipboard">Copied to clipboard</string>
@ -3078,6 +3087,14 @@
<string name="audio_message_reply_content">%1$s (%2$s)</string>
<string name="audio_message_file_size">(%1$s)</string>
<string name="voice_broadcast_live">Live</string>
<string name="a11y_resume_voice_broadcast_record">Resume voice broadcast record</string>
<string name="a11y_pause_voice_broadcast_record">Pause voice broadcast record</string>
<string name="a11y_stop_voice_broadcast_record">Stop voice broadcast record</string>
<string name="a11y_play_voice_broadcast">Play or resume voice broadcast</string>
<string name="a11y_pause_voice_broadcast">Pause voice broadcast</string>
<string name="a11y_voice_broadcast_buffering">Buffering</string>
<string name="upgrade_room_for_restricted">Anyone in %s will be able to find and join this room - no need to manually invite everyone. Youll be able to change this in room settings anytime.</string>
<string name="upgrade_room_for_restricted_no_param">Anyone in a parent space will be able to find and join this room - no need to manually invite everyone. Youll be able to change this in room settings anytime.</string>
@ -3197,6 +3214,15 @@
<string name="tooltip_attachment_location">Share location</string>
<string name="tooltip_attachment_voice_broadcast">Start a voice broadcast</string>
<string name="attachment_type_selector_gallery">Photo library</string>
<string name="attachment_type_selector_sticker">Stickers</string>
<string name="attachment_type_selector_file">Attachments</string>
<string name="attachment_type_selector_voice_broadcast">Voice broadcast</string>
<string name="attachment_type_selector_poll">Polls</string>
<string name="attachment_type_selector_location">Location</string>
<string name="attachment_type_selector_camera">Camera</string>
<string name="attachment_type_selector_contact">Contact</string>
<string name="message_reaction_show_less">Show less</string>
<plurals name="message_reaction_show_more">
<item quantity="one">"%1$d more"</item>
@ -3311,6 +3337,7 @@
<string name="device_manager_other_sessions_no_unverified_sessions_found">No unverified sessions found.</string>
<string name="device_manager_other_sessions_no_inactive_sessions_found">No inactive sessions found.</string>
<string name="device_manager_other_sessions_clear_filter">Clear Filter</string>
<string name="device_manager_other_sessions_select">Select sessions</string>
<string name="device_manager_session_overview_signout">Sign out of this session</string>
<string name="device_manager_session_details_title">Session details</string>
<string name="device_manager_session_details_description">Application, device, and activity information.</string>
@ -3386,9 +3413,16 @@
<string name="qr_code_login_header_failed_device_is_not_supported_description">Linking with this device is not supported.</string>
<string name="qr_code_login_header_failed_timeout_description">The linking wasnt completed in the required time.</string>
<string name="qr_code_login_header_failed_denied_description">The request was denied on the other device.</string>
<string name="qr_code_login_new_device_instruction_1">Open ${app_name} on your other device</string>
<string name="qr_code_login_new_device_instruction_2">Go to Settings -> Security &amp; Privacy -> Show All Sessions</string>
<string name="qr_code_login_new_device_instruction_3">Select \'Show QR code in this device\'</string>
<string name="qr_code_login_header_failed_other_description">The request failed.</string>
<string name="qr_code_login_header_failed_e2ee_security_issue_description">A security issue was encountered setting up secure messaging. One of the following may be compromised: Your homeserver; Your internet connection(s); Your device(s);</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">The other device is already signed in.</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">The other device must be signed in.</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">That QR code is invalid.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">The sign in was cancelled on the other device.</string>
<string name="qr_code_login_header_failed_homeserver_is_not_supported_description">The homeserver doesn\'t support sign in with QR code.</string>
<string name="qr_code_login_new_device_instruction_1">Open the app on your other device</string>
<string name="qr_code_login_new_device_instruction_2">Go to Settings -> Security &amp; Privacy</string>
<string name="qr_code_login_new_device_instruction_3">Select \'Show QR code\'</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Start at the sign in screen</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Select \'Sign in with QR code\'</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Start at the sign in screen</string>

View File

@ -77,6 +77,9 @@
<dimen name="location_sharing_live_duration_choice_margin_horizontal">12dp</dimen>
<dimen name="location_sharing_live_duration_choice_margin_vertical">22dp</dimen>
<!-- Voice Broadcast -->
<dimen name="voice_broadcast_controller_button_size">48dp</dimen>
<!-- Material 3 -->
<dimen name="collapsing_toolbar_layout_medium_size">112dp</dimen>

View File

@ -62,7 +62,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
buildConfigField "String", "SDK_VERSION", "\"1.5.4\""
buildConfigField "String", "SDK_VERSION", "\"1.5.6\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""

View File

@ -19,6 +19,7 @@ package org.matrix.android.sdk.api
import okhttp3.ConnectionSpec
import okhttp3.Interceptor
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
import org.matrix.android.sdk.api.metrics.MetricPlugin
import java.net.Proxy
data class MatrixConfiguration(
@ -74,4 +75,9 @@ data class MatrixConfiguration(
* Sync configuration.
*/
val syncConfig: SyncConfig = SyncConfig(),
/**
* Metrics plugin that can be used to capture metrics from matrix-sdk-android.
*/
val metricPlugins: List<MetricPlugin> = emptyList()
)

View File

@ -0,0 +1,41 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.extensions
import org.matrix.android.sdk.api.metrics.MetricPlugin
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
/**
* Executes the given [block] while measuring the transaction.
*/
@OptIn(ExperimentalContracts::class)
inline fun measureMetric(metricMeasurementPlugins: List<MetricPlugin>, block: () -> Unit) {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
try {
metricMeasurementPlugins.forEach { plugin -> plugin.startTransaction() } // Start the transaction.
block()
} catch (throwable: Throwable) {
metricMeasurementPlugins.forEach { plugin -> plugin.onError(throwable) } // Capture if there is any exception thrown.
throw throwable
} finally {
metricMeasurementPlugins.forEach { plugin -> plugin.finishTransaction() } // Finally, finish this transaction.
}
}

View File

@ -27,6 +27,7 @@ open class LoggerTag(name: String, parentTag: LoggerTag? = null) {
object SYNC : LoggerTag("SYNC")
object VOIP : LoggerTag("VOIP")
object CRYPTO : LoggerTag("CRYPTO")
object RENDEZVOUS : LoggerTag("RZ")
val value: String = if (parentTag == null) {
name

View File

@ -0,0 +1,32 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.metrics
import org.matrix.android.sdk.api.logger.LoggerTag
import timber.log.Timber
private val loggerTag = LoggerTag("DownloadKeysMetricsPlugin", LoggerTag.CRYPTO)
/**
* Extension of MetricPlugin for download_device_keys task.
*/
interface DownloadDeviceKeysMetricsPlugin : MetricPlugin {
override fun logTransaction(message: String?) {
Timber.tag(loggerTag.value).v("## downloadDeviceKeysMetricPlugin() : $message")
}
}

View File

@ -0,0 +1,46 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.metrics
/**
* A plugin that can be used to capture metrics in Client.
*/
interface MetricPlugin {
/**
* Start the measurement of the metrics as soon as task is started.
*/
fun startTransaction()
/**
* Mark the measuring transaction finished once the task is completed.
*/
fun finishTransaction()
/**
* Invoked when there is any error in the ongoing task. The metrics tool can use this information to attach to the ongoing transaction.
*
* @param throwable Exception thrown in the running task.
*/
fun onError(throwable: Throwable)
/**
* Can be used to log this transaction.
*/
fun logTransaction(message: String? = "") {
// no-op
}
}

View File

@ -0,0 +1,229 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous
import android.net.Uri
import org.matrix.android.sdk.api.auth.AuthenticationService
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
import org.matrix.android.sdk.api.logger.LoggerTag
import org.matrix.android.sdk.api.rendezvous.channels.ECDHRendezvousChannel
import org.matrix.android.sdk.api.rendezvous.model.ECDHRendezvousCode
import org.matrix.android.sdk.api.rendezvous.model.Outcome
import org.matrix.android.sdk.api.rendezvous.model.Payload
import org.matrix.android.sdk.api.rendezvous.model.PayloadType
import org.matrix.android.sdk.api.rendezvous.model.Protocol
import org.matrix.android.sdk.api.rendezvous.model.RendezvousError
import org.matrix.android.sdk.api.rendezvous.model.RendezvousIntent
import org.matrix.android.sdk.api.rendezvous.transports.SimpleHttpRendezvousTransport
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel
import org.matrix.android.sdk.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
import org.matrix.android.sdk.api.util.MatrixJsonParser
import timber.log.Timber
/**
* Implementation of MSC3906 to sign in + E2EE set up using a QR code.
*/
class Rendezvous(
val channel: RendezvousChannel,
val theirIntent: RendezvousIntent,
) {
companion object {
private val TAG = LoggerTag(Rendezvous::class.java.simpleName, LoggerTag.RENDEZVOUS).value
@Throws(RendezvousError::class)
fun buildChannelFromCode(code: String): Rendezvous {
val parsed = try {
// we rely on moshi validating the code and throwing exception if invalid JSON or doesn't
MatrixJsonParser.getMoshi().adapter(ECDHRendezvousCode::class.java).fromJson(code)
} catch (a: Throwable) {
throw RendezvousError("Invalid code", RendezvousFailureReason.InvalidCode)
} ?: throw RendezvousError("Invalid code", RendezvousFailureReason.InvalidCode)
val transport = SimpleHttpRendezvousTransport(parsed.rendezvous.transport.uri)
return Rendezvous(
ECDHRendezvousChannel(transport, parsed.rendezvous.key),
parsed.intent
)
}
}
private val adapter = MatrixJsonParser.getMoshi().adapter(Payload::class.java)
// not yet implemented: RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE
val ourIntent: RendezvousIntent = RendezvousIntent.LOGIN_ON_NEW_DEVICE
@Throws(RendezvousError::class)
private suspend fun checkCompatibility() {
val incompatible = theirIntent == ourIntent
Timber.tag(TAG).d("ourIntent: $ourIntent, theirIntent: $theirIntent, incompatible: $incompatible")
if (incompatible) {
// inform the other side
send(Payload(PayloadType.FINISH, intent = ourIntent))
if (ourIntent == RendezvousIntent.LOGIN_ON_NEW_DEVICE) {
throw RendezvousError("The other device isn't signed in", RendezvousFailureReason.OtherDeviceNotSignedIn)
} else {
throw RendezvousError("The other device is already signed in", RendezvousFailureReason.OtherDeviceAlreadySignedIn)
}
}
}
@Throws(RendezvousError::class)
suspend fun startAfterScanningCode(): String {
val checksum = channel.connect()
Timber.tag(TAG).i("Connected to secure channel with checksum: $checksum")
checkCompatibility()
// get protocols
Timber.tag(TAG).i("Waiting for protocols")
val protocolsResponse = receive()
if (protocolsResponse?.protocols == null || !protocolsResponse.protocols.contains(Protocol.LOGIN_TOKEN)) {
send(Payload(PayloadType.FINISH, outcome = Outcome.UNSUPPORTED))
throw RendezvousError("Unsupported protocols", RendezvousFailureReason.UnsupportedHomeserver)
}
send(Payload(PayloadType.PROGRESS, protocol = Protocol.LOGIN_TOKEN))
return checksum
}
@Throws(RendezvousError::class)
suspend fun waitForLoginOnNewDevice(authenticationService: AuthenticationService): Session {
Timber.tag(TAG).i("Waiting for login_token")
val loginToken = receive()
if (loginToken?.type == PayloadType.FINISH) {
when (loginToken.outcome) {
Outcome.DECLINED -> {
throw RendezvousError("Login declined by other device", RendezvousFailureReason.UserDeclined)
}
Outcome.UNSUPPORTED -> {
throw RendezvousError("Homeserver lacks support", RendezvousFailureReason.UnsupportedHomeserver)
}
else -> {
throw RendezvousError("Unknown error", RendezvousFailureReason.Unknown)
}
}
}
val homeserver = loginToken?.homeserver ?: throw RendezvousError("No homeserver returned", RendezvousFailureReason.ProtocolError)
val token = loginToken.loginToken ?: throw RendezvousError("No login token returned", RendezvousFailureReason.ProtocolError)
Timber.tag(TAG).i("Got login_token now attempting to sign in with $homeserver")
val hsConfig = HomeServerConnectionConfig(homeServerUri = Uri.parse(homeserver))
return authenticationService.loginUsingQrLoginToken(hsConfig, token)
}
@Throws(RendezvousError::class)
suspend fun completeVerificationOnNewDevice(session: Session) {
val userId = session.myUserId
val crypto = session.cryptoService()
val deviceId = crypto.getMyDevice().deviceId
val deviceKey = crypto.getMyDevice().fingerprint()
send(Payload(PayloadType.PROGRESS, outcome = Outcome.SUCCESS, deviceId = deviceId, deviceKey = deviceKey))
// await confirmation of verification
val verificationResponse = receive()
if (verificationResponse?.outcome == Outcome.VERIFIED) {
val verifyingDeviceId = verificationResponse.verifyingDeviceId
?: throw RendezvousError("No verifying device id returned", RendezvousFailureReason.ProtocolError)
val verifyingDeviceFromServer = crypto.getCryptoDeviceInfo(userId, verifyingDeviceId)
if (verifyingDeviceFromServer?.fingerprint() != verificationResponse.verifyingDeviceKey) {
Timber.tag(TAG).w(
"Verifying device $verifyingDeviceId key doesn't match: ${
verifyingDeviceFromServer?.fingerprint()
} vs ${verificationResponse.verifyingDeviceKey})"
)
// inform the other side
send(Payload(PayloadType.FINISH, outcome = Outcome.E2EE_SECURITY_ERROR))
throw RendezvousError("Key from verifying device doesn't match", RendezvousFailureReason.E2EESecurityIssue)
}
verificationResponse.masterKey?.let { masterKeyFromVerifyingDevice ->
// verifying device provided us with a master key, so use it to check integrity
// see what the homeserver told us
val localMasterKey = crypto.crossSigningService().getMyCrossSigningKeys()?.masterKey()
// n.b. if no local master key this is a problem, as well as it not matching
if (localMasterKey?.unpaddedBase64PublicKey != masterKeyFromVerifyingDevice) {
Timber.tag(TAG).w("Master key from verifying device doesn't match: $masterKeyFromVerifyingDevice vs $localMasterKey")
// inform the other side
send(Payload(PayloadType.FINISH, outcome = Outcome.E2EE_SECURITY_ERROR))
throw RendezvousError("Master key from verifying device doesn't match", RendezvousFailureReason.E2EESecurityIssue)
}
// set other device as verified
Timber.tag(TAG).i("Setting device $verifyingDeviceId as verified")
crypto.setDeviceVerification(DeviceTrustLevel(locallyVerified = true, crossSigningVerified = false), userId, verifyingDeviceId)
Timber.tag(TAG).i("Setting master key as trusted")
crypto.crossSigningService().markMyMasterKeyAsTrusted()
} ?: run {
// set other device as verified anyway
Timber.tag(TAG).i("Setting device $verifyingDeviceId as verified")
crypto.setDeviceVerification(DeviceTrustLevel(locallyVerified = true, crossSigningVerified = false), userId, verifyingDeviceId)
Timber.tag(TAG).i("No master key given by verifying device")
}
// request secrets from the verifying device
Timber.tag(TAG).i("Requesting secrets from $verifyingDeviceId")
session.sharedSecretStorageService().let {
it.requestSecret(MASTER_KEY_SSSS_NAME, verifyingDeviceId)
it.requestSecret(SELF_SIGNING_KEY_SSSS_NAME, verifyingDeviceId)
it.requestSecret(USER_SIGNING_KEY_SSSS_NAME, verifyingDeviceId)
it.requestSecret(KEYBACKUP_SECRET_SSSS_NAME, verifyingDeviceId)
}
} else {
Timber.tag(TAG).i("Not doing verification")
}
}
@Throws(RendezvousError::class)
private suspend fun receive(): Payload? {
val data = channel.receive() ?: return null
val payload = try {
adapter.fromJson(data.toString(Charsets.UTF_8))
} catch (e: Exception) {
Timber.tag(TAG).w(e, "Failed to parse payload")
throw RendezvousError("Invalid payload received", RendezvousFailureReason.Unknown)
}
return payload
}
private suspend fun send(payload: Payload) {
channel.send(adapter.toJson(payload).toByteArray(Charsets.UTF_8))
}
suspend fun close() {
channel.close()
}
}

View File

@ -0,0 +1,51 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous
import org.matrix.android.sdk.api.rendezvous.model.RendezvousError
/**
* Representation of a rendezvous channel such as that described by MSC3903.
*/
interface RendezvousChannel {
val transport: RendezvousTransport
/**
* @returns the checksum/confirmation digits to be shown to the user
*/
@Throws(RendezvousError::class)
suspend fun connect(): String
/**
* Send a payload via the channel.
* @param data payload to send
*/
@Throws(RendezvousError::class)
suspend fun send(data: ByteArray)
/**
* Receive a payload from the channel.
* @returns the received payload
*/
@Throws(RendezvousError::class)
suspend fun receive(): ByteArray?
/**
* Closes the channel and cleans up.
*/
suspend fun close()
}

View File

@ -0,0 +1,32 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous
enum class RendezvousFailureReason(val canRetry: Boolean = true) {
UserDeclined,
OtherDeviceNotSignedIn,
OtherDeviceAlreadySignedIn,
Unknown,
Expired,
UserCancelled,
InvalidCode,
UnsupportedAlgorithm(false),
UnsupportedTransport(false),
UnsupportedHomeserver(false),
ProtocolError,
E2EESecurityIssue(false)
}

View File

@ -0,0 +1,36 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous
import okhttp3.MediaType
import org.matrix.android.sdk.api.rendezvous.model.RendezvousError
import org.matrix.android.sdk.api.rendezvous.model.RendezvousTransportDetails
interface RendezvousTransport {
var ready: Boolean
@Throws(RendezvousError::class)
suspend fun details(): RendezvousTransportDetails
@Throws(RendezvousError::class)
suspend fun send(contentType: MediaType, data: ByteArray)
@Throws(RendezvousError::class)
suspend fun receive(): ByteArray?
suspend fun close()
}

View File

@ -0,0 +1,183 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.channels
import android.util.Base64
import com.squareup.moshi.JsonClass
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import okhttp3.MediaType.Companion.toMediaType
import org.matrix.android.sdk.api.logger.LoggerTag
import org.matrix.android.sdk.api.rendezvous.RendezvousChannel
import org.matrix.android.sdk.api.rendezvous.RendezvousFailureReason
import org.matrix.android.sdk.api.rendezvous.RendezvousTransport
import org.matrix.android.sdk.api.rendezvous.model.RendezvousError
import org.matrix.android.sdk.api.rendezvous.model.SecureRendezvousChannelAlgorithm
import org.matrix.android.sdk.api.util.MatrixJsonParser
import org.matrix.android.sdk.internal.crypto.verification.SASDefaultVerificationTransaction
import org.matrix.olm.OlmSAS
import timber.log.Timber
import java.security.SecureRandom
import java.util.LinkedList
import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
/**
* Implements X25519 ECDH key agreement and AES-256-GCM encryption channel as per MSC3903:
* https://github.com/matrix-org/matrix-spec-proposals/pull/3903
*/
class ECDHRendezvousChannel(override var transport: RendezvousTransport, theirPublicKeyBase64: String?) : RendezvousChannel {
companion object {
private const val ALGORITHM_SPEC = "AES/GCM/NoPadding"
private const val KEY_SPEC = "AES"
private val TAG = LoggerTag(ECDHRendezvousChannel::class.java.simpleName, LoggerTag.RENDEZVOUS).value
}
@JsonClass(generateAdapter = true)
internal data class ECDHPayload(
val algorithm: SecureRendezvousChannelAlgorithm? = null,
val key: String? = null,
val ciphertext: String? = null,
val iv: String? = null
)
private val olmSASMutex = Mutex()
private var olmSAS: OlmSAS?
private val ourPublicKey: ByteArray
private val ecdhAdapter = MatrixJsonParser.getMoshi().adapter(ECDHPayload::class.java)
private var theirPublicKey: ByteArray? = null
private var aesKey: ByteArray? = null
init {
theirPublicKeyBase64?.let {
theirPublicKey = Base64.decode(it, Base64.NO_WRAP)
}
olmSAS = OlmSAS()
ourPublicKey = Base64.decode(olmSAS!!.publicKey, Base64.NO_WRAP)
}
@Throws(RendezvousError::class)
override suspend fun connect(): String {
val sas = olmSAS ?: throw RendezvousError("Channel closed", RendezvousFailureReason.Unknown)
val isInitiator = theirPublicKey == null
if (isInitiator) {
Timber.tag(TAG).i("Waiting for other device to send their public key")
val res = this.receiveAsPayload() ?: throw RendezvousError("No reply from other device", RendezvousFailureReason.ProtocolError)
if (res.key == null) {
throw RendezvousError(
"Unsupported algorithm: ${res.algorithm}",
RendezvousFailureReason.UnsupportedAlgorithm,
)
}
theirPublicKey = Base64.decode(res.key, Base64.NO_WRAP)
} else {
// send our public key unencrypted
Timber.tag(TAG).i("Sending public key")
send(
ECDHPayload(
algorithm = SecureRendezvousChannelAlgorithm.ECDH_V1,
key = Base64.encodeToString(ourPublicKey, Base64.NO_WRAP)
)
)
}
olmSASMutex.withLock {
sas.setTheirPublicKey(Base64.encodeToString(theirPublicKey, Base64.NO_WRAP))
sas.setTheirPublicKey(Base64.encodeToString(theirPublicKey, Base64.NO_WRAP))
val initiatorKey = Base64.encodeToString(if (isInitiator) ourPublicKey else theirPublicKey, Base64.NO_WRAP)
val recipientKey = Base64.encodeToString(if (isInitiator) theirPublicKey else ourPublicKey, Base64.NO_WRAP)
val aesInfo = "${SecureRendezvousChannelAlgorithm.ECDH_V1.value}|$initiatorKey|$recipientKey"
aesKey = sas.generateShortCode(aesInfo, 32)
val rawChecksum = sas.generateShortCode(aesInfo, 5)
return SASDefaultVerificationTransaction.getDecimalCodeRepresentation(rawChecksum, separator = "-")
}
}
private suspend fun send(payload: ECDHPayload) {
transport.send("application/json".toMediaType(), ecdhAdapter.toJson(payload).toByteArray(Charsets.UTF_8))
}
override suspend fun send(data: ByteArray) {
if (aesKey == null) {
throw IllegalStateException("Shared secret not established")
}
send(encrypt(data))
}
private suspend fun receiveAsPayload(): ECDHPayload? {
transport.receive()?.toString(Charsets.UTF_8)?.let {
return ecdhAdapter.fromJson(it)
} ?: return null
}
override suspend fun receive(): ByteArray? {
if (aesKey == null) {
throw IllegalStateException("Shared secret not established")
}
val payload = receiveAsPayload() ?: return null
return decrypt(payload)
}
override suspend fun close() {
val sas = olmSAS ?: throw IllegalStateException("Channel already closed")
olmSASMutex.withLock {
// this does a double release check already so we don't re-check ourselves
sas.releaseSas()
olmSAS = null
}
transport.close()
}
private fun encrypt(plainText: ByteArray): ECDHPayload {
val iv = ByteArray(16)
SecureRandom().nextBytes(iv)
val cipherText = LinkedList<Byte>()
val encryptCipher = Cipher.getInstance(ALGORITHM_SPEC)
val secretKeySpec = SecretKeySpec(aesKey, KEY_SPEC)
val ivParameterSpec = IvParameterSpec(iv)
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec)
cipherText.addAll(encryptCipher.update(plainText).toList())
cipherText.addAll(encryptCipher.doFinal().toList())
return ECDHPayload(
ciphertext = Base64.encodeToString(cipherText.toByteArray(), Base64.NO_WRAP),
iv = Base64.encodeToString(iv, Base64.NO_WRAP)
)
}
private fun decrypt(payload: ECDHPayload): ByteArray {
val iv = Base64.decode(payload.iv, Base64.NO_WRAP)
val encryptCipher = Cipher.getInstance(ALGORITHM_SPEC)
val secretKeySpec = SecretKeySpec(aesKey, KEY_SPEC)
val ivParameterSpec = IvParameterSpec(iv)
encryptCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec)
val plainText = LinkedList<Byte>()
plainText.addAll(encryptCipher.update(Base64.decode(payload.ciphertext, Base64.NO_WRAP)).toList())
plainText.addAll(encryptCipher.doFinal().toList())
return plainText.toByteArray()
}
}

View File

@ -0,0 +1,26 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class ECDHRendezvous(
val transport: SimpleHttpRendezvousTransportDetails,
val algorithm: SecureRendezvousChannelAlgorithm,
val key: String
)

View File

@ -0,0 +1,25 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class ECDHRendezvousCode(
val intent: RendezvousIntent,
val rendezvous: ECDHRendezvous
)

View File

@ -0,0 +1,38 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = false)
enum class Outcome(val value: String) {
@Json(name = "success")
SUCCESS("success"),
@Json(name = "declined")
DECLINED("declined"),
@Json(name = "unsupported")
UNSUPPORTED("unsupported"),
@Json(name = "verified")
VERIFIED("verified"),
@Json(name = "e2ee_security_error")
E2EE_SECURITY_ERROR("e2ee_security_error")
}

View File

@ -0,0 +1,36 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
internal data class Payload(
val type: PayloadType,
val intent: RendezvousIntent? = null,
val outcome: Outcome? = null,
val protocols: List<Protocol>? = null,
val protocol: Protocol? = null,
val homeserver: String? = null,
@Json(name = "login_token") val loginToken: String? = null,
@Json(name = "device_id") val deviceId: String? = null,
@Json(name = "device_key") val deviceKey: String? = null,
@Json(name = "verifying_device_id") val verifyingDeviceId: String? = null,
@Json(name = "verifying_device_key") val verifyingDeviceKey: String? = null,
@Json(name = "master_key") val masterKey: String? = null
)

View File

@ -0,0 +1,32 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = false)
internal enum class PayloadType(val value: String) {
@Json(name = "m.login.start")
START("m.login.start"),
@Json(name = "m.login.finish")
FINISH("m.login.finish"),
@Json(name = "m.login.progress")
PROGRESS("m.login.progress")
}

View File

@ -0,0 +1,26 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = false)
enum class Protocol(val value: String) {
@Json(name = "org.matrix.msc3906.login_token")
LOGIN_TOKEN("org.matrix.msc3906.login_token")
}

View File

@ -0,0 +1,21 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import org.matrix.android.sdk.api.rendezvous.RendezvousFailureReason
class RendezvousError(val description: String, val reason: RendezvousFailureReason) : Exception(description)

View File

@ -0,0 +1,26 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = false)
enum class RendezvousIntent {
@Json(name = "login.start") LOGIN_ON_NEW_DEVICE,
@Json(name = "login.reciprocate") RECIPROCATE_LOGIN_ON_EXISTING_DEVICE
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2022 New Vector Ltd
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -14,10 +14,11 @@
* limitations under the License.
*/
package im.vector.app.features.login.qr
package org.matrix.android.sdk.api.rendezvous.model
enum class QrCodeLoginErrorType {
DEVICE_IS_NOT_SUPPORTED,
TIMEOUT,
REQUEST_WAS_DENIED,
}
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
open class RendezvousTransportDetails(
val type: RendezvousTransportType
)

View File

@ -0,0 +1,26 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = false)
enum class RendezvousTransportType(val value: String) {
@Json(name = "org.matrix.msc3886.http.v1")
MSC3886_SIMPLE_HTTP_V1("org.matrix.msc3886.http.v1")
}

View File

@ -0,0 +1,26 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = false)
enum class SecureRendezvousChannelAlgorithm(val value: String) {
@Json(name = "org.matrix.msc3903.rendezvous.v1.curve25519-aes-sha256")
ECDH_V1("org.matrix.msc3903.rendezvous.v1.curve25519-aes-sha256")
}

View File

@ -0,0 +1,24 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.model
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class SimpleHttpRendezvousTransportDetails(
val uri: String
) : RendezvousTransportDetails(type = RendezvousTransportType.MSC3886_SIMPLE_HTTP_V1)

View File

@ -0,0 +1,173 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.rendezvous.transports
import kotlinx.coroutines.delay
import okhttp3.MediaType
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.matrix.android.sdk.api.logger.LoggerTag
import org.matrix.android.sdk.api.rendezvous.RendezvousFailureReason
import org.matrix.android.sdk.api.rendezvous.RendezvousTransport
import org.matrix.android.sdk.api.rendezvous.model.RendezvousError
import org.matrix.android.sdk.api.rendezvous.model.RendezvousTransportDetails
import org.matrix.android.sdk.api.rendezvous.model.SimpleHttpRendezvousTransportDetails
import timber.log.Timber
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
/**
* Implementation of the Simple HTTP transport MSC3886: https://github.com/matrix-org/matrix-spec-proposals/pull/3886
*/
class SimpleHttpRendezvousTransport(rendezvousUri: String?) : RendezvousTransport {
companion object {
private val TAG = LoggerTag(SimpleHttpRendezvousTransport::class.java.simpleName, LoggerTag.RENDEZVOUS).value
}
override var ready = false
private var cancelled = false
private var uri: String?
private var etag: String? = null
private var expiresAt: Date? = null
init {
uri = rendezvousUri
}
override suspend fun details(): RendezvousTransportDetails {
val uri = uri ?: throw IllegalStateException("Rendezvous not set up")
return SimpleHttpRendezvousTransportDetails(uri)
}
@Throws(RendezvousError::class)
override suspend fun send(contentType: MediaType, data: ByteArray) {
if (cancelled) {
throw IllegalStateException("Rendezvous cancelled")
}
val method = if (uri != null) "PUT" else "POST"
val uri = this.uri ?: throw RuntimeException("No rendezvous URI")
val httpClient = okhttp3.OkHttpClient.Builder().build()
val request = Request.Builder()
.url(uri)
.method(method, data.toRequestBody())
.header("content-type", contentType.toString())
etag?.let {
request.header("if-match", it)
}
val response = httpClient.newCall(request.build()).execute()
if (response.code == 404) {
throw get404Error()
}
etag = response.header("etag")
Timber.tag(TAG).i("Sent data to $uri new etag $etag")
if (method == "POST") {
val location = response.header("location") ?: throw RuntimeException("No rendezvous URI found in response")
response.header("expires")?.let {
val format = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US)
expiresAt = format.parse(it)
}
// resolve location header which could be relative or absolute
this.uri = response.request.url.toUri().resolve(location).toString()
ready = true
}
}
@Throws(RendezvousError::class)
override suspend fun receive(): ByteArray? {
if (cancelled) {
throw IllegalStateException("Rendezvous cancelled")
}
val uri = uri ?: throw IllegalStateException("Rendezvous not set up")
val httpClient = okhttp3.OkHttpClient.Builder().build()
while (true) {
Timber.tag(TAG).i("Polling: $uri after etag $etag")
val request = Request.Builder()
.url(uri)
.get()
etag?.let {
request.header("if-none-match", it)
}
val response = httpClient.newCall(request.build()).execute()
try {
// expired
if (response.code == 404) {
throw get404Error()
}
// rely on server expiring the channel rather than checking ourselves
if (response.header("content-type") != "application/json") {
response.header("etag")?.let {
etag = it
}
} else if (response.code == 200) {
response.header("etag")?.let {
etag = it
}
return response.body?.bytes()
}
// sleep for a second before polling again
// we rely on the server expiring the channel rather than checking it ourselves
delay(1000)
} finally {
response.close()
}
}
}
private fun get404Error(): RendezvousError {
if (expiresAt != null && Date() > expiresAt) {
return RendezvousError("Expired", RendezvousFailureReason.Expired)
}
return RendezvousError("Received unexpected 404", RendezvousFailureReason.Unknown)
}
override suspend fun close() {
cancelled = true
ready = false
uri?.let {
try {
val httpClient = okhttp3.OkHttpClient.Builder().build()
val request = Request.Builder()
.url(it)
.delete()
.build()
httpClient.newCall(request).execute()
} catch (e: Throwable) {
Timber.tag(TAG).w(e, "Failed to delete channel")
}
}
}
}

View File

@ -401,7 +401,7 @@ fun Event.getRelationContent(): RelationDefaultContent? {
when (getClearType()) {
EventType.STICKER -> getClearContent().toModel<MessageStickerContent>()?.relatesTo
in EventType.BEACON_LOCATION_DATA -> getClearContent().toModel<MessageBeaconLocationDataContent>()?.relatesTo
else -> null
else -> getClearContent()?.get("m.relates_to")?.toContent().toModel()
}
}
}

View File

@ -65,6 +65,11 @@ data class HomeServerCapabilities(
* True if the home server supports login via qr code, false otherwise.
*/
val canLoginWithQrCode: Boolean = false,
/**
* True if the home server supports threaded read receipts and unread notifications.
*/
val canUseThreadReadReceiptsAndNotifications: Boolean = false,
) {
enum class RoomCapabilitySupport {

View File

@ -102,6 +102,14 @@ data class RoomSummary(
* Number of unread and highlighted message in this room.
*/
val highlightCount: Int = 0,
/**
* Number of threads with unread messages in this room.
*/
val threadNotificationCount: Int = 0,
/**
* Number of threads with highlighted messages in this room.
*/
val threadHighlightCount: Int = 0,
/**
* True if this room has unread messages.
*/

View File

@ -126,6 +126,8 @@ interface Timeline {
/**
* Called when new events come through the sync.
* Note that the corresponding events may not be available yet in the database.
* [onTimelineUpdated] will be called with the event content.
*/
fun onNewTimelineEvents(eventIds: List<String>) = Unit

View File

@ -52,6 +52,11 @@ data class RoomSync(
*/
@Json(name = "org.matrix.msc2654.unread_count") val unreadCount: Int? = null,
/**
* The count of threads with unread notifications (not the total # of notifications in all threads).
*/
@Json(name = "unread_thread_notifications") val unreadThreadNotifications: Map<String, RoomSyncUnreadThreadNotifications>? = null,
/**
* The room summary.
*/

View File

@ -0,0 +1,33 @@
/*
* Copyright 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.api.session.sync.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class RoomSyncUnreadThreadNotifications(
/**
* The number of threads with unread messages that match the push notification rules.
*/
@Json(name = "notification_count") val notificationCount: Int? = null,
/**
* The number of threads with highlighted unread messages (subset of notifications).
*/
@Json(name = "highlight_count") val highlightCount: Int? = null
)

View File

@ -60,5 +60,6 @@ internal data class HomeServerVersion(
val r0_6_0 = HomeServerVersion(major = 0, minor = 6, patch = 0)
val r0_6_1 = HomeServerVersion(major = 0, minor = 6, patch = 1)
val v1_3_0 = HomeServerVersion(major = 1, minor = 3, patch = 0)
val v1_4_0 = HomeServerVersion(major = 1, minor = 4, patch = 0)
}
}

View File

@ -54,6 +54,8 @@ private const val FEATURE_SEPARATE_ADD_AND_BIND = "m.separate_add_and_bind"
private const val FEATURE_THREADS_MSC3440 = "org.matrix.msc3440"
private const val FEATURE_THREADS_MSC3440_STABLE = "org.matrix.msc3440.stable"
private const val FEATURE_QR_CODE_LOGIN = "org.matrix.msc3882"
private const val FEATURE_THREADS_MSC3771 = "org.matrix.msc3771"
private const val FEATURE_THREADS_MSC3773 = "org.matrix.msc3773"
/**
* Return true if the SDK supports this homeserver version.
@ -79,6 +81,15 @@ internal fun Versions.doesServerSupportThreads(): Boolean {
return unstableFeatures?.get(FEATURE_THREADS_MSC3440_STABLE) ?: false
}
/**
* Indicate if the homeserver support MSC3771 and MSC3773 for threaded read receipts and unread notifications.
*/
internal fun Versions.doesServerSupportThreadUnreadNotifications(): Boolean {
val msc3771 = unstableFeatures?.get(FEATURE_THREADS_MSC3771) ?: false
val msc3773 = unstableFeatures?.get(FEATURE_THREADS_MSC3773) ?: false
return getMaxVersion() >= HomeServerVersion.v1_4_0 || (msc3771 && msc3773)
}
internal fun Versions.doesServerSupportQrCodeLogin(): Boolean {
return unstableFeatures?.get(FEATURE_QR_CODE_LOGIN) ?: false
}

View File

@ -18,13 +18,17 @@ package org.matrix.android.sdk.internal.crypto
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.MatrixConfiguration
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.MatrixPatterns
import org.matrix.android.sdk.api.auth.data.Credentials
import org.matrix.android.sdk.api.extensions.measureMetric
import org.matrix.android.sdk.api.metrics.DownloadDeviceKeysMetricsPlugin
import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel
import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
import org.matrix.android.sdk.internal.crypto.model.CryptoInfoMapper
import org.matrix.android.sdk.internal.crypto.model.rest.KeysQueryResponse
import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
import org.matrix.android.sdk.internal.crypto.tasks.DownloadKeysForUsersTask
import org.matrix.android.sdk.internal.session.SessionScope
@ -47,8 +51,11 @@ internal class DeviceListManager @Inject constructor(
coroutineDispatchers: MatrixCoroutineDispatchers,
private val taskExecutor: TaskExecutor,
private val clock: Clock,
matrixConfiguration: MatrixConfiguration
) {
private val metricPlugins = matrixConfiguration.metricPlugins
interface UserDevicesUpdateListener {
fun onUsersDeviceUpdate(userIds: List<String>)
}
@ -345,19 +352,25 @@ internal class DeviceListManager @Inject constructor(
return MXUsersDevicesMap()
}
val params = DownloadKeysForUsersTask.Params(filteredUsers, syncTokenStore.getLastToken())
val response = try {
downloadKeysForUsersTask.execute(params)
} catch (throwable: Throwable) {
Timber.e(throwable, "## CRYPTO | doKeyDownloadForUsers(): error")
if (throwable is CancellationException) {
// the crypto module is getting closed, so we cannot access the DB anymore
Timber.w("The crypto module is closed, ignoring this error")
} else {
onKeysDownloadFailed(filteredUsers)
val relevantPlugins = metricPlugins.filterIsInstance<DownloadDeviceKeysMetricsPlugin>()
val response: KeysQueryResponse
measureMetric(relevantPlugins) {
response = try {
downloadKeysForUsersTask.execute(params)
} catch (throwable: Throwable) {
Timber.e(throwable, "## CRYPTO | doKeyDownloadForUsers(): error")
if (throwable is CancellationException) {
// the crypto module is getting closed, so we cannot access the DB anymore
Timber.w("The crypto module is closed, ignoring this error")
} else {
onKeysDownloadFailed(filteredUsers)
}
throw throwable
}
throw throwable
Timber.v("## CRYPTO | doKeyDownloadForUsers() : Got keys for " + filteredUsers.size + " users")
}
Timber.v("## CRYPTO | doKeyDownloadForUsers() : Got keys for " + filteredUsers.size + " users")
for (userId in filteredUsers) {
// al devices =
val models = response.deviceKeys?.get(userId)?.mapValues { entry -> CryptoInfoMapper.map(entry.value) }

View File

@ -82,6 +82,33 @@ internal abstract class SASDefaultVerificationTransaction(
// older devices have limited support of emoji but SDK offers images for the 64 verification emojis
// so always send that we support EMOJI
val KNOWN_SHORT_CODES = listOf(SasMode.EMOJI, SasMode.DECIMAL)
/**
* decimal: generate five bytes by using HKDF.
* Take the first 13 bits and convert it to a decimal number (which will be a number between 0 and 8191 inclusive),
* and add 1000 (resulting in a number between 1000 and 9191 inclusive).
* Do the same with the second 13 bits, and the third 13 bits, giving three 4-digit numbers.
* In other words, if the five bytes are B0, B1, B2, B3, and B4, then the first number is (B0 << 5 | B1 >> 3) + 1000,
* the second number is ((B1 & 0x7) << 10 | B2 << 2 | B3 >> 6) + 1000, and the third number is ((B3 & 0x3f) << 7 | B4 >> 1) + 1000.
* (This method of converting 13 bits at a time is used to avoid requiring 32-bit clients to do big-number arithmetic,
* and adding 1000 to the number avoids having clients to worry about properly zero-padding the number when displaying to the user.)
* The three 4-digit numbers are displayed to the user either with dashes (or another appropriate separator) separating the three numbers,
* or with the three numbers on separate lines.
*/
fun getDecimalCodeRepresentation(byteArray: ByteArray, separator: String = " "): String {
val b0 = byteArray[0].toUnsignedInt() // need unsigned byte
val b1 = byteArray[1].toUnsignedInt() // need unsigned byte
val b2 = byteArray[2].toUnsignedInt() // need unsigned byte
val b3 = byteArray[3].toUnsignedInt() // need unsigned byte
val b4 = byteArray[4].toUnsignedInt() // need unsigned byte
// (B0 << 5 | B1 >> 3) + 1000
val first = (b0.shl(5) or b1.shr(3)) + 1000
// ((B1 & 0x7) << 10 | B2 << 2 | B3 >> 6) + 1000
val second = ((b1 and 0x7).shl(10) or b2.shl(2) or b3.shr(6)) + 1000
// ((B3 & 0x3f) << 7 | B4 >> 1) + 1000
val third = ((b3 and 0x3f).shl(7) or b4.shr(1)) + 1000
return "$first$separator$second$separator$third"
}
}
override var state: VerificationTxState = VerificationTxState.None
@ -371,33 +398,6 @@ internal abstract class SASDefaultVerificationTransaction(
return getDecimalCodeRepresentation(shortCodeBytes!!)
}
/**
* decimal: generate five bytes by using HKDF.
* Take the first 13 bits and convert it to a decimal number (which will be a number between 0 and 8191 inclusive),
* and add 1000 (resulting in a number between 1000 and 9191 inclusive).
* Do the same with the second 13 bits, and the third 13 bits, giving three 4-digit numbers.
* In other words, if the five bytes are B0, B1, B2, B3, and B4, then the first number is (B0 << 5 | B1 >> 3) + 1000,
* the second number is ((B1 & 0x7) << 10 | B2 << 2 | B3 >> 6) + 1000, and the third number is ((B3 & 0x3f) << 7 | B4 >> 1) + 1000.
* (This method of converting 13 bits at a time is used to avoid requiring 32-bit clients to do big-number arithmetic,
* and adding 1000 to the number avoids having clients to worry about properly zero-padding the number when displaying to the user.)
* The three 4-digit numbers are displayed to the user either with dashes (or another appropriate separator) separating the three numbers,
* or with the three numbers on separate lines.
*/
fun getDecimalCodeRepresentation(byteArray: ByteArray): String {
val b0 = byteArray[0].toUnsignedInt() // need unsigned byte
val b1 = byteArray[1].toUnsignedInt() // need unsigned byte
val b2 = byteArray[2].toUnsignedInt() // need unsigned byte
val b3 = byteArray[3].toUnsignedInt() // need unsigned byte
val b4 = byteArray[4].toUnsignedInt() // need unsigned byte
// (B0 << 5 | B1 >> 3) + 1000
val first = (b0.shl(5) or b1.shr(3)) + 1000
// ((B1 & 0x7) << 10 | B2 << 2 | B3 >> 6) + 1000
val second = ((b1 and 0x7).shl(10) or b2.shl(2) or b3.shr(6)) + 1000
// ((B3 & 0x3f) << 7 | B4 >> 1) + 1000
val third = ((b3 and 0x3f).shl(7) or b4.shr(1)) + 1000
return "$first $second $third"
}
override fun getEmojiCodeRepresentation(): List<EmojiRepresentation> {
return getEmojiCodeRepresentation(shortCodeBytes!!)
}

View File

@ -63,6 +63,8 @@ import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo036
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo037
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo038
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo039
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo040
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo041
import org.matrix.android.sdk.internal.util.Normalizer
import org.matrix.android.sdk.internal.util.database.MatrixRealmMigration
import timber.log.Timber
@ -86,7 +88,7 @@ internal class RealmSessionStoreMigration @Inject constructor(
private val scSchemaVersion = 7L
private val scSchemaVersionOffset = (1L shl 12)
val schemaVersion = 39L +
val schemaVersion = 41L +
scSchemaVersion * scSchemaVersionOffset
}
@ -142,6 +144,8 @@ internal class RealmSessionStoreMigration @Inject constructor(
if (oldVersion < 37) MigrateSessionTo037(realm).perform()
if (oldVersion < 38) MigrateSessionTo038(realm).perform()
if (oldVersion < 39) MigrateSessionTo039(realm).perform()
if (oldVersion < 40) MigrateSessionTo040(realm).perform()
if (oldVersion < 41) MigrateSessionTo041(realm).perform()
if (oldScVersion <= 0) MigrateScSessionTo001(realm).perform()
if (oldScVersion <= 1) MigrateScSessionTo002(realm).perform()

View File

@ -45,6 +45,7 @@ internal object HomeServerCapabilitiesMapper {
canUseThreading = entity.canUseThreading,
canControlLogoutDevices = entity.canControlLogoutDevices,
canLoginWithQrCode = entity.canLoginWithQrCode,
canUseThreadReadReceiptsAndNotifications = entity.canUseThreadReadReceiptsAndNotifications
)
}

View File

@ -72,6 +72,8 @@ internal class RoomSummaryMapper @Inject constructor(
unreadCount = roomSummaryEntity.unreadCount,
aggregatedUnreadCount = roomSummaryEntity.aggregatedUnreadCount,
aggregatedNotificationCount = roomSummaryEntity.aggregatedNotificationCount,
threadHighlightCount = roomSummaryEntity.threadHighlightCount,
threadNotificationCount = roomSummaryEntity.threadNotificationCount,
hasUnreadMessages = roomSummaryEntity.hasUnreadMessages,
hasUnreadContentMessages = roomSummaryEntity.hasUnreadContentMessages,
hasUnreadOriginalContentMessages = roomSummaryEntity.hasUnreadOriginalContentMessages,

View File

@ -0,0 +1,34 @@
/*
* Copyright (c) 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.internal.database.migration
import io.realm.DynamicRealm
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntityFields
import org.matrix.android.sdk.internal.extensions.forceRefreshOfHomeServerCapabilities
import org.matrix.android.sdk.internal.util.database.RealmMigrator
internal class MigrateSessionTo040(realm: DynamicRealm) : RealmMigrator(realm, 40) {
override fun doMigrate(realm: DynamicRealm) {
realm.schema.get("HomeServerCapabilitiesEntity")
?.addField(HomeServerCapabilitiesEntityFields.CAN_USE_THREAD_READ_RECEIPTS_AND_NOTIFICATIONS, Boolean::class.java)
?.transform { obj ->
obj.set(HomeServerCapabilitiesEntityFields.CAN_USE_THREAD_READ_RECEIPTS_AND_NOTIFICATIONS, false)
}
?.forceRefreshOfHomeServerCapabilities()
}
}

View File

@ -0,0 +1,30 @@
/*
* Copyright (c) 2022 The Matrix.org Foundation C.I.C.
*
* 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.
*/
package org.matrix.android.sdk.internal.database.migration
import io.realm.DynamicRealm
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntityFields
import org.matrix.android.sdk.internal.util.database.RealmMigrator
internal class MigrateSessionTo041(realm: DynamicRealm) : RealmMigrator(realm, 41) {
override fun doMigrate(realm: DynamicRealm) {
realm.schema.get("RoomSummaryEntity")
?.addField(RoomSummaryEntityFields.THREAD_HIGHLIGHT_COUNT, Int::class.java)
?.addField(RoomSummaryEntityFields.THREAD_NOTIFICATION_COUNT, Int::class.java)
}
}

View File

@ -32,6 +32,7 @@ internal open class HomeServerCapabilitiesEntity(
var canUseThreading: Boolean = false,
var canControlLogoutDevices: Boolean = false,
var canLoginWithQrCode: Boolean = false,
var canUseThreadReadReceiptsAndNotifications: Boolean = false,
) : RealmObject() {
companion object

View File

@ -175,6 +175,16 @@ internal open class RoomSummaryEntity(
if (value != field) field = value
}
var threadNotificationCount: Int = 0
set(value) {
if (value != field) field = value
}
var threadHighlightCount: Int = 0
set(value) {
if (value != field) field = value
}
var readMarkerId: String? = null
set(value) {
if (value != field) field = value

View File

@ -167,8 +167,7 @@ internal fun RealmQuery<TimelineEventEntity>.filterEvents(filters: TimelineEvent
endGroup()
}
if (filters.filterUseless) {
not()
.equalTo(TimelineEventEntityFields.ROOT.IS_USELESS, true)
not().equalTo(TimelineEventEntityFields.ROOT.IS_USELESS, true)
}
if (filters.filterEdits) {
not().like(TimelineEventEntityFields.ROOT.CONTENT, TimelineEventFilter.Content.EDIT)

View File

@ -17,11 +17,11 @@
package org.matrix.android.sdk.internal.session.content
import kotlinx.coroutines.withContext
import org.apache.sanselan.Sanselan
import org.apache.sanselan.formats.jpeg.JpegImageMetadata
import org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter
import org.apache.sanselan.formats.tiff.constants.ExifTagConstants
import org.apache.sanselan.formats.tiff.constants.GPSTagConstants
import org.apache.commons.imaging.Imaging
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata
import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter
import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants
import org.apache.commons.imaging.formats.tiff.constants.GpsTagConstants
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.internal.util.TemporaryFileCreator
@ -46,24 +46,13 @@ internal class ImageExifTagRemover @Inject constructor(
*/
suspend fun removeSensitiveJpegExifTags(jpegImageFile: File): File = withContext(coroutineDispatchers.io) {
val outputSet = tryOrNull("Unable to read JpegImageMetadata") {
(Sanselan.getMetadata(jpegImageFile) as? JpegImageMetadata)?.exif?.outputSet
(Imaging.getMetadata(jpegImageFile) as? JpegImageMetadata)?.exif?.outputSet
} ?: return@withContext jpegImageFile
tryOrNull("Unable to remove ExifData") {
outputSet.removeField(ExifTagConstants.EXIF_TAG_GPSINFO)
outputSet.removeField(ExifTagConstants.EXIF_TAG_SUBJECT_LOCATION_1)
outputSet.removeField(ExifTagConstants.EXIF_TAG_SUBJECT_LOCATION_2)
outputSet.removeField(ExifTagConstants.EXIF_TAG_USER_COMMENT)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_ALTITUDE)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_ALTITUDE_REF)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_LONGITUDE)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_LONGITUDE_REF)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_DEST_LONGITUDE)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_DEST_LONGITUDE_REF)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_LATITUDE)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_LATITUDE_REF)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_DEST_LATITUDE)
outputSet.removeField(GPSTagConstants.GPS_TAG_GPS_DEST_LATITUDE_REF)
tagsToRemove.forEach { tagInfo ->
outputSet.removeField(tagInfo)
}
} ?: return@withContext jpegImageFile
val scrubbedFile = temporaryFileCreator.create()
@ -82,4 +71,12 @@ internal class ImageExifTagRemover @Inject constructor(
}
)
}
private val tagsToRemove
get() = GpsTagConstants.ALL_GPS_TAGS +
listOf(
ExifTagConstants.EXIF_TAG_GPSINFO,
ExifTagConstants.EXIF_TAG_SUBJECT_LOCATION,
ExifTagConstants.EXIF_TAG_USER_COMMENT,
)
}

View File

@ -28,7 +28,7 @@ internal object FilterFactory {
limit = numberOfEvents,
// senders = listOf(userId),
// relationSenders = userId?.let { listOf(it) },
relationTypes = listOf(RelationType.THREAD)
relationTypes = listOf(RelationType.THREAD),
)
}
@ -37,7 +37,7 @@ internal object FilterFactory {
limit = numberOfEvents,
containsUrl = true,
types = listOf(EventType.MESSAGE),
lazyLoadMembers = true
lazyLoadMembers = true,
)
}
@ -55,30 +55,23 @@ internal object FilterFactory {
}
fun createDefaultRoomFilter(): RoomEventFilter {
return RoomEventFilter(
lazyLoadMembers = true
)
return RoomEventFilter(lazyLoadMembers = true)
}
fun createElementRoomFilter(): RoomEventFilter {
return RoomEventFilter(
lazyLoadMembers = true
lazyLoadMembers = true,
// TODO Enable this for optimization
// types = (listOfSupportedEventTypes + listOfSupportedStateEventTypes).toMutableList()
)
}
private fun createElementTimelineFilter(): RoomEventFilter? {
return null // RoomEventFilter().apply {
// TODO Enable this for optimization
// types = listOfSupportedEventTypes.toMutableList()
// }
return RoomEventFilter(enableUnreadThreadNotifications = true)
}
private fun createElementStateFilter(): RoomEventFilter {
return RoomEventFilter(
lazyLoadMembers = true
)
return RoomEventFilter(lazyLoadMembers = true)
}
// Get only managed types by Element

View File

@ -17,6 +17,7 @@ package org.matrix.android.sdk.internal.session.filter
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import org.matrix.android.sdk.api.session.sync.model.RoomSync
import org.matrix.android.sdk.internal.di.MoshiProvider
/**
@ -74,9 +75,15 @@ internal data class RoomEventFilter(
*/
@Json(name = "contains_url") val containsUrl: Boolean? = null,
/**
* If true, enables lazy-loading of membership events. See Lazy-loading room members for more information. Defaults to false.
* If true, enables lazy-loading of membership events.
* See Lazy-loading room members for more information.
* Defaults to false.
*/
@Json(name = "lazy_load_members") val lazyLoadMembers: Boolean? = null
@Json(name = "lazy_load_members") val lazyLoadMembers: Boolean? = null,
/**
* If true, this will opt-in for the server to return unread threads notifications in [RoomSync].
*/
@Json(name = "unread_thread_notifications") val enableUnreadThreadNotifications: Boolean? = null,
) {
fun toJSONString(): String {
@ -92,6 +99,7 @@ internal data class RoomEventFilter(
rooms != null ||
notRooms != null ||
containsUrl != null ||
lazyLoadMembers != null)
lazyLoadMembers != null ||
enableUnreadThreadNotifications != null)
}
}

View File

@ -25,6 +25,7 @@ import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
import org.matrix.android.sdk.internal.auth.version.Versions
import org.matrix.android.sdk.internal.auth.version.doesServerSupportLogoutDevices
import org.matrix.android.sdk.internal.auth.version.doesServerSupportQrCodeLogin
import org.matrix.android.sdk.internal.auth.version.doesServerSupportThreadUnreadNotifications
import org.matrix.android.sdk.internal.auth.version.doesServerSupportThreads
import org.matrix.android.sdk.internal.auth.version.isLoginAndRegistrationSupportedBySdk
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity
@ -144,6 +145,8 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
homeServerCapabilitiesEntity.canControlLogoutDevices = getVersionResult.doesServerSupportLogoutDevices()
homeServerCapabilitiesEntity.canUseThreading = /* capabilities?.threads?.enabled.orFalse() || */
getVersionResult.doesServerSupportThreads()
homeServerCapabilitiesEntity.canUseThreadReadReceiptsAndNotifications =
getVersionResult.doesServerSupportThreadUnreadNotifications()
homeServerCapabilitiesEntity.canLoginWithQrCode = getVersionResult.doesServerSupportQrCodeLogin()
}

Some files were not shown because too many files have changed in this diff Show More