diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml index 5698a696b6..30b6600c94 100644 --- a/.github/workflows/danger.yml +++ b/.github/workflows/danger.yml @@ -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: diff --git a/.github/workflows/post-pr.yml b/.github/workflows/post-pr.yml index b618519b0d..aac4fffa4e 100644 --- a/.github/workflows/post-pr.yml +++ b/.github/workflows/post-pr.yml @@ -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 diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 1692e2e281..9d9e8e76e8 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -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: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1816fe3a78..bb16d8abe8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -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 diff --git a/.github/workflows/triage-incoming.yml b/.github/workflows/triage-incoming.yml index 6a22bf5223..4dadc25ab4 100644 --- a/.github/workflows/triage-incoming.yml +++ b/.github/workflows/triage-incoming.yml @@ -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 diff --git a/.github/workflows/triage-labelled.yml b/.github/workflows/triage-labelled.yml index 174e3c54c0..8e9cc6d76c 100644 --- a/.github/workflows/triage-labelled.yml +++ b/.github/workflows/triage-labelled.yml @@ -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 }} diff --git a/.github/workflows/triage-priority-bugs.yml b/.github/workflows/triage-priority-bugs.yml index e762102226..07e73fe805 100644 --- a/.github/workflows/triage-priority-bugs.yml +++ b/.github/workflows/triage-priority-bugs.yml @@ -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 diff --git a/.github/workflows/triage-unlabelled.yml b/.github/workflows/triage-unlabelled.yml index 06df286d09..98d6579958 100644 --- a/.github/workflows/triage-unlabelled.yml +++ b/.github/workflows/triage-unlabelled.yml @@ -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 diff --git a/CHANGES.md b/CHANGES.md index 7e2df7716b..cfea189c21 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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) ====================================== diff --git a/build.gradle b/build.gradle index d0f093a451..7e7da48295 100644 --- a/build.gradle +++ b/build.gradle @@ -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) { diff --git a/dependencies.gradle b/dependencies.gradle index f081e0a874..33a2096a43 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -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 : [ 'coroutinesCore' : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutines", @@ -50,12 +47,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", @@ -82,7 +79,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 @@ -108,6 +105,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" ], @@ -161,13 +160,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", ] diff --git a/dependencies_groups.gradle b/dependencies_groups.gradle index 68de2c1581..8d488ba2f8 100644 --- a/dependencies_groups.gradle +++ b/dependencies_groups.gradle @@ -176,7 +176,6 @@ ext.groups = [ 'org.apache.ant', 'org.apache.commons', 'org.apache.httpcomponents', - 'org.apache.sanselan', 'org.bouncycastle', 'org.ccil.cowan.tagsoup', 'org.checkerframework', diff --git a/docs/jitsi.md b/docs/jitsi.md index 4dd06effdb..d6c93c49aa 100644 --- a/docs/jitsi.md +++ b/docs/jitsi.md @@ -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 `.misc` to notify about the library upgrade. diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105040.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105040.txt new file mode 100644 index 0000000000..c1bf4fd59a --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/de-DE/changelogs/40105000.txt b/fastlane/metadata/android/de-DE/changelogs/40105000.txt index cd3ec93387..254c0fe0d8 100644 --- a/fastlane/metadata/android/de-DE/changelogs/40105000.txt +++ b/fastlane/metadata/android/de-DE/changelogs/40105000.txt @@ -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 diff --git a/fastlane/metadata/android/de-DE/changelogs/40105020.txt b/fastlane/metadata/android/de-DE/changelogs/40105020.txt index ac08e662db..af7a8d7cce 100644 --- a/fastlane/metadata/android/de-DE/changelogs/40105020.txt +++ b/fastlane/metadata/android/de-DE/changelogs/40105020.txt @@ -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 diff --git a/fastlane/metadata/android/de-DE/changelogs/40105040.txt b/fastlane/metadata/android/de-DE/changelogs/40105040.txt new file mode 100644 index 0000000000..017e23cd9e --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/en-US/changelogs/40105060.txt b/fastlane/metadata/android/en-US/changelogs/40105060.txt new file mode 100644 index 0000000000..8269f7145c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40105060.txt @@ -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 diff --git a/fastlane/metadata/android/et/changelogs/40105040.txt b/fastlane/metadata/android/et/changelogs/40105040.txt new file mode 100644 index 0000000000..b1c84cad47 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/fa/changelogs/40105040.txt b/fastlane/metadata/android/fa/changelogs/40105040.txt new file mode 100644 index 0000000000..a33ad09422 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40105040.txt @@ -0,0 +1,2 @@ +تغییرات اصلی در این نگارش: قابلیت‌های جدید در تنظیمات آزمایشگاه‌ها: نگارندهٔ متن غنی، مدیریت افزارهٔ جدید، پخش صدا. هنوز زیر توسعهٔ فعّال! +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/fr-FR/changelogs/40105040.txt b/fastlane/metadata/android/fr-FR/changelogs/40105040.txt new file mode 100644 index 0000000000..027e2b0252 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40105040.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : Nouvelles fonctionnalités expérimentales : éditeur de texte formaté, nouveau gestionnaire d’appareils, diffusion audio. C’est toujours en cours de développement ! +Intégralité des changements : https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/id/changelogs/40105040.txt b/fastlane/metadata/android/id/changelogs/40105040.txt new file mode 100644 index 0000000000..810af47607 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/it-IT/changelogs/40105040.txt b/fastlane/metadata/android/it-IT/changelogs/40105040.txt new file mode 100644 index 0000000000..1e69c7436e --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/pt-BR/changelogs/40105040.txt b/fastlane/metadata/android/pt-BR/changelogs/40105040.txt new file mode 100644 index 0000000000..99d6971bf3 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104340.txt b/fastlane/metadata/android/ru-RU/changelogs/40104340.txt new file mode 100644 index 0000000000..63da187fe9 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/40104340.txt @@ -0,0 +1,2 @@ +Основные изменения в этой версии: различные исправления ошибок и улучшения стабильности. +Полный список изменений: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104360.txt b/fastlane/metadata/android/ru-RU/changelogs/40104360.txt new file mode 100644 index 0000000000..208233d92e --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/40104360.txt @@ -0,0 +1,3 @@ +Новый вид приложения можно включить в настройках лаборатории. Пожалуйста, попробуйте! +Исправлены проблемы, связанные с отсутствием уведомлений и длительной инкрементной синхронизацией. +Полный список изменений: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/ru-RU/changelogs/40105020.txt b/fastlane/metadata/android/ru-RU/changelogs/40105020.txt new file mode 100644 index 0000000000..83bf3c747b --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/40105020.txt @@ -0,0 +1,2 @@ +Основные изменения в этой версии: новый вид приложения включён по умолчанию! +Весь список изменений: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/ru-RU/changelogs/40105040.txt b/fastlane/metadata/android/ru-RU/changelogs/40105040.txt new file mode 100644 index 0000000000..c923750bc4 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/40105040.txt @@ -0,0 +1,2 @@ +Основные изменения в этой версии — новые возможности в настройках лаборатории: наглядный текстовый редактор, новое управление устройствами, голосовая трансляция. Всё это ещё находится в активной разработке! +Весь список изменений: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/sk/changelogs/40105040.txt b/fastlane/metadata/android/sk/changelogs/40105040.txt new file mode 100644 index 0000000000..75d4196fbf --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40105040.txt b/fastlane/metadata/android/sv-SE/changelogs/40105040.txt new file mode 100644 index 0000000000..66b2b47e7d --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40105040.txt @@ -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 diff --git a/fastlane/metadata/android/uk/changelogs/40105040.txt b/fastlane/metadata/android/uk/changelogs/40105040.txt new file mode 100644 index 0000000000..bbc005f84c --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40105040.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: Нові можливості в налаштуваннях лабораторії: Текстовий редактор, нове керування пристроями, голосові повідомлення. Досі в активній розробці! +Список усіх змін: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105040.txt b/fastlane/metadata/android/zh-TW/changelogs/40105040.txt new file mode 100644 index 0000000000..b35b1185b9 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40105040.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:實驗室設定下有新功能:格式化文字編輯器、新裝置管理、語音廣播。仍在積極開發中! +完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/library/ui-strings/src/main/res/values-az/strings.xml b/library/ui-strings/src/main/res/values-az/strings.xml index 53100db285..044ecf900c 100644 --- a/library/ui-strings/src/main/res/values-az/strings.xml +++ b/library/ui-strings/src/main/res/values-az/strings.xml @@ -69,4 +69,68 @@ %1$s %2$s üçün dəvəti qəbul etdi. Səbəb: %3$s %1$s %2$s dəvətini geri götürdü. Səbəb: %3$s Otağ yaratdınız + Bu əməliyyatı yerinə yetirmək üçün sistem tənzimləmələrindən Kameraya icazə verin. + Tənzimləmələr + %1$s qoşuldu + Otağa qoşuldunuz + %1$s-ı dəvət etdiniz + Müzakirə yaratdınız + %1$s otağı yaratdı + Səsli bildirişlər + Bildirişləri dinləmək + Ümumi + Ümumi + 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. + 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. + Otaq avatarını sildiniz + %1$s otaq avatarını sildi + Otaq mövzusunu sildiniz + Otağın adını sildiniz + 🎉 Bütün serverlərin iştirakı qadağandır! Bu otaq artıq istifadə edilə bilməz. + Dəyişiklik yoxdur. + Bu otaq üçün server ACL-lərini dəyişdirdiniz. + • %s ilə uyğunlaşan serverlər qadağan edilib. + Bu otaq üçün server ACL-lərini təyin etdiniz. + %s bu otaq üçün server ACL-lərini təyin etdi. + Burada təkmilləşdirdiniz. + %s burada təkmilləşdi. + Bu otağı təkmilləşdirdiniz. + Gələcək mesajları %1$s üçün görünən etdiniz + %1$s gələcək mesajları %2$s üçün görünən etdi + Gələcək otaq tarixçəsini %1$s üçün görünən etdiniz + Zəngi bitirdiniz. + Zəngə cavab verdiniz. + Zəngi qurmaq üçün məlumat göndərdiniz. + %s zəngi qurmaq üçün məlumat göndərdi. + Səsli zəng etdiniz. + Video zəng etdiniz. + Otağın adını buna dəyişdiniz: %1$s + Otaq avatarını dəyişdiniz + %1$s otaq avatarını dəyişdi + Mövzunu buna dəyişdiniz: %1$s + Ekran adınızı sildiniz (bu, %1$s idi) + %1$s ekran adınızı %2$s olaraq dəyişdiniz + Ekran adınızı %1$s qoydunuz + Avatarınızı dəyişdirmisiniz + %1$s dəvətini geri götürdünüz + %1$s adlı istifadəçini qadağan etdiniz + %1$s adlı istifadəçini qadağan etdiniz + %1$s adlı istifadəçini qovdunuz + Dəvəti rədd etdiniz + Otağı tərk etdiniz + %1$s otaqdan çıxdı + Otağı tərk etdiniz + Qoşuldunuz + %1$s müzakirə yaratdı + Sizin dəvətiniz + + %1$d seçildi + %1$d seçildi + + %1$s, %2$s-ı dəvət etdi + Otağa qoşulmaq üçün %1$s-a dəvət göndərdiniz + %s, bu otaq üçün server ACL-lərini dəyişdi. + • %s ilə uyğunlaşan serverlərə icazə verildi. \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml index fa363cee8c..ce786fb87d 100644 --- a/library/ui-strings/src/main/res/values-ca/strings.xml +++ b/library/ui-strings/src/main/res/values-ca/strings.xml @@ -381,7 +381,7 @@ Versió Versió d\'OLM Termes i condicions - Avisos de terceres parts + Avisos de tercers Copyright Política de privacitat Esborra la memòria cau @@ -1198,8 +1198,8 @@ 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. Format: Url: - session_name: - push_key: + Àlies de la sessió: + Clau \'push\': ID d\'aplicació: Revisa la configuració per activar les notificacions Estàs veient la notificació! Clica\'m! @@ -1376,7 +1376,7 @@ Si treus el vet a un usuari podrà tornar a unir-se a la sala. No s\'ha pogut treure el vet a l\'usuari Treu el vet a l\'usuari - app_display_name: + Àlies de l\'aplicació: El teu àlies Estableix la foto URL de la teva foto @@ -1630,7 +1630,7 @@ ha enviat una nevada ❄️ El meu codi Comparteix el meu codi - Escaneja un codi QR + Escaneja codi QR No és un codi QR de Matrix vàlid No hi ha informació criptogràfica disponible La nova sessió s\'ha verificat. Tindrà accés als teus missatges xifrats i es mostrarà de confiança per als altres usuaris. @@ -2745,4 +2745,95 @@ Estat de verificació desconegut Escaneja codi QR ID de sessió: + ${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. + 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; + 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: + Comença a la pantalla d\'inici de sessió + Comença a la pantalla d\'inici de sessió + Iniciant sessió a un dispositiu mòbil\? + Mostra codi QR + Selecciona \'Escaneja codi QR\' + Selecciona \'Mostra codi QR\' + Ves a Configuració -> Seguretat i privadesa + Obre l\'aplicació en l\'altre dispositiu + Inici de sessió cancel·lat per l\'altre dispositiu. + El codi QR és invàlid. + L\'altre dispositiu ha d\'haver iniciat sessió. + L\'altre dispositiu ja ha iniciat sessió. + Ha fallat la petició. + Petició denegada per l\'altre dispositiu. + La vinculació no s\'ha completat en el temps permès. + La vinculació amb aquest dispositiu no està admesa. + Connexió sense èxit + Connexió segura establerta + Escaneja el codi QR de sota amb el dispositiu amb la sessió tancada. + Utilitza el dispositiu amb la sessió iniciada per escanejar el codi QR següent: + Torna-ho a provar + No coincideix\? + Iniciant sessió + Connectant al dispositiu + Escaneja codi QR + Confirma + Assegura\'t que coneixes l\'origen d\'aquest codi. L\'enllaç de dispositius, proporciona a algú accés complet al teu compte. + Aplica subratllat + Ratlla-ho + Aplica negreta + Aplica cursiva + Selecciona \'Inicia sessió amb codi QR\' + El servidor no és compatible amb l\'inici de sessió mitjançant codi QR. + Inicia sessió amb codi QR + Utilitza la càmera d\'aquest dispositiu per escanejar el codi QR que es mostra a l\'altre dispositiu: + Escaneja codi QR + 3 + 2 + 1 + Permet enregistrar i enviar emissions de veu dins una sala. + Activa l\'emissió de veu (en desenvolupament) + Activa la gravació d\'informació de client + Desa el nom de client, la versió i l\'URL per reconèixer les sessions més fàcilment dins el gestor de sessions. + Obté un millor control i visibilitat de totes les teves sessions. + Activa el nou gestor de sessions + 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: + Inicia sessió amb codi QR + Sistema operatiu + Model + Navegador + URL + Versió + Nom + Aplicació + Verifica la teva sessió actual per mostrar l\'estat de verificació d\'aquesta sessió. + Activat: + Alguna cosa ha anat malament. Comprova la teva connexió i torna-ho a provar. + Concedir permís + ${app_name} necessita permís per mostrar notificacions. +\nSi us plau, concedeix-li el permís. + Prova l\'editor de text enriquit (el mode text pla arribarà aviat) + Activa l\'editor de text enriquit + Rep notificacions en aquesta sessió. + Notificacions + Carregant + Pausa l\'emissió de veu + Reprodueix o reprèn l\'emissió de veu + Atura l\'enregistrament d\'emissió de veu + Pausa l\'enregistrament d\'emissió de veu + Reprèn l\'enregistrament d\'emissió de veu + En directe + Deselecciona-ho tot + Selecciona-ho tot + + %1$d seleccionat + %1$d seleccionats + + Enquestes + Selecciona sessions + Contacte + Càmera + Ubicació + Emissió de veu + Adjunts + Adhesius + Galeria \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml index 3410858988..53599adce2 100644 --- a/library/ui-strings/src/main/res/values-cs/strings.xml +++ b/library/ui-strings/src/main/res/values-cs/strings.xml @@ -351,7 +351,7 @@ Hovor probíhá… Protější strana hovor nepřijala. Informace - ${app_name} potřebuje oprávnění pro přístup k Vašemu mikrofonu pro uskutečnění hlasových hovorů. + ${app_name} potřebuje oprávnění pro přístup k vašemu mikrofonu pro uskutečnění hlasových hovorů. ANO NE Pokračovat @@ -411,12 +411,12 @@ Hotovo Opravdu se chcete odhlásit\? Video hovor probíhá… - ${app_name} potřebuje oprávnění pro přístup k Vaší kameře a mikrofonu pro uskutečnění video hovoru. + ${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. Tuto změnu nelze zvrátit, protože povyšujete uživatele na stejnou úroveň, jakou máte vy. \nOpravdu to chcete udělat\? - 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. + 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. 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. 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. 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. @@ -578,7 +578,7 @@ Deaktivace účtu Deaktivovat můj účet Objevování - Správa Vašich nastavení pro objevování. + Správa vašich nastavení pro objevování. Analýza Odeslat analytická data ${app_name} sbírá anonymní analytická data pro vylepšení aplikace. @@ -848,7 +848,7 @@ Začít používat zálohu klíčů (Pokročilé) Zabezpečit zálohu přístupovou frází. - 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čí. + 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. Nastavit přístupovou frází @@ -856,7 +856,7 @@ Nebo zabezpečte svoji zálohu pomocí klíče obnovy, uloženého někde v bezpečí. (Pokročilé) Nastavit s klíčem obnovy Podařilo se! - 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. + 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) Uchovávejte svůj klíč obnovy velmi bezpečně, např. ve správci hesel (nebo trezoru) Hotovo @@ -971,7 +971,7 @@ Hlas a video Nápověda a O aplikaci Registrovat token - Učinit návrh + Poslat návrh Prosím, zapište svůj návrh níže. Popište svůj návrh tady Děkujeme, návrh byl úspěšně odeslán @@ -1023,7 +1023,7 @@ Zapnout podrobné záznamy. 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. Prosím, opakujte, jakmile jste přijali všeobecné podmínky svého domovského serveru. - 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. + 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. Poslat přílohu Otevřít navigační zásuvku Otevřít menu založení místnosti @@ -1106,7 +1106,7 @@ Prémiový hosting pro organizace Zadejte adresu Modular Element nebo serveru, který chcete použít Při načítání stránky došlo k chybě: %1$s (%2$d) - Aplikace se nemůže přihlásit k tomuto homeserveru. Homeserver podporuje následující typy přihlášení: %1$s. + 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\? Omlouváme se, tento server již nepřijímá nové účty. @@ -1279,7 +1279,7 @@ ${app_name} neobstarává události typu \'%1$s\' ${app_name} narazil na chybu při převádění obsahu události s id \'%1$s\' Odignorovat - Tato relace nemůže sdílet toto ověření s jinými z Vašich relací. + 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. Odešle danou zprávu zabarvenou jako duha Odešle daný emote zabarvený jako duha @@ -1475,7 +1475,7 @@ Manuálně ověřit textem Ověřit přihlášení Interaktivně ověřit pomocí Emoji - 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. + 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. Zvolte si, prosím, uživatelské jméno. Prosím, zvolte heslo. Překontrolovat tento odkaz @@ -1517,7 +1517,7 @@ Nemáte povolení zahájit konferenční hovor v této místnosti Zahájit video schůzku Zahájit hlasovou schůzku - 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á. + 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á. Nemůžete zahájit hovor se sebou Nemůžete zahájit hovor se sebou, počkejte, až účastníci přijmou pozvánku Přidání widgetu se nezdařilo @@ -1567,9 +1567,9 @@ Důvod k vykázání Zrušit vykázání uživatele Zrušení vykázání uživatele jim opět umožní vstoupit do místnosti. - Žádné telefonní číslo nebylo zadáno do Vašeho účtu + Žádné telefonní číslo nebylo zadáno do vašeho účtu Emailová adresa - Žádná emailová adresa nebyla zadána do Vašeho účtu + Žádná emailová adresa nebyla zadána do vašeho účtu Telefonní čísla Ostranit %s\? Ujistěte se, že kliknete na odkaz v e-mailu, který jsme Vám poslali. @@ -1577,7 +1577,7 @@ Vytvořit bezpečnou zálohu Resetovat bezpečnou zálohu Nastavit na tomto zařízení - 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. + 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. Generovat nový bezpečnostní klíč nebo nastavit novou bezpečnostní frázi pro existující zálohu. To nahradí Váš nynější klíč nebo frázi. Integrace jsou vypnuty @@ -1641,7 +1641,7 @@ Zastavit fotoaparát Spustit fotoaparát Bezpečná záloha - 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. + 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. Nastavit Použít bezpečnostní klíč Generovat bezpečnostní klíč k uložení na bezpečném místě např. správci hesel nebo sejfu. @@ -2104,13 +2104,13 @@ Prohlédnout a spravovat adresy tohoto prostoru. Adresy prostorů Aktualizujte na doporučenou verzi místnosti - Tato místnost používá místnost verze %s, kterou homeserver označil za nestabilní. + Tato místnost používá verzi místnosti %s, kterou domovský server označil za nestabilní. K aktualizaci místnosti potřebujete oprávnění Automaticky aktualizovat mateřský prostor Automaticky pozvat uživatele Budete aktualizovat tuto místnost z %1$s na %2$s. - 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á. + 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. Aktualizovat soukromou místnost Aktualizovat veřejnou místnost Aktualizace @@ -2124,7 +2124,7 @@ Raději ověřit porovnáním emoji Oskenovat tímto zařízením Oskenujte kód svým dalším zařízením nebo přepněte a oskenujte tímto zařízením - URL API Homeserveru + URL API domovského serveru Chybějící oprávnění Pro provedení této akce udělte, prosím, oprávnění Fotoaparát v systémových nastaveních. 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. @@ -2762,7 +2762,7 @@ Vytvořit přímou zprávu pouze při první zprávě Povolit odložené přímé zprávy Zjednodušený Element s volitelnými kartami - Povolit nový vzhled + Zapnout nové uspořádání 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. @@ -2839,9 +2839,9 @@ Začněte na přihlašovací obrazovce Vyberte možnost \"Přihlásit se pomocí QR kódu\" Začněte na přihlašovací obrazovce - Vyberte možnost \"Zobrazit QR kód na tomto zařízení\" - Přejděte do Nastavení -> Zabezpečení a soukromí -> Zobrazit všechny relace - Otevřete ${app_name} na vašem druhém zařízení + Vyberte možnost \"Zobrazit QR kód\" + Přejděte do Nastavení -> Zabezpečení a soukromí + Otevřete aplikaci na vašem druhém zařízení Žádost byla na druhém zařízení zamítnuta. Propojení nebylo dokončeno v požadovaném čase. Propojení s tímto zařízením není podporováno. @@ -2859,4 +2859,36 @@ 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: Přihlásit se pomocí QR kódu Naskenovat QR kód + Možnost nahrávat a odesílat hlasové vysílání na časové ose místnosti. + Povolit hlasové vysílání (v aktivním vývoji) + Domovský server nepodporuje přihlášení pomocí QR kódu. + Přihlášení bylo na druhém zařízení zrušeno. + Tento QR kód je neplatný. + Druhé zařízení musí být přihlášeno. + Druhé zařízení je již přihlášeno. + 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í; + Žádost se nezdařila. + Ukládání do vyrovnávací paměti + Pozastavit hlasové vysílání + Přehrát nebo obnovit hlasové vysílání + Ukončit záznam hlasového vysílání + Pozastavit záznam hlasového vysílání + Obnovit záznam hlasového vysílání + Živě + Vybrat relace + Kontakt + Fotoaparát + Poloha + Hlasování + Hlasové vysílání + Přílohy + Nálepky + Knihovna fotografií + Zrušit výběr všech + Vybrat všechny + + %1$d vybraný + %1$d vybrané + %1$d vybraných + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index fe849a1ddf..409fc564f4 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -42,7 +42,7 @@ %s hat diesen Raum aufgewertet. Sende eine Nachricht … Erste Synchronisation: -\nImportiere Benutzerkonto … +\nImportiere Konto … Erste Synchronisation: \nImportiere Kryptoschlüssel Erste Synchronisation: @@ -57,7 +57,7 @@ Erste Synchronisation: \nImportiere Benutzerdaten %1$s hat die Einladung an %2$s, den Raum zu betreten, zurückgezogen - %1$s\'s Einladung. Grund: %2$s + Einladung von %1$s. Grund: %2$s %1$s hat %2$s eingeladen. Grund: %3$s %1$s hat dich eingeladen. Grund: %2$s %1$s ist dem Raum beigetreten. Grund: %2$s @@ -67,7 +67,7 @@ %1$s hat Sperre von %2$s aufgehoben. Grund: %3$s %1$s hat %2$s verbannt. Grund: %3$s %1$s hat die Einladung für %2$s angenommen. Grund: %3$s - %1$s hat Einladung für %2$s verworfen. Grund: %3$s + %1$s hat die Einladung für %2$s zurückgezogen. Grund: %3$s %1$s fügt %2$s als eine Adresse für diesen Raum hinzu. %1$s fügt %2$s als Adressen für diesen Raum hinzu. @@ -263,13 +263,13 @@ Nur Matrix-Kontakte Keine Ergebnisse Räume - Logdateien übermitteln + Sende Protokolle Absturzberichte übermitteln Bildschirmfoto übermitteln Problem melden Bitte beschreibe das Problem. Was hast du genau gemacht\? Was sollte passieren\? Was ist tatsächlich passiert\? Problembeschreibung - 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: + 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: Du scheinst dein Telefon frustriert zu schütteln. Möchtest du das Fenster zum Senden eines Fehlerberichts öffnen\? Dein Fehlerbericht wurde erfolgreich übermittelt Der Fehlerbericht konnte nicht übermittelt werden (%s) @@ -353,7 +353,7 @@ Telefonnummer hinzufügen Anwendungsinformationen in den Systemeinstellungen anzeigen. Anwendungsinformationen - Benachrichtigungen für diesen Account + Benachrichtigungen für dieses Konto Benachrichtigungen für diese Sitzung Direktnachrichten Gruppenunterhaltungen @@ -408,7 +408,7 @@ Alle Nur Mitglieder Nur Mitglieder (ab Einladung) - Nur Mitglieder (ab Beitreten) + Nur Mitglieder (ab Betreten) Verbannte Benutzer Erweitert Interne ID dieses Raumes @@ -438,8 +438,8 @@ Vergleiche die folgenden Zeichen mit den Einstellungen in der Sitzung des anderen Nutzers und bestätige: Falls sie nicht übereinstimmen, wurde die Kommunikation vielleicht kompromittiert. Raumverzeichnis auswählen - Server-Name - Alle Räume auf dem %s-Server + Name des Servers + Alle Räume auf %s Alle nativen %s-Räume Bedienoberfläche Sprache @@ -467,20 +467,20 @@ Berechtigungslevel muss eine positive ganze Zahl sein. Du bist nicht Mitglied in diesem Raum. Du hast keine Berechtigung, diese Aktion in diesem Raum auszuführen. - Anfrage beinhaltet keine Raum-ID. + room_id fehlt in der Anfrage. Raum %s ist nicht sichtbar. Integrationen hinzufügen Benachrichtigungston Anfrage konnte nicht gesendet werden. - Anfrage enthält keine user_id. + user_id fehlt in der Anfrage. Helles Design Dunkles Design Schwarzes Design Auf Ereignisse lauschen Nachrichten mit meinem Anzeigenamen Nachrichten mit meinen Benutzernamen - Du hast die neue Sitzung \'%s\' hinzugefügt, die jetzt Verschlüsselungs-Schlüssel anfordert. - Deine bislang nicht verifiziertes Sitzung \'%s\' fordert Verschlüsselungs-Schlüssel an. + Du hast die neue Sitzung „%s“ hinzugefügt, die jetzt Verschlüsselungs-Schlüssel anfordert. + Deine bislang nicht verifizierte Sitzung „%s“ fordert Verschlüsselungs-Schlüssel an. Verifizierung beginnen Anruf Laute Benachrichtigungen @@ -572,7 +572,7 @@ Bestimmt das Berechtigungslevel des Benutzers Setzt Berechtigungen des Benutzers zurück Lädt Benutzer mit angegebener Kennung in den aktuellen Raum ein - Raum mit angegebener Adresse beitreten + Raum mit angegebener Adresse betreten Verlasse Raum Raumthema ändern Entfernt die Person angegebener ID @@ -609,7 +609,7 @@ Schreibbenachrichtigungen senden Lasse andere Benutzer wissen, dass du tippst. Markdown-Formatierung - Formatiere Nachrichten mittels Markdown-Syntax, bevor sie gesendet werden. Dies erlaubt erweiterte Formatierungen wie Sternchen (*), um kursiven Text anzuzeigen. + Formatiere Nachrichten mittels Markdown-Syntax, bevor sie gesendet werden. Dies erlaubt erweiterte Formatierungen wie Sternchen, um kursiven Text anzuzeigen. Lesebestätigungen zeigen Klicke auf die Lesebestätigungen für eine detailliertere Liste. Einladungen, Entfernungen und Verbannungen bleiben sichtbar. @@ -626,7 +626,7 @@ Klingelton für eingehende Anrufe Wähle Klingelton für Anrufe: Akzeptieren - Bitte lese und akzeptiere die Richtlinien dieses Homeservers: + Bitte lese und akzeptiere die Richtlinien dieses Heim-Servers: Tests ausführen Läuft … (%1$d von %2$d) Einer oder mehrere Tests sind fehlgeschlagen. Versuche vorgeschlagene Lösung(en). @@ -637,7 +637,7 @@ \nBitte überprüfe die Systemeinstellungen. Öffne Einstellungen Kontoeinstellungen. - Benachrichtigungen sind für dein Konto eingeschaltet. + Benachrichtigungen sind für dein Konto aktiviert. Benachrichtigungen sind für dein Konto deaktiviert. \nBitte überprüfe die Kontoeinstellungen. Aktiviere @@ -686,7 +686,7 @@ Fertig Erweiterte Benachrichtigungseinstellungen Angepasste Einstellungen. - Beachte, dass einige Nachrichtentypen leise sind (erzeugen eine Benachrichtigung aber keinen Ton). + Beachte, dass einige Nachrichtentypen leise sind (erzeugen eine Benachrichtigung, aber keinen Ton). Einige Benachrichtigungen sind in deinen erweiterten Einstellungen deaktiviert. Konto hinzufügen Laute Benachrichtigungen einstellen @@ -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. [%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. - Verwaltung der Kryptoschlüssel + Verwaltung der Verschlüsselungs-Schlüssel Schlüsselsicherung verwalten 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 @@ Um die Schlüsselsicherung für diese Sitzung zu verwenden, stelle sie jetzt mit deiner Passphrase oder deinem Wiederherstellungsschlüssel wieder her. 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. Beim Abmelden gehen deine verschlüsselten Nachrichten verloren - Schlüssel-Sicherung wird durchgeführt. Wenn du dich jetzt abmeldest, gehen deine verschlüsselten Nachrichten verloren. + Schlüsselsicherung läuft. Wenn du dich jetzt abmeldest, verlierst du den Zugriff auf deine verschlüsselten Nachrichten. Schlüsselsicherung sollte bei allen Sitzungen aktiviert sein, um den Verlust verschlüsselter Nachrichten zu verhindern. Ich möchte meine verschlüsselten Nachrichten nicht Sichere Schlüssel … @@ -781,7 +781,7 @@ (Erweitert) Wiederherstellungsschlüssel einrichten Erfolg! Deine Schlüssel wurden gesichert. - Dein Wiederherstellungsschlüssel ist ein Sicherungsnetz - du kannst es benutzen um den Zugriff auf deine verschlüsselten Nachrichten wiederherzustellen, falls du deine Passphrase vergisst. + 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) Bewahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie einem Passwortmanager (oder Safe) auf Ich habe eine Kopie angefertigt @@ -877,7 +877,7 @@ ERSTELLEN Name Öffentlich - Jeder wird diesem Raum beitreten können + Jeder wird diesen Raum betreten können Integrationsmanager Schlüsselaustausch anfragen 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\? @@ -1024,21 +1024,21 @@ Es ist unangebracht Benutzerdefinierte Meldung … Diesen Inhalt melden - Meldegrund + Grund für Meldung des Inhalts MELDEN NUTZER IGNORIEREN Inhalt gemeldet Dieser Inhalt wurde gemeldet. \n -\nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden. +\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden. Als Spam gemeldet Dieser Inhalt wurde als Spam gemeldet. \n -\nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden. +\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden. Als unangebracht gemeldet Dieser Inhalt wurde als unangebracht gemeldet. \n -\nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden. +\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden. Nutzer ignorieren Alle Nachrichten (laut) Alle Nachrichten @@ -1066,7 +1066,7 @@ 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. 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. Stimme den Nutzungsbedingungen des Identitäts-Servers (%s) zu, um per E-Mail-Adresse oder Telefonnummer auffindbar zu sein zu können. - Zu teilende Daten nicht verarbeitbar + Konnte zu teilende Daten nicht verarbeiten Erweitere und personalisiere deine Erfahrung Mit %1$s verbinden Mit Element Matrix Services verbinden @@ -1092,7 +1092,7 @@ Diese E-Mail-Adresse ist mit keinem Konto verknüpft Prüfe deinen Posteingang Eine Bestätigungsmail wurde an %1$s versendet. - Klicke auf den Link um dein neues Passwort zu bestätigen. Sobald du dem enthaltenen Link gefolgt bist, klicke unten. + Tippe auf den Link um dein neues Passwort zu bestätigen. Sobald du dem enthaltenen Link gefolgt bist, klicke unten. Ich habe meine E-Mail-Adresse bestätigt Erfolgreich! Dein Passwort wurde zurückgesetzt. @@ -1140,7 +1140,7 @@ Bitte verwende das internationale Format. Weiter Weiter - Internationale Telefonnummern müssen mit \'+\' beginnen + Internationale Telefonnummern müssen mit „+“ beginnen Die Telefonnummer scheint ungültig zu sein. Bitte prüfen Registrieren bei %1$s Benutzername @@ -1221,10 +1221,10 @@ Verifizierung gesendet Verifizierung angefragt Verifiziere diese Sitzung - Scanne den Code mit dem Gerät des Gegenüber für eine gegenseitige Überprüfung + Lasse den Code mit dem Gerät deines Gegenüber für eine gegenseitige Verifizierung einlesen Scanne Code des Anderen - Kann nicht scannen - Wenn ihr nicht am selben Ort seid, vergleicht Emoji stattdessen + Kann nicht einlesen + Wenn ihr nicht am selben Ort seid, vergleicht stattdessen Emoji Verifizieren via Emoji-Vergleich %s verifizieren %s verifiziert @@ -1253,8 +1253,8 @@ Administrator in %1$s Moderator in %1$s Springen und als gelesen markieren - ${app_name} kann keine Ereignisse vom Typ \'%1$s\' - ${app_name} ist beim Verarbeiten des Ereignisinhalts mit der ID \'%1$s\' auf ein Problem gestoßen + ${app_name} unterstützt keine Ereignisse vom Typ „%1$s“ + ${app_name} ist beim Verarbeiten des Ereignisinhalts mit der ID „%1$s“ auf ein Problem gestoßen Nicht ignorieren 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. @@ -1269,8 +1269,8 @@ Um sicher zu gehen, verifiziere %s, indem ein einmaliger Code überprüft wird. Um sicher zu sein, tut dies persönlich oder verwendet einen anderen Kommunikationsweg. Vergleiche die einzigartigen Emoji und stell sicher, dass sie in derselben Reihenfolge angezeigt werden. - Vergleiche den Code mit dem Code auf dem Bildschirm deines Gegenübers. - Nachrichten mit diesem Gegenüber sind Ende-zu-Ende-verschlüsselt und können nicht von Dritten gelesen werden. + Vergleiche den Code mit dem Code auf dem Bildschirm deines Gegenüber. + Nachrichten mit dieser Person sind Ende-zu-Ende-verschlüsselt und können nicht von Dritten gelesen werden. Deine neue Sitzung ist jetzt verifiziert. Sie hat Zugriff auf deine verschlüsselten Nachrichten, und andere Benutzer sehen sie als vertrauenswürdig an. Quersignierung Quersignierung ist aktiviert, @@ -1374,7 +1374,7 @@ Benachrichtigungskonfiguration Nachrichten mit \"@room\" Verschlüsselte Gruppenunterhaltungen - Sendet eine Nachricht als einfachen Text, ohne sie als Markdown zu interpretieren + Sendet eine Nachricht als Klartext, ohne sie als Markdown darzustellen Inkorrekter Benutzername und/oder Passwort. Das eingegebene Passwort beginnt oder endet mit Leerzeichen, bitte kontrolliere es. Nachrichtenschlüssel Wiederherstellungs-Passphrase @@ -1494,7 +1494,7 @@ Benutzer bannen Grund für den Bann Bann des Benutzers aufheben - Das Aufheben des Bannes wird dem Benutzer erlauben dem Raum wieder beizutreten. + Wenn du die Person entbannst, kann sie den Raum wieder betreten. Verschlüsselte Sicherung Sicherung einrichten Sicherung zurücksetzen @@ -1503,7 +1503,7 @@ Generiere einen neuen Sicherheitsschlüssel oder setze eine neue Sicherheitspassphrase für dein existierendes Backup. Dieses wird deinen aktuellen Schlüssel oder deine aktuelle Phrase ersetzen. Integrationen sind deaktiviert - Aktiviere \'Erlaube Integrationen\' in den Einstellungen um dies zu machen. + Aktiviere hierfür „Integrationen erlauben“ in den Einstellungen. %d gebannter Benutzer %d gebannte Benutzer @@ -1537,7 +1537,7 @@ Falls du ein Konto auf einem Heim-Server eingerichtet hast, verwende nachstehend deine Matrix-ID (z. B. @benutzer:domain.com) und dein Passwort. Matrix-ID Wenn du dein Passwort nicht weißt, gehe zurück um es zurücksetzen zu lassen. - Dies ist keine gültige Benutzerkennung. Erwartetes Format: \'@benutzer:homeserver.org\' + Dies ist keine gültige Benutzerkennung. Erwartetes Format: „@benutzer:homeserver.org“ Es konnte kein gültiger Homeserver gefunden werden. Bitte prüfe deine Kennung Sticker Administrative Aktionen @@ -1592,7 +1592,7 @@ Du hast die Raumeinstellungen erfolgreich geändert Du kannst auf diese Nachricht nicht zugreifen Warte auf diese Nachricht. Das könnte eine Weile dauern - 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. + 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. Du kannst auf diese Nachricht nicht zugreifen, weil der Sender dich blockiert hat Du kannst auf diese Nachricht nicht zugreifen, weil der Sender deiner Sitzung nicht vertraut Du kannst auf diese Nachricht nicht zugreifen, weil der Sender absichtlich die Schlüssel nicht gesendet hat @@ -1620,13 +1620,13 @@ Neue PIN Um deine PIN zurückzusetzen, musst du dich erneut anmelden und eine neue erstellen. Aktiviere PIN - Wenn du deine PIN zurücksetzen möchtest, tippe \"PIN vergessen\" um dich abzumelden und sie anschließend zurückzusetzen. + Wenn du deine PIN zurücksetzen möchtest, tippe auf „PIN vergessen“, um dich abzumelden und sie zurückzusetzen. Versehentliche Anrufe verhindern Bitte um Bestätigung, bevor du einen Anruf tätigst Einrichten Dir fehlt die Berechtigung in diesem Raum eine Konferenz zu starten - Starte eine Videokonferenz - Starte eine Audiokonferenz + Beginne eine Videokonferenz + Beginne eine Audiokonferenz Konferenzen nutzen die Jitsi-Sicherheits- und Berechtigungsrichtlinien. Alle im Raum Anwesenden können während der Konferenz beitreten. Du kannst dich nicht selbst anrufen Du kannst dich nicht selbst anrufen, warte bis Teilnehmer die Einladung annehmen @@ -1650,7 +1650,7 @@ Falscher Code, %d verbleibende Versuche Warnung! Letzter Versuch bevor du ausgeloggt wirst! - Zu viele Fehler. Du wurdest ausgeloggt + Zu viele Fehler, du wurdest abgemeldet Diese Telefonnummer ist bereits registriert. Deinem Konto wurde keine Telefonnummer hinzugefügt E-Mail-Adressen @@ -1661,10 +1661,10 @@ E-Mail und Telefon Verwalte E-Mail-Adressen und Telefonnummern, die mit deinem Matrix-Konto verknüpft sind Code - Verwende das internationale Format (Telefonnummer muss mit \'+\' beginnen) + Bitte nutze das internationale Format (muss mit „+“ beginnen) Bestätige deine Identität, indem du dieses Login verifizierst, um Zugriff auf verschlüsselte Nachrichten zu erhalten. - Raum, indem du gebannt wurdest, kann nicht geöffnet werden. - Raum kann nicht gefunden werden. Stelle sicher, dass er existiert. + Ein Raum, aus dem du verbannt wurdest, kann nicht geöffnet werden. + Kann diesen Raum nicht finden. Stelle sicher, dass er existiert. %d Sekunde %d Sekunden @@ -1672,7 +1672,7 @@ Umfrage Reagierte mit: %s Der Link war fehlerhaft - Du bist nicht berechtigt, einen Anruf in diesem Raum zu starten + Du bist nicht berechtigt, einen Anruf in diesem Raum zu beginnen Ergebnis der Überprüfung Kontodaten vom Typ %1$s löschen\? \n @@ -1683,12 +1683,12 @@ Die Applikation wartet auf den PUSH Push testen Gebannte Nutzer filtern - Du bist nicht berechtigt einen Anruf zu starten + Du bist nicht berechtigt einen Anruf zu beginnen Du hast keine Berechtigung ein Konferenzgespräch zu starten Details wie Raumnamen und Nachrichteninhalt zeigen. Inhalt in Benachrichtigungen anzeigen PIN-Code ist die einzige Möglichkeit ${app_name} zu entsperren. - Aktiviere Gerät-spezifische Biometrie wie Fingerabdrücke und Gesichtserkennung. + Aktiviere gerätespezifische Biometrie wie Fingerabdrücke und Gesichtserkennung. Biometrie aktivieren Schutz konfigurieren Zugriffsschutz @@ -1726,10 +1726,10 @@ Du siehst die Benachrichtigung! Klick mich! Benachrichtigungsanzeige Bei jedem Öffnen von ${app_name} ist der PIN-Code erforderlich. - PIN-Code ist erforderlich, nachdem ${app_name} 2 Minuten lang nicht verwendet wurde. - Fordere PIN nach 2 Minuten an + PIN-Code ist erforderlich, nachdem ${app_name} zwei Minuten lang nicht verwendet wurde. + Erfrage PIN nach zwei Minuten Nur die Anzahl ungelesener Nachrichten in der Benachrichtigung zeigen. - Bild hinzufügen mit + Füge Bild hinzu per Der Raum ist noch nicht erstellt. Raumerstellung abbrechen\? Zu niedrige Priorität hinzufügen Thema @@ -1742,7 +1742,7 @@ Raumname Prüfung exportieren Direktnachricht - Verlauf der Anfragen von Schlüsselfreigaben senden + Schlüsselfreigabe-Anfragen übermitteln Keine weiteren Ergebnisse Beginne eine Unterhaltung Autorisieren @@ -1752,7 +1752,7 @@ Vorschläge Bekannte Personen QR-Code - Hinzufügen via QR-Code + Per QR-Code hinzufügen Gib die Erlaubnis, um auf die Kamera zu zugreifen. Um den QR-Code zu scannen, muss der Zugriff auf die Kamera erlaubt werden. Öffentliche Adressen @@ -1762,7 +1762,7 @@ Änderungen daran, wer die Chronik lesen kann, gelten nur für kommende Nachrichten in diesem Raum. Die Sichtbarkeit der bestehenden Chronik bleibt unverändert. Zurückziehen Hinzufügen - Mit Nachricht teilen + Per Nachricht teilen Erweiterte Optionen ausblenden Erweiterte Optionen anzeigen Die Sichtbarkeit des Raums konnte nicht abgerufen werden (%1$s). @@ -1778,7 +1778,7 @@ Meinen Code teilen Mein Code QR-Code einlesen - Das ist kein korrekter QR-Code von Matrix + Das ist kein korrekter Matrix-QR-Code 🔐️ Komm mit zu ${app_name} Hey, schreibe mit mir auf ${app_name}: %s Freunde einladen @@ -1797,7 +1797,7 @@ Aktivieren, wenn der Raum nur von Mitgliedern deines Heim-Servers zur internen Kommunikation verwendet wird. Das kann später nicht mehr geändert werden. Begrenze Zugang zu diesem Raum (für immer!) auf Mitglieder von %s %1$d von %2$d - Keine Vorschau für diesen Raum verfügbar. Willst du direkt beitreten\? + Keine Vorschau für diesen Raum verfügbar. Willst du ihn betreten\? Der Raum ist gerade nicht zugänglich. \nVersuche es später nochmal, oder bitte einen Raum-Admin um Hilfe. Eine neue Adresse veröffentlichen @@ -1820,9 +1820,9 @@ Raumname ändern Sichtbarkeit des Verlaufs ändern Raum-Verschlüsselung aktivieren - Haupt-Adresse des Raums ändern + Hauptadresse des Raums ändern Raumbild ändern - Widgets verändern + Widgets ändern Jeden benachrichtigen Von anderen gesendete Nachrichten entfernen Nutzer verbannen @@ -1830,7 +1830,7 @@ Einstellungen ändern Nutzer einladen Nachrichten senden - Standard Rolle + Standard-Rolle Berechtigungen Berechtigungen Du hast nicht die Berechtigung zum Aktualisieren der Rollen, die zum Ändern verschiedener Teile des Raums erforderlich sind @@ -1918,9 +1918,9 @@ Die Obergrenze ist nicht bekannt. Dein Heim-Server akzeptiert Anhänge (wie Dateien, Medien, etc.) mit einer Größe bis zu %s. - Datei-Upload-Obergrenze des Servers + Dateigrößenlimit des Servers Serverversion - Servername + Server-Name Raumeinstellungen Derzeitige Konferenz verlassen und zu einer anderen wechseln\? Raum-Version @@ -1947,9 +1947,9 @@ Öffentlich Du kannst dies später ändern Ungeprüft - Jeder kann den Raum finden und beitreten + Jeder kann den Raum finden und betreten Öffentlich - Nur Eingeladene können es finden und beitreten + Nur sichtbar und zu betreten für Eingeladene Privat Unbekannte Zugriffseinstellung (%s) Gästen erlauben beizutreten @@ -1957,8 +1957,8 @@ Spaces Jeder kann im Raum anklopfen, Mitglieder können dann zustimmen oder ablehnen Momentan bist nur du hier. Mit anderen Leuten wird %s noch viel besser. - Diese werden in der Lage sein, %s zu durchsuchen - Diese werden kein Teil von %s sein + Sie wird in der Lage sein, %s zu durchsuchen + Sie wird kein Teil von %s sein Tritt meinem Space %1$s %2$s bei Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Räume oder Spaces hinzufügen @@ -1975,11 +1975,11 @@ Verlassen Räume hinzufügen Räume erkunden - Trotzdem beitreten - Space beitreten + Dennoch betreten + Space betreten Space erstellen Nur zu diesem Raum - In Space \"%s\" einladen + Zu %s einladen Link teilen Mithilfe einer E-Mail-Adresse einladen Personen einladen @@ -2002,7 +2002,7 @@ Welche Art von Space möchtest du erstellen\? Space erstellen Space erstellen - 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. + 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. Nur Space-Mitglieder %d Person, die du kennst, ist bereits beigetreten @@ -2031,7 +2031,7 @@ Komprimiere Bild … Als Standard festsetzen und nicht mehr fragen Jedes Mal fragen - Gib den Namen eines neuen Servers ein, den du erkunden möchtest. + Gib den Namen des neuen Servers ein, den du erkunden möchtest. Neuen Server hinzufügen Dein Server 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. @@ -2044,7 +2044,7 @@ Dieser Space hat noch keine Räume Für weitere Infos kontaktiere bitte die Administration des Homeservers Dein Homeserver scheint Spaces noch nicht zu unterstützen - Du bist der einzige Admin von diesem Space. Wenn du ihn verlässt, hat niemand Kontrolle über ihn. + Du bist der einzige Admin dieses Spaces. Wenn du ihn verlässt, hat niemand Kontrolle über ihn. Du wirst diesen Raum ohne erneute Einladung nicht betreten können. Du bist die einzige Person hier. Wenn du den Space verlässt, ist er für immer verloren (eine lange Zeit). Einladen in %s @@ -2067,7 +2067,7 @@ Beim Versuch %s beizutreten, ist leider ein Fehler aufgetreten Zur empfohlenen Raumversion upgraden Ersatzraum betreten - Raum zu neuer Version upgraden + Aktualisiert den Raum auf eine neue Version stabil instabil Raumversionen 👓 @@ -2090,7 +2090,7 @@ Du benötigst die Berechtigung, um einen Raum upzugraden Übergeordneten Space automatisch updaten Benutzer automatisch einladen - Du upgradest diesen Raum von %1$s zu %2$s. + Du aktualisierst diesen Raum von %1$s zu %2$s. 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. Privaten Raum upgraden @@ -2108,7 +2108,7 @@ Spaces wählen Mitglieder von %s können Räume finden, betrachten und betreten. Privat (Zutritt nur mit Einladung) - Raumupgrades + Raumaktualisierungen Nachrichten von Bots Raumeinladungen Verschlüsselte Gruppennachrichten @@ -2157,7 +2157,7 @@ Sprachanruf beendet • %1$s Benachrichtige mich bei \@room - Schlüsselwörter dürfen kein \"%s\" enthalten + Schlüsselwörter dürfen kein „%s“ enthalten Schlüsselwörter können nicht mit einem Punkt beginnen Nichts Nicht erreicht @@ -2187,14 +2187,14 @@ Erstelle Space … Hilfreiche Informationen zur Fehlersuche anzeigen Debug-Info anzeigen - Das schaut nicht nach einer gültigen E-Mail-Adresse aus + Das scheint keine gültige E-Mail-Adresse zu sein Mittels Name, ID oder E-Mail-Adresse suchen Neuen Space erstellen Zugriff Wer hat Zugriff\? - Benachrichtigungen per Email für %s aktivieren + Benachrichtigungen per E-Mail für %s aktivieren Um Benachrichtigungen per E-Mail zu empfangen, musst du eine E-Mail-Adresse hinzufügen - Emailbenachrichtigungen + E-Mail-Benachrichtigungen Space upgraden Namen vom Space ändern Space verschlüsseln @@ -2202,7 +2202,7 @@ Space-Icon ändern Du hast nicht die Berechtigung, Rollenrechte zu bearbeiten Space-Berechtigungen - Wenn du die Person entbannst, kann sie wieder beitreten. + Wenn du die Person entbannst, kann sie den Space wieder betreten. Die Verbannung einer Person entfernt sie aus diesem Space und hindert sie am erneuten Beitritt. Kicken entfernt die Person aus dem Space \n @@ -2222,9 +2222,9 @@ Ändert den Raumnamen Entblockt eine Person und zeigt deren Nachrichten wieder an Blockiert eine Person und versteckt deren Nachrichten - Jeder kann den Space finden und beitreten + Jeder kann den Space finden und betreten Du kannst deine Benachrichtigungen in den %1$s verwalten. - Beachte, dass Benachrichtigungen zu Erwähnungen und Schlüsselwörtern in verschlüsselten Räumen momentan nicht verfügbar sind. + Bitte beachte, dass Benachrichtigungen zu Erwähnungen und Schlüsselwörtern in verschlüsselten Räumen mobil nicht verfügbar sind. Wähle die Berechtigungen der Rollen aus Rollen deren Berechtigungen einsehen und bearbeiten. @@ -2252,8 +2252,8 @@ Auf Benachrichtigungen warten Externe Bibliotheken Du kannst dies jederzeit in den Einstellungen deaktivieren - Wir teilen keine Informationen mit Drittpersonen - Wir erfassen und analysieren keine Accountdaten + Wir teilen keine Informationen mit Dritten + Wir erfassen und analysieren keine Kontodaten 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. @@ -2269,7 +2269,7 @@ Hilfe Rechtliches Entscheide, welche Spaces Zugriff auf den Raum haben sollen. Die Mitglieder der Spaces können diesen Räumen betreten. - hier + Hier Hilf mit, ${app_name} zu verbessern Aktivieren Farbe des Anzeigenamens ändern @@ -2305,14 +2305,14 @@ Dieser Server stellt keine Richtlinie bereit. Richtlinie deines Identitäts-Servers Richtlinie deines Heim-Servers - ${app_name} Richtlinie + Richtlinie von ${app_name} Abstimmung erstellen Kontakte öffnen Sticker verschicken Datei hochladen Verschicke Fotos und Videos Kamera öffnen - Willst du diese Umfrage wirklich entfernen\? Du wirst sie nicht wiederherstellen können. + Willst du diese Abstimmung wirklich entfernen\? Du wirst sie nicht wiederherstellen können. Abstimmung entfernen Abstimmung beendet Stimme abgegeben @@ -2332,12 +2332,12 @@ ${app_name} konnte nicht auf deinen Standort zugreifen. Bitte versuche es später noch einmal. ${app_name} konnte nicht auf deinen Standort zugreifen Standort - Ergebnisse werden erst angezeigt, wenn du die Umfrage beendest - Geschlossene Umfrage - Ergebnisse werden direkt nach Stimmabgabe angezeigt - Offene Umfrage - Umfragetyp - Umfrage bearbeiten + Die Ergebnisse werden erst sichtbar, sobald du die Umfrage beendest + Abgeschlossene Abstimmung + Abstimmende können die Ergebnisse nach Stimmabgabe sehen + Laufende Abstimmung + Abstimmungsart + Abstimmung bearbeiten Keine Stimmen abgegeben Konto erstellen Kommunikation für dein Team. @@ -2362,7 +2362,7 @@ Möchtest du einem existierenden Server beitreten\? Communities Teams - Wir helfen dir, in Verbindung zu kommen + Wir helfen dir, dich zu vernetzen Mit wem wirst du am meisten schreiben\? Link zu Thread kopieren Threads anzeigen @@ -2416,7 +2416,7 @@ Bildschirm teilen Probiere es aus Echtzeit bis %1$s - Wähle Deine Benachrichtigungsmethode + Wähle deine Benachrichtigungsmethode Vorläufige Implementierung: Standorte verbleiben im Raumverlauf Profil-Tag: h @@ -2523,7 +2523,7 @@ 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! Nachrichten in dieser Unterhaltung werden Ende-zu-Ende-verschlüsselt. Bist du ein Mensch\? - Bitte lies dir %ss Bedingungen und Richtlinien durch + Bitte lies dir die Bedingungen und Richtlinien von %s durch Server-Richtlinien Folge den Anweisungen, die an %s gesendet wurden E-Mail bestätigen @@ -2741,8 +2741,8 @@ ⚠ Es befinden sich nicht verifizierte Geräte in diesem Raum. Sie werden deine Nachrichten nicht entschlüsseln können. Niemals verschlüsselte Nachrichten zu unverifizierten Sitzungen in diesem Raum senden. Verstanden - Probiere den Rich-Text-Editor aus (bald auch mit Plain-Text-Modus) - Aktiviere Rich-Text-Editor + Probiere den Textverarbeitungs-Editor (bald auch mit Klartext-Modus) + Textverarbeitungs-Editor aktivieren Browser Durchgestrichen formatieren Kursiv formatieren @@ -2784,9 +2784,9 @@ Beginne auf dem Anmeldebildschirm Wähle „Mit QR-Code anmelden“ Beginne auf dem Anmeldebildschirm - Wähle \'QR-Code auf diesem Gerät anzeigen\' - Gehe zu Einstellungen -> Sicherheit und Privatsphäre -> Alle Sitzungen anzeigen - Öffne ${app_name} auf deinem anderen Gerät + Wähle „QR-Code anzeigen“ + Gehe zu Einstellungen -> Sicherheit und Privatsphäre + Öffne die App auf deinem anderen Gerät Die Anfrage wurde auf dem anderen Gerät abgelehnt. Die Verbindung konnte nicht in der erforderlichen Zeit hergestellt werden. Verbindung mit diesem Gerät nicht unterstützt. @@ -2797,11 +2797,42 @@ Benutze dein angemeldetes Gerät um den unten angezeigten QR-Code einzulesen: Mit QR-Code anmelden Benutze die Kamera auf diesem Gerät um den vom anderen Gerät angezeigten QR-Code zu scannen: - QR-Code scannen + QR-Code einlesen 3 2 1 Du kannst dieses Gerät benutzen um ein anderes Gerät per QR-Code anzumelden. Dafür gibt es zwei Wege: Mit QR-Code anmelden - QR-Code scannen + QR-Code einlesen + Zeichne Sprachnachrichten auf, während du sie in Echtzeit in den Raumverlauf sendest. + Sprachübertragung aktivieren (in aktiver Entwicklung) + Der Heim-Server unterstützt Anmelden per QR-Code nicht. + Die Anmeldung wurde vom anderen Gerät abgebrochen. + Der QR-Code ist ungültig. + Das andere Gerät muss angemeldet sein. + Das andere Gerät ist bereits angemeldet. + 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); + Die Anfrage ist fehlgeschlagen. + Abspielen oder fortsetzen der Sprachübertragung + Fortsetzen der Sprachübertragung + Puffere + Pausiere Sprachübertragung + Stoppe Aufzeichnung der Sprachübertragung + Pausiere Aufzeichnung der Sprachübertragung + Live + Sticker + Sitzungen auswählen + Kontakt + Kamera + Standort + Umfragen + Sprachübertragung + Anhänge + Fotobibliothek + Alle abwählen + Alle auswählen + + %1$d ausgewählt + %1$d ausgewählt + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index 7ead21394c..9bfbbe8eeb 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -2754,9 +2754,9 @@ Alusta sisselogimisvaatest Vali „Logi võrku QR-koodi abil“ Alusta sisselogimisvaatest - Vali „Näita selles seadmes QR-koodi“ - Ava Seadistused -> Turvalisus ja privaatsus -> Näita kõiki sessioone - Ava ${app_name} oma teises seades + Vali „Näita QR-koodi“ + Ava Seadistused -> Turvalisus ja privaatsus + Ava sama rakendus oma teises seades Teine seade lükkas päringu tagasi. Sidumine ei lõppenud etteantud aja jooksul. Sidumine selle seadmega ei ole toetatud. @@ -2796,4 +2796,35 @@ ${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. + Võimalus salvestada ja postitada ringhäälingukõnesid jututoa ajajoonele. + Võta kasutusele ringhäälingukõned (aktiivses arenduses) + Koduserver ei toeta muude seadmete võrku logimise võimalust. + Sisselogimine katkestati teises seadmes. + See QR-kood on vigane. + Teine seade peab olema võrku loginud. + Teine seade on juba võrku loginud. + 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; + Päring ei õnnestunud. + Andmed on puhverdamisel + Alusta või jätka ringhäälingukõne esitamist + Lõpeta ringhäälingukõne salvestamine + Peata ringhäälingukõne salvestamine + Jätka ringhäälingukõne salvestamist + Peata ringhäälingukõne esitamine + Otse eetris + Vali sessioonid + Kontakt + Kaamera + Asukoht + Küsitlused + Ringhäälingukõne + Manused + Kleepsud + Fotode kogu + Eemalda kõik valikud + Vali kõik + + %1$d valitud + %1$d valitud + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index dbf3658887..f2701519e7 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -2726,4 +2726,80 @@ اعطای دسترسی ویرایشگر متن غنی را بیازمایید (حالت متن خام به زودی) به کار انداختن ویرایشگر متن غنی + برای آشکارسازی وضعیت تأیید نشست کنونیتان، تأییدش کنید. + کارساز خانگی از ورود با کد QR پشتیبانی نمی‌کند. + ورود روی افزارهٔ دیگر لغو شد. + دید و واپایش بیش‌تری روی نشست‌هایتان داشته باشید. + درخواست روی افزارهٔ دیگر رد شد. + پیوند در مدّت مقرّر کامل نشد‌. + افزارهٔ دیگر باید وارد شده باشد. + افزارهٔ دیگر از پیش وارد شده. + به تنظیمات -> امنیت و محرمانگی بروید + کاره را روی افزارهٔ دیگرتان بگشایید + پیوند دادن با این افزاره پشتیبانی نمی‌شود. + به کار انداختن پخش صدا (زیر توسعهٔ فعّال) + نمایش کد QR روی این افزاره + آغاز در صفحهٔ ورود + گزینش‌«ورود با کد QR» + آغاز در صفحهٔ ورود + گرفتن آگاهی‌های ارسالی روی این نشست. + پخش یا مکث پخش صدا + کد QR نامعتبر است. + وارد شدن در افزاره‌ای همراه؟ + ورود با کد QR + ورود با کد QR + توقّف ضبط پخش صدا + مکث ضبط پخش صدا + از سر گیری ضبط پخش صدا + گزینش «نمایش کد QR» + گزینش «نمایش کد QR» + به کار انداختن ضبط اطّلاعات کارخواه + به کار انداختن مدیر نشست جدید + مکث پخش صدا + درخواست شکست خورد. + وارد کردنتان + وصل شدن به افزاره + پویش کد QR + اتّصال امن برقرار شده + پویش کد QR + پویش کد QR + اعمال قالب زیرخط‌دار + اعمال قالب خط‌خورده + اعمال قالب کج + اعمال قالب توپر + وضعیت تأیید نامعلوم + گزینش نشست‌ها + پخش صدا + کتابخانهٔ عکس + دوباره تلاش کنید + مطابق نیستند؟ + اتّصال ناموفّق + سیستم‌عامل + آگاهی‌های ارسالی + شناسهٔ نشست: + آشنا + دوربین + مکان + نظرسنجی‌ها + پیوست‌ها + برچسب‌ها + میانگیری + زنده + تأیید + ۳ + ۲ + ۱ + مدل + مرورگر + نشانی + نگارش + نام + برنامه + به کار افتاده: + ناگزینش همه + گزینش همه + + ۱ گزیده + %1$d گزیده + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-fi/strings.xml b/library/ui-strings/src/main/res/values-fi/strings.xml index a576e7f0dc..4976f49a92 100644 --- a/library/ui-strings/src/main/res/values-fi/strings.xml +++ b/library/ui-strings/src/main/res/values-fi/strings.xml @@ -1,5 +1,5 @@ - + Käyttäjän %s kutsu %1$s kutsui käyttäjän %2$s %1$s kutsui sinut @@ -401,7 +401,7 @@ 1 kuukausi Ikuisesti Teema - Kirjaisinkoko + Fontin koko Pienin Pieni Normaali @@ -955,8 +955,8 @@ Ei rekisteröityjä viesti-ilmoitusten yhdyskäytäviä app_id: push_key: - app_display_name: - device_name: + Sovelluksen näyttönimi: + Istunnon näyttönimi: Formaatti: Rekisteröi tunniste Salataan pikkukuvaa… @@ -1039,7 +1039,7 @@ Sovellus ei pysty luomaan uusia tunnuksia tälle kotipalvelimelle. \n \nHaluatko rekisteröityä web-klientillä\? - Tämä sähköpostiosoite ei ole liitettynä mihinkään tunnukseen. + Tämä sähköpostiosoite ei ole liitettynä mihinkään tiliin. Palauta salasana palvelimella %1$s Sähköpostiisi lähetetään viesti uuden salananan asettamiseksi. Seuraava @@ -1048,7 +1048,7 @@ Varoitus! 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. Jatka - Tämä sähköposti ei ole liitettynä mihinkään tunnukseen + Tämä sähköposti ei ole liitettynä mihinkään tiliin Tarkista sähköpostisi Vahvistusviesti lähetettiin osoitteeseen %1$s. Näpäytä linkkiä vahvistaaksesi uuden salasanasi. Seurattuasi siinä olevaa linkkiä, klikkaa alapuolelta. @@ -1062,7 +1062,7 @@ \n \nPeru salasananvaihtoprosessi\? Aseta sähköpostiosoite - Aseta sähköpostiosoite palauttaaksesi tunnuksesi. Myöhemmin, voit antaa muiden löytää sinut sähköpostillasi. + Aseta sähköpostiosoite palauttaaksesi tilisi. Myöhemmin voit antaa muiden löytää sinut sähköpostiosoitettasi etsimällä. Sähköposti Sähköposti (vapaaehtoinen) Seuraava @@ -2116,4 +2116,197 @@ %1$s muutti tämän huoneen vaihtoehtoisia osoitteita. Alkusynkronointipyyntö Poista tämän osoitteen julkaisu - + Vahvistamaton + Parhaan turvallisuuden takaamiseksi kirjaudu ulos istunnoista, joita et tunnista tai et enää käytä. + Vahvistetu + Suodata + + Käyttämättä %1$d päivän tai pidempään + Käyttämättä %1$d päivää tai pidempään + + Käyttämätön + Ei valmis turvallista viestintää varten + Vahvistamaton + Valmis turvallista viestintää varten + Vahvistettu + Kaikki istunnot + Suodata + Viimeisin toiminta %1$s + Laite + Istunto + Nykyinen istunto + Käyttämättä olevat istunnot + Vahvista nämä istunnot tai kirjaudu niistä ulos. + Vahvistamattomat istunnot + Paranna tilisi turvallisuutta seuraamalla näitä suosituksia. + Turvallisuussuositukset + + Käyttämättä %1$d+ päivän (%2$s) + Käyttämättä %1$d+ päivää (%2$s) + + Vahvistamaton · Nykyinen istuntosi + Vahvistamaton · Viimeisin toiminta %1$s + Vahvistettu · Viimeisin toiminta %1$s + Näytä kaikki (%1$d) + Näytä tiedot + Vahvista istunto + Tuntematon vahvistuksen tila + Vahvistamaton istunto + Vahvistettu istunto + Tuntematon laitetyyppi + Työpöytä + Mobiili + Turvallisuuden vuoksi vahvista istunnot ja kirjaudu ulos niistä istunnoista, joita et tunnista tai et enää käytä. + Muut istunnot + + %d viesti poistettu + %d viestiä poistettu + + Käytä sijainnin jakamista + Tällä hetkellä käytössä %s. + Menetelmä + + Löytyi %d menetelmä. + Löytyi %d menetelmää. + + Saatavilla olevat menetelmät + Ilmoitusmenetelmä + Taustasynkronointi + Valitse miten ilmoitukset vastaanotetaan + Näytönjako on päällä + ${app_name}-näytönjako + Huoneilmoitus + Ilmoita koko huoneelle + Jaa sijainti + Päivitetty %1$s sitten + %1$s jäljellä + Avaa sovelluksella + 8 tuntia + 1 tunti + 15 minuuttia + Tulokset näytetään vain kun lopetat kyselyn + Kysely lopetettu + Lopeta kysely + Lopetetaanko tämä kysely\? + Tulokset tulevat näkyviin kun kysely lopetetaan + Lopeta kysely + (%1$s) + %1$s (%2$s) + Ei voi toistaa %1$s + Keskeytä %1$s + Toista %1$s + %1$d minuuttia %2$d sekuntia + Tuloksia ei löydy + Avaa asetukset + Incognito-näppäimistö + Istunnot + Tätä linkkiä ei voi avata: yhteisöt on korvattu avaruuksilla + Skannaa QR-koodi + Käyttäjänimi / sähköposti / puhelin + Olethan ihminen\? + Seuraa sähköpostiosoitteeseen %s lähetettyjä ohjeita + Salasanan nollaus + Unohtunut salasana + Lähetä sähköposti uudelleen + Etkö saanut sähköpostia\? + Seuraa sähköpostiosoitteeseen %s lähetettyjä ohjeita + Vahvista sähköpostiosoitteesi + Lähetä koodi uudelleen + Koodi lähetettiin numeroon %s + Vahvista puhelinnumerosi + Kirjaudu ulos kaikilta laitteilta + Nollaa salasana + Vähintään kahdeksan merkkiä. + Valitse uusi salasana + Uusi salasana + Tarkista sähköpostisi. + %s lähettää sinulle vahvistuslinkin + Vahvistuskoodi + Puhelinnumero + %s haluaa vahvistaa tilisi + Anna puhelinnumerosi + Sähköpostiosoite + %s haluaa vahvistaa tilisi + Anna sähköpostiosoitteesi + Lue palvelimen %s käyttöehdot + Palvelimen käytännöt + Haluatko ylläpitää omaa palvelinta\? + Palvelimen verkko-osoite + Mikä on palvelimesi osoite\? + Mikä on palvelimesi osoite\? Se on kuin koti kaikille tiedoillesi + Valitse palvelin + Tervetuloa takaisin! + Muokkaa + Vähintään kahdeksan merkkiä + Luo tili + Vie minut kotiin + Aikeissa liittyä olemassa olevalle palvelimelle\? + Yhteisöt + Tiimit + Kaverit ja perhe + Avaa avaruusluettelo + Luo uusi keskustelu tai huone + Anna palautetta + Käytössä: + Istunnon ID: + Katselet jo tätä ketjua! + Päivitetään tietojasi… + Jokin meni vikaan. Tarkista verkkoyhteys ja yritä uudelleen. + Ihmiset + Suosikit + Lukemattomat + Kaikki + Käytä järjestelmän oletusta + Valitse itse + Aseta automaattisesti + Valitse fontin koko + Myönnä oikeus + + %1$s ja %2$d muu + %1$s ja %2$d muuta + + %1$s ja %2$s + Pidä keskustelut organisoituna ketjujen avulla + Omat ketjut + Kaikki ketjut + Muuta avaruuden pääosoitetta + Täällä näkyvät uudet pyynnöt ja kutsut. + Ei mitään uutta. + Kutsut + Avaruudet ovat uusi tapa ryhmitellä huoneita ja ihmisiä. Luo avaruus aloittaaksesi. + Ei avaruuksia vielä. + Selvä + Seuraava + Näytä ketjut + Käytä avaruuksia (oikealla alhaalla) nopeammin ja helpommin kuin koskaan aiemmin. + Käytä avaruuksia + Selaa huoneita + Vaihda avaruutta + Luo huone + Aloita keskustelu + Kaikki keskustelut + Kokeile + Anna palautetta napauttamalla oikeaa yläkulmaa. + Anna palautetta + ${app_name}in yksinkertaistaminen asetti välilehdet valinnaiseksi. Hallitse välilehtiä oikean yläkulman valikosta. + Tervetuloa uuteen näkymään! + Yksinkertaistettu Element valinnaisilla välilehdillä + Ota uusi asettelu käyttöön + A - Ö + Aktiivisuus + Järjestysperuste + Näytä viimeisimmät + Näytä suodattimet + Asettelun asetukset + %s +\nvaikuttaa hieman tyhjältä. + Ketkä ovat tiimikavereitasi\? + Yksityinen avaruus sinulle ja tiimikavereillesi + Minä ja tiimikaverit + Päivitä avaruus + Vaihda avaruuden kuva + + %1$d valittu + %1$d valittu + + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index b77173519d..6c767fc350 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -2772,4 +2772,68 @@ \nVeuillez autoriser l’accès sur la prochaine fenêtre pour pouvoir voir des notifications. Essayer l’éditeur de texte formaté (le mode texte brut arrive bientôt) Activer l’éditeur de texte formaté + Vérifiez l’origine de ce code. En appairant un appareil, vous lui fournissez un accès complet à votre compte. + Confirmer + Réessayez + Pas de correspondance \? + Connexion + Connexion à l’appareil + Scanner le QR code + Connexion sur un appareil mobile \? + Afficher le QR code sur cet appareil + Sélectionnez « Scanner le QR code » + Démarrez à l’écran de connexion + Sélectionnez « Se connecter avec un QR code » + Démarrez à l’écran de connexion + Sélectionnez « Afficher le QR code » + Allez dans Réglages -> Confidentialité et sécurité + Ouvrez l’application sur votre autre appareil + Le serveur d’accueil ne prend pas en charge la connexion avec un QR code. + La connexion a été annulée sur l’autre appareil. + Ce QR code est invalide. + L’autre appareil doit être connecté. + L’autre appareil est déjà connecté. + 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 d’accueil ; votre connexion Internet ; votre (vos) appareil(s) ; + La requête a échoué. + La requête a été refusée sur l’autre appareil. + L’appairage n’a pas été effectué dans le temps imparti. + L’appairage avec cet appareil n’est pas pris en charge. + Échec de la connexion + Vérifiez votre appareil connecté, le code ci-dessous devrait y être affiché. Confirmez que le code ci-dessous correspond à celui de l’autre appareil : + Connexion sécurisée établie + Scannez le QR code ci-dessous avec l’appareil qui n’est pas connecté. + Utilisez votre appareil connecté pour scanner le QR code ci-dessous : + Se connecter avec un QR code + Utilisez l’appareil photo de cet appareil pour scanner le QR code affiché sur votre autre appareil : + Scanner le QR code + 3 + 2 + 1 + Pouvoir enregistrer et envoyer une diffusion audio dans l’historique du salon. + Activer la diffusion audio (en cours de développement) + 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 : + Se connecter avec un QR code + Scanner le QR code + Mise en mémoire tampon + Mettre en pause la diffusion audio + Lire ou continuer la diffusion audio + Arrêter l’enregistrement de la diffusion audio + Mettre en pause l’enregistrement de la diffusion audio + Continuer l’enregistrement de la diffusion audio + Direct + Sélectionner des sessions + Contact + Appareil photo + Position + Sondages + Diffusion audio + Pièces jointes + Autocollants + Galerie photo + Tout désélectionner + Tout sélectionner + + %1$d sélectionné + %1$d sélectionnés + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index 59792a9218..21ea6aab14 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -2788,9 +2788,9 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze QR kód megjelenítése ezen az eszközön Válaszd ezt: „QR kód beolvasása” Válaszd ezt: „Belépés QR kóddal” - Válaszd ezt: „QR kód megjelenítése ezen az eszközön” - Menj a Beállítások -> Biztonság és Adatvédelem -> Minden munkamenet megjelenítése menübe - Nyisd meg a(z) ${app_name} alkalmazást a másik eszközön + Válaszd ezt: „QR kód megjelenítése” + Menj a Beállítások -> Biztonság és Adatvédelem + Nyisd meg az alkalmazást a másik eszközön A kérést elutasították a másik eszközön. Az összekötés az elvárt időn belül nem fejeződött be. Összekötés ezzel az eszközzel nem támogatott. @@ -2805,4 +2805,35 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze 1 Belépés QR kóddal QR kód beolvasása + A matrix szerver nem támogatja más eszköz bejelentkeztetését. + A bejelentkezés a másik eszköz által meg lett szakítva. + QR kód érvénytelen. + A másik eszköznek már bejelentkezve kell lennie. + A másik eszköz már bejelentkezett. + 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, + A kérés sikertelen. + Hang közvetítés felvételéhez és a szoba idővonalára küldéséhez. + Hang közvetítés engedélyezése (aktív fejlesztés alatt) + Pufferelés + Hang közvetítés szüneteltetése + Hang közvetítés lejátszása vagy lejátszás folytatása + Hang közvetítés felvétel leállítása + Hang közvetítés felvétel megállítása + Hang közvetítés felvétel újraindítása + Élő + Munkamenetek kiválasztása + Névjegy + Kamera + Földrajzi helyzet + Szavazások + Hang közvetítés + Mellékletek + Matricák + Fénykép könyvtár + Semmit nem jelöl ki + Mindet kijelöli + + %1$d kiválasztva + %1$d kiválasztva + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index 6d20563d55..6ed423bb70 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -2729,13 +2729,13 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Pindai kode QR Ingin masuk di perangkat ponsel\? Tampilkan kode QR di perangkat ini - Pilih \'Pindai dengan kode QR\' + Pilih \'Pindai kode QR\' Mulai dari layar masuk Pilih \'Masuk dengan kode QR\' Mulai dari layar masuk - Pilih \'Tampilkan kode QR di perangkat ini\' - Pergi ke Pengaturan → Keamanan & Privasi → Tampilkan Semua Sesi - Buka ${app_name} di perangkat Anda yang lain + Pilih \'Tampilkan kode QR\' + Pergi ke Pengaturan → Keamanan & Privasi + Buka aplikasi di perangkat Anda yang lain Permintaan ditolak di perangkat lain. Penautan tidak selesai dalam waktu yang dibutuhkan. Penautan dengan perangkat ini tidak didukung. @@ -2753,4 +2753,34 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Anda dapat menggunakan perangkat ini untuk masuk ke perangkat ponsel atau web dengan sebuah kode QR. Ada dua cara untuk melalukan ini: Masuk dengan Kode QR Pindai kode QR + Sebuah masalah keamanan ditemukan ketika menyiapkan perpesanan aman. Salah satu dari berikut mungkin dikompromikan: homeserver Anda; koneksi internet Anda; perangkat Anda; + Pemasukan dibatalkan di perangkat yang lain. + Kode QR tidak absah. + Perangkat yang lain harus masuk. + Perangkat yang lain sudah masuk. + Homeserver tidak mendukung masuk dengan kode QR. + Permintaan gagal. + Memungkinkan untuk merekam dan mengirim siaran suara dalam linimasa ruangan. + Aktifkan siaran suara (dalam pengembangan aktif) + Memuat + Jeda siaran suara + Mainkan atau lanjutkan siaran suara + Hentikan rekaman siaran suara + Jeda rekaman siaran suara + Lanjutkan rekaman siaran suara + Langsung + Pilih sesi + Kontak + Kamera + Lokasi + Pemungutan suara + Siaran suara + Lampiran + Stiker + Pustaka foto + Batalkan semua pilihan + Pilih semua + + %1$d dipilih + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml index cea69030bc..5cc509e8b9 100644 --- a/library/ui-strings/src/main/res/values-it/strings.xml +++ b/library/ui-strings/src/main/res/values-it/strings.xml @@ -2722,12 +2722,12 @@ Rinomina sessione Disconnetti questa sessione Non verificata · La sessione attuale - Inizia un broadcast vocale + Inizia una trasmissione vocale L\'autenticità di questo messaggio cifrato non può essere garantita su questo dispositivo. 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. Tastiera incognito Antepone (╯°□°)╯︵ ┻━┻ ad un messaggio di testo - Broadcast voce + Trasmissione vocale Apri la schermata degli strumenti per sviluppatori 🔒 Hai attivato la crittografia solo per sessioni verificate in tutte le stanze nelle impostazioni di sicurezza. ⚠ Ci sono dispositivi non verificati in questa stanza, non potranno decifrare i messaggi che invii. @@ -2776,9 +2776,9 @@ Inizia nella schermata di accesso Seleziona ‘Accedi con codice QR’ Inizia nella schermata di accesso - Seleziona ‘Mostra codice QR in questo dispositivo’ - Vai in Impostazioni -> Sicurezza e privacy -> Mostra tutte le sessioni - Apri ${app_name} sull\'altro dispositivo + Seleziona ‘Mostra codice QR’ + Vai in Impostazioni -> Sicurezza e privacy + Apri l\'app sull\'altro dispositivo La richiesta è stata negata sull\'altro dispositivo. Il collegamento non è stato completato nel tempo previsto. Il collegamento con questo dispositivo non è supportato. @@ -2796,4 +2796,35 @@ Puoi usare questo dispositivo per accedere in un dispositivo mobile o web con un codice QR. Ci sono due modi: Accedi con codice QR Scansiona codice QR + Registra e invia trasmissioni vocali nella linea temporale della stanza. + Attiva trasmissione vocale (in sviluppo attivo) + L\'homeserver non supporta l\'accesso con codice QR. + L\'accesso è stato annullato sull\'altro dispositivo. + Quel codice QR non è valido. + L\'altro dispositivo deve fare l\'accesso. + L\'altro dispositivo ha già fatto l\'accesso. + 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; + La richiesta è fallita. + Buffering + Sospendi trasmissione vocale + Avvia o riprendi trasmissione vocale + Ferma registrazione trasmissione vocale + Sospendi registrazione trasmissione vocale + Riprendi registrazione trasmissione vocale + In diretta + Seleziona sessioni + Contatto + Fotocamera + Posizione + Sondaggi + Trasmissione vocale + Allegati + Adesivi + Album di foto + Deseleziona tutto + Seleziona tutto + + %1$d selezionato + %1$d selezionati + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-nb-rNO/strings.xml b/library/ui-strings/src/main/res/values-nb-rNO/strings.xml index 7af718d920..067dbbbc28 100644 --- a/library/ui-strings/src/main/res/values-nb-rNO/strings.xml +++ b/library/ui-strings/src/main/res/values-nb-rNO/strings.xml @@ -36,7 +36,7 @@ Kopiert til utklippstavle Advarsel Feil - Folk + Personer Rom Invitasjoner Lavprioritet @@ -65,10 +65,6 @@ Fjern Bli med Avvis - - - - Inviter Utesteng Opphev utestengelse @@ -265,7 +261,6 @@ %s skriver … Søk Filtrer rommets medlemmer - Alle meldinger olm-versjon Deaktiver kontoen @@ -314,8 +309,6 @@ Bråkete Kryptert melding Rom - - Årsak: %1$s %d+ Begynn å bruke Nøkkelsikkerhetskopiering @@ -379,7 +372,6 @@ Du kommer til å miste tilgang til dine enkrypterte meldinger med mindre du sikkerhetskopierer nøklene dine før du logger av. Se dekryptert kilde Rapporter innhold - Er du sikker på at vil logge ut\? Telefonsamtale Videosamtale @@ -393,7 +385,6 @@ Systemadvarsler Samtaler Bare matrix-kontakter - Send kjæsjlogg Send skjermbilde Vennligst forklar feilen. Hva gjorde du\? Hva forventet du at skulle skje\? Hva skjedde i stedet\? @@ -446,7 +437,6 @@ Dette ser ikke ut som en gyldig E-postadresse SSL-feil. For mange forespørsler har blitt sendt - Forlat rommet Direktemeldinger Ignorer bruker @@ -600,13 +590,10 @@ Du har ikke tillatelse til å starte en konferansesamtale Tilbakestill Vennligst gjennomgå og godta retningslinjene til denne hjemmeserveren: - Klarte ikke verifisere e-postadressen: Pass på at du har klikket på lenken i e-posten Denne hjemmetjeneren vil vite om du er en robot - Klarte ikke å starte en sanntidskopling. \nVennligst be hjemmetjeneradministratoren din om å sette opp en TURN server så samtaler blir mer stabile. - Inneholdt ikke gyldig JSON Ugyldig JSON Sikkerhetsfrase @@ -702,7 +689,6 @@ App info Ingen telefonnummer er lagt til kontoen din Legg til på startskjerm - Godta bare sertifikatet hvis serveradministratoren har publisert et fingeravtrykk som samsvarer med det over. Sertifikatet er endret fra en tidligere klarert til en som ikke er klarert. Serveren kan ha fornyet sertifikatet. Kontakt serveradministratoren for forventet fingeravtrykk. Sertifikatet har endret seg fra et som telefonen din klarerte. Dette er veldig uvanlig. Det anbefales at du IKKE godtar dette nye sertifikatet. @@ -734,19 +720,14 @@ Nevne Avbryt invitasjonen Er du sikker på at du vil forlate rommet\? - Gå til første uleste melding. Liste medlemmer Tillat tillatelse til å få tilgang til kontaktene dine. For å skanne en QR-kode, må du gi tilgang til kameraet. - ${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. - ${app_name} trenger tillatelse for å få tilgang til mikrofonen din for å utføre lydanrop. - - Innkommende taleanrop Innkommende videosamtale Anrop avsluttet @@ -770,7 +751,6 @@ Begynn å chatte [%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. - Ekstern vert kunne ikke plukke opp. Pågående videosamtale… Pågående samtale… @@ -1137,7 +1117,6 @@ 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. Forsinkelse mellom hver synkronisering - Tidsavbrudd for synkroniseringsforespørsel Du vil ikke bli varslet om innkommende meldinger når appen er i bakgrunnen. ${app_name} vil synkroniseres i bakgrunnen med jevne mellomrom på presis tid (konfigurerbar). @@ -1251,7 +1230,6 @@ Ta kontakt med din hjemmetjener -administrator for mer informasjon Noen rom kan være skjult fordi de er private, og du trenger en invitasjon. \nDu har ikke tillatelse til å legge til rom. - Oppgradering kreves Oppgrader offentlig rom Oppgrader privat rom @@ -1275,4 +1253,4 @@ %1$s endret visningsnavnet sitt til %2$s %1$s utestengte %2$s %ss invitasjon - + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-nl/strings.xml b/library/ui-strings/src/main/res/values-nl/strings.xml index e8ede9b079..c5616ed761 100644 --- a/library/ui-strings/src/main/res/values-nl/strings.xml +++ b/library/ui-strings/src/main/res/values-nl/strings.xml @@ -2,7 +2,7 @@ Uitnodiging van %s %1$s heeft %2$s uitgenodigd - %1$s heeft u uitgenodigd + %1$s heeft je uitgenodigd %1$s is deelnemer geworden van de kamer %1$s heeft het de kamer verlaten %1$s heeft de uitnodiging geweigerd @@ -47,7 +47,7 @@ \nKamers importeren Initiële synchronisatie: \nGesprekken worden geladen -\nAls u aan veel kamers deelneemt kan dit even duren +\nAls je aan veel kamers deelneemt kan dit even duren Initiële synchronisatie: \nUitgenodigde kamers worden geïmporteerd Initiële synchronisatie: @@ -59,7 +59,7 @@ %1$s heeft de uitnodiging voor %2$s om deelnemer te worden van de kamer ingetrokken Uitnodiging van %1$s. Reden: %2$s %1$s heeft %2$s uitgenodigd. Reden: %3$s - %1$s heeft u uitgenodigd. Reden: %2$s + %1$s heeft je uitgenodigd. Reden: %2$s %1$s neemt nu deel. Reden: %2$s %1$s is weggegaan. Reden: %2$s %1$s heeft de uitnodiging geweigerd. Reden: %2$s @@ -81,8 +81,8 @@ %1$s heeft het hoofdadres voor dit gesprek verwijderd. %1$s heeft gasten de toegang tot dit gesprek verleend. %1$s heeft gasten de toegang tot het gesprek verhinderd. - %1$s heeft end-to-end-versleuteling ingeschakeld. - %1$s heeft end-to-end-versleuteling ingeschakeld (onbekend algoritme %2$s). + %1$s heeft eind-tot-eind-versleuteling ingeschakeld. + %1$s heeft eind-tot-eind-versleuteling ingeschakeld (onbekend algoritme %2$s). Instellingen Oké Annuleren @@ -124,14 +124,14 @@ Crash-logboek versturen Schermafdruk versturen Probleem melden - Beschrijf de fout. Wat heeft u gedaan\? Wat verwachtte u dat er zou gebeuren\? Wat is er echt gebeurd\? - Beschrijf hier uw probleem - Om het probleem te kunnen onderzoeken worden logboeken van deze cliënt met de foutmelding verstuurd. Deze foutmelding, inclusief de logboeken en schermafdruk, zullen niet openbaar zichtbaar zijn. Indien u liever alleen de bovenstaande tekst verstuurt, haal dan het vinkje weg: - Het ziet er naar uit dat u de telefoon in frustratie schudt. Wilt u een probleem melden\? + Beschrijf de fout. Wat heb je gedaan\? Wat verwachtte je dat er zou gebeuren\? Wat is er echt gebeurd\? + Beschrijf hier jouw probleem + Om het probleem te kunnen onderzoeken worden logboeken van deze cliënt met de foutmelding verstuurd. Deze foutmelding, inclusief de logboeken en schermafdruk, zullen niet openbaar zichtbaar zijn. Indien je liever alleen de bovenstaande tekst verstuurt, haal dan het vinkje weg: + Het ziet er naar uit dat je de telefoon in frustratie schudt. Wil je een probleem melden\? De foutmelding is verzonden Versturen van foutmelding is mislukt (%s) Voortgang (%s%%) - De toepassing is de vorige keer gecrasht. Wilt u dit melden\? + De toepassing is de vorige keer gecrasht. Wil je dit melden\? Deelnemen aan kamer Inlognaam Afmelden @@ -147,8 +147,8 @@ Dit is geen geldig e-mailadres Dit e-mailadres is al in gebruik. Wachtwoord vergeten? - Deze server wil graag weten of u geen robot bent - Verifiëren van het e-mailadres is mislukt: zorg dat u op de koppeling in de e-mail hebt geklikt + Deze server wil graag weten of je geen robot bent + Verifiëren van het e-mailadres is mislukt: zorg dat je op de koppeling in de e-mail hebt geklikt Voer een geldige URL in Ongeldige JSON Bevatte geen geldige JSON @@ -164,8 +164,8 @@ Oproep gaande… De andere kant heeft niet opgenomen. Informatie - ${app_name} heeft toegang nodig tot uw microfoon om spraakoproepen te maken. - ${app_name} heeft toegang nodig tot uw camera en microfoon om video-oproepen te maken. + ${app_name} heeft toegang nodig tot je microfoon om spraakoproepen te maken. + ${app_name} heeft toegang nodig tot je camera en microfoon om video-oproepen te maken. \n \nVerleen toegang op de volgende pop-ups om de oproep te maken. JA @@ -176,7 +176,7 @@ Afwijzen Naar ongelezen springen Gesprek verlaten - Weet u zeker dat u het gesprek wilt verlaten\? + Weet je zeker dat je het gesprek wil verlaten\? TWEEGESPREKKEN Uitnodigen Verbannen @@ -184,22 +184,22 @@ Alle berichten van deze persoon verbergen Alle berichten van deze persoon tonen Vermelden - U kunt deze veranderingen niet ongedaan maken aangezien u de persoon tot hetzelfde niveau als uzelf promoveert. -\nWeet u het zeker\? + Je kan deze veranderingen niet ongedaan maken aangezien je de persoon tot hetzelfde niveau als jezelf promoveert. +\nWeet je het zeker\? %s is aan het typen… %1$s en %2$s zijn aan het typen… %1$s, %2$s en anderen zijn aan het typen… - U heeft geen toestemming om dit naar dit gesprek te sturen. + Je hebt geen toestemming om dit naar dit gesprek te sturen. Vertrouwen Niet vertrouwen Afmelden Negeren Vingerafdruk (%s): Kan de identiteit van de externe server niet verifïeren. - Dit kan betekenen dat iemand uw internetverkeer met slechte bedoelingen probeert te onderscheppen, of dat uw telefoon het certificaat van de server niet vertrouwt. + Dit kan betekenen dat iemand jouw internetverkeer met slechte bedoelingen probeert te onderscheppen, of dat jouw telefoon het certificaat van de server niet vertrouwt. Als de serverbeheerder heeft gezegd dat dit normaal is, wees er dan zeker van dat de vingerafdruk hieronder overeenkomt met de door de beheerder verschafte vingerafdruk. - Het certificaat is veranderd van één dat door uw telefoon werd vertrouwd naar een ander. Dit is HEEL ONGEBRUIKELIJK. Het wordt aangeraden om dit nieuwe certificaat NIET TE AANVAARDEN. - Het certificaat is veranderd van een vertrouwd naar een onvertrouwd certificaat. De server heeft misschien zijn certificaat vernieuwd. Contacteer de serverbeheerder voor de verwachte vingerafdruk. + Het certificaat is veranderd van één dat door jouw telefoon werd vertrouwd naar een ander. Dit is HEEL ONGEBRUIKELIJK. Het wordt aangeraden om dit nieuwe certificaat NIET TE AANVAARDEN. + Het certificaat is veranderd van een vertrouwd naar een onvertrouwd certificaat. De server heeft misschien zijn certificaat vernieuwd. Neem contact op met de serverbeheerder voor de verwachte vingerafdruk. Aanvaard het certificaat alleen als de serverbeheerder een vingerafdruk heeft gepubliceerd die overeenkomt met degene hierboven. Zoeken Gespreksleden filteren @@ -249,14 +249,14 @@ Aangemeld als Server Identiteitsserver - Bekijk uw e-mail en tik op de koppeling erin. Tik zodra dit gedaan is op Verdergaan. + Bekijk je e-mail en tik op de koppeling erin. Tik zodra dit gedaan is op Verdergaan. Dit e-mailadres is al in gebruik. Dit telefoonnummer is al in gebruik. Wachtwoord veranderen Huidig wachtwoord Nieuw wachtwoord Bijwerken van wachtwoord is mislukt - Uw wachtwoord is gewijzigd + Je wachtwoord is gewijzigd Alle berichten van %s tonen\? Kies een land Onderwerp @@ -270,7 +270,7 @@ Geavanceerd Interne ID van dit gesprek Experimenteel - Dit zijn experimentele functies die zich op onverwachte manieren kunnen gedragen. Wees behoedzaam bij het gebruik van deze functies. + Dit zijn experimentele functionaliteiten die zich op onverwachte manieren kunnen gedragen. Wees behoedzaam bij het gebruik van deze functies. Instellen als hoofdadres Niet instellen als hoofdadres Ontsleutelingsfout @@ -292,8 +292,8 @@ NIET geverifieerd Geverifieerd Verifiëren - Om te verifiëren dat deze sessie vertrouwd kan worden, contacteert u de eigenaar via een andere methode (bv. persoonlijk of via een telefoontje) en vraagt u hem/haar of de sleutel die hij/zij ziet in zijn/haar persoonsinstellingen van deze sessie overeenkomt met de sleutel hieronder: - Als het overeenkomt, drukt u op de knop ‘Verifiëren’ hieronder. Als het niet overeenkomt, dan onderschept iemand anders deze sessie en zou u het beter blokkeren. In de toekomst zal dit verificatieproces verbeterd worden. + Om te verifiëren dat deze sessie vertrouwd kan worden, neem je contact op met de eigenaar via een andere methode (bv. persoonlijk of via een telefoontje) en vraag je ze of de sleutel die ze zien in hun persoonsinstellingen van deze sessie overeenkomt met de sleutel hieronder: + Als het overeenkomt, druk je op de knop ‘Verifiëren’ hieronder. Als het niet overeenkomt, dan onderschept iemand anders deze sessie en kan je het beter blokkeren. In de toekomst zal dit verificatieproces verbeterd worden. Kamermap kiezen Servernaam Alle gesprekken op server %s @@ -324,12 +324,12 @@ Luisteren naar gebeurtenissen Meldingsgeluid Tijdsaanduidingen in 12-uursformaat weergeven - Weet u zeker dat u deze widget uit dit gesprek wilt verwijderen\? + Weet je zeker dat je deze widget uit dit gesprek wilt verwijderen\? Kan widget niet aanmaken. Versturen van verzoek mislukt. Het machtsniveau moet een positief geheel getal zijn. - U zit niet in dit gesprek. - U heeft geen toestemming om dat in dit gesprek te doen. + Je zit niet in dit gesprek. + Je hebt geen toestemming om dat in dit gesprek te doen. room_id ontbreekt in het verzoek. user_id ontbreekt in het verzoek. Gesprek %s is niet zichtbaar. @@ -344,8 +344,8 @@ Berichten die mijn inlognaam bevatten Statistische gegevens Systeemcamera gebruiken - U heeft een nieuwe sessie ‘%s’ toegevoegd, die versleutelingssleutels aanvraagt. - Uw ongeverifieerde sessie ‘%s’ vraagt versleutelingssleutels aan. + Je hebt een nieuwe sessie ‘%s’ toegevoegd, die versleutelingssleutels aanvraagt. + Jouw ongeverifieerde sessie ‘%s’ vraagt versleutelingssleutels aan. Verificatie starten Opdrachtfout Onbekende opdracht: %s @@ -354,8 +354,8 @@ Versleuteld bericht Laden… Schudden om een probleem te melden - Weet u zeker dat u een spraakoproep wilt beginnen\? - Weet u zeker dat u een video-oproep wilt beginnen\? + Weet je zeker dat je een spraakoproep wilt beginnen\? + Weet je zeker dat je een video-oproep wilt beginnen\? %d verandering in lidmaatschap %d veranderingen in lidmaatschap @@ -365,7 +365,7 @@ %d deelnemer %d deelnemers - Als een persoon wordt verbannen, wordt deze uit deze kamer verwijderd en wordt er voorkomen dat hij opnieuw lid wordt. + Als een persoon wordt verbannen, wordt deze uit deze kamer verwijderd en wordt er voorkomen dat ze opnieuw lid worden. %d nieuw bericht %d nieuwe berichten @@ -387,40 +387,40 @@ Thuis Gesprekken Uitgenodigd - %2$s heeft u uit %1$s gezet - %2$s heeft u uit %1$s verbannen + %2$s heeft je uit %1$s gezet + %2$s heeft je uit %1$s verbannen Reden: %1$s Avatar - %d ongelezen bericht waarin u vermeld bent - %d ongelezen berichten waarin u vermeld bent + %d ongelezen bericht waarin je vermeld bent + %d ongelezen berichten waarin je vermeld bent Verstuur een sticker Sticker versturen - U heeft momenteel geen stickerpakketten ingeschakeld. + Je hebt momenteel geen stickerpakketten ingeschakeld. \n -\nWilt u er nu een paar toevoegen\? +\nWil je er nu een paar toevoegen\? Account deactiveren Mijn account deactiveren Statistische gegevens (analytics) versturen ${app_name} verzamelt anonieme statistische gegevens (analytics) om het voor ons mogelijk te maken om de app te verbeteren. Er ontbreekt een vereiste parameter. - Om de %1$s-server verder te blijven gebruiken, dient u de voorwaarden te lezen en ermee akkoord te gaan. + Om de %1$s-server verder te blijven gebruiken, dien je de voorwaarden te lezen en ermee akkoord te gaan. Nu doorlezen Account deactiveren - Dit zal uw account voorgoed onbruikbaar maken. U zult zich niet meer kunnen aanmelden, en niemand anders zal met dezelfde persoon-ID kunnen registreren. Dit zal er voor zorgen dat uw account alle gesprekken verlaat waar deze momenteel lid van is, en het verwijdert de accountgegevens van de identiteitsserver. Deze actie is onomkeerbaar. + Dit zal je account voorgoed onbruikbaar maken. Je zal je niet meer kunnen aanmelden, en niemand anders zal met dezelfde persoon-ID kunnen registreren. Dit zal er voor zorgen dat jouw account alle gesprekken verlaat waar deze momenteel lid van is, en het verwijdert de accountgegevens van de identiteitsserver. Deze actie is onomkeerbaar. \n -\nHet deactiveren van uw account zal er niet standaard voor zorgen dat de berichten die u hebt verzonden worden vergeten. Indien u wilt dat wij de berichten vergeten, vinkt u het vakje hieronder aan. +\nHet deactiveren van je account zal er niet standaard voor zorgen dat de berichten die je hebt verzonden worden vergeten. Indien je wil dat wij de berichten vergeten, vink je het vakje hieronder aan. \n -\nDe zichtbaarheid van berichten in Matrix is gelijkaardig aan e-mails. Het vergeten van uw berichten betekent dat berichten die u verstuurd heeft niet meer gedeeld worden met nieuwe of ongeregistreerde gebruikers, maar geregistreerde gebruikers die al toegang hebben tot deze berichten zullen alsnog toegang hebben tot hun eigen kopie ervan. +\nDe zichtbaarheid van berichten in Matrix is gelijkaardig aan e-mails. Het vergeten van jouw berichten betekent dat berichten die je verstuurd hebt niet meer gedeeld worden met nieuwe of ongeregistreerde gebruikers, maar geregistreerde gebruikers die al toegang hebben tot deze berichten zullen alsnog toegang hebben tot hun eigen kopie ervan. Vergeet alle berichten die ik heb verstuurd wanneer mijn account gedeactiveerd is (Let op: dit zal er voor zorgen dat toekomstige personen een onvolledig beeld krijgen van gesprekken) Account deactiveren Downloaden - Beveiligingssleutels van uw sessies opnieuw aanvragen. + Beveiligingssleutels van je sessies opnieuw aanvragen. Start ${app_name} op een ander apparaat dat het bericht kan ontsleutelen, zodat het de sleutels naar deze sessie kan sturen. Spraakbericht versturen Sorry, er is geen externe toepassing gevonden om deze actie te voltooien. - Voer uw wachtwoord in. + Voer je wachtwoord in. Beschrijf het probleem in het Engels, indien mogelijk. Media bekijken vóór het versturen Geeft activiteit weer @@ -433,7 +433,7 @@ Gesprek verlaten Onderwerp van het gesprek instellen Stuurt persoon met gegeven ID eruit - Wijzigt uw weergavenaam + Wijzig je weergavenaam Markdown aan/uit Dit gesprek is vervangen en is niet langer actief. Het gesprek wordt hier voortgezet @@ -445,7 +445,7 @@ %d geselecteerd Om Matrix-appbeheer te herstellen - contact op te nemen met uw dienstbeheerder + contact op te nemen met je dienstbeheerder Deze server heeft een van zijn bronlimieten overschreden, dus sommige personen zullen zich niet kunnen aanmelden. Deze server heeft een van zijn bronlimieten overschreden. Deze server heeft zijn limiet voor maandelijks actieve personen overschreden, dus sommige personen zullen zich niet kunnen aanmelden. @@ -460,11 +460,11 @@ Beltoon voor inkomende oproepen Selecteer beltoon voor oproepen: Eruit sturen - Voorvertoning van koppelingen in het gesprek tonen (als uw server deze functie ondersteunt). + Voorvertoning van koppelingen in het gesprek tonen (als je server deze functionaliteit ondersteunt). Typmeldingen versturen - Laat andere personen weten dat u aan het typen bent. + Laat andere personen weten dat je aan het typen bent. Markdown-opmaak - Maak berichten op met Markdown-syntax voordat ze verstuurd worden. Hiermee kunt u uitgebreide opmaak gebruiken, zoals sterretjes voor schuingedrukte tekst. + Maak berichten op met Markdown-syntax voordat ze verstuurd worden. Hiermee kan je uitgebreide opmaak gebruiken, zoals sterretjes voor schuingedrukte tekst. Leesbevestigingen weergeven Tik op de leesbevestigingen voor een uitgebreide lijst. Toetredingen en verlatingen weergeven @@ -473,18 +473,18 @@ Omvat veranderingen in avatar en weergavenaam. Sleutelback-up Sleutelback-up gebruiken - Indien u zich nu afmeldt, zult u uw versleutelde berichten verliezen - Sleutelback-up is bezig. Indien u zich nu afmeldt, zult u de toegang tot uw versleutelde berichten verliezen. - Veilige sleutelback-up dient actief te zijn op al uw sessies om de toegang tot uw versleutelde berichten niet te verliezen. + Indien je jezelf nu afmeldt, zal je jouw versleutelde berichten verliezen + Sleutelback-up is bezig. Indien je jezelf nu afmeldt, zal je de toegang tot jouw versleutelde berichten verliezen. + Veilige sleutelback-up dient actief te zijn op al je sessies om de toegang tot je versleutelde berichten niet te verliezen. Ik wil mijn versleutelde berichten niet Sleutels worden geback-upt… - Weet u het zeker\? + Weet je het zeker\? Back-up maken - U zult de toegang tot uw versleutelde berichten verliezen, tenzij u eerst een back-up van uw sleutels maakt vooraleer u zich afmeldt. + Je zal de toegang tot je versleutelde berichten verliezen, tenzij je eerst een back-up van je sleutels maakt voordat je jezelf afmeldt. Overslaan Klaar Negeren - Weet u zeker dat u zich wilt afmelden\? + Weet je zeker dat je jezelf wilt afmelden\? Markeren als gelezen Aanmelden met unieke aanmelding Video-oproep gaande… @@ -494,7 +494,7 @@ Diagnostische probleemoplossingsinformatie Testen uitvoeren Bezig met uitvoeren… (%1$d van %2$d) - Basisdiagnose is oké. Als u nog steeds geen meldingen ontvangt, gelieve dan een bugmelding in te dienen om ons te helpen onderzoeken. + Basisdiagnose is oké. Als je nog steeds geen meldingen ontvangt, gelieve dan een bugmelding in te dienen om ons te helpen onderzoeken. Er zijn één of meer tests mislukt, probeer de aanbevolen oplossing(en). Er zijn één of meer tests mislukt, gelieve een bugmelding in te dienen om ons te helpen onderzoeken. Systeeminstellingen. @@ -503,8 +503,8 @@ \nGelieve deze te controleren. Instellingen openen Accountinstellingen. - Meldingen zijn ingeschakeld voor uw account. - Meldingen zijn uitgeschakeld voor uw account. + Meldingen zijn ingeschakeld voor jouw account. + Meldingen zijn uitgeschakeld voor jouw account. \nGelieve de accountinstellingen te controleren. Inschakelen Sessie-instellingen. @@ -514,7 +514,7 @@ Inschakelen Aangepaste instellingen. Sommige soorten berichten zijn stil (ze geven een geluidsloze melding). - Sommige meldingen zijn uitgeschakeld in uw aangepaste instellingen. + Sommige meldingen zijn uitgeschakeld in je aangepaste instellingen. Play-diensten controleren De APK van Google Play Services is beschikbaar en up-to-date. ${app_name} maakt gebruikt van Google Play Services om pushberichten af te leveren, maar dit lijkt niet juist geconfigureerd te zijn: @@ -528,7 +528,7 @@ [%1$s] \nDeze fout is onafhankelijk van ${app_name}. Volgens Google betekent deze fout dat het apparaat te veel apps heeft geregistreerd met FCM. De fout treedt enkel op ingeval er een enorm aantal apps is, dus zou dit de gemiddelde persoon niet mogen hinderen. [%1$s] -\nDeze fout is onafhankelijk van ${app_name}. Ze kan verschillende oorzaken hebben. Misschien werkt het als u het later opnieuw probeert. U kunt ook controleren of het gegevensverbruik van Google Play Services niet wordt beperkt in de systeeminstellingen, of dat de klok van uw apparaat wel juist staat, of dat het misschien aan een aangepaste ROM ligt. +\nDeze fout is onafhankelijk van ${app_name}. Ze kan verschillende oorzaken hebben. Misschien werkt het als je het later opnieuw probeert. Je kan ook controleren of het gegevensverbruik van Google Play Services niet wordt beperkt in de systeeminstellingen, of dat de klok van je apparaat wel juist staat, of dat het misschien aan een aangepaste ROM ligt. [%1$s] \nDeze fout is onafhankelijk van ${app_name}. Er is geen Google-account verbonden met de telefoon. Open het accountbeheer en voeg er een Google-account toe. Account toevoegen @@ -538,13 +538,13 @@ \n%1$s Starten bij opstarten van apparaat De dienst zal starten wanneer het apparaat wordt herstart. - De dienst zal niet starten wanneer het apparaat wordt herstart en u zult geen meldingen ontvangen tot u ${app_name} hebt geopend. + De dienst zal niet starten wanneer het apparaat wordt herstart en je zal geen meldingen ontvangen tot je ${app_name} hebt geopend. Starten bij opstarten inschakelen Achtergrondbeperkingen controleren Achtergrondbeperkingen zijn uitgeschakeld voor ${app_name}. Deze test dient uitgevoerd te worden met een mobiele verbinding (geen wifi). \n%1$s Achtergrondbeperkingen zijn ingeschakeld voor ${app_name}. -\nAl wat de app probeert te doen zal in de achtergrond hevig beperkt worden; dit kan het correct functioneren van meldingen beïnvloeden. +\nAlles wat de app probeert te doen zal in de achtergrond hevig beperkt worden; dit kan het correct functioneren van meldingen beïnvloeden. \n%1$s Beperkingen uitschakelen Accuoptimalisatie @@ -566,7 +566,7 @@ Standaardmediabron Kiezen Sluitergeluid afspelen - Maak een wachtwoord aan om de geëxporteerde sleutels mee te versleutelen. U heeft dit wachtwoord nodig om de sleutels te kunnen importeren. + Maak een wachtwoord aan om de geëxporteerde sleutels mee te versleutelen. Je hebt dit wachtwoord nodig om de sleutels te kunnen importeren. Herstel van versleutelde berichten Sleutelback-up beheren @@ -599,27 +599,27 @@ Wachtwoorden komen niet overeen Voer een wachtwoord in Wachtwoord is te zwak - Verwijder het wachtwoord als u wilt dat ${app_name} een herstelsleutel genereert. - Verlies nooit uw versleutelde berichten - Berichten in versleutelde gesprekken worden beveiligd met end-to-end-versleuteling. Enkel de ontvanger(s) en u hebben de sleutels om deze berichten te lezen. + Verwijder het wachtwoord als je wil dat ${app_name} een herstelsleutel genereert. + Verlies nooit jouw versleutelde berichten + Berichten in versleutelde gesprekken worden beveiligd met eind-to-eind-versleuteling. Enkel de ontvanger(s) en jij hebben de sleutels om deze berichten te lezen. \n -\nMaak een veilige back-up van uw sleutels om ze niet te verliezen. +\nMaak een veilige back-up van jouw sleutels om ze niet te verliezen. Begin sleutelback-up te gebruiken (Geavanceerd) Sleutels handmatig exporteren - Beveilig uw back-up met een wachtwoord. - We bewaren een versleutelde kopie van uw sleutels op onze server. Bescherm uw back-up met een wachtwoord om deze veilig te houden. + Beveilig je back-up met een wachtwoord. + We bewaren een versleutelde kopie van jouw sleutels op onze server. Bescherm je back-up met een wachtwoord om deze veilig te houden. \n -\nVoor een maximale beveiliging zou deze sleutel moeten verschillen van uw accountwachtwoord. +\nVoor een maximale beveiliging zou deze sleutel moeten verschillen van je accountwachtwoord. Wachtwoord instellen Back-up wordt aangemaakt - Of beveilig uw back-up met een herstelsleutel, en bewaar deze op een veilige plaats. + Of beveilig je back-up met een herstelsleutel, en bewaar deze op een veilige plaats. (Geavanceerd) Instellen met herstelsleutel Klaar! - Uw sleutels worden geback-upt. - Uw herstelsleutel is een veiligheidsnet - u kunt deze gebruiken om de toegang tot uw versleutelde berichten te herstellen indien u uw wachtwoord vergeet. -\nBewaar uw herstelsleutel op een heel veilige plaats, zoals een wachtwoordbeheerder (of een kluis) - Bewaar uw herstelsleutel op een heel veilige plaats, zoals een wachtwoordbeheerder (of een kluis) + Jouw sleutels worden geback-upt. + Jouw herstelsleutel is een veiligheidsnet - je kan deze gebruiken om de toegang tot jouw versleutelde berichten te herstellen indien je jouw wachtwoord vergeet. +\nBewaar je herstelsleutel op een heel veilige plaats, zoals een wachtwoordbeheerder (of een kluis) + Bewaar je herstelsleutel op een heel veilige plaats, zoals een wachtwoordbeheerder (of een kluis) Klaar Ik heb een kopie gemaakt Herstelsleutel opslaan @@ -630,23 +630,23 @@ Herstelsleutel wordt gegenereerd met wachtwoord, dit proces kan enkele seconden duren. Herstelsleutel Onverwachte fout - Weet u het zeker\? - U kunt de toegang tot uw berichten verliezen indien u zich afmeldt of dit apparaat verliest. + Weet je het zeker\? + Je kunt de toegang tot je berichten verliezen indien je jezelf afmeldt of dit apparaat verliest. Back-upversie wordt opgehaald… - Gebruik uw herstelwachtwoord om uw versleutelde berichtgeschiedenis te ontgrendelen - uw herstelsleutel gebruiken - Als u uw herstelwachtwoord niet meer weet, kunt u %s. - Gebruik uw herstelsleutel om uw versleutelde berichtgeschiedenis te ontgrendelen + Gebruik je herstelwachtwoord om jouw versleutelde berichtgeschiedenis te ontgrendelen + jouw herstelsleutel gebruiken + Als je jouw herstelwachtwoord niet meer weet, kan je %s. + Gebruik je herstelsleutel om jouw versleutelde berichtgeschiedenis te ontgrendelen Voer de herstelsleutel in - Herstelsleutel verloren\? U kunt er een nieuwe instellen in de instellingen. - De back-up kan met dit wachtwoord niet ontsleuteld worden: controleer of u het juiste herstelwachtwoord heeft ingevoerd. + Herstelsleutel verloren\? Je kan er een nieuwe instellen in de instellingen. + De back-up kan met dit wachtwoord niet ontsleuteld worden: controleer of je het juiste herstelwachtwoord hebt ingevoerd. Back-up wordt hersteld: Herstelsleutel wordt berekend… Sleutels worden gedownload… Sleutels worden geïmporteerd… Geschiedenis ontgrendelen Voer een herstelsleutel in - De back-up kan met deze herstelsleutel niet ontsleuteld worden: controleer of u de juiste herstelsleutel heeft ingevoerd. + De back-up kan met deze herstelsleutel niet ontsleuteld worden: controleer of je de juiste herstelsleutel hebt ingevoerd. Back-up hersteld %s! Back-up met %d sleutel hersteld. @@ -661,18 +661,18 @@ Back-up verwijderen Sleutelback-up is correct ingesteld voor deze sessie. Sleutelback-up is niet actief op deze sessie. - Uw sleutels worden niet geback-upt vanaf deze sessie. + Jouw sleutels worden niet geback-upt vanaf deze sessie. De back-up heeft een ondertekening van een onbekende sessie met ID %s. De back-up heeft een geldige ondertekening van deze sessie. De back-up heeft een geldige ondertekening van de geverifieerde sessie %s. De back-up heeft een geldige ondertekening van de ongeverifieerde sessie %s De back-up heeft een ongeldige ondertekening van de geverifieerde sessie %s De back-up heeft een ongeldige ondertekening van de ongeverifieerde sessie %s - Herstel nu met uw wachtwoord of herstelsleutel om sleutelback-up op deze sessie te gebruiken. + Herstel nu met je wachtwoord of herstelsleutel om sleutelback-up op deze sessie te gebruiken. Back-up wordt verwijderd… Back-up verwijderen - Uw geback-upte versleutelingssleutels verwijderen van de server\? U zult uw herstelsleutel niet meer kunnen gebruiken om de versleutelde berichtgeschiedenis te lezen. - Verlies nooit uw versleutelde berichten + Jouw geback-upte versleutelingssleutels verwijderen van de server\? Je zal jouw herstelsleutel niet meer kunnen gebruiken om de versleutelde berichtgeschiedenis te lezen. + Verlies nooit je versleutelde berichten Sleutelback-up gebruiken Nieuwe sleutels voor versleutelde berichten Beheren in sleutelback-up @@ -687,21 +687,21 @@ Ondertekening Sorry, vergadergesprekken met Jitsi worden nog niet ondersteund op oudere apparaten (met een Android-versie lager dan 6.0) onbekend IP-adres - Een nieuwe sessie vraagt versleutelingssleutels aan. -\nSessienaam: %1$s -\nLaatst gezien: %2$s -\nAls u zich niet heeft aangemeld op een andere sessie, negeer dan dit verzoek. - Een ongeverifieerde sessie vraagt versleutelingssleutels aan. -\nSessienaam: %1$s -\nLaatst gezien: %2$s -\nAls u zich niet heeft aangemeld op een andere sessie, negeer dan dit verzoek. + Een nieuwe sessie vraagt versleutelingssleutels aan. +\nSessienaam: %1$s +\nLaatst gezien: %2$s +\nAls je jezelf niet hebt aangemeld op een andere sessie, negeer dan dit verzoek. + Een ongeverifieerde sessie vraagt versleutelingssleutels aan. +\nSessienaam: %1$s +\nLaatst gezien: %2$s +\nAls je jezelf niet hebt aangemeld op een andere sessie, negeer dan dit verzoek. Delen Sleuteldeelverzoek Negeren Geverifieerd! Ik snap het Verificatieverzoek - %s wil uw sessie verifiëren + %s wil je sessie verifiëren Onbekende fout Geen Intrekken @@ -712,17 +712,17 @@ Synchroniseren op de achtergrond Geoptimaliseerd voor batterij ${app_name} zal op een batterijzuinige manier synchroniseren op de achtergrond. -\nAfhankelijk van de staat van uw apparaat kan het besturingssysteem de synchronisatie uitstellen. +\nAfhankelijk van de staat van je apparaat kan het besturingssysteem de synchronisatie uitstellen. Geoptimaliseerd voor snelheid ${app_name} zal periodiek op de achtergrond synchroniseren (configureerbaar). -\nDit heeft een negatieve impact op uw batterij- en datagebruik. Er zal een melding getoond worden ter informatie. +\nDit heeft een negatieve impact op je batterij- en datagebruik. Er zal een melding getoond worden ter informatie. Geen achtergrondssynchronisatie - U zal geen melding van berichten ontvangen als de app zich in de achtergrond bevindt. + Je zal geen melding van berichten ontvangen als de app zich in de achtergrond bevindt. Integraties Gebruik een integratiebeheerder om bots, bruggen, widgets en stickerpakketten te beheren. -\nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, gespreksuitnodigingen versturen en bestuursniveaus instellen namens u. +\nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, gespreksuitnodigingen versturen en bestuursniveaus instellen namens jou. Ontdekken - Beheer uw ontdekkingsinstellingen. + Beheer jouw ontdekkingsinstellingen. Integraties toestaan Integratiebeheerder Widget @@ -735,10 +735,10 @@ Widget herladen Openen in browser Toegang intrekken voor mij - Uw weergavenaam - Uw profielfoto-URL - Uw persoon-ID - Uw thema + Jouw weergavenaam + Jouw profielfoto-URL + Jouw persoon-ID + Jouw thema Widget-ID Gespreks-ID Deze widget wil gebruik maken van de volgende bronnen: @@ -747,25 +747,25 @@ Camera gebruiken Microfoon gebruiken DRM-beschermde media lezen - Om verder te gaan dient u de dienstvoorwaarden te aanvaarden. - Er bestaat al een back-up op uw server - Het lijkt erop dat u al een back-up van uw herstelsleutel heeft uit een andere sessie. Wilt u deze vervangen door degene die u nu aanmaakt\? + Om verder te gaan dien je de dienstvoorwaarden te aanvaarden. + Er bestaat al een back-up op je server + Het lijkt erop dat je al een back-up van je herstelsleutel heeft uit een andere sessie. Wilt je deze vervangen door degene die je nu aanmaakt\? Vervangen Stoppen Back-upstatus wordt gecontroleerd - U gebruikt geen identiteitsserver - Het lijkt er op dat u probeert verbinding te maken met een andere server. Wil je uitloggen\? + Je gebruikt geen identiteitsserver + Het lijkt er op dat je probeert verbinding te maken met een andere server. Wil je uitloggen\? Bewerken Beantwoorden Opnieuw proberen - Heeft u een uitnodiging gestuurd + Heeft je een uitnodiging gestuurd Uitgenodigd door %s - U bent helemaal bij! - U hebt geen ongelezen berichten meer + Je bent helemaal bij! + Je hebt geen ongelezen berichten meer Gesprekken - Uw directe gesprekken zullen hier worden weergegeven. Gebruik de + knop rechts onder om een gesprek te starten. + Jouw directe gesprekken zullen hier worden weergegeven. Gebruik de + knop rechts onder om een gesprek te starten. Kamers - Uw kamers zullen hier worden weergegeven. Gebruik de + knop rechtsonder om een bestaande kamer te openen of een nieuwe aan te maken. + Jouw kamers zullen hier worden weergegeven. Gebruik de + knop rechtsonder om een bestaande kamer te openen of een nieuwe aan te maken. Reacties Bevestigen Reactie Toevoegen @@ -775,7 +775,7 @@ Gebeurtenis gemodereerd door gesprek beheerder Niet correcte gebeurtenis, kan niet weergeven Nieuwe kamer aanmaken - Geen netwerk. Controleer uw internet verbinding. + Geen netwerk. Controleer je internet verbinding. Wijzigen Netwerk wijzigen Even wachten… @@ -787,8 +787,8 @@ Publiek Iedereen kan deelnemer worden van deze kamer Afspelen - U heeft het hoofdadres voor dit gesprek verwijderd. - U heeft %1$s uitgenodigd. Reden: %2$s + Je hebt het hoofdadres voor dit gesprek verwijderd. + Je hebt %1$s uitgenodigd. Reden: %2$s Jouw uitnodiging. Reden: %1$s Bericht verstuurd Initiële synchronisatie: @@ -797,36 +797,36 @@ \nAan het wachten op een antwoord van de server… Lege kamer (was %s) Moderator - U heeft %1$s uitgenodigd + Je hebt %1$s uitgenodigd %1$s nodigde %2$s uit Geen verandering. - U heeft toekomstige berichten zichtbaar gemaakt voor %1$s + Je hebt toekomstige berichten zichtbaar gemaakt voor %1$s %1$s heeft toekomstige berichten zichtbaar gemaakt voor %2$s - U hebt de oproep beëindigd. - U hebt de oproep beantwoord. - U heeft uw schermnaam gewijzigd van %1$s naar %2$s - U heeft uw schermnaam ingesteld op %1$s - U heeft uw avatar aangepast - U heeft de uitnodiging geweigerd - U heeft de kamer verlaten + Je hebt de oproep beëindigd. + Je hebt de oproep beantwoord. + Je hebt je schermnaam gewijzigd van %1$s naar %2$s + Je hebt je schermnaam ingesteld op %1$s + Je hebt je avatar aangepast + Je hebt de uitnodiging geweigerd + Je hebt de kamer verlaten %1$s heeft de kamer verlaten - U heeft de kamer verlaten - U heeft %1$s uitgenodigd - U heeft de discussie aangemaakt + Je hebt de kamer verlaten + Je hebt %1$s uitgenodigd + Je hebt de discussie aangemaakt %1$s heeft de discussie aangemaakt - U heeft de kamer aangemaakt + Je hebt de kamer aangemaakt %1$s heeft de kamer aangemaakt - Uw uitnodiging - U heeft %1$s verbannen. Reden: %2$s - U heeft de verbanning van %1$s opgeheven. Reden: %2$s - U heeft %1$s eruit getrapt. Reden: %2$s - U heeft de uitnodiging geweigerd. Reden: %1$s - U bent vertrokken. Reden: %1$s + Je uitnodiging + Je hebt %1$s verbannen. Reden: %2$s + Je hebt de verbanning van %1$s opgeheven. Reden: %2$s + Je hebt %1$s eruit getrapt. Reden: %2$s + Je hebt de uitnodiging geweigerd. Reden: %1$s + Je bent vertrokken. Reden: %1$s %1$s is vertrokken. Reden: %2$s - U heeft de kamer verlaten. Reden: %1$s - U heeft zich aangesloten. Reden: %1$s + Je hebt de kamer verlaten. Reden: %1$s + Je hebt je aangesloten. Reden: %1$s %1$s heeft zich aangesloten. Reden: %2$s - U heeft zich aangesloten bij de kamer. Reden: %1$s + Je hebt je aangesloten bij de kamer. Reden: %1$s %1$s, %2$s, %3$s en %4$d andere %1$s, %2$s, %3$s en %4$d anderen @@ -835,75 +835,75 @@ %1$s, %2$s en %3$s %1$s van %2$s naar %3$s %1$s heeft het machtigingsniveau van %2$s aangepast. - U heeft het machtigingsniveau van %1$s aangepast. + Je hebt het machtigingsniveau van %1$s aangepast. Speciaal Speciaal (%1$d) Standaardlid Beheerder - U heeft de widget %1$s aangepast + Je hebt de widget %1$s aangepast %1$s heeft de widget %2$s aangepast - U heeft de widget %1$s verwijderd + Je hebt de widget %1$s verwijderd %1$s heeft de widget %2$s verwijderd - U heeft de widget %1$s toegevoegd + Je hebt de widget %1$s toegevoegd %1$s heeft de widget %2$s toegevoegd - U heeft de uitnodiging voor %1$s geaccepteerd - U heeft de uitnodiging voor %1$s ingetrokken + Je hebt de uitnodiging voor %1$s geaccepteerd + Je hebt de uitnodiging voor %1$s ingetrokken %1$s heeft de uitnodiging voor %2$s ingetrokken - U heeft de uitnodiging voor %1$s ingetrokken om zich bij de kamer aan te sluiten - U heeft een uitnodiging gestuurd naar %1$s om zich bij de kamer aan te sluiten - U heeft de kameravatar verwijderd + Je hebt de uitnodiging voor %1$s ingetrokken om zich bij de kamer aan te sluiten + Je hebt een uitnodiging gestuurd naar %1$s om zich bij de kamer aan te sluiten + Je hebt de kameravatar verwijderd %1$s heeft de kameravatar verwijderd - U heeft het kameronderwerp verwijderd - U heeft de kamernaam verwijderd - U heeft de kamer geüpgraded. - U verstuurde data om het gesprek op te zetten. + Je hebt het kameronderwerp verwijderd + Je hebt de kamernaam verwijderd + Je hebt de kamer geüpgraded. + Je verstuurde data om het gesprek op te zetten. %s verstuurde data om het gesprek op te zetten. - U heeft een audiogesprek geopend. - U heeft een videogesprek geopend. - U heeft de kamernaam veranderd naar: %1$s - U heeft de kamerafbeelding aangepast + Je hebt een audiogesprek geopend. + Je hebt een videogesprek geopend. + Je hebt de kamernaam veranderd naar: %1$s + Je hebt de kamerafbeelding aangepast %1$s heeft de kamerafbeelding aangepast - U heeft het onderwerp gewijzigd naar: %1$s - U heeft uw weergavenaam verwijderd (voorheen %1$s) - U heeft de uitnodiging van %1$s ingetrokken - U heeft %1$s verbannen - U heeft de verbanning van %1$s opgeheven - U heeft %1$s eruit getrapt - U sloot zich aan + Je hebt het onderwerp gewijzigd naar: %1$s + Je hebt je weergavenaam verwijderd (voorheen %1$s) + Je hebt de uitnodiging van %1$s ingetrokken + Je hebt %1$s verbannen + Je hebt de verbanning van %1$s opgeheven + Je hebt %1$s verwijderd + Je sloot je aan %1$s sluit aan - U heeft de kamer betreden - Druk op uw opname om te stoppen of om te luisteren + Je hebt de kamer betreden + Druk op je opname om te stoppen of om te luisteren Houd ingedrukt om op te nemen, laat los om te versturen Verwijder opname Stembericht aan het opnemen Pauzeer stembericht Speel stembericht af - Iedereen in %s kan de ruimte vinden en betreden - het is niet nodig om iedereen handmatig uit te nodigen. U kunt dit op elk moment aanpassen in de kamer instellingen. + Iedereen in %s kan de ruimte vinden en betreden - het is niet nodig om iedereen handmatig uit te nodigen. Je kan dit op elk moment aanpassen in de kamer instellingen. Stembericht (%1$s) Kan niet antwoorden of aanpassen als stembericht actief is Kan stembericht niet opnemen Kan stembericht niet afspelen - U heeft gasten de toegang tot dit gesprek verleend. - U heeft het hoofdadres voor dit gesprek ingesteld op %1$s. - U heeft %1$s als gespreksadres toegevoegd en %2$s verwijderd. + Je hebt gasten de toegang tot dit gesprek verleend. + Je hebt het hoofdadres voor dit gesprek ingesteld op %1$s. + Je hebt %1$s als gespreksadres toegevoegd en %2$s verwijderd. - U heeft %1$s als gespreksadres verwijderd. - U heeft %1$s als gespreksadressen verwijderd. + Je hebt %1$s als gespreksadres verwijderd. + Je hebt %1$s als gespreksadressen verwijderd. - U heeft %1$s als kameradres toegevoegd. - U heeft %1$s als kameradressen toegevoegd. + Je hebt %1$s als kameradres toegevoegd. + Je hebt %1$s als kameradressen toegevoegd. - U heeft de uitnodiging van %1$s ingetrokken. Reden: %2$s - U heeft de uitnodiging voor %1$s aanvaard. Reden: %2$s + Je hebt de uitnodiging van %1$s ingetrokken. Reden: %2$s + Je hebt de uitnodiging voor %1$s aanvaard. Reden: %2$s 🎉 Alle servers zijn uitgesloten van deelname! Deze kamer kan niet meer gebruikt worden. • Servers die overeenkomen met IP-tekens zijn nu verbannen. • Servers die overeenkomen met IP-tekens zijn nu toegestaan. • Servers die overeenkomen met IP-letters zijn verbannen. • Servers die overeenkomen met IP-tekens zijn toegestaan. %s heeft de server ACL\'s voor deze kamer ingesteld. - U heeft de server ACL\'s voor deze kamer ingesteld. - U heeft de server ACL\'s voor deze kamer aangepast. + Je hebt de server ACL\'s voor deze kamer ingesteld. + Je hebt de server ACL\'s voor deze kamer aangepast. %s heeft de server ACL\'s voor deze kamer aangepast. • Servers die overeenkomen met %s zijn verwijderd uit de toegestane lijst. • Servers die overeenkomen met %s zijn nu toegestaan. @@ -911,9 +911,9 @@ • Servers die overeenkomen met %s zijn nu verbannen. • Servers die overeenkomen met %s zijn toegestaan. • Servers die overeenkomen met %s zijn verbannen. - U heeft hier geüpgraded. + Je hebt hier geüpgraded. %s heeft hier geüpgraded. - U heeft toekomstige kamergeschiedenis zichtbaar gemaakt voor %1$s + Je hebt toekomstige kamergeschiedenis zichtbaar gemaakt voor %1$s %1$ds over %s is toegetreden. Conclusie Bevestiging @@ -958,7 +958,7 @@ Klaar! Berichtsleutel Herstelwachtwoordzin - Bevestiging Geannuleerd + Verificatie geannuleerd Sleutelverzoeken Verwijderen Bevestigen Accountgegevens @@ -988,7 +988,7 @@ %s heeft geannuleerd Jij hebt geaccepteerd %s heeft geaccepteerd - U heeft geannuleerd + Je hebt geannuleerd Niet beveiligd Ze komen overeen Versleuteling inschakelen @@ -1055,13 +1055,13 @@ Overige Geen Persoon negeren - Uzelf degraderen\? + Jezelf degraderen\? Uitnodiging annuleren In de wacht zetten SSL-fout. Camera wisselen Draadloze Koptelefoon - Ruimten + Spaces Wisselen Opwaarderen Aanbevolen @@ -1169,10 +1169,10 @@ Wachten… Formaat: Url: - sessie_naam: - app_weergave_naam: - push_key: - app_id: + Sessie weergavenaam: + App weergavenaam: + Push key: + App ID: Voorkeuren Algemeen BEKIJKEN @@ -1186,36 +1186,36 @@ Succes Kopiëren Geef toestemming om de camera te gebruiken via de systeeminstellingen om deze actie uit te voeren. - Sommige rechten ontbreken om deze actie uit te voeren, geeft a.u.b. toestemming via de systeeminstellingen. + Sommige rechten ontbreken om deze actie uit te voeren, geeft toestemming via de systeeminstellingen. Ruimten Begin met chatten Herstellen Afwijzen Systeemstandaard - U heeft end-to-end-versleuteling ingeschakeld (onbekend algoritme %1$s). - U heeft end-to-end-versleuteling ingeschakeld. - U heeft gasten de toegang tot het gesprek verhinderd. + Je hebt eind-tot-eind-versleuteling ingeschakeld (onbekend algoritme %1$s). + Je hebt eind-tot-eind-versleuteling ingeschakeld. + Je hebt gasten de toegang tot het gesprek verhinderd. %1$s heeft gasten de toegang tot het gesprek verhinderd. - U heeft gasten de toegang tot het gesprek verhinderd. - U heeft hier gasten toegelaten. + Je hebt gasten de toegang tot het gesprek verhinderd. + Je hebt hier gasten toegelaten. %1$s heeft hier gasten toegelaten. - U heeft het gespreksadres gewijzigd. + Je hebt het gespreksadres gewijzigd. %1$s heeft het gespreksadres gewijzigd. - U heeft het hoofdadres en alternatieve gespreksadres gewijzigd. + Je hebt het hoofdadres en alternatieve gespreksadres gewijzigd. %1$s heeft het hoofdadres en alternatieve gespreksadres gewijzigd. - U heeft het alternatieve gespreksadres gewijzigd. + Je hebt het alternatieve gespreksadres gewijzigd. %1$s heeft het alternatieve gespreksadres gewijzigd. - U heeft alternatief gespreksadres %1$s verwijderd. - U heeft alternatieve gespreksadressen %1$s verwijderd. + Je hebt alternatief gespreksadres %1$s verwijderd. + Je hebt alternatieve gespreksadressen %1$s verwijderd. %1$s heeft %2$s als alternatief gespreksadres verwijderd. %1$s heeft %2$s als alternatieve gespreksadressen verwijderd. - U heeft %1$s als alternatief gespreksadres toegevoegd. - U heeft %1$s als alternatieve gespreksadressen toegevoegd. + Je hebt %1$s als alternatief gespreksadres toegevoegd. + Je hebt %1$s als alternatieve gespreksadressen toegevoegd. %1$s heeft %2$s als alternatief gespreksadres toegevoegd. @@ -1224,31 +1224,31 @@ Aan de slag Spacerechten Gespreksrechten - Door de verbanning op te heffen kan deze gebruiker opnieuw deelnemer worden van de ruimte. - Door de verbanning op te heffen kan deze gebruiker opnieuw deelnemer worden van de kamer. - Door deze persoon te verbannen zal hij/zij verwijderd worden uit deze space en voorkomen dat hij/zij opnieuw toetreedt. + Door de verbanning op te heffen kan deze persoon opnieuw deelnemer worden van de space. + Door de verbanning op te heffen kan deze persoon opnieuw deelnemer worden van de kamer. + Door deze persoon te verbannen zullen ze verwijderd worden uit deze space en voorkomen dat ze opnieuw toetreden. Reden voor verbanning - De gebruiker zal worden verwijderd uit deze ruimte. + De persoon zal worden verwijderd uit deze space. \n -\nOm te voorkomen dat ze opnieuw toetreden, kunt u ze verbannen. - Door deze persoon te verwijderen zal hij/zij niet meer in dit gesprek zitten. +\nOm te voorkomen dat ze opnieuw toetreden, kan je ze verbannen. + De persoon zal worden verwijderd van deze kamer. \n -\nOm te voorkomen dat hij/zij opnieuw toetreedt, kun je hem/haar ook verbannen. +\nOm te voorkomen dat ze opnieuw toetreden, kan je ze verbannen. Reden voor verwijdering - Weet u zeker dat u uitnodiging voor deze persoon wilt annuleren\? - Als u deze persoon niet negeert, worden alle berichten van deze persoon opnieuw weergegeven. + Weet je zeker dat je de uitnodiging voor deze persoon wilt annuleren\? + Als je deze persoon niet negeert, worden alle berichten van deze persoon opnieuw weergegeven. Door deze persoon te negeren worden zijn/haar berichten verwijderd uit gesprekken die jullie delen. \n -\nU kunt deze actie op elk moment ongedaan maken in de algemene instellingen. - U kunt deze wijziging niet ongedaan maken omdat uzelf degradeert, als u de laatste persoon met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen. - Deze kamer is niet publiek. U kunt niet opnieuw deelnemer worden zonder uitnodiging. - Toegang verlenen tot uw contactpersonen. - Om de QR-code te scannen moet u toegang verlenen tot de camera. +\nJe kan deze actie op elk moment ongedaan maken in de algemene instellingen. + Je kan deze wijziging niet ongedaan maken omdat je jezelf degradeert, als je de laatste persoon met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen. + Deze kamer is niet publiek. Je kan niet opnieuw deelnemer worden zonder uitnodiging. + Toegang verlenen tot je contactpersonen. + Om de QR-code te scannen moet je toegang verlenen tot de camera. Oproep beëindigen… Geen antwoord - De persoon die u heeft gebeld is bezet. + De persoon die je hebt gebeld is bezet. Persoon bezet - U heeft de oproep in de wacht gezet + Je hebt de oproep in de wacht gezet %s heeft de oproep in de wacht gezet Bellen met %s Videobellen met %s @@ -1272,7 +1272,7 @@ HD uitschakelen Geluidsapparaat Selecteren Kan geen realtime verbinding tot stand brengen. -\nVraag de beheerder van uw server om een TURN-server te configureren om gesprekken betrouwbaar te laten werken. +\nVraag de beheerder van jouw server om een TURN-server te configureren om gesprekken betrouwbaar te laten werken. ${app_name} Oproep Mislukt Server API URL Sleutel deelverzoekgeschiedenis versturen @@ -1284,36 +1284,36 @@ Nieuwe waarde Widget verwijderen mislukt Widget toevoegen mislukt - U kunt uzelf niet bellen, wacht totdat deelnemers de uitnodiging accepteren - U kunt niet met uzelf bellen - Vergaderingen gebruiken beveiligings- en toestemmingsbeleid van Jitsi. Alle huidige personen in het gesprek zullen een uitnodiging zien terwijl uw vergadering bezig is. + Je kunt jezelf niet bellen, wacht totdat deelnemers de uitnodiging accepteren + Je kunt niet met jezelf bellen + Vergaderingen gebruiken beveiligings- en toestemmingsbeleid van Jitsi. Alle huidige personen in het gesprek zullen een uitnodiging zien terwijl je vergadering bezig is. Geluidsvergadering starten Videoconferentie starten - U mist de rechten om een oproep te starten - U mist de rechten om een oproep in dit gesprek te starten - U mist de rechten om een vergadering te starten - U mist de rechten om een vergadering in dit gesprek te starten + Je mist de rechten om een oproep te starten + Je mist de rechten om een oproep in dit gesprek te starten + Je mist de rechten om een vergadering te starten + Je mist de rechten om een vergadering in dit gesprek te starten Ontbrekende rechten Geef toestemming om de microfoon te gebruiken om stemberichten te versturen. Alles herstellen - U bent toegetreden. + Je bent toegetreden. Er is een verificatie e-mail verzonden naar %1$s. Controleer je inbox Dit e-mailadres is niet aan een account gekoppeld - Als u uw wachtwoord wijzigt, worden alle end-to-end-versleutelingssleutels voor al uw sessies opnieuw ingesteld, waardoor de gecodeerde chatgeschiedenis onleesbaar wordt. Stel een back-up sleutel in of exporteer uw kamersleutels uit een andere sessie voordat u uw wachtwoord opnieuw instelt. - Er wordt een verificatie-e-mail naar uw inbox gestuurd om het instellen van uw nieuwe wachtwoord te bevestigen. + Als je jouw wachtwoord wijzigt, worden alle eind-tot-eind-versleutelingssleutels voor al je sessies opnieuw ingesteld, waardoor de gecodeerde chatgeschiedenis onleesbaar wordt. Stel een back-up sleutel in of exporteer je kamersleutels uit een andere sessie voordat je jouw wachtwoord opnieuw instelt. + Er wordt een verificatie-e-mail naar jouw inbox gestuurd om het instellen van je nieuwe wachtwoord te bevestigen. Wachtwoord opnieuw instellen op %1$s Dit e-mailadres is niet gekoppeld aan een account. De applicatie kan geen account aanmaken op deze server. \n -\nWilt u zich aanmelden met een webclient\? +\nWil je jezelf aanmelden met een webclient\? Sorry, deze server accepteert geen nieuwe accounts. De applicatie kan niet inloggen op deze server. De thuisserver ondersteunt de volgende aanmeldingstype(s): %1$s. \n \nWil je inloggen met een webclient\? Er is een fout opgetreden bij het laden van de pagina: %1$s (%2$d) - Voer het adres in van de server die u wilt gebruiken - Voer het adres in van de Modular Element of de server die u wilt gebruiken + Voer het adres in van de server die je wil gebruiken + Voer het adres in van de Modular Element of de server die je wil gebruiken Premium hosting voor organisaties Element Matrix Services-adres Geschiedenis wissen @@ -1331,21 +1331,21 @@ Word gratis lid met miljoenen anderen op de grootste openbare server Net als e-mail hebben accounts één thuis, hoewel je met iedereen kunt praten Selecteer een server - Breid en pas uw ervaring aan + Breid uit en personaliseer je ervaring Houd gesprekken privé met versleuteling Chat direct met mensen of in groepen - Het is jouw gesprek. Bezet het. - U heeft deze op enkel uitnodiging gemaakt. + Het is jouw gesprek. Bezit het. + Je hebt deze op enkel uitnodiging gemaakt. %1$s heeft dit alleen op uitnodiging gemaakt. Je hebt de kamer alleen op uitnodiging gemaakt. %1$s heeft de kamer alleen voor uitnodigingen ingesteld. - U heeft de kamer openbaar gemaakt voor iedereen die de link kent. - U negeert geen enkele persoon + Je heb de kamer openbaar gemaakt voor iedereen die de link kent. + Je negeert geen enkele persoon %1$s heeft de kamer openbaar gemaakt voor iedereen die de link kent. Klik lang op een kamer om meer opties te zien Schrijf trefwoorden om een reactie te vinden. Stuurt het gegeven bericht als een spoiler - U heeft geen wijzigingen aangebracht + Je hebt geen wijzigingen aangebracht %1$s heeft geen wijzigingen aangebracht Kamer instellingen Verlaat de kamer @@ -1356,15 +1356,15 @@ Alle belangrijke berichten Deze inhoud is als ongepast gerapporteerd. \n -\nAls u geen inhoud van deze persoon meer wilt zien, kunt u deze negeren om hun berichten te verbergen. +\nAls je geen inhoud van deze persoon meer wilt zien, kan je deze negeren om hun berichten te verbergen. Gemeld als ongepast Deze inhoud is gerapporteerd als spam. \n -\nAls u geen inhoud van deze persoon meer wilt zien, kunt u deze negeren om hun berichten te verbergen. +\nAls je geen inhoud van deze persoon meer wilt zien, kan je deze negeren om hun berichten te verbergen. Gerapporteerd als spam Deze inhoud is gemeld. \n -\nAls u geen inhoud van deze persoon meer wilt zien, kunt u deze negeren om hun berichten te verbergen. +\nAls je geen inhoud van deze persoon meer wilt zien, kan je deze negeren om hun berichten te verbergen. Reden voor het rapporteren van deze inhoud Deze inhoud rapporteren Er zijn geen bestanden in deze kamer @@ -1394,49 +1394,49 @@ Open het menu kamer maken Open de navigatielade Het lijkt erop dat de server er te lang over doet om te reageren. Dit kan worden veroorzaakt door een slechte verbinding of een fout met de server. Probeer het over een tijdje opnieuw. - Probeer het opnieuw zodra u de algemene voorwaarden van uw homeserver hebt geaccepteerd. - Uitgebreide logboeken helpen ontwikkelaars door meer logboeken te verstrekken wanneer u een RageShake verzendt. Zelfs wanneer ingeschakeld, registreert de toepassing geen berichtinhoud of andere privégegevens. + Probeer het opnieuw zodra je de algemene voorwaarden van je homeserver hebt geaccepteerd. + Uitgebreide logboeken helpen ontwikkelaars door meer logboeken te verstrekken wanneer je een RageShake verzendt. Zelfs wanneer ingeschakeld, registreert de toepassing geen berichtinhoud of andere privégegevens. Uitgebreide logboeken inschakelen - Ga akkoord met de servicevoorwaarden van de identiteitsserver (%s), zodat u vindbaar bent op e-mailadres of telefoonnummer. - U deelt momenteel e-mailadressen of telefoonnummers op de identiteitsserver %1$s. U moet opnieuw verbinding maken met %2$s om ze niet meer te delen. + Ga akkoord met de servicevoorwaarden van de identiteitsserver (%s), zodat je vindbaar bent op e-mailadres of telefoonnummer. + Je deelt momenteel e-mailadressen of telefoonnummers op de identiteitsserver %1$s. Je moet opnieuw verbinding maken met %2$s om ze niet meer te delen. De verificatiecode is niet correct. Er is een sms-bericht verzonden naar %s. Voer de verificatiecode in die deze bevat. - De door u gekozen identiteitsserver heeft geen servicevoorwaarden. Ga alleen verder als je de eigenaar van de service vertrouwt + De door jouw gekozen identiteitsserver heeft geen servicevoorwaarden. Ga alleen verder als je de eigenaar van de service vertrouwt Identiteitsserver heeft geen servicevoorwaarden Voer de URL van de identiteitsserver in Kan geen verbinding maken met identiteitsserver Voer een identiteitsserver URL in - Gaat u akkoord met het versturen van deze informatie\? - Om bestaande contacten te ontdekken, moet u contactgegevens (e-mailadressen en telefoonnummers) naar uw identiteitsserver sturen. We hashen uw gegevens voordat ze worden verzonden vanwege privacy. + Ga je akkoord met het versturen van deze informatie\? + Om bestaande contacten te ontdekken, moet je contactgegevens (e-mailadressen en telefoonnummers) naar je identiteitsserver sturen. We hashen je gegevens voordat ze worden verzonden vanwege privacy. Stuur e-mailadressen en telefoonnummers naar %s Toestemming geven Mijn toestemming intrekken - Uw thuisserverbeleid - Kan geen server bereiken op de URL %s. Controleer uw link of kies handmatig een server. - Uw contacten zijn privé. Om personen van uw contacten te ontdekken, hebben we uw toestemming nodig om contactgegevens naar uw identiteitsserver te sturen. - We hebben u een bevestigingsmail gestuurd naar %s, controleer eerst uw e-mail en klik op de bevestigingslink - We hebben u een bevestigingsmail gestuurd naar %s, controleer uw e-mail en klik op de bevestigingslink - Ontdekkingsopties verschijnen zodra u een e-mail heeft toegevoegd. - U gebruikt momenteel %1$s om te ontdekken en vindbaar te zijn voor bestaande contacten die u kent. - U bekijkt deze kamer al! - Er kan geen voorbeeld van deze kamer worden bekeken. Wilt u deelnemen\? + Jouw thuisserverbeleid + Kan geen server bereiken op de URL %s. Controleer je link of kies handmatig een server. + Jouw contacten zijn privé. Om personen van je contacten te ontdekken, hebben we jouw toestemming nodig om contactgegevens naar je identiteitsserver te sturen. + We hebben een e-mail gestuurd naar %s, controleer eerst je e-mail en klik op de bevestigingslink + We hebben een e-mail gestuurd naar %s, controleer je e-mail en klik op de bevestigingslink + Ontdekkingsopties verschijnen zodra je een e-mailadres hebt toegevoegd. + Je gebruikt momenteel %1$s om te ontdekken en vindbaar te zijn voor bestaande contacten die je kent. + Je bekijkt deze kamer al! + Er kan geen voorbeeld van deze kamer worden bekeken. Wil je toetreden\? Deze kamer is op dit moment niet toegankelijk. -\nProbeer het later opnieuw of vraag een kamerbeheerder om te controleren of u toegang heeft. - Verander uw avatar alleen in deze huidige kamer - Verander uw schermnaam alleen in de huidige kamer - Andere spaces of kamers die u misschien niet kent - Space die u kent die deze kamer bevat - Stel adressen in voor deze kamer zodat personen deze kamer kunnen vinden via uw server (%1$s) - U kunt dit op elk moment uitschakelen in de instellingen - U krijgt geen meldingen voor vermeldingen en trefwoorden in versleutelde kamers op uw mobiel. - Zorg ervoor dat u op de link heeft geklikt in de e-mail die we u hebben gestuurd. - U hebt uw toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere personen van uw contacten te ontdekken. +\nProbeer het later opnieuw of vraag een kamerbeheerder om te controleren of je toegang hebt. + Verander je afbeelding alleen in deze kamer + Verander je weergavenaam alleen in de huidige kamer + Andere spaces of kamers die je misschien niet kent + Space die je kent die deze kamer bevat + Stel adressen in voor deze kamer zodat personen deze kamer kunnen vinden via jouw server (%1$s) + Je kan dit op elk moment uitschakelen in de instellingen + Je krijgt geen meldingen voor vermeldingen en trefwoorden in versleutelde kamers op je mobiel. + Zorg ervoor dat je op de link hebt geklikt in de e-mail die we je hebben gestuurd. + Je hebt toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere personen van je contacten te ontdekken. E-mailadressen en telefoonnummers versturen Vindbare telefoonnummers - Als u de verbinding met uw identiteitsserver verbreekt, betekent dit dat u niet door andere personen kan worden gevonden en dat u anderen niet per e-mail of telefoon kunt uitnodigen. - Ontdekkingsopties verschijnen zodra u een telefoonnummer heeft toegevoegd. + Als je de verbinding met je identiteitsserver verbreekt, betekent dit dat je niet door andere personen kan worden gevonden en dat je anderen niet per e-mail of telefoon kan uitnodigen. + Ontdekkingsopties verschijnen zodra je een telefoonnummer hebt toegevoegd. Vindbare e-mailadressen - U gebruikt momenteel geen identiteitsserver. Om te ontdekken en vindbaar te zijn door bestaande contacten die u kent, configureert u er een hieronder. + Je gebruikt momenteel geen identiteitsserver. Om te ontdekken en vindbaar te zijn door bestaande contacten die Je kent, configureer je er een hieronder. Geen beleid geleverd door de identiteitsserver Identiteitsserverbeleid verbergen Identiteitsserverbeleid weergeven @@ -1460,7 +1460,7 @@ Bekijk de kamer directory Een nieuw privébericht versturen Nieuwe kamer aanmaken - Kunt u niet vinden wat u zoekt\? + Kan je niet vinden wat je zoekt\? Geen bewerkingen gevonden Bestand %1$s is gedownload! Video comprimeren %d%% @@ -1471,14 +1471,14 @@ Verborgen gebeurtenissen op de tijdlijn weergeven Geef feedback De feedback kan niet worden verzonden (%s) - Bedankt, uw feedback is succesvol verzonden - U kunt contact met mij opnemen als u vervolgvragen heeft - U gebruikt een bètaversie van spaces. Uw feedback zal helpen bij het informeren van de volgende versies. Uw platform en inlognaam worden genoteerd om ons te helpen uw feedback zoveel mogelijk te gebruiken. + Bedankt, je feedback is succesvol verzonden + Je kan contact met mij opnemen als je vervolgvragen hebt + Je gebruikt een bètaversie van spaces. Jouw feedback zal helpen bij het informeren van de volgende versies. Jouw platform en inlognaam worden genoteerd om ons te helpen jouw feedback zoveel mogelijk te gebruiken. Spaces feedback De suggestie kan niet worden verzonden (%s) Bedankt, de suggestie is succesvol verzonden - Beschrijf hier uw suggestie - Schrijf hieronder uw suggestie. + Beschrijf hier jouw suggestie + Schrijf hieronder jouw suggestie. Een voorstel doen Systeeminstellingen Versies @@ -1500,7 +1500,7 @@ \n \n%s Kameronderwerp (optioneel) - Nieuwe ruimte aanmaken + Nieuwe space aanmaken Geeft een plaatsvervangende melding weer voor verwijderde berichten. Verwijderde berichten weergeven Beveiligde back-up instellen @@ -1519,9 +1519,9 @@ %1$s in %2$s en %3$s Deze server is al aanwezig in de lijst Kan deze server of de kamerlijst niet vinden - Voer de naam in van een nieuwe server die u wilt verkennen. + Voer de naam in van een nieuwe server die je wil verkennen. Een nieuwe server toevoegen - Uw server + Jouw server Sleutel %1$d/%2$d geïmporteerd met succes. %1$d/%2$d sleutels met succes geïmporteerd. @@ -1562,7 +1562,7 @@ Een nieuw adres handmatig publiceren Andere gepubliceerde adressen: Dit is het hoofdadres - Gepubliceerde adressen kunnen door iedereen op elke server worden gebruikt om lid te worden van uw kamer. Om een adres te publiceren, moet het eerst als lokaal adres worden ingesteld. + Gepubliceerde adressen kunnen door iedereen op elke server worden gebruikt om lid te worden van jouw kamer. Om een adres te publiceren, moet het eerst als lokaal adres worden ingesteld. Gepubliceerde adressen Adressen van deze kamer bekijken en beheren. Ruimte-adressen @@ -1574,27 +1574,27 @@ Wie heeft toegang\? Wijzigingen in wie geschiedenis kan lezen, zijn alleen van toepassing op toekomstige berichten in deze kamer. De zichtbaarheid van de bestaande historie blijft ongewijzigd. Account instellingen - U kunt meldingen beheren in %1$s. + Je kan meldingen beheren in %1$s. Houd er rekening mee dat vermeldingen en trefwoordmeldingen niet beschikbaar zijn in versleutelde kamers op mobiel. Informeer mij voor - Beheer e-mailadressen en telefoonnummers die aan uw Matrix-account zijn gekoppeld + Beheer e-mailadressen en telefoonnummers die aan je Matrix-account zijn gekoppeld E-mailadressen en telefoonnummers Schakel hiervoor \'Integraties toestaan\' in bij Instellingen. Integraties zijn uitgeschakeld Deze server biedt geen beleid. Bibliotheken van derden - Uw identiteitsserverbeleid + Jouw identiteitsserverbeleid ${app_name}-beleid We delen geen informatie met derden We registreren of profileren geen accountgegevens hier - Help ons problemen te identificeren en ${app_name} te verbeteren door anonieme gebruiksgegevens te delen. Om inzicht te krijgen in hoe mensen meerdere apparaten gebruiken, genereren we een willekeurige identificatie die door uw apparaten wordt gedeeld. + Help ons problemen te identificeren en ${app_name} te verbeteren door anonieme gebruiksgegevens te delen. Om inzicht te krijgen in hoe mensen meerdere apparaten gebruiken, genereren we een willekeurige identificatie die door jouw apparaten wordt gedeeld. \n -\nU kunt al onze voorwaarden %s lezen. +\nJe kan al onze voorwaarden %s lezen. Help ${app_name} verbeteren - Dit zal uw huidige sleutel of zin vervangen. - Genereer een nieuwe beveiligingssleutel of stel een nieuwe beveiligingszin in voor uw bestaande back-up. - Bescherm uzelf tegen verlies van toegang tot versleutelde berichten en gegevens door een back-up te maken van versleutelingssleutels op uw server. + Dit zal jouw huidige sleutel of zin vervangen. + Genereer een nieuwe beveiligingssleutel of stel een nieuwe beveiligingszin in voor je bestaande back-up. + Bescherm jezelf tegen verlies van toegang tot versleutelde berichten en gegevens door een back-up te maken van versleutelingssleutels op je server. Instellen op dit apparaat Beveiligde back-up resetten Beveiligde back-up instellen @@ -1616,23 +1616,23 @@ Versleutelde berichten in groepsgesprekken Versleutelde berichten in één-op-één gesprekken Er is op de melding geklikt! - Klik op de melding. Als u de melding niet ziet, controleer dan de systeeminstellingen. - U bekijkt de melding! Klik hier! + Klik op de melding. Als je de melding niet ziet, controleer dan de systeeminstellingen. + Je bekijkt de melding! Klik hier! Kan push niet ontvangen. Oplossing zou kunnen zijn om de applicatie opnieuw te installeren. De applicatie ontvangt PUSH De applicatie wacht op de PUSH Trefwoorden mogen \'%s\' niet bevatten Trefwoorden mogen niet beginnen met \'.\' Nieuw trefwoord toevoegen - Uw trefwoorden + Jouw trefwoorden Breng me op de hoogte voor Vermeldingen en trefwoorden Standaardmeldingen E-mailmeldingen inschakelen voor %s - Om e-mail met melding te ontvangen, koppelt u een e-mail aan uw Matrix-account + Om e-mail met melding te ontvangen, koppel je een e-mailadres aan je Matrix-account E-mail notificatie - Er is geen e-mailadres toegevoegd aan uw account - Er is geen telefoonnummer toegevoegd aan uw account + Er is geen e-mailadres toegevoegd aan je account + Er is geen telefoonnummer toegevoegd aan je account De sessie is afgemeld! De kamer is verlaten! Alleen vermeldingen en trefwoorden @@ -1660,8 +1660,8 @@ Personen uitnodigen Berichten sturen Standaardrol - U bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van deze space te wijzigen - U bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van de kamer te wijzigen + Je bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van deze space te wijzigen + Je bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van de kamer te wijzigen Selecteer de rollen die nodig zijn om verschillende delen van deze space te wijzigen Selecteer de rollen die nodig zijn om verschillende delen van de kamer te veranderen Bekijk en update de rollen die nodig zijn om verschillende delen van de kamer te veranderen. @@ -1669,8 +1669,8 @@ Kies server Niet nu Inschakelen - Luisteren naar notificaties - U mag niet deelnemen aan deze kamer + Luisteren naar meldingen + Je mag niet toetreden tot deze kamer Gebeurtenis status verzonden! Gebeurtenis verzonden! Misvormde gebeurtenis @@ -1706,7 +1706,7 @@ Sleutel importeren uit bestand Widgets openen Authenticatie mislukt - ${app_name} vereist dat u uw inloggegevens invoert om deze actie uit te voeren. + ${app_name} vereist dat je jouw inloggegevens invoert om deze actie uit te voeren. Opnieuw authenticatie nodig Schuif om het gesprek te beëindigen Onbekend persoon @@ -1737,20 +1737,20 @@ Terugbellen Dit gesprek is beëindigd %1$s heeft dit gesprek geweigerd - U heeft deze oproep geweigerd + Je hebt deze oproep geweigerd Veranderingen ongedaan maken Er zijn niet opgeslagen wijzigingen. De wijzigingen negeren\? De kamer is nog niet aangemaakt. Het aanmaken van een kamer annuleren\? De link was verkeerd ingedeeld QR-code niet gescand! Ongeldige QR-code (ongeldige URI)! - U kunt uzelf niet DM\'en! + Je kan jezelf niet DM\'en! Deel via tekst Kan deze kamer niet vinden. Zorg ervoor dat het bestaat. - U kunt geen kamer openen waar u uit bent verbannen. - Wijzig uw huidige pincode + Je kan geen kamer openen waar je uit bent verbannen. + Wijzig je huidige pincode Verander pincode - Elke keer dat u ${app_name} opent, is een pincode vereist. + Elke keer dat je ${app_name} opent, is een pincode vereist. Pincode is vereist na 2 minuten ${app_name} niet te hebben gebruikt. Pincode vereist na 2 minuten Geef alleen het aantal ongelezen berichten weer in een eenvoudige melding. @@ -1759,16 +1759,16 @@ Pincode is de enige manier om ${app_name} te ontgrendelen. Schakel apparaatspecifieke biometrische gegevens in, zoals vingerafdrukken en gezichtsherkenning. Biometrische gegevens inschakelen - Als u uw pincode opnieuw wilt instellen, tikt u op Pincode vergeten om uit te loggen en opnieuw in te stellen. + Als je jouw pincode opnieuw wilt instellen, tik je op Pincode vergeten om uit te loggen en opnieuw in te stellen. Pincode inschakelen Beveiliging configureren Beveilig de toegang met pincode en biometrie. Toegang beveiligen - Om uw pincode opnieuw in te stellen, moet u opnieuw inloggen en een nieuwe maken. - Voer uw pincode in + Om je pincode opnieuw in te stellen, moet je opnieuw inloggen en een nieuwe maken. + Voer je pincode in Kan pincode niet valideren. Tik voor een nieuwe. Kies een pincode voor beveiliging - Te veel fouten, u bent uitgelogd + Te veel fouten, je bent uitgelogd Waarschuwing! Laatste resterende poging voor uitloggen! %d invoer @@ -1778,49 +1778,49 @@ Verkeerde code, %d resterende poging Verkeerde code, %d resterende pogingen - Controleer uw instellingen om pushmeldingen in te schakelen + Controleer je instellingen om pushmeldingen in te schakelen Pushmeldingen zijn uitgeschakeld Kan persoon verbanning niet opheffen Verbannen door %1$s Uitnodiging voor %1$s intrekken\? Zoeken naar contacten op Matrix - Uw contactenboek is leeg - Uw contacten ophalen… + Jouw contactenboek is leeg + Jouw contacten ophalen… Herstelsleutel opslaan in LEER MEER BEGREPEN - We zijn verheugd om aan te kondigen dat we van naam zijn veranderd! Uw app is up-to-date en u bent ingelogd op uw account. + We zijn verheugd om aan te kondigen dat we van naam zijn veranderd! Jouw app is up-to-date en je bent ingelogd op jouw account. Riot is nu Element! Wachten op versleutelingsgeschiedenis - U heeft geen toegang tot dit bericht omdat de afzender de sleutels met opzet niet heeft verzonden - U heeft geen toegang tot dit bericht omdat u bent geblokkeerd door de afzender - U heeft geen toegang tot dit bericht omdat uw sessie niet wordt vertrouwd door de afzender - Vanwege end-to-end-versleuteling moet u mogelijk wachten op het bericht van iemand omdat de versleutelingssleutels niet correct naar u zijn verzonden. + Je hebt geen toegang tot dit bericht omdat de afzender de sleutels met opzet niet heeft verzonden + Je hebt geen toegang tot dit bericht omdat je bent geblokkeerd door de afzender + Je hebt geen toegang tot dit bericht omdat jouw sessie niet wordt vertrouwd door de afzender + Vanwege eind-tot-eind-versleuteling moet je mogelijk wachten op het bericht van iemand omdat de versleutelingssleutels niet correct naar jou zijn verzonden. Wachten op dit bericht, dit kan even duren - U heeft geen toegang tot dit bericht + Je hebt geen toegang tot dit bericht Avatar instellen Je hebt de kamerinstellingen met succes gewijzigd - Voer uw beveiligingszin nogmaals in om deze te bevestigen. - Voer een beveiligingszin in die alleen u kent en die wordt gebruikt om geheimen op uw server te beveiligen. + Voer jouw beveiligingszin nogmaals in om deze te bevestigen. + Voer een beveiligingszin in die alleen jij kent en die wordt gebruikt om geheimen op jouw server te beveiligen. Stel een beveiligingszin in - Bewaar uw beveiligingssleutel ergens veilig, zoals een wachtwoordbeheerder of een kluis. - Bewaar uw beveiligingssleutel - Voer een geheime zin in die alleen u kent en genereer een sleutel voor back-up. + Bewaar jouw beveiligingssleutel ergens veilig, zoals een wachtwoordbeheerder of een kluis. + Bewaar jouw beveiligingssleutel + Voer een geheime zin in die alleen jij kent en genereer een sleutel voor back-up. Gebruik een beveiligingszin Genereer een beveiligingssleutel om ergens veilig op te slaan, zoals een wachtwoordbeheerder of een kluis. Een beveiligingssleutel gebruiken - Bescherm uzelf tegen verlies van toegang tot versleutelde berichten en gegevens door een back-up te maken van versleutelingssleutels op uw server. + Bescherm jezelf tegen verlies van toegang tot versleutelde berichten en gegevens door een back-up te maken van versleutelingssleutels op je server. Start de camera Stop de camera Dempen van de microfoon opheffen De microfoon dempen Voer de URL van een identiteitsserver in - U kunt ook een andere identiteitsserver URL invoeren - Uw server (%1$s) stelt voor om %2$s te gebruiken voor uw identiteitsserver + Je kan ook een andere identiteitsserver URL invoeren + Je server (%1$s) stelt voor om %2$s te gebruiken voor jouw identiteitsserver De toestemming van de persoon is niet gegeven. Er is geen huidige associatie met dit id. De associatie heeft gefaald. - Voor uw privacy ondersteunt ${app_name} alleen het versturen van gehashte e-mailadressen en telefoonnummers van personen. + Voor je privacy ondersteunt ${app_name} alleen het versturen van gehashte e-mailadressen en telefoonnummers van personen. Accepteer eerst de voorwaarden van de identiteitsserver in de instellingen. Configureer eerst een identiteitsserver. Deze operatie is niet mogelijk. De server is verouderd. @@ -1829,11 +1829,11 @@ Open voorwaarden van %s Beschikbare talen laden… Andere beschikbare talen - Deel deze code met mensen zodat ze deze kunnen scannen om u toe te voegen en te beginnen met chatten. + Deel deze code met mensen zodat ze deze kunnen scannen om je toe te voegen en te beginnen met chatten. Mijn code Mijn code delen Een QR-code scannen - We kunnen geen personen uitnodigen. Controleer de personen die u wilt uitnodigen en probeer het opnieuw. + We kunnen geen personen uitnodigen. Controleer de personen die je wil uitnodigen en probeer het opnieuw. Uitnodigingen verzonden naar %1$s en nog één Uitnodigingen verzonden naar %1$s en %2$d meer @@ -1845,19 +1845,19 @@ Hé, praat met me op ${app_name}: %s Vrienden uitnodigen Mensen toevoegen - We kunnen je DM niet maken. Controleer de personen die u wilt uitnodigen en probeer het opnieuw. - De link %1$s brengt u naar een andere site: %2$s. + We kunnen je DM niet maken. Controleer de personen die je wilt uitnodigen en probeer het opnieuw. + De link %1$s brengt je naar een andere site: %2$s. \n -\nWeet u zeker dat u door wilt gaan\? +\nWeet je zeker dat je door wilt gaan\? Dubbelcheck deze link Kies een wachtwoord. Kies een inlognaam. Kan kruislingsondertekenen niet instellen - Bevestig uw identiteit door deze login te verifiëren en deze toegang te verlenen tot versleutelde berichten. - Bevestig uw identiteit door deze login van een van uw andere sessies te verifiëren en toegang te verlenen tot versleutelde berichten. + Bevestig je identiteit door deze login te verifiëren en deze toegang te verlenen tot versleutelde berichten. + Bevestig je identiteit door deze login van een van uw andere sessies te verifiëren en toegang te verlenen tot versleutelde berichten. Interactief verifiëren door Emoji Handmatig verifiëren via tekst - Verifieer de nieuwe login voor toegang tot uw account: %1$s + Verifieer de nieuwe login voor toegang tot je account: %1$s Verifieer al je sessies om ervoor te zorgen dat je account en berichten veilig zijn Bekijk waar je bent ingelogd Versleuteld door een niet-geverifieerd apparaat @@ -1866,34 +1866,34 @@ Stuurt het gegeven bericht met sneeuwval Stuurt het gegeven bericht met confetti - Laat het apparaat zien waarmee u nu kunt verifiëren - %d apparaten weergeven waarmee u nu kunt verifiëren + Laat het apparaat zien waarmee je nu kan verifiëren + %d apparaten weergeven waarmee je nu kan verifiëren - U start opnieuw op zonder geschiedenis, geen berichten, vertrouwde apparaten of vertrouwde personen + Je start opnieuw op zonder geschiedenis, geen berichten, vertrouwde apparaten of vertrouwde personen Als je alles reset - Doe dit alleen als u geen ander apparaat heeft waarmee u dit apparaat kunt verifiëren. + Doe dit alleen als je geen ander apparaat hebt waarmee je dit apparaat kunt verifiëren. Alle herstelopties vergeten of verloren\? Alles resetten Kan geen toegang krijgen tot beveiligde opslag - Selecteer uw herstelsleutel of voer deze handmatig in door deze te typen of te plakken vanaf uw klembord + Selecteer je herstelsleutel of voer deze handmatig in door deze te typen of te plakken vanaf je klembord Herstelsleutel gebruiken - Gebruik uw %1$s of gebruik uw %2$s om door te gaan. + Gebruik je %1$s of gebruik je %2$s om door te gaan. Alleen ondersteund in versleutelde kamers Dwingt dat de huidige uitgaande groepssessie in een versleutelde kamer wordt weggegooid - Gebruik de nieuwste ${app_name} op uw andere apparaten: + Gebruik de nieuwste ${app_name} op je andere apparaten: of een andere Matrix client die kruislingsondetekenen ondersteunt ${app_name} iOS \n${app_name} Android ${app_name} Web \n${app_name} Desktop - Gebruik de nieuwste ${app_name} op uw andere apparaten, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} voor Android of een andere Matrix-client die geschikt is voor kruislingsondertekenen + Gebruik de nieuwste ${app_name} op je andere apparaten, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} voor Android of een andere Matrix-client die geschikt is voor kruislings ondertekenen Stel een nieuw accountwachtwoord in… Kan mediabestand niet opslaan - Als u deze instelling inschakelt, wordt de FLAG_SECURE aan alle activiteiten toegevoegd. Start de toepassing opnieuw om de wijziging door te voeren. + Als je deze instelling inschakelt, wordt de FLAG_SECURE aan alle activiteiten toegevoegd. Start de applicatie opnieuw om de wijziging door te voeren. Voorkom screenshots van de applicatie Sleutel Back-up herstelsleutel - Weet u uw Key Back-up wachtwoordzin niet, u kunt %s. - gebruik uw Backup-herstelsleutel - Voer uw Sleutel Back-up wachtwoordzin in om door te gaan. + Weet je jouw Key Back-up wachtwoordzin niet, je kan %s. + gebruik je Backup-herstelsleutel + Voer je Sleutel Back-up wachtwoordzin in om door te gaan. Sleutelback-up geheim opslaan in SSSS SSSS sleutel genereren uit herstelsleutel SSSS sleutel genereren op basis van wachtwoordzin (%s) @@ -1903,8 +1903,8 @@ Back-upsleutel controleren Voer een herstelsleutel in Het is geen geldige herstelsleutel - Voer uw %s in om door te gaan - Verifieer uzelf en anderen om uw chats veilig te houden + Voer je %s in om door te gaan + Verifieer jezelf en anderen om jouw chats veilig te houden Encryptie upgrade beschikbaar Dit account is gedeactiveerd. Onjuiste inlognaam en/of wachtwoord. Het ingevoerde wachtwoord begint of eindigt met spaties, controleer dit alstublieft. @@ -1915,24 +1915,24 @@ Bijna klaar! Toont het andere apparaat een vinkje\? Een onderwerp toevoegen %s om mensen te laten weten waar deze kamer over gaat. - Dit is het begin van uw privéberichtgeschiedenis met %s. + Dit is het begin van jouw privéberichtgeschiedenis met %s. Dit is het begin van dit gesprek. Dit is het begin van %s. - U hebt de kamer gemaakt en geconfigureerd. + Je hebt de kamer gemaakt en geconfigureerd. %s heeft de kamer gemaakt en geconfigureerd. De versleuteling die door deze kamer wordt gebruikt, wordt niet ondersteund Versleuteling niet ingeschakeld - Berichten in deze chat zijn end-to-end-versleuteld. + Berichten in deze chat zijn eind-tot-eind-versleuteld. Berichten in deze kamer zijn eind-tot-eind-versleuteld. Lees meer en verifieer persoon in hun profiel. - Als u nu annuleert, kunt u versleutelde berichten en gegevens kwijtraken als u de toegang tot uw aanmeldingen verliest. + Als je nu annuleert, kan je versleutelde berichten en gegevens kwijtraken als je de toegang tot uw aanmeldingen verliest. \n -\nU kunt ook Veilige back-up instellen en uw sleutels beheren in Instellingen. - Kopieer het naar uw persoonlijke cloudopslag +\nJe kan ook Veilige back-up instellen en uw sleutels beheren in Instellingen. + Kopieer het naar je persoonlijke cloudopslag Bewaar het op een USB-stick of back-upstation Print het uit en bewaar het ergens veilig - Uw %2$s en %1$s zijn nu ingesteld. + Jouw %2$s en %1$s zijn nu ingesteld. \n -\nHoud ze veilig! U heeft ze nodig om versleutelde berichten te ontgrendelen en informatie te beveiligen als u al uw actieve sessies verliest. +\nHoud ze veilig! Je hebt ze nodig om versleutelde berichten te ontgrendelen en informatie te beveiligen als je al jouw actieve sessies verliest. Sleutelback-up instellen Zelfondertekenende sleutel synchroniseren Persoonssleutel synchroniseren @@ -1943,25 +1943,25 @@ Hou het veilig Herstel instellen. Dit kan enkele seconden duren, even geduld a.u.b. - Voer een beveiligingszin in die alleen u kent en die wordt gebruikt om geheimen op uw server te beveiligen. - Gebruik niet uw accountwachtwoord. - Voer uw %s in om door te gaan. - Verificatie is geannuleerd. U kunt de verificatie opnieuw starten. + Voer een beveiligingszin in die alleen jij kent en die wordt gebruikt om geheimen op jouw server te beveiligen. + Gebruik niet je accountwachtwoord. + Voer je %s in om door te gaan. + Verificatie is geannuleerd. Je kan de verificatie opnieuw starten. Een van de volgende zaken kan worden aangetast: \n -\n- Uw wachtwoord -\n- Uw server +\n- Jouw wachtwoord +\n- Jouw server \n- Dit apparaat, of het andere apparaat \n- De internetverbinding die elk apparaat gebruikt \n -\nWe raden u aan uw wachtwoord en herstelsleutel onmiddellijk in Instellingen te wijzigen. - U verifieert %1$s (%2$s) niet als u nu annuleert. Begin opnieuw in hun profiel. - Als u annuleert, kunt u geen versleutelde berichten op dit apparaat lezen en zullen andere personen het niet vertrouwen - Als u annuleert, kunt u geen versleutelde berichten lezen op je nieuwe apparaat en zullen andere personen het niet vertrouwen - Uw account is mogelijk gecompromitteerd +\nWe raden je aan jouw wachtwoord en herstelsleutel onmiddellijk in Instellingen te wijzigen. + Je verifieert %1$s (%2$s) niet als je nu annuleert. Begin opnieuw in hun profiel. + Als je annuleert, kan je geen versleutelde berichten op dit apparaat lezen en zullen andere personen het niet vertrouwen + Als je annuleert, kan je geen versleutelde berichten lezen op je nieuwe apparaat en zullen andere personen het niet vertrouwen + Jouw account is mogelijk gecompromitteerd Dit was ik niet - Gebruik deze sessie om uw nieuwe te verifiëren en deze toegang te verlenen tot versleutelde berichten. - Nieuwe login. Was u dit\? + Gebruik deze sessie om je nieuwe te verifiëren en deze toegang te verlenen tot versleutelde berichten. + Nieuwe login. Was jij dit\? Ontgrendel de geschiedenis van versleutelde berichten Exportcontrole ${app_name} Android @@ -1970,7 +1970,7 @@ Gebeurtenis verwijderd door persoon, reden: %1$s Reden voor redigeren Geef een reden op - Weet u zeker dat u deze gebeurtenis wilt verwijderen (wissen)\? Houd er rekening mee dat als u een kamer naam of onderwerpwijziging verwijdert, de wijziging ongedaan kan worden gemaakt. + Weet je zeker dat je deze gebeurtenis wil verwijderen (wissen)\? Houd er rekening mee dat als je een kamer naam of onderwerpwijziging verwijdert, de wijziging ongedaan kan worden gemaakt. Media versturen in het originele formaat Stuur video in het originele formaat @@ -1980,7 +1980,7 @@ Stuur afbeelding in het originele formaat Stuur afbeeldingen in het originele formaat - Wilt u deze bijlage naar %1$s sturen\? + Wil je deze bijlage naar %1$s sturen\? Kan geen geheimen vinden in opslag Als je geen toegang hebt tot een bestaande sessie Een herstelwachtwoordzin of -sleutel gebruiken @@ -1990,8 +1990,8 @@ Vliegtuigmodus is ingeschakeld Verbinding met de server is verbroken Bijna klaar! Toont %s een vinkje\? - Totdat deze persoon deze sessie vertrouwt, worden berichten die van en naar de sessie worden verzonden, gelabeld met waarschuwingen. U kunt het ook handmatig verifiëren. - %1$s (%2$s) aangemeld met een nieuwe sessie: + Totdat deze persoon deze sessie vertrouwt, worden berichten die van en naar deze sessie worden verzonden, gelabeld met waarschuwingen. Je kan het ook handmatig verifiëren. + %1$s (%2$s) is aangemeld met een nieuwe sessie: Deze sessie wordt vertrouwd voor veilig berichtenverkeer omdat %1$s (%2$s) deze heeft geverifieerd: Kan geen sessies ophalen Gebruik een bestaande sessie om deze te verifiëren en deze toegang te verlenen tot versleutelde berichten. @@ -2000,39 +2000,39 @@ %d actieve sessie %d actieve sessies - Verifieer deze sessie om hem als vertrouwd te markeren en verleen hem toegang tot versleutelde berichten. Als u zich niet bij deze sessie hebt aangemeld, is uw account mogelijk gehackt: - Deze sessie wordt vertrouwd voor veilige berichten omdat u deze heeft geverifieerd: + Verifieer deze sessie om als vertrouwd te markeren en toegang te verlenen tot versleutelde berichten. Als jij je niet bij deze sessie hebt aangemeld, is jouw account mogelijk gehackt: + Deze sessie wordt vertrouwd voor veilige berichten omdat je deze hebt geverifieerd: Geen cryptografische informatie beschikbaar Standaardversie Kamerversies 👓 De limiet is onbekend. - Uw server accepteert bijlagen (bestanden, media, enz.) met een grootte tot %s. + Jouw server accepteert bijlagen (bestanden, media, enz.) met een grootte tot %s. Server limiet voor het uploaden van bestanden Serverversie Server naam Afmelden voor deze sessie Alle sessies tonen - Uw serverbeheerder heeft standaard end-to-end versleuteling uitgeschakeld in privékamers en privéberichten. + Jouw serverbeheerder heeft standaard eind-tot-eind versleuteling uitgeschakeld in privékamers en privéberichten. Kruisondertekenen is niet ingeschakeld - Kruisondertekenen is ingeschakeld. + Kruislings ondertekenen is ingeschakeld. \nSleutels worden niet vertrouwd - Kruisondertekenen is ingeschakeld + Kruislings ondertekenen is ingeschakeld \nSleutels zijn vertrouwd. \nPrivésleutels zijn niet bekend Kruisondertekening is ingeschakeld \nPrivésleutels op het apparaat. - Uw nieuwe sessie is nu geverifieerd. Het heeft toegang tot uw gecodeerde berichten en andere personen zullen het als vertrouwd zien. - Berichten met deze persoon zijn end-to-end-versleuteld en kunnen niet door derden worden gelezen. + Jouw nieuwe sessie is nu geverifieerd. Het heeft toegang tot jouw gecodeerde berichten en andere personen zullen het als vertrouwd zien. + Berichten met deze persoon zijn eind-tot-eind-versleuteld en kunnen niet door derden worden gelezen. Vergelijk de code met die op het scherm van de andere persoon. Vergelijk de unieke emoji en zorg ervoor dat ze in dezelfde volgorde verschijnen. Doe dit voor de zekerheid persoonlijk of gebruik een andere manier om te communiceren. - Om veilig te zijn, verifieert u %s door een eenmalige code te controleren. + Om veilig te zijn, verifieer je %s door een eenmalige code te controleren. Eenmaal ingeschakeld, kan versleuteling voor een kamer niet worden uitgeschakeld. Berichten die in een versleutelde kamer worden verzonden, kunnen niet door de server worden gezien, alleen door de deelnemers van de kamer. Het inschakelen van versleuteling kan voorkomen dat veel bots en koppelingen correct werken. - U bent niet gemachtigd om versleuteling in deze kamer in te schakelen. - End-to-end-versleuteling inschakelen… + Je bent niet gemachtigd om versleuteling in deze kamer in te schakelen. + Eind-tot-eind-versleuteling inschakelen… Verzendt de gegeven emote gekleurd als een regenboog Stuurt het gegeven bericht gekleurd als een regenboog - Deze sessie kan deze verificatie niet delen met uw andere sessies. + Deze sessie kan deze verificatie niet delen met jouw andere sessies. \nDe verificatie wordt lokaal opgeslagen en gedeeld in een toekomstige versie van de app. ${app_name} heeft een probleem ondervonden bij het weergeven van de inhoud van het gebeurtenis met id \'%1$s\' ${app_name} verwerkt geen gebeurtenissen van het type \'%1$s\' @@ -2043,40 +2043,40 @@ Moderator in %1$s Beheerder in %1$s De kamer verlaten… - Berichten hier zijn end-to-end-versleuteld. + Berichten hier zijn eind-tot-eind-versleuteld. \n -\nUw berichten zijn beveiligd met sloten en alleen u en de ontvanger hebben de unieke sleutels om ze te ontgrendelen. - Berichten in deze kamer zijn end-to-end-versleuteld. +\nJouw berichten zijn beveiligd met sloten en alleen jij en de ontvanger hebben de unieke sleutels om ze te ontgrendelen. + Berichten in deze kamer zijn eind-tot-eind-versleuteld. \n -\nUw berichten zijn beveiligd met sloten en alleen u en de ontvanger hebben de unieke sleutels om ze te ontgrendelen. - Berichten hier zijn niet end-to-end-versleuteld. - Berichten in deze kamer zijn niet end-to-end-versleuteld. +\nJouw berichten zijn beveiligd met sloten en alleen jij en de ontvanger hebben de unieke sleutels om ze te ontgrendelen. + Berichten hier zijn niet eind-tot-eind-versleuteld. + Berichten in deze kamer zijn niet eind-tot-eind-versleuteld. Wachten op %s… Verifieer door emoji\'s te vergelijken Verifieer door emoji te vergelijken - Als u niet persoonlijk aanwezig bent, vergelijk dan emoji\'s + Als je niet persoonlijk aanwezig bent, vergelijk dan emoji\'s Scannen met dit apparaat Scan hun code - Scan de code met uw ander apparaat of wissel en scan met dit apparaat + Scan de code met je andere apparaat of wissel en scan met dit apparaat Scan de code met het apparaat van de andere persoon om elkaar veilig te verifiëren Deze sessie verifiëren Gereageerd met: %s - "Een van de volgende zaken kan worden aangetast: + Een van de volgende zaken kan worden aangetast: \n -\n - Uw server -\n - De server waarmee de gebruiker die u verifieert is verbonden -\n - De internetverbinding van u of de andere personen -\n - Het apparaat van u of van andere personen" +\n - Jouw server +\n - De server waarmee de gebruiker die je verifieert is verbonden +\n - De internetverbinding van jou of de andere personen +\n - Het apparaat van jou of van andere personen Ze komen niet overeen Niet-vertrouwd inloggen - Uw e-maildomein is niet geautoriseerd om op deze server te registreren + Jouw e-maildomein is niet geautoriseerd om op deze server te registreren Ruimte aanmaken… Kamer aanmaken… Sommige tekens zijn niet toegestaan Geef een kameradres op Dit adres is al in gebruik Ruimte-adres - U kunt dit inschakelen als de kamer alleen wordt gebruikt voor samenwerking met interne teams op uw server. Dit kan later niet meer worden gewijzigd. + Je kan dit inschakelen als de kamer alleen wordt gebruikt voor samenwerking met interne teams op jouw server. Dit kan later niet meer worden gewijzigd. Blokkeer iedereen die geen deel uitmaakt van %s om ooit deel te nemen aan deze kamer Verberg geavanceerd Geavanceerd weergeven @@ -2090,87 +2090,87 @@ Schud je telefoon om de detectiedrempel te testen De ontwikkelaarsmodus activeert verborgen functies en kan de applicatie ook minder stabiel maken. Alleen voor ontwikkelaars! De beschrijving is te kort - Uw matrix.to link is onjuist opgemaakt - De huidige sessie is voor gebruiker %1$s en u geeft inloggegevens op voor persoon %2$s. Dit wordt niet ondersteund door ${app_name}. -\nWis eerst de gegevens en meld u vervolgens opnieuw aan met een ander account. - U raakt de toegang tot beveiligde berichten kwijt, tenzij u zich aanmeldt om uw versleutelingssleutels te herstellen. + Jouw matrix.to link is onjuist opgemaakt + De huidige sessie is voor gebruiker %1$s en je geeft inloggegevens op voor persoon %2$s. Dit wordt niet ondersteund door ${app_name}. +\nWis eerst de gegevens en meld je vervolgens opnieuw aan met een ander account. + Je raakt de toegang tot beveiligde berichten kwijt, tenzij je jezelf aanmeldt om jouw versleutelingssleutels te herstellen. Alle gegevens wissen die momenteel op dit apparaat zijn opgeslagen\? -\nMeld u opnieuw aan om toegang te krijgen tot uw accountgegevens en berichten. +\nMeld je opnieuw aan om toegang te krijgen tot je accountgegevens en berichten. Alle gegevens wissen - Waarschuwing: uw persoonlijke gegevens (inclusief versleutelingssleutels) zijn nog steeds opgeslagen op dit apparaat. + Waarschuwing: jouw persoonlijke gegevens (inclusief versleutelingssleutels) zijn nog steeds opgeslagen op dit apparaat. \n -\nWis het als u klaar bent met het gebruik van dit apparaat of als u zich wilt aanmelden bij een ander account. +\nWis het als je klaar bent met het gebruik van dit apparaat of als je jezelf wilt aanmelden bij een ander account. Persoonlijke gegevens wissen Log in om versleutelingssleutels te herstellen die exclusief op dit apparaat zijn opgeslagen. Je hebt ze nodig om al uw beveiligde berichten op elk apparaat te lezen. - Uw server (%1$s) beheerder heeft u uitgelogd van uw account %2$s (%3$s). + Je server (%1$s) beheerder heeft je uitgelogd van jouw account %2$s (%3$s). Je bent uitgelogd Opnieuw inloggen Het kan verschillende redenen hebben: \n -\n• U heeft uw wachtwoord bij een andere sessie gewijzigd. +\n• Je hebt je wachtwoord bij een andere sessie gewijzigd. \n -\n• U heeft deze sessie verwijderd uit een andere sessie. +\n• Je hebt deze sessie verwijderd uit een andere sessie. \n -\n• De beheerder van uw server heeft uw toegang om veiligheidsredenen ongeldig gemaakt. +\n• De beheerder van je server heeft jouw toegang om veiligheidsredenen ongeldig gemaakt. Je bent uitgelogd - Kan geen geldige server vinden. Controleer uw ID a.u.b. + Kan geen geldige server vinden. Controleer je ID Dit is geen geldige persoon-ID. Verwacht formaat: \'@persoon:server.org\' - Als u uw wachtwoord niet weet, gaat u terug om het opnieuw in te stellen. + Als je jouw wachtwoord niet weet, ga je terug om het opnieuw in te stellen. Als je een account aanmaakt op een server, gebruik dan je Matrix ID (bijv. @persoon:domein.nl) en wachtwoord hieronder. Aanmelden met Matrix ID Aanmelden met Matrix ID - Er zijn te veel verzoeken verzonden. Je kunt het over %1$d seconde opnieuw proberen… - Er zijn te veel verzoeken verzonden. Je kunt het over %1$d seconden opnieuw proberen… + Er zijn te veel verzoeken verzonden. Je kan het over %1$d seconde opnieuw proberen… + Er zijn te veel verzoeken verzonden. Je kan het over %1$d seconden opnieuw proberen… - Deze server draait op een oude versie. Vraag uw server beheerder om te upgraden. U kunt doorgaan, maar sommige functies werken mogelijk niet correct. + Deze server draait op een oude versie. Vraag je server beheerder om te upgraden. Je kan doorgaan, maar sommige functionaliteiten werken mogelijk niet correct. De ingevoerde code is niet correct. Gelieve dit te controleren. We hebben zojuist een e-mail gestuurd naar %1$s. \nKlik op de link die deze bevat om door te gaan met het aanmaken van een account. - Controleer uw e-mail + Controleer je e-mail Accepteer de voorwaarden om door te gaan Voer de captcha uitdaging uit Selecteer een aangepaste server Selecteer Element Matrix Services - Uw account is nog niet aangemaakt. Het registratieproces stoppen\? + Jouw account is nog niet aangemaakt. Het registratieproces stoppen\? Deze inlognaam is in gebruik Inlognaam of e-mailadres - Meld u aan bij %1$s + Meld je aan bij %1$s Telefoonnummer lijkt ongeldig. Controleer het alstublieft Internationale telefoonnummers moeten beginnen met \'+\' Gebruik het internationale formaat (telefoonnummer moet beginnen met \'+\') - We hebben zojuist een code naar %1$s gestuurd. Voer het hieronder in om te verifiëren dat u het bent. + We hebben zojuist een code naar %1$s gestuurd. Voer het hieronder in om te verifiëren dat jij het bent. Telefoonnummer bevestigen Telefoon nummer (optioneel) Gebruik het internationale formaat. - Stel een telefoonnummer in om optioneel toe te staan dat mensen die u kent u kunnen ontdekken. + Stel een telefoonnummer in om optioneel toe te staan dat mensen die je kent jou kunnen ontdekken. Telefoonnummer instellen Lijkt niet op een geldig e-mailadres - Stel een e-mail in om uw account te herstellen. Later kunt u optioneel toelaten dat mensen die u kent u via uw e-mail ontdekken. + Stel een e-mail in om je account te herstellen. Later kan je optioneel toestaan dat mensen die je kent jou via je e-mail ontdekken. E-mailadres instellen - Uw wachtwoord is nog niet gewijzigd. + Jouw wachtwoord is nog niet gewijzigd. \n \nHet proces voor het wijzigen van het wachtwoord stoppen\? Terug naar Inloggen - U bent bij alle sessies uitgelogd en ontvangt geen pushmeldingen meer. Log opnieuw in op elk apparaat om meldingen weer in te schakelen. + Je bent bij alle sessies uitgelogd en ontvangt geen pushmeldingen meer. Log opnieuw in op elk apparaat om meldingen weer in te schakelen. Je wachtwoord is gereset. Ik heb mijn e-mailadres geverifieerd - Tik op de link om uw nieuwe wachtwoord te bevestigen. Klik hieronder als u de link hebt gevolgd die erin staat. - Word eigenaar van uw gesprekken. - Ruimte aanmaken - Ruimte aanmaken… + Tik op de link om je nieuwe wachtwoord te bevestigen. Klik hieronder als je de link hebt gevolgd die erin staat. + Word eigenaar van jouw gesprekken. + Space aanmaken + Space aanmaken… Een ruimte aanmaken Gebeurtenis inhoud Houd er rekening mee dat bij het upgraden een nieuwe versie van de kamer wordt gemaakt. Alle huidige berichten blijven in deze gearchiveerde kamer. - Iedereen in een ouderkamer kan deze kamer vinden en er lid van worden. Het is niet nodig om iedereen handmatig uit te nodigen. U kunt dit op elk moment wijzigen in de kamer instellingen. + Iedereen in een ouderspace kan deze kamer vinden en er lid van worden. Het is niet nodig om iedereen handmatig uit te nodigen. Je kan dit op elk moment wijzigen in de kamer instellingen. Het upgraden van een kamer is een geavanceerde actie en wordt meestal aanbevolen wanneer een kamer onstabiel is vanwege bugs, ontbrekende functies of beveiligingsproblemen. \nDit heeft meestal alleen invloed op hoe de kamer op de server wordt verwerkt. Beheer kamers - U bent de enige beheerder van deze kamer. Als u het verlaat, betekent dit dat niemand er controle over heeft. + Je bent de enige beheerder van deze kamer. Als je het verlaat, betekent dit dat niemand er controle over heeft. Deze alias is momenteel niet toegankelijk. -\nProbeer het later opnieuw of vraag een kamerbeheerder om te controleren of u toegang heeft. +\nProbeer het later opnieuw of vraag een kamerbeheerder om te controleren of je toegang hebt. Word lid van mijn kamer %1$s %2$s - Als u lid wilt worden van een bestaande kamer, heeft u een uitnodiging nodig. + Als je lid wil worden van een bestaande kamer, heb je een uitnodiging nodig. Weet je zeker dat je alle niet verzonden berichten in deze kamer wilt verwijderen\? Automatisch rapport versleutelingsfouten. Poll maken @@ -2179,7 +2179,7 @@ Upload bestand Afbeeldingen en video\'s versturen Open camera - Weet u zeker dat u deze poll wilt verwijderen\? U kunt het niet meer herstellen nadat het is verwijderd. + Weet je zeker dat je deze poll wilt verwijderen\? Je kan het niet meer herstellen nadat het is verwijderd. Poll verwijderen Poll beëindigd Stem uitgebracht @@ -2216,65 +2216,65 @@ Vraag of onderwerp Poll vraag of onderwerp Poll maken - Start de toepassing opnieuw om de wijziging door te voeren. + Start de applicatie opnieuw om de wijziging door te voeren. LaTeX wiskunde inschakelen %s in Instellingen om uitnodigingen rechtstreeks in ${app_name} te ontvangen. - Koppel deze e-mail aan uw account - Deze uitnodiging voor deze space is verzonden naar %s die niet is gekoppeld aan uw account - Deze uitnodiging voor deze kamer is verzonden naar %s die niet is gekoppeld aan uw account + Koppel deze e-mail aan je account + Deze uitnodiging voor deze space is verzonden naar %s die niet is gekoppeld aan jouw account + Deze uitnodiging voor deze kamer is verzonden naar %s die niet is gekoppeld aan jouw account Stop met opnemen Schuif om te annuleren Spraakbericht opnemen Sorry, er is een fout opgetreden bij het proberen deel te nemen aan: %s Upgrade naar de aanbevolen kamerversie In deze kamer wordt versie %s gebruikt, die door deze server als onstabiel is gemarkeerd. - U heeft toestemming nodig om een kamer te upgraden + Je hebt toestemming nodig om een kamer te upgraden Bovenliggende space automatisch bijwerken Personen automatisch uitnodigen - U update de kamer van %1$s naar %2$s. + Je update de kamer van %1$s naar %2$s. Upgrade privékamer Upgrade openbare kamer Upgrade vereist Even geduld, het kan even duren. Deelnemen aan vervangende kamer Naamloze kamer - Sommige kamers zijn mogelijk verborgen omdat ze privé zijn en u een uitnodiging nodig heeft. - Sommige kamers zijn mogelijk verborgen omdat ze privé zijn en u een uitnodiging nodig heeft. -\nU heeft geen rechten om kamers toe te voegen. + Sommige kamers zijn mogelijk verborgen omdat ze privé zijn en je een uitnodiging nodig hebt. + Sommige kamers zijn mogelijk verborgen omdat ze privé zijn en je een uitnodiging nodig hebt. +\nJe hebt geen rechten om kamers toe te voegen. Deze space heeft geen kamers - Neem contact op met uw server beheerder voor meer informatie + Neem contact op met jouw serverbeheerder voor meer informatie Het lijkt erop dat je server nog geen Spaces ondersteunt Experimenteel voelen\? -\nU kunt bestaande spaces aan een space toevoegen. - Alle kamers waarin u deelneemt, worden weergegeven in Home. +\nJe kan bestaande spaces aan een space toevoegen. + Alle kamers waarin je deelneemt, worden weergegeven in Home. Alle kamers op startscherm weergeven Kamers en spaces beheren Markeren als aanbevolen Markeren als niet aanbevolen Op zoek naar iemand die niet in %s zit\? - %s nodigt u uit - Uw systeem verzendt automatisch logboeken wanneer er een fout optreedt die niet kan worden ontsleuteld - U bent uitgenodigd + %s nodigt je uit + Jouw systeem verzendt automatisch logboeken wanneer er een fout optreedt die niet kan worden ontsleuteld + Je bent uitgenodigd Spaces zijn een nieuwe manier om kamers en mensen te groeperen. - Voeg een space toe aan elke space die u beheert. + Voeg een space toe aan elke space die jij beheert. Bestaande spaces toevoegen Bestaande kamers toevoegen Bestaande kamers en space toevoegen - U kunt pas weer deelnemen als u opnieuw wordt uitgenodigd. - U bent de enige persoon hier. Als u weggaat, kan niemand meer meedoen, ook u niet. - Weet u zeker dat u %s wilt verlaten\? + Je kan pas weer deelnemen als je opnieuw wordt uitgenodigd. + Je bent de enige persoon hier. Als je weggaat, kan niemand meer meedoen, ook jij niet. + Weet je zeker dat je %s wil verlaten\? Verlaat Kamers toevoegen Kamers ontdekken - %d persoon die u kent is al lid geworden - %d mensen die u kent zijn al lid geworden + %d persoon die je kent is al lid geworden + %d mensen die je kent zijn al lid geworden Ontdek (%s) Installatie voltooien Nodig uit via e-mail, vind contacten en meer… Voltooi het instellen van detectie. - U gebruikt momenteel geen identiteitsserver. Om teamgenoten uit te nodigen en door hen vindbaar te zijn, configureert u er hieronder een. + Je gebruikt momenteel geen identiteitsserver. Om teamgenoten uit te nodigen en door hen vindbaar te zijn, configureet je er hieronder een. Doe toch mee Space deelnemen Voor nu overslaan @@ -2285,37 +2285,37 @@ Deel link Uitnodigen via inlognaam of e-mailadres uitnodiging via e-mail - Het is alleen u op dit moment. %s zal nog beter zijn met anderen. + Het is alleen jij op dit moment. %s zal nog beter zijn met anderen. Uitnodigen voor %s Mensen uitnodigen - Nodig mensen uit voor uw space - Laten we voor elk van hen een kamer maken. U kunt later ook meer toevoegen, inclusief reeds bestaande. - Aan welke dingen werkt u\? - Zorg ervoor dat de juiste mensen toegang hebben tot %s bedrijf. U kunt later meer uitnodigen. - Wie zijn uw teamgenoten\? - We zullen kamers voor hen maken. U kunt later ook meer toevoegen. - Wat zijn enkele discussies die u wilt voeren in %s\? + Nodig mensen uit voor jouw space + Laten we voor elk van hen een kamer maken. Je kan er later ook meer toevoegen, inclusief reeds bestaande. + Aan welke dingen werk jij\? + Zorg ervoor dat de juiste mensen toegang hebben tot %s bedrijf. Je kan er later meer uitnodigen. + Wie zijn jouw teamgenoten\? + We zullen kamers voor hen maken. Je kan later ook meer toevoegen. + Wat zijn enkele discussies die je wil voeren in %s\? Geef het een naam om door te gaan. - Voeg wat details toe om mensen te helpen het te identificeren. U kunt deze op elk moment wijzigen. - Voeg wat details toe om het te laten opvallen. U kunt deze op elk moment wijzigen. - Alleen op uitnodiging, het beste voor uzelf of teams + Voeg wat details toe om mensen te helpen het te identificeren. Je kan deze op elk moment wijzigen. + Voeg wat details toe om het te laten opvallen. Je kan deze op elk moment wijzigen. + Alleen op uitnodiging, het beste voor jezelf of teams Open voor iedereen, het beste voor gemeenschappen - Een privé-ruimte voor u en uw teamgenoten + Een privé-ruimte voor jou en jouw teamgenoten Ik en teamgenoten Een privé space om je kamers te organiseren Alleen ik Zorg ervoor dat de juiste mensen toegang hebben tot %s. - Met wie werkt u samen\? - U kunt dit later wijzigen - Wat voor soort ruimte wilt u aanmaken\? - Uw privé-ruimte - Uw openbare ruimte + Met wie werk je samen\? + Je kan dit later wijzigen + Wat voor soort ruimte wil je aanmaken\? + Jouw privé-ruimte + Jouw openbare ruimte Space toevoegen Privé space Openbare space Niet verzonden berichten verwijderen Berichten kunnen niet worden verzonden - Wilt u het versturen van een bericht annuleren\? + Wil je het versturen van een bericht annuleren\? Alle mislukte berichten verwijderen Upgrade een kamer naar een nieuwe versie Verlaat kamer met gegeven id (of huidige kamer indien leeg) @@ -2325,11 +2325,11 @@ Kleur weergavenaam overschrijven Ik heb al een account Veilig berichtenverkeer. - U heeft de controle. + Jij hebt de controle. Deel locatie Open met - ${app_name} kan geen toegang krijgen tot uw locatie. Probeer het later opnieuw. - ${app_name} heeft geen toegang tot uw locatie + ${app_name} kan geen toegang krijgen tot jouw locatie. Probeer het later opnieuw. + ${app_name} heeft geen toegang tot jouw locatie Locatie Deel locatie Resultaten worden pas onthuld als je de poll beëindigt @@ -2345,36 +2345,36 @@ Versleuteling is verkeerd geconfigureerd. Hun locatie gedeeld Account aanmaken - Berichten voor uw team. - End-to-end versleuteld en geen telefoonnummer vereist. Geen advertenties of dataverzameling. - Kies waar je gesprekken worden bewaard, zodat u controle en onafhankelijkheid heeft. Verbonden via Matrix. - Veilige en onafhankelijke communicatie die u dezelfde mate van privacy geeft als een persoonlijk gesprek in uw eigen huis. + Berichten voor jouw team. + Eind-tot-eind versleuteld en geen telefoonnummer vereist. Geen advertenties of dataverzameling. + Kies waar je gesprekken worden bewaard, zodat je controle en onafhankelijkheid hebt. Verbonden via Matrix. + Veilige en onafhankelijke communicatie die je dezelfde mate van privacy geeft als een persoonlijk gesprek in je eigen huis. Locatie - De versleuteling is verkeerd geconfigureerd, zodat u geen berichten kunt versturen. Klik om instellingen te openen. - De versleuteling is verkeerd geconfigureerd, zodat u geen berichten kunt versturen. Neem contact op met een beheerder om de versleuteling in een geldige staat te herstellen. + De versleuteling is verkeerd geconfigureerd, zodat je geen berichten kunt versturen. Klik om instellingen te openen. + De versleuteling is verkeerd geconfigureerd, zodat je geen berichten kunt versturen. Neem contact op met een beheerder om de versleuteling in een geldige staat te herstellen. Berichtbubbels weergeven Kan kaart niet laden Kaart Let op: app wordt opnieuw gestart Discussieberichten inschakelen Verbinding maken met server - Wilt u lid worden van een bestaande server\? + Wil je lid worden van een bestaande server\? Sla deze vraag over Nog niet zeker\? %s Gemeenschappen Teams Vrienden en familie - We helpen u om verbinding te maken - Met wie gaat u het meest chatten\? - U bekijkt deze discussie al! + We helpen je om verbinding te maken + Met wie ga je het meest chatten\? + Je bekijkt deze thread al! Bekijk in kamer - Reageren in discussie + Reageren in thread Het commando \"%s\" wordt herkend maar niet ondersteund in discussies. - Van een discussie + Van een thread Tip: Tik lang op een bericht en gebruik \"%s\". Discussies helpen je gesprekken on-topic te houden en gemakkelijk bij te houden. - Houd discussies georganiseerd met discussielijnen - Toont alle discussies waaraan u heeft deelgenomen + Houd discussies georganiseerd met threads + Toont alle discussies waaraan je hebt deelgenomen Mijn discussies Toont alle discussies van de huidige kamer Alle discussies @@ -2384,7 +2384,7 @@ Discussies in de kamer filteren Kopieer link naar discussie Bekijk in kamer - Discussies bekijken + Thead bekijken Personen De server accepteert geen inlognaam met alleen cijfers. Kamer notificatie @@ -2408,24 +2408,24 @@ Pin van geselecteerde locatie op kaart Sla deze stap over Opslaan en doorgaan - U kunt op elk moment bij de instellingen uw profiel bijwerken + Je kan op elk moment bij de instellingen jouw profiel bijwerken Ziet er goed uit! Laten we beginnen - Tijd om een gezicht bij uw naam te voegen + Tijd om een gezicht bij je naam te voegen Voeg een profielfoto toe - U kunt dit later wijzigen + Je kunt dit later wijzigen Weergavenaam Kies een weergavenaam - Uw account %s is aangemaakt + Jouw account %s is aangemaakt Gefeliciteerd! Breng me naar het begin Personaliseer profiel - We komen dichter bij het uitbrengen van een openbare bèta voor Discussies. + We komen dichter bij het uitbrengen van een openbare bèta voor Threads. \n \nTerwijl we ons erop voorbereiden, moeten we enkele wijzigingen aanbrengen: discussies die vóór dit punt zijn gemaakt, worden weergegeven als gewone antwoorden. \n -\nDit zal een eenmalige overgang zijn, aangezien Discussies nu deel uitmaken van de Matrix-specificatie. - Discussies die bèta naderen 🎉 +\nDit zal een eenmalige overgang zijn, aangezien Threads nu deel uitmaken van de Matrix-specificatie. + Threads benaderen bèta 🎉 %1$s, %2$s en anderen %1$s en %2$s Uitzetten @@ -2437,7 +2437,7 @@ 8 uur 1 uur 15 minuten - Deel uw live locatie voor + Deel jouw live locatie voor (%1$s) %1$s (%2$s) %1$s kan niet worden afgeluisterd @@ -2448,17 +2448,17 @@ Hun live locatie gedeeld ${app_name} is ook geweldig voor op de werkplek. Het wordt vertrouwd door \'s werelds veiligste organisaties. BÈTA - Discussies zijn werk in uitvoering met nieuwe, opwindende aankomende functies, zoals verbeterde meldingen. We horen graag uw feedback! + Threads zijn werk in uitvoering met nieuwe, opwindende aankomende functies, zoals verbeterde meldingen. We horen graag jouw feedback! Discussies Beta-feedback Geef feedback BÈTA - Indien ingeschakeld, verschijnt u altijd offline voor andere personen, zelfs wanneer u de applicatie gebruikt. + Indien ingeschakeld, verschijn je altijd offline voor andere personen, zelfs wanneer je de applicatie gebruikt. Offline modus Aanwezigheid - Uw server ondersteunt momenteel geen discussies, dus deze functie kan onbetrouwbaar zijn. Sommige berichten in een discussie zijn mogelijk niet betrouwbaar beschikbaar. %sWilt u toch discussies inschakelen\? - Discussies bèta - Discussies helpen uw gesprekken on-topic te houden en gemakkelijk bij te houden. %s Als u discussies inschakelt, wordt de app vernieuwd. Bij sommige accounts kan dit langer duren. - Discussies bèta + Jouw server ondersteunt momenteel geen threads, dus deze functionaliteit kan onbetrouwbaar zijn. Sommige berichten in een thread zijn mogelijk niet betrouwbaar beschikbaar. %sWil je threads toch inschakelen\? + Threads bèta + Threads helpen je gesprekken on-topic te houden en gemakkelijk bij te houden. %s Als je threads inschakelt, wordt de app vernieuwd. Bij sommige accounts kan dit langer duren. + Threads bèta Leer meer Probeer het uit Scherm delen is bezig @@ -2482,7 +2482,7 @@ Live tot %1$s Bekijk live locatie Live locatie beëindigd - Sommige resultaten zijn mogelijk verborgen omdat ze privé zijn en u hiervoor een uitnodiging nodig heeft. + Sommige resultaten zijn mogelijk verborgen omdat ze privé zijn en je hiervoor een uitnodiging nodig hebt. Geen resultaten gevonden Verlaat geen Verlaat alles @@ -2493,7 +2493,7 @@ min u Locatie delen inschakelen - Let op: dit is een labfunctie met een tijdelijke implementatie. Dit betekent dat u uw locatiegeschiedenis niet kunt verwijderen en dat geavanceerde gebruikers uw locatiegeschiedenis kunnen zien, zelfs nadat u stopt met het delen van uw live locatie met deze ruimte. + Let op: dit is een labfunctie met een tijdelijke implementatie. Dit betekent dat je jouw locatiegeschiedenis niet kunt verwijderen en dat geavanceerde gebruikers jouw locatiegeschiedenis kunnen zien, zelfs nadat je stopt met het delen van je live locatie met deze ruimte. Live locatie delen Huidige gateway: %s Gateway @@ -2512,9 +2512,9 @@ Meldingsmethode Achtergrondsynchronisatie Google Services - Kies hoe u meldingen wilt ontvangen + Kies hoe je meldingen wil ontvangen Kan biometrische authenticatie niet inschakelen. - Biometrische authenticatie is uitgeschakeld omdat er onlangs een nieuwe biometrische authenticatiemethode is toegevoegd. U kunt het weer inschakelen in Instellingen. + Biometrische authenticatie is uitgeschakeld omdat er onlangs een nieuwe biometrische authenticatiemethode is toegevoegd. Je kan het weer inschakelen in Instellingen. Meldingsmethode resetten Profieltag: Kan eindpunt token niet registreren op server: @@ -2525,7 +2525,7 @@ Resultaten zijn zichtbaar wanneer de poll is afgelopen Bij het uitnodigen in een versleutelde ruimte die geschiedenis deelt, is de versleutelde geschiedenis zichtbaar. MSC3061: Kamersleutels delen voor eerdere berichten - Stuur uw eerste bericht om %s uit te nodigen om te chatten + Stuur je eerste bericht om %s uit te nodigen om te chatten Berichten in deze chat worden eind-tot-eind versleuteld. Ga @@ -2533,49 +2533,49 @@ %d berichten verwijderd Deel locatie - U moet de juiste rechten hebben om de live locatie in deze kamer te delen. - U heeft geen toestemming om de live locatie te delen + Je moet de juiste rechten hebben om de live locatie in deze kamer te delen. + Je hebt geen toestemming om de live locatie te delen Kan deze link niet openen: communities zijn vervangen door spaces Gebruikersnaam / E-mailadres / Telefoonnummer - Bent u een mens\? + Ben je een mens\? Volg de instructies die naar %s zijn verstuurd Wachtwoord reset Wachtwoord vergeten - Email opnieuw verzenden + E-mail opnieuw verzenden Geen e-mail ontvangen\? Volg de instructies die naar %s zijn gestuurd - Verifieer uw e-mailadres + Verifieer je e-mailadres Code nogmaals versturen Er is een code verzonden naar %s - Bevestig uw telefoonnummer + Bevestig je telefoonnummer Alle apparaten uitloggen Reset wachtwoord Zorg ervoor dat het 8 tekens of meer zijn. Kies een nieuw wachtwoord Nieuw wachtwoord - Controleer uw e-mail. - %s stuurt u een verificatielink + Controleer je e-mail. + %s stuurt je een verificatielink Bevestigingscode Telefoonnummer - %s moet uw account verifiëren - Vul uw telefoonnummer in + %s moet je account verifiëren + Vul je telefoonnummer in E-mail - %s moet uw account verifiëren - Vul uw e-mailadres in + %s moet jouw account verifiëren + Vul jouw e-mailadres in Lees de voorwaarden en het beleid van %s door Serverbeleiden Neem contact op Element Matrix Services (EMS) is een robuuste en betrouwbare hostingservice voor snelle, veilige en realtime communicatie. Ontdek hoe op element.io/ems - Wilt u uw eigen server hosten\? + Wil je jouw eigen server hosten\? Server URL - Wat is het adres van uw server\? Dit is als uw huis voor al uw data - Selecteer uw server + Wat is het adres van jouw server\? Dit is als een huis voor al jouw data + Selecteer je server Welkom terug! Bewerk Of - Waar uw gesprekken zijn opgeslagen + Waar jouw gesprekken worden opgeslagen Moet 8 tekens of meer zijn - Anderen kunnen u ontdekken %s + Anderen kunnen je ontdekken %s Maak een account aan Systeemstandaard gebruiken Handmatig kiezen @@ -2585,11 +2585,11 @@ Snelkoppelingen voor Element Oproep machtigingen inschakelen Live locatie Deze QR-code lijkt misvormd. Probeer te verifiëren met een andere methode. - U hebt geen toegang tot de gecodeerde berichtgeschiedenis. Reset uw Veilige Berichten Back-up en verificatiesleutels om opnieuw te beginnen. + Je hebt geen toegang tot de gecodeerde berichtgeschiedenis. Reset je Veilige Berichten Back-up en verificatiesleutels om opnieuw te beginnen. Kan dit apparaat niet verifiëren - Wat is het adres van uw server\? - Waar uw conversaties leven - Uw gegevens bijwerken… + Wat is het adres van jouw server\? + Waar jouw gesprekken zijn opgeslagen + Jouw gegevens bijwerken… %1$s en %2$d andere %1$s en %2$d andere @@ -2599,7 +2599,7 @@ Kan kaart niet laden \nDeze server is mogelijk niet geconfigureerd om kaarten weer te geven. Open instellingen - Voor de beste beveiliging verifieert u uw sessies en meldt u zich af bij elke sessie die u niet meer herkent of gebruikt. + Voor de beste beveiliging verifieer je jouw sessies en meld je jezelf af bij elke sessie die je niet meer herkent of gebruikt. Andere sessies Sessies Lijst met publieke spaces @@ -2618,18 +2618,18 @@ Kamer creëren Gesprek starten Alle gesprekken - U kunt feedback geven via het menu rechtsboven. - Krijg sneller en gemakkelijker toegang tot uw ruimten (rechtsonder). - Om ${app_name} te versimpelen zijn tabbladen nu optioneel. U kunt ze beheren in het menu rechtsboven. - Hier zullen uw ongelezen berichten verschijnen wanneer u deze heeft. + Je kan feedback geven via het menu rechtsboven. + Krijg sneller en gemakkelijker toegang tot jouw spaces (rechtsonder). + Om ${app_name} te versimpelen zijn tabbladen nu optioneel. Je kan ze beheren in het menu rechtsboven. + Hier zullen jouw ongelezen berichten verschijnen wanneer je deze hebt. De allesomvattende beveiligde chat-app voor teams, vrienden en organisaties. Maak een gesprek aan of word deelnemer van een bestaande kamer om te beginnen. - Ruimten zijn een nieuwe manier om kamers en personen te groeperen. Voeg een bestaande kamer toe, of maak een nieuwe aan via de knop rechtsonder. + Spaces zijn een nieuwe manier om kamers en personen te groeperen. Voeg een bestaande kamer toe, of maak een nieuwe aan via de knop rechtsonder. - Overweeg uit te loggen van oude sessies (%1$d of meer dagen) welke u niet meer gebruikt. - Overweeg uit te loggen van oude sessies (%1$d of meer dagen) welke u niet meer gebruikt. + Overweeg uit te loggen van oude sessies (%1$d of meer dagen) welke je niet meer gebruikt. + Overweeg uit te loggen van oude sessies (%1$d of meer dagen) welke je niet meer gebruikt. Verifieer of log uit van ongeverifieerde sessies. - Verbeter uw accountbeveiliging door deze aanbevelingen te volgen. + Verbeter je accountbeveiliging door deze aanbevelingen te volgen. Al %1$d+ dag inactief (%2$s) Al %1$d+ dagen inactief (%2$s) @@ -2653,8 +2653,8 @@ Sessie verifiëren Sorry, deze kamer kon niet worden gevonden. \nProbeer het later opnieuw. %s - Dit is waar uw nieuwe verzoeken en uitnodigingen zullen verschijnen. - Ruimten zijn een nieuwe manier om kamers en personen te groeperen. Maak een ruimte aan om te beginnen. + Dit is waar jouw nieuwe verzoeken en uitnodigingen zullen verschijnen. + Spaces zijn een nieuwe manier om kamers en personen te groeperen. Maak een space aan om te beginnen. Ongeverifieerde sessie Geverifieerde sessie Onbekend apparaattype @@ -2663,8 +2663,177 @@ Mobiel Niets nieuws. Uitnodigingen - Nog geen ruimten. + Nog geen spaces. %s subitems inklappen %s subitems uitvouwen - Ruimte aanpassen - + Space veranderen + Voeg (╯°□°)╯︵ ┻━┻ toe voor elk platte tekst bericht + Spraakuitzending + ${app_name} heeft toestemming nodig om notificaties te laten zien. +\nGeef alsjeblieft toestemming. + Probeer de rich-text-editor (platte tekst-modus binnenkort beschikbaar) + Rich-text-editor inschakelen + Uitgestelde privéberichten inschakelen + Een vereenvoudigde Element met optionele tabs + Nieuwe layout inschakelen + Bevestigen + Opnieuw proberen + Je wordt ingelogd + Verbinden met apparaat + Scan QR-code + Inloggen op een mobiel apparaat\? + Toon QR-code op dit apparaat + Begin op het inlogscherm + Begin op het inlogscherm + Ga naar Instellingen -> Veiligheid & privacy + Open de app op je andere apparaat + Het inloggen is afgebroken op het andere apparaat. + Die QR-code is ongeldig. + Het andere apparaat moet ingelogd zijn. + Het andere apparaat is al ingelogd. + De aanvraag is mislukt. + De aanvraag is op het andere apparaat geweigerd. + De verbinding kon niet in de benodigde tijd tot stand worden gebracht. + Verbinden met dit apparaat wordt niet ondersteund. + Verbinding mislukt + Beveiligde verbinding tot stand gebracht + Scan de onderstaande QR-code met je uitgelogde apparaat. + Inloggen met QR-code + Gebruik de camera op dit apparaat om de op het andere apparaat getoonde QR-code te scannen: + Scan QR-code + Geverifieerde sessies + Niet-geverifieerde sessies + Inactieve sessies zijn sessies die je al een tijd niet gebruikt hebt, maar deze blijven encryptiesleutels ontvangen. +\n +\nVerwijder inactieve sessies om de veiligheid en prestaties te verbeteren. Het helpt je ook met het herkennen van mogelijk verdachte nieuwe sessies. + Inactieve sessies + Je kan dit apparaat gebruiken om in te loggen op een ander apparaat met een QR-code. Er zijn twee manier om dit te doen: + Log in met QR-code + Wees bewust dat sessienamen ook zichtbaar zijn voor personen met wie je communiceert. + Sessienaam + IP-adres + Besturingssysteem + Versie + Naam + Applicatie + Sessienaam + Ontvang pushnotificaties op deze sessie. + Pushnotificaties + Sessiedetails + Uitloggen voor deze sessie + Filter wissen + Geen inactieve sessies gevonden. + Geen niet-geverifieerde sessies gevonden. + Geen geverifieerde sessies gevonden. + Inactief + Niet geverifieerd + Geverifieerd + + %1$d dag of langer inactief + %1$d dagen of langer inactief + + Inactief + Niet klaar voor veilige communicatie + Niet geverifieerd + Klaar voor veilige communicatie + Geverifieerd + Alle sessies + Apparaat + Sessie + Huidige Sessie + Niet geverifeerd · Jouw huidige sessie + Verifieer je huidige sessie voor verbeterde veilige communicatie. + Deze sessie is klaar voor veilige communicatie. + Je huidige sessie is klaar voor veilige communicatie. + Onbekende verificatiestatus + Bufferen + Live + De authenticiteit van dit versleutelde bericht kan niet worden gegarandeerd op dit apparaat. + Incognito toetsenbord + Scan QR-code + Ingeschakeld: + Sessie ID: + Er is iets fout gegaan. Controleer je netwerkverbinding en probeer het opnieuw. + ⚠ Er zijn niet-geverifieerde apparaten in deze kamer. Deze zullen niet in staat zijn de door jouw verzonden berichten te ontsleutelen. + Stuur nooit versleutelde berichten naar niet-geverifieerde sessie in deze kamer. + Toestemming geven + ${app_name} heeft toestemming nodig om notificaties te laten zien. Notificaties kunnen je berichten, uitnodigen, etc. tonen. +\n +\nGeeft toestemming bij de volgende pop-ups om notificaties te kunnen zien. + Begrepen + Onderstreep formaat toepassen + Doorhaal formaat toepassen + Cursief formaat toepassen + Vet formaat toepassen + Zorg ervoor dat je de herkomst van deze code kent. Door apparaten te koppelen, geef je iemand volledige toegang tot jouw account. + Geen match\? + Selecteer \'QR-code scannen\' + Selecteer \'Aanmelden met QR-code\' + Selecteer \'Toon QR-code\' + De server ondersteunt geen inloggen met QR-code. + Er is een beveiligingsprobleem opgetreden bij het instellen van beveiligde berichtenuitwisseling. Een van de volgende zaken kan in geschonden zijn: je server; je internetverbinding(en); je apparaat(en); + Controleer je aangemelde apparaat, de onderstaande code zou moeten worden weergegeven. Bevestig dat de onderstaande code overeenkomt met dat apparaat: + Gebruik je aangemelde apparaat om de onderstaande QR-code te scannen: + 3 + 2 + 1 + In staat zijn om spraakuitzendingen op te nemen en te verzenden in de tijdlijn van de kamer. + Spraakuitzending inschakelen (in actieve ontwikkeling) + Noteer de naam, versie en url van de applicatie om sessies gemakkelijker te herkennen in sessiebeheer. + Opname van applicatie informatie inschakelen + Meer zichtbaarheid en controle over al je sessies. + Nieuwe sessiemanager inschakelen + Andere gebruikers in privéchats en chatruimten waaraan jij deelneemt, kunnen een volledige lijst van je sessies bekijken. +\n +\nDit geeft ze het vertrouwen dat ze echt met jou praten, maar het betekent ook dat ze de sessienaam kunnen zien die je hier invoert. + Sessies hernoemen + Geverifieerde sessies zijn ingelogd met jouw inloggegevens en vervolgens geverifieerd, hetzij met je veilige wachtwoordzin of door kruisverificatie. +\n +\nDit betekent dat ze coderingssleutels bevatten voor je eerdere berichten en bevestigen aan andere gebruikers waarmee je communiceert dat deze sessies echt van jou zijn. + Niet-geverifieerde sessies zijn sessies die zijn aangemeld met jouw inloggegevens, maar niet zijn geverifieerd. +\n +\nJe moet er vooral zeker van zijn dat je deze sessies herkent, omdat ze een ongeoorloofd gebruik van je account kunnen vertegenwoordigen. + Met aangepaste sessienamen kan je jouw apparaten gemakkelijker herkennen. + Sessie hernoemen + Model + Browser + URL + Laatste activiteit + Informatie over toepassing, apparaat en activiteit. + Sessies selecteren + + Overweeg om je af te melden bij oude sessies (%1$d dag of meer) die je niet meer gebruikt. + Overweeg om je af te melden bij oude sessies (%1$d dagen of meer) die je niet meer gebruikt. + + Verifieer je sessies voor verbeterde beveiligde berichtenuitwisseling of meld je af bij sessies die je niet meer herkent of gebruikt. + Voor de beste beveiliging log je uit bij elke sessie die je niet meer herkent of gebruikt. + Filter + Filter + Laatste activiteit %1$s + Verifieer je huidige sessie om de verificatiestatus van deze sessie weer te geven. + Verifieer of meld je af bij deze sessie voor de beste beveiliging en betrouwbaarheid. + Contact + Camera + Locatie + Peilingen + Spraakuitzending + Bijlagen + Stikkers + Fotobibliotheek + Een spraakuitzending starten + Spraakuitzending pauzeren + Spraakuitzending afspelen of hervatten + Opname van spraakuitzending stoppen + Opname van spraakuitzending pauzeren + Opname van spraakuitzending hervatten + Verzoek dat het toetsenbord geen gepersonaliseerde gegevens, zoals typgeschiedenis en woordenboek, bijwerkt op basis van wat je in gesprekken hebt getypt. Opgelet dat sommige toetsenborden deze instelling mogelijk niet respecteren. + Open het scherm met ontwikkelaarstools + 🔒 Je hebt de codering voor geverifieerde sessies enkel voor alle kamers ingeschakeld in Beveiligingsinstellingen. + Maak directe chat alleen aan bij een bericht + Deselecteer alles + Selecteer alles + + %1$d geselecteerd + %1$d geselecteerd + + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index 97141a9765..2ec5f394bd 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -2785,9 +2785,9 @@ Comece na tela de signin Selecione \'Fazer signin com QR code\' Comece na tela de signin - Selecione \'Mostrar QR code neste dispositivo\' - Vá para Configurações -> Segurança & Privacidade -> Mostrar Todas as Sessões - Obra ${app_name} em seu outro dispositivo + Selecione \'Mostrar QR code\' + Vá para Configurações -> Segurança & Privacidade + Abra o app em seu outro dispositivo A requisição foi negada no outro dispositivo. A linkagem não foi completada no tempo requerido. Linkagem com este dispositivo não é suportado. @@ -2805,4 +2805,35 @@ 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: Fazer signin com QR Code Scannar QR code + O servidorcasa não suporta sign in com QR code. + O sign in foi cancelado no outro dispositivo. + O QR code é inválido. + O outro dispositivo deve estar feito signin. + O outro dispositivo já está feito signin. + 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); + A requisição falhou. + Seja capaz de gravar e enviar broadcast de voz em timeline de sala. + Broadcast de voz (sob desenvolvimento ativo) + Buffering + Pausar broadcast de voz + Tocar ou retomar broadcast de voz + Parar gravação de broadcast de voz + Pausar gravação de broadcast de voz + Retomar gravação de broadcast de voz + Ao vivo + Selecionar sessões + Contato + Câmera + Localização + Sondagens + Broadcast de voz + Anexos + Stickers + Biblioteca de fotos + Desselecionar todas(os) + Selecionar todas(os) + + %1$d selecionada(o) + %1$d selecionadas(os) + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml index 0349acedd1..fb819efb69 100644 --- a/library/ui-strings/src/main/res/values-ru/strings.xml +++ b/library/ui-strings/src/main/res/values-ru/strings.xml @@ -367,8 +367,8 @@ Добавить телефон Системные настройки приложения. Сведения о приложении - Включить уведомления для этой учетной записи - Включить уведомления для этой сессии + Уведомления для этой учётной записи + Уведомления для этой сессии В персональных чатах В групповых чатах Когда меня приглашают в комнату @@ -434,14 +434,14 @@ Публичное название ID сессии Ключ сессии - Экспорт E2E ключей комнаты - Экспорт ключей комнаты + Экспорт E2E ключей + Экспорт ключей Экспорт ключей в локальный файл Экспорт Введите мнемоническую фразу Подтвердите мнемоническую фразу - Импорт E2E ключей комнаты - Импорт ключей комнаты + Импорт E2E ключей + Импорт ключей Импортировать ключи из локального файла Импорт Шифровать только для проверенных сессий @@ -618,7 +618,7 @@ Системные оповещения Ошибка Создать мнемоническую фразу - Парольные фразы не совпадают + Мнемонические фразы не совпадают свяжитесь с вашим администратором Превышен один из ресурсных лимитов сервера, по этому некоторые пользователи не смогут авторизоваться. Превышен один из ресурсных лимитов сервера. @@ -663,7 +663,7 @@ Включить Настройки сессии. Уведомления включены для этой сессии. - Уведомления не включено для этой сессии. + Уведомления не включены для этой сессии. \nПожалуйста, проверьте настройки ${app_name}. Включить Проверка сервисов Play @@ -725,14 +725,14 @@ Управление криптографическими ключами Управление резервным копированием ключей Беззвучный - Пожалуйста, введите мнемоническую фразу - Парольная фраза слишком простая + Введите мнемоническую фразу + Мнемоническая фраза слишком проста Пожалуйста, удалите мнемоническую фразу, если хотите, чтобы ${app_name} сгенерировал бумажный ключ. Никогда не теряйте зашифрованных сообщений Сообщения в зашифрованных комнатах защищены сквозным шифрованием. Ключи для прочтения этих сообщений есть только у вас и получателя(ей). \n \nНадёжно сохраните резервную копию ключей, чтобы не потерять их. - Установите парольную фразу + Задайте мнемоническую фразу Сохранить бумажный ключ Готово Сохранить как файл @@ -744,7 +744,7 @@ Удалить резервную копию ключей шифрования с сервера\? Вы больше не сможете использовать бумажный ключ для чтения истории зашифрованных сообщений. Удалить резервную копию Удаление резервной копии… - Чтобы использовать резервную копию ключа в этой сессии, восстановите его с помощью своей парольной фразы или ключа восстановления. + Чтобы использовать резервное копирование ключей в этой сессии, восстановите их с помощью мнемонической фразы или бумажного ключа. Резервная копия имеет недействительную подпись из подтвержденной сессии %s Резервная копия имеет действительную подпись из неподтвержденной сессии %s Резервная копия имеет действительную подпись из подтверждённой сессии %s. @@ -782,7 +782,7 @@ Невозможно расшифровать резервную копию с помощью этого бумажного ключа: пожалуйста, убедитесь, что вы ввели правильный бумажный ключ. Невозможно расшифровать резервную копию с помощью этой мнемонической фразы: пожалуйста, убедитесь, что вы ввели правильную мнемоническую фразу. - Генерация бумажного ключа с использованием мнемонической фразы может занять несколько секунд. + Создание бумажного ключа с использованием мнемонической фразы может занять несколько секунд. [%1$s] \nЭта ошибка вне контроля ${app_name}. На телефоне нет учетной записи Google. Пожалуйста, добавьте аккаунт Google. [%1$s] @@ -830,8 +830,8 @@ Зашифрованная копия ключей будет храниться на вашем сервере. Для безопасности защитите её мнемонической фразой. \n \nДля максимальной безопасности мнемоническая фраза должна отличаться от пароля вашей учётной записи. - Ключ восстановления — это страховка, вы можете использовать его для восстановления доступа к вашим зашифрованным сообщениям, если забудете вашу парольную фразу. -\nХраните ключ восстановления в надёжном месте, например, в диспетчере паролей (или в сейфе) + Бумажный ключ — это подстраховка: вы можете использовать его для восстановления доступа к своим зашифрованным сообщениям, если забудете свою мнемоническую фразу. +\nХраните свой бумажный ключ в очень надёжном месте, например, в менеджере паролей (или в сейфе) Импортирование ключей… Скачивание ключей… Вычисление бумажного ключа… @@ -1520,16 +1520,16 @@ \n \nМы рекомендуем вам немедленно изменить свой пароль и ключ восстановления в настройках. Подтверждение отменено - Генерация ключа безопасности из парольной фразы - Генерация ключа SSSS из парольной фразы - Генерация ключа SSSS из парольной фразы (%s) + Создание бумажного ключа из мнемонической фразы + Создание ключа SSSS из мнемонической фразы + Создание ключа SSSS из мнемонической фразы (%s) Чтобы продолжить работу, введите парольную фразу для резервного копирования ключа. Если вы не знаете вашу парольную фразу для резервного копирования ключей, вы можете %s. Задать роль - Введите секретную фразу, известную только вам, для защиты данных на вашем сервере. + Введите мнемоническую фразу, известную только вам, которая используется для защиты данных на вашем сервере. Настройка восстановления. Готово! - Храните его в безопасности + Храните его в надёжном месте Завершить Публикация созданных ключей идентификации Определение ключа SSSS по умолчанию @@ -1572,8 +1572,8 @@ или другой клиент Matrix поддерживающий перекрестную подпись Принудительно отбрасывает текущую групповую сессию для отправки сообщений в зашифрованную комнату Чтобы продолжить, используйте %1$s или %2$s. - Используйте ключ восстановления - Выберите ключ восстановления или введите его вручную, введя или вставив из буфера обмена + Используйте бумажный ключ + Выберите бумажный ключ или введите его вручную, введя или вставив из буфера обмена Не удалось получить доступ к защищенному хранилищу данных Не зашифровано Зашифровано неподтверждённой сессией @@ -1625,13 +1625,13 @@ Используйте ключ безопасности Создайте ключ безопасности для хранения в надежном месте, например в менеджере паролей или сейфе. Использовать мнемоническую фразу - Введите секретную фразу, известную только вам, и создайте ключ для резервного копирования. + Введите мнемоническую фразу, известную только вам, и создайте ключ для резервного копирования. Сохраните свой ключ безопасности Храните бумажный ключ в надёжном месте, например, в менеджере паролей или в сейфе. - Задайте секретную фразу - Введите секретную фразу, известную только вам, для защиты данных на вашем сервере. + Задайте мнемоническую фразу + Введите мнемоническую фразу, известную только вам, которая используется для защиты данных на вашем сервере. Мнемоническая фраза - Для подтверждения введите вашу секретную фразу ещё раз. + Введите мнемоническую фразу ещё раз, чтобы подтвердить её. Название комнаты Тема Вы успешно изменили настройки комнаты @@ -1679,7 +1679,8 @@ %1$d/%2$d ключ успешно импортирован. %1$d/%2$d ключа успешно импортированы. - %1$d/%2$d ключей успешно импортировано. + %1$d/%2$d ключей успешно импортированы. + %1$d/%2$d ключей успешно импортированы. Управление интеграциями Нет активных виджетов @@ -2765,7 +2766,7 @@ Другие пользователи в личных сообщениях и комнатах, к которым вы присоединились, могут просматривать весь список ваших сессий. \n \nЭто даёт им уверенность в том, что они действительно общаются с вами, но это также означает, что они могут видеть название сессии, которое вы ввели здесь. - Визуальный редактор текста + Наглядный текстовый редактор ID сессии: Уведомления Получать push-уведомления в этой сессии. @@ -2792,4 +2793,16 @@ Рассмотрите возможность выхода из старых сессий (%1$d дней или дольше), которые вы более не используете. Рассмотрите возможность выхода из старых сессий (%1$d дней или дольше), которые вы более не используете. + Голосовая трансляция + Голосовые трансляции (в активной разработке) + Записывает название клиента, версию и URL-адрес для более лёгкого распознавания сессий в менеджере сессий. + Записывать информацию о клиенте + Галерея + Наклейки + Вложения + Голосовая трансляция + Опрос + Местоположение + Камера + Контакт \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml index 43a8301d58..bf57233b37 100644 --- a/library/ui-strings/src/main/res/values-sk/strings.xml +++ b/library/ui-strings/src/main/res/values-sk/strings.xml @@ -2692,7 +2692,7 @@ Tu sa zobrazia neprečítané správy, ak nejaké máte. Nič, o čom by bolo potrebné podať správu. 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. - Vitajte v aplikácii ${názov_aplikácie}, + Vitajte v aplikácii ${app_name}, \n%s. Priestory sú novým spôsobom zoskupovania miestností a ľudí. Pomocou tlačidla vpravo dole môžete pridať existujúcu miestnosť alebo vytvoriť novú. %s @@ -2839,9 +2839,9 @@ Začnite na prihlasovacej obrazovke Vyberte možnosť \"Prihlásiť sa pomocou QR kódu\" Začnite na prihlasovacej obrazovke - Vyberte možnosť \"Zobraziť QR kód na tomto zariadení\" - Prejdite do Nastavenia -> Zabezpečenie a súkromie -> Zobraziť všetky relácie - Otvorte ${app_name} na vašom druhom zariadení + Vyberte možnosť \"Zobraziť QR kód\" + Prejdite do Nastavenia -> Zabezpečenie a súkromie + Otvorte aplikáciu na vašom druhom zariadení Žiadosť bola na druhom zariadení zamietnutá. Prepojenie nebolo dokončené v požadovanom čase. Prepojenie s týmto zariadením nie je podporované. @@ -2859,4 +2859,36 @@ 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: Prihlásiť sa pomocou QR kódu Skenovať QR kód + Domovský server nepodporuje prihlásenie pomocou QR kódu. + Prihlasovanie bolo zrušené na druhom zariadení. + QR kód nie je platný. + Druhé zariadenie musí byť prihlásené. + Druhé zariadenie je už prihlásené. + 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); + Žiadosť zlyhala. + Možnosť nahrávania a odosielania hlasového vysielania v časovej osi miestnosti. + Zapnúť hlasové vysielanie (v štádiu aktívneho vývoja) + Načítavanie do vyrovnávacej pamäte + Pozastaviť hlasové vysielanie + Prehrať alebo pokračovať v nahrávaní hlasového vysielania + Zastaviť nahrávanie hlasového vysielania + Pozastaviť nahrávanie hlasového vysielania + Pokračovať v nahrávaní hlasového vysielania + Naživo + Vyberte relácie + Kontakt + Kamera + Poloha + Ankety + Hlasové vysielanie + Prílohy + Nálepky + Knižnica fotografií + Zrušiť výber všetkých + Vybrať všetko + + %1$d vybraté + %1$d vybraté + %1$d vybraných + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-sv/strings.xml b/library/ui-strings/src/main/res/values-sv/strings.xml index 1f38d2069c..eaa327e977 100644 --- a/library/ui-strings/src/main/res/values-sv/strings.xml +++ b/library/ui-strings/src/main/res/values-sv/strings.xml @@ -2544,7 +2544,7 @@ Skicka e-brev igen Fick du inget e-brev\? För att bekräfta din e-post, tryck på knappen i e-brevet vi just skickade till %s - Kolla din e-post för att verifiera. + Verifiera din e-post Skicka kod igen En kod skickades till %s Bekräfta ditt telefonnummer @@ -2718,4 +2718,122 @@ \nVänligen ge åtkomst på nästa pop-uper för att kunna se aviseringar. Aktivera rik-text-redigerare Testa den nya rik-text-redigeraren + Välkommen till en ny vy! + Det här är vart dina olästa meddelanden hamnar, när du har några. + Inget att rapportera. + 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. + Välkommen till ${app_name}, +\n%s. + 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. + %s +\nser lite tom ut. + Möjliggör att spela in och skicka röstsändning i rummets tidslinje. + Aktivera röstsändning (under aktiv utveckling) + Spara klientnamnet, versionen, och URL:en för att enklare känna igen sessioner i sessionehanteraren. + Aktivera klientinforapportering + Ha bättre insyn i och kontroll över alla dina sessioner. + Aktivera den nya sessionshanteraren + 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. + Döper om sessioner + 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. + Verifierade sessioner + 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. + Overifierade sessioner + 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. + Inaktiva sessioner + 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: + Logga in med QR-kod + Observera att sessionsnamnen också kan ses av folk du kommunicerar med. + Anpassade namn kan hjälpa dig att känna igen dina enheter lättare. + Sessionsnamn + Döp om session + IP-adress + Operativsystem + Modell + Webbläsare + URL + Version + Namn + Applikation + Senaste aktiviteten + Sessionsnamn + Ta emot pushnotiser i den här sessionen. + Skanna QR-kod + Använd understrykning + Använd överstrykning + Använd kursiv stil + Använd fetstil + 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. + Bekräfta + Pröva igen + Ingen match\? + Loggar in dig + Ansluter till enhet + Skanna QR-kod + Loggar du in en mobil\? + Visa QR-kod på den här enheten + Välj \'Skanna QR-kod\' + Börja på inloggningsskärmen + Välj \'Logga in med QR-kod\' + Börja på inloggningsskärmen + Välj \'Visa QR-kod\' + Gå till Inställningar -> Säkerhet och sekretess + Öppna appen på din andra enhet + Hemservern stöder inte inloggning med QR-kod. + Inloggningen avbröts på den andra enheten. + Den QR-koden är ogiltig. + Den andra enheten måste vara inloggad. + Den andra enheten är redan inloggad. + 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; + Begäran misslyckades. + Begäran nekades på den andra enheten. + Länkningen slutfördes inte inom den krävda tiden. + Länkning med den här enheten stöds inte. + Misslyckad anslutning + Kolla din inloggade enhet, koden nedan borde visas. Bekräfta att koden nedan matchar den enheten: + Säker anslutning etablerad + Skanna QR-koden nedan med din utloggade enhet. + Använd din inloggade enhet för att skanna QR-koden nedan: + Logga in med QR-kod + Använd den här enhetens kamera för att skanna QR-koden på din andra enhet: + Buffrar + Pausa röstsändning + Spela eller återuppta röstsändning + Avsluta inspelning av röstsändning + Pausa inspelning av röstsändning + Återuppta inspelning av röstsändning + Live + Skanna QR-kod + 3 + 2 + 1 + Pröva + Tryck uppe till höger för att se alternativet att ge återkoppling. + Ge återkoppling + Kom åt dina utrymmen (nere till höger) snabbare och enklare än någonsin förut. + Kom åt utrymmen + För att förenkla din ${app_name} så är flikar nu valfria. Hantera dem i menyn uppe till höger. + Välj sessioner + Kontakt + Kamera + Plats + Omröstningar + Röstsändning + Bilagor + Dekaler + Fotobibliotek + Avmarkera alla + Välj alla + + %1$d vald + %1$d valda + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml index 2a04e58f41..f633a0ef2f 100644 --- a/library/ui-strings/src/main/res/values-uk/strings.xml +++ b/library/ui-strings/src/main/res/values-uk/strings.xml @@ -2839,12 +2839,12 @@ Перейменувати сеанс Вийти з цього сеансу Не звірений - Ваш поточний сеанс - Розпочати голосове мовлення + Розпочати трансляцію голосового повідомлення Справжність цього зашифрованого повідомлення не може бути гарантована на цьому пристрої. Заборонити клавіатурі оновлювати будь-які персоналізовані дані, як-от історію набору тексту та словник, на основі того, що ви набрали в розмовах. Зверніть увагу, що деякі клавіатури можуть не дотримуватися цього налаштування. Клавіатура інкогніто Надсилає (╯°□°)╯︵ ┻━┻ на початку текстового повідомлення - Голосове мовлення + Голосові повідомлення Відкрийте інструменти розробника 🔒 Ви увімкнули шифрування лише для перевірених сеансів для всіх кімнат у налаштуваннях безпеки. ⚠ У цій кімнаті є неперевірені пристрої, вони не зможуть розшифрувати повідомлення, які ви надсилаєте. @@ -2892,9 +2892,9 @@ Виберіть «Увійти за допомогою QR-коду» Почніть з екрана входу Почніть з екрана входу - Виберіть «Показати QR-код на цьому пристрої» - Перейдіть до Налаштування -> Безпека й приватність -> Показати всі сеанси - Відкрийте ${app_name} на іншому своєму пристрої + Виберіть «Показати QR-код» + Перейдіть до Налаштування -> Безпека й приватність + Відкрийте застосунок на іншому своєму пристрої Запит на іншому пристрої було відхилено. Пов\'язування не було завершено у встановлені терміни. Пов\'язування з цим пристроєм не підтримується. @@ -2913,4 +2913,37 @@ Сканувати QR-код Сканувати QR-код Сканувати QR-код + Домашній сервер не підтримує вхід за допомогою QR-коду. + Вхід на іншому пристрої було скасовано. + Цей QR-код недійсний. + Повинен бути виконаний вхід з іншого пристрою. + Вхід з іншого пристрою вже виконано. + Під час налаштування захищеного обміну повідомленнями виникла проблема з безпекою. Можливо, порушено одне з таких налаштувань: Ваш домашній сервер; Ваше інтернет-з\'єднання; Ваш пристрій; + Запит не виконаний. + Можливість записувати та надсилати голосові повідомлення до стрічки кімнати. + Увімкнути голосові повідомлення (в активній розробці) + Буферизація + Призупинити голосове повідомлення + Відтворити або поновити відтворення голосового повідомлення + Припинити запис голосового повідомлення + Призупинити запис голосового повідомлення + Відновити запис голосового повідомлення + Наживо + Вибрати сеанси + Контакт + Камера + Місце перебування + Опитування + Голосові повідомлення + Вкладення + Наліпки + Фотобібліотека + Скасувати вибір усіх + + Вибрано %1$d + Вибрано %1$d + Вибрано %1$d + Вибрано %1$d + + Вибрати все \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index ae29132c91..688652265b 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -11,10 +11,10 @@ %1$s 封禁了 %2$s %1$s 更换了他们的头像 %1$s 将他们的显示名称设置为 %2$s - %1$s 把他们的显示名称从 %2$s 改为 %3$s - %1$s 移除了他们的显示名称 (%2$s) - %1$s 把主题改为: %2$s - %1$s 把房间名称改为: %2$s + %1$s 将其显示名称从 %2$s 更改为 %3$s + %1$s 移除了他们的显示名称(%2$s) + %1$s 将话题更改为:%2$s + %1$s 将房间名称更改为:%2$s %s 发起了一次视频通话。 %s 发起了一次语音通话。 %s 已接听通话。 @@ -25,7 +25,7 @@ 任何人。 (头像也被更改) %1$s 移除了房间名称 - %1$s 移除了房间主题 + %1$s 移除了房间话题 ** 无法解密:%s ** 发送者的设备没有向我们发送此消息的密钥。 无法发送消息 @@ -79,11 +79,11 @@ %1$s 为此房间移除了主要地址。 %1$s 已允许访客加入房间。 %1$s 已禁止访客加入房间。 - %1$s已开启端到端加密。 - %1$s已开启端到端加密(无法识别的算法%2$s)。 - %1$s 创建了这个房间 + %1$s 已开启端到端加密。 + %1$s 已开启端到端加密(无法识别的算法 %2$s)。 + %1$s 创建了房间 你的邀请 - 你创建了这个房间 + 你创建了房间 你邀请了 %1$s 你加入了房间 你离开了房间 @@ -94,40 +94,40 @@ 你撤回了对 %1$s 的邀请 你更换了你的头像 你将你的显示名称设置为 %1$s - 你将你的显示名称从 %1$s 改为 %2$s - 你移除了你的显示名称 (%1$s) - 你把主题改为:%1$s + 您将显示名称从 %1$s 更改为 %2$s + 您移除了您的显示名称(%1$s) + 您将话题更改为:%1$s %1$s 更改了房间头像 你更改了房间头像 - 你把房间名称改为:%1$s + 您将房间名称更改为:%1$s 你发起了一次视频通话。 你发起了一次语音通话。 %s 发送了数据以建立通话。 你发送了数据以建立通话。 - 你接听了通话。 - 你结束了通话。 - 你已让未来的房间历史对%1$s可见 + 你已接听通话。 + 你已结束通话。 + 你已让未来的房间历史对 %1$s 可见 你升级了此房间。 你移除了房间名称 - 你移除了房间主题 + 你移除了房间话题 %1$s 移除了房间头像 你移除了房间头像 你向 %1$s 发送了加入房间的邀请 你已撤回了对 %1$s 加入房间的邀请 你接受了 %1$s 的邀请 - %1$s 添加了 %2$s 挂件 - 你添加了 %1$s 挂件 - %1$s 移除了 %2$s 挂件 - 你移除了 %1$s 挂件 - %1$s 修改了 %2$s 挂件 - 你修改了 %1$s 挂件 + %1$s 添加了 %2$s 小部件 + 你添加了 %1$s 小部件 + %1$s 移除了 %2$s 小部件 + 你移除了 %1$s 小部件 + %1$s 修改了 %2$s 小部件 + 你修改了 %1$s 小部件 管理员 协管员 默认 自定义(%1$d) 自定义 - 你更改了%1$s的权力级别。 - %1$s更改了%2$s的权力级别。 + 您更改了 %1$s 的权限等级。 + %1$s 更改了 %2$s 的权限等级。 %1$s 从 %2$s 到 %3$s 你的邀请。理由:%1$s 你邀请了 %1$s。理由:%2$s @@ -151,7 +151,7 @@ 你已允许访客加入房间。 你已禁止访客加入房间。 你已开启端到端加密。 - 你已开启端到端加密(无法识别的算法%1$s)。 + 你已开启端到端加密(无法识别的算法 %1$s)。 你已离开。理由:%1$s %1$s 已离开。理由:%2$s 你已加入。理由:%1$s @@ -170,15 +170,15 @@ %1$s 已加入 你创建了讨论 %1$s 创建了讨论 - 你已阻止客人加入房间。 - %1$s已阻止客人加入房间。 - 你已允许客人加入这里。 - %1$s 已允许客人加入这里。 + 你已阻止访客加入房间。 + %1$s 已阻止访客加入房间。 + 你已允许访客加入这里。 + %1$s 已允许访客加入这里。 接受 拒绝 挂断 引用 - 分享 + 共享 语音通话 视频通话 全部标记为已读 @@ -298,7 +298,7 @@ 当前密码 显示所有来自 %s 的消息? 选择国家 - 主题 + 话题 房间历史可见性 谁可以阅读历史消息? 任何人 @@ -340,7 +340,7 @@ \n \n请在接下来的弹出窗口中授权允许访问,以便进行通话。 移除 - 你将不能撤销这个修改,因为你正在让这个用户和你拥有相同的权力级别。 + 您将无法撤消此更改,因为您正在将用户提升为与您相同的权限级别。 \n你确定吗? 这可能意味着有人正在恶意劫持你的流量,或者你的手机不信任远程服务器提供的数字证书。 如果服务器管理员说这是预期的情况,请确保下面的指纹与管理员提供的指纹相匹配。 @@ -416,11 +416,11 @@ 深色主题 黑色主题 通知声音 - 使用12小时制显示时间戳 - 确定要从此房间删除此挂件吗? - 无法创建挂件。 + 使用 12 小时制显示时间戳 + 确定要从此房间中删除小部件吗? + 无法创建小部件。 发送请求失败。 - 权力级别必须是正整数。 + 权限等级必须是正整数。 你不在这个房间。 你没权限在当前房间执行此操作。 请求中缺失 room_id。 @@ -452,7 +452,7 @@ 封禁用户会把他们移出此房间并阻止他们再次加入。 全部消息 添加到主屏幕 - 行内URL预览 + 内联网址预览 提及用户时震动 创建 @@ -463,7 +463,7 @@ %d个成员状态变动 - %d个成员 + %d 个成员 %d条未读的已通知消息 @@ -473,7 +473,7 @@ %d 个房间 - %d个启用的挂件 + %d 个活动的小部件 主页 房间 @@ -506,25 +506,25 @@ 下载 发送语音消息 对不起,没有可完成此操作的外部应用。 - 从你的其他会话上重新请求加密密钥。 - 请在其他可解密此消息的设备上启动 ${app_name},以便其将密钥发送至当前会话。 + 从你的其它会话上重新请求加密密钥。 + 请在其它可解密此消息的设备上启动 ${app_name},以便其将密钥发送至当前会话。 请输入你的密码。 如果可能的话,请使用英文撰写问题描述。 发送前预览媒体文件 显示动作 按照 ID 封禁用户 按照 ID 解禁用户 - 定义用户的权力级别 + 定义用户的权限等级 按照 ID 取消用户管理员权限 按照 ID 邀请用户进入当前房间 用给定地址加入房间 离开房间 - 设置房间主题 + 设置房间话题 从此房间移除指定ID的用户 更改你显示的显示名称 打开/关闭 markdown 修复 Matrix Apps 管理 - 这个房间已经被替换并且不再活跃。 + 此房间已被替换,不再处于活动状态。 对话在此继续 这个房间是另一个对话的延续 点击此处查看更早的消息 @@ -535,8 +535,8 @@ 联系你的服务管理员 本服务器其中一项资源已超出限制,部分用户将无法登录 本服务器其中一项资源已超出限制。 - 本服务器已达到每月活跃用户限制,部分用户将无法登录 - 本服务器已达到每月活跃用户限制。 + " 此主服务器已达到其每月活跃用户限制,因此<b>某些用户将无法登录</b>。" + 此主服务器已达到其每月活跃用户限制。 请 %s 以继续使用本服务。 请 %s 以增加此限制的额度。 接受 @@ -555,7 +555,7 @@ 一个或多个测试没有通过,请尝试建议的修复方法。 一个或多个测试没有通过,请提交错误反馈以协助我们调查此问题。 系统设置。 - 通知已在系统设置中启用。 + 已在系统设置中启用通知。 通知已在系统设置中禁用。 \n请检查系统设置。 打开设置 @@ -593,8 +593,8 @@ 让房间中的其他用户知道你正在输入。 Markdown 格式化 在消息发出之前使用 Markdown 语法格式化消息。这允许你使用高级的文字格式,例如使用星号显示斜体文字。 - 显示已阅回执 - 点击已阅回执以显示所有已经阅读过某条消息的用户。 + 显示已读回执 + 单击已读回执以获取详细列表。 显示加入与离开事件 邀请、移除与封禁不受影响。 显示账户变动事件 @@ -606,7 +606,7 @@ 展开 抱歉,发生了一个错误 Markdown 已禁用。 - Markdown 已启用。 + 已启用 Markdown。 视频通话中…… 服务将在设备重启后启动。 服务不会在设备重启后启动,在你打开 ${app_name} 一次之前你将不会收到消息通知。 @@ -628,7 +628,7 @@ 使用密钥备份 如果你此时登出账户,你将会失去你的已加密消息 密钥备份进行中。如果你此时登出账户将无法再访问你的已加密消息。 - 你的所有会话都应当启用安全密钥备份以避免失去对你的已加密消息的访问权。 + 安全密钥备份应该在您的所有会话中都处于活动状态,以避免失去对加密消息的访问权限。 我不想要我的已加密消息 正在备份密钥…… 确定吗? @@ -684,10 +684,10 @@ 完成 我已经制作了一份拷贝 保存恢复密钥 - 分享 + 共享 保存为文件 请制作一份拷贝 - 分享恢复密钥… + 与…共享恢复密钥 正在使用口令词组来生成恢复密钥,此过程可能会花费几秒钟。 恢复密钥 意外错误 @@ -777,8 +777,8 @@ \n会话名称:%1$s \n最近上线于:%2$s \n若你未曾在另一个会话上登录,则忽略此请求。 - 分享 - 密钥分享请求 + 共享 + 密钥共享请求 忽略 替换 终止 @@ -786,7 +786,7 @@ 已验证! 了解了 验证请求 - %s 想验证你的装置 + %s 想验证您的会话 未知错误 编辑 回复 @@ -795,7 +795,7 @@ 由 %s 邀请 对话 房间 - 反应 + 回应 同意 添加反应 查看反应 @@ -815,10 +815,10 @@ 推送规则 尚未定义任何推送规则 没有已注册的推送通道 - app_id: - push_key: - app_display_name: - device_name: + 应用ID: + 推送密钥: + 应用显示名称: + 会话显示名称: URL: 格式: 音频与视频 @@ -837,7 +837,7 @@ 通知 ${app_name} 呼叫失败 无法建立实时连接。 -\n请要求你的主服务器管理员配置 TURN 服务器以使通话可靠工作。 +\n请让您的主服务器的管理员配置一个 TURN 服务器,以便呼叫能够可靠地工作。 选择声音设备 电话 扬声器 @@ -881,8 +881,8 @@ 无后台同步 应用在后台时你不会收到消息通知。 集成 - 使用集成管理器管理机器人、桥接、部件和贴纸包。 -\n集成管理器接收配置数据,可以代表你修改部件、发送房间邀请及设置权力级别。 + 使用集成管理器来管理机器人、桥接、小部件和贴纸包。 +\n集成管理器接收配置数据,并可以代表您修改小部件、发送房间邀请和设置权限等级。 安全备份 设置安全备份 重置安全备份 @@ -903,24 +903,24 @@ %1$s:%2$s %1$s:%2$s %3$s 查看 - 活动挂件 - 挂件 - 载入挂件 - 此挂件添加者: - 使用它可能会设置cookie并与%s分享数据: - 使用它可能会与%s分享数据: - 载入挂件失败。 + 活动小部件 + 小部件 + 加载小部件 + 此小部件由以下人员添加: + 使用它可能会设置 cookie 并与 %s 共享数据: + 使用它可能会与 %s 共享数据: + 加载小部件失败。 \n%s - 重载挂件 + 重新加载小部件 在浏览器中打开 撤消我的访问权限 你的显示名称 你的头像 URL 你的用户 ID 你的主题 - 挂件 ID + 小部件 ID 房间 ID - 挂件想使用以下资源: + 这个小部件想要使用以下资源: 允许 阻止全部 使用相机 @@ -952,7 +952,7 @@ 获取信任信息时发生错误 获取密钥备份数据时发生错误 从文件“%1$s”导入端到端密钥。 - 其他第三方通知 + 其它第三方通知 你已经在查看此房间! 注册令牌 提出建议 @@ -970,7 +970,7 @@ 文件%1$s 已被下载! 消息编辑 未找到编辑 - 过滤对话… + 过滤对话…… 找不到你要找的? 创建新房间 发送新私聊消息 @@ -983,7 +983,7 @@ 查看编辑历史 服务条款 可被其他人发现 - 使用机器人,挂件和贴纸包 + 使用机器人、桥接、小部件和贴纸包 身份服务器 断开身份服务器 配置身份服务器 @@ -991,12 +991,12 @@ 你正在使用 %1$s 与你知道的现有联系人相互发现。 你当前未使用身份服务器。若要与你知道的现有联系人相互发现,请在下方配置。 可发现电子邮件地址 - 发现选项将在你添加电子邮件后出现。 + 发现选项将在你添加电子邮件地址后出现。 发现选项将在你添加电话号码后出现。 与你的身份服务器断开意味着你将无法被其它用户发现并且无法通过电子邮件和电话邀请他人。 可发现电话号码 - 我们向 %s 给你发送了确认电子邮件,检查你的电子邮件并点击确认链接 - 我们向 %s 给你发送了确认电子邮件,请先检查你的电子邮件并点击确认链接 + 我们向%s发送了一封电子邮件,请检查你的电子邮件并点击确认链接 + 我们向%s发送了电子邮件,请先检查你的电子邮件并点击确认链接 输入身份服务器 URL 无法连接到身份服务器 请输入身份服务器 url @@ -1004,10 +1004,10 @@ 你选择的身份服务器无任何服务条款。仅在你信任服务所有者时继续 已向 %s 发送文字消息。请输入它包含的验证码。 验证码不正确。 - 你当前在身份服务器 %1$s 上分享电子邮件地址或电话号码。你需要重连接 %2$s 已停止分享。 + 您当前在身份服务器 %1$s 上共享电子邮件地址或电话号码。您需要重新连接到 %2$s 才能停止共享它们。 同意身份服务器 (%s) 服务条款使你可以通过电子邮件地址或电话号码被发现。 启用详细日志。 - 当你发送 RageShake 时详细日志将帮助开发者提供更多日志。即使启用,应用也不会记录消息内容或任何其他私有数据。 + 详细日志将通过在您发送 RageShake 时提供更多日志来帮助开发人员。即使启用,应用程序也不会记录消息内容或任何其他私人数据。 接收你的主服务器条款和条件后请重试。 服务器似乎响应时间太长,这可能是由于连接不良或服务器错误引起的。请稍后再试。 发送附件 @@ -1105,16 +1105,16 @@ 应用无法在此服务器上创建账户。 \n \n你想要通过网页客户端注册吗? - 电子邮件未关联到任何账户。 + 此电子邮件地址未关联到任何账户。 在 %1$s 上重置密码 验证邮件将发送到你的收件箱以确认设置你的新密码。 下一个 电子邮件 新密码 - 注意! + 警告! 更改你的密码将重置所有会话上的端到端加密密钥,从而使加密聊天记录无法读取。在重设密码之前,请设置“密钥备份”或从另一个会话中导出房间密钥。 继续 - 电子邮件未链接到任何账户 + 此电子邮件地址未链接到任何账户 检查你的收件箱 验证电子邮件已发送到 %1$s。 点击链接以确认你的新密码。跟随包含的链接验证后,请点击下方。 @@ -1123,12 +1123,12 @@ 你的密码已重置。 你已登出全部会话,不会再接收到推送通知。若要重新启用通知,请在每个设备上再次登录。 返回登录 - 注意 + 警告 你的密码尚未更改。 \n \n是否中止密码更改过程? 设置电子邮件地址 - 设置电子邮件用于恢复你的账户。之后,你可以选择允许你认识的人通过电子邮件发现你。 + 设置电子邮件地址以用于恢复你的账户。之后,你可以选择允许你认识的人通过此地址发现你。 电子邮件 电子邮件(可选) 下一个 @@ -1151,7 +1151,7 @@ 密码 下一个 用户名已占用 - 注意 + 警告 你的账户尚未创建。是否中止注册过程? 选择 matrix.org 选择 Element Matrix Services @@ -1176,9 +1176,9 @@ 你已登出 这可能由于多种原因: \n -\n• 你已在其他会话中更改了你的密码。 +\n• 你已在其它会话中更改了你的密码。 \n -\n• 你已从其他会话删除了此会话。 +\n• 你已从其它会话删除了此会话。 \n \n• 你的服务器管理员出于安全原因已取消你的访问权限。 重新登录 @@ -1189,7 +1189,7 @@ 登录 密码 清除个人数据 - 注意:你的个人数据(包括加密密钥)仍存储在此设备上。 + 警告:你的个人数据(包括加密密钥)仍存储在此设备上。 \n \n如果你不再使用此设备,或想登录另一个账户,请清除它。 清除全部数据 @@ -1211,13 +1211,13 @@ 检测到摇动! 设置 当前会话 - 其他会话 + 其它会话 仅显示第一个结果,请输入更多字符… 快速失败 发生意外错误时,${app_name} 可能更经常崩溃 在明文消息前添加 ¯\\_(ツ)_/¯ 启用加密 - 加密一经启用,便无法禁用。 + 启用后,无法禁用加密。 你的电子邮件域无权注册此服务器 未信任的登录 匹配 @@ -1227,7 +1227,7 @@ \n \n - 你的主服务器 \n - 你验证的用户连接到的主服务器 -\n - 你或其它用户的网络连接 +\n - 你或其他用户的网络连接 \n - 你或其他用户的设备 视频。 图片。 @@ -1235,7 +1235,7 @@ 文件 贴纸 正在等待…… - %s 已取消 + %s已取消 你已取消 %s 已接受 你已接受 @@ -1276,9 +1276,9 @@ %1$s里的默认 %2$s里的自定义(%1$d) ${app_name} 无法处理类型为 \'%1$s\' 的事件 - ${app_name} 在渲染 id 为 \'%1$s\' 的事件内容时遇到了一个问题 + ${app_name} 在呈现 ID 为“%1$s”的事件内容时遇到问题 取消忽略 - 该会话无法与你的其他会话共享此验证。 + 该会话无法与你的其它会话共享此验证。 \n验证将保存在本地,并在此应用的未来版本中共享。 给给定的消息和彩虹一样上色后发送 和彩虹一样给给定的表情上色后发送 @@ -1289,22 +1289,22 @@ 房间加密一经启用,便无法禁用。在加密房间中,发送的消息无法被服务器看到,只能被房间的参与者看到。启用加密可能会使许多机器人和桥接无法正常运作。 启用加密 为保证安全,请核对一次性代码以验证 %s。 - 为保证安全,请当面验证,或者使用其他通讯方式验证。 + 为保证安全,请当面验证,或者使用其它通讯方式验证。 比较独特表情,确保它们以相同顺序出现。 与其他用户设备上显示的代码比较。 与此用户的消息是端到端加密的,无法被第三方读取。 你的新会话已验证。它可以访问你的加密消息,其他用户会将其视为可信任。 交叉签名 - 交叉签名已启用 + 已启用交叉签名 \n设备上的私钥。 - 交叉签名已启用 + 已启用交叉签名 \n密钥可信任。 \n私钥未知 - 交叉签名已启用。 + 已启用交叉签名。 \n密钥未信任 - 交叉签名未启用 + 未启用交叉签名 你的服务器管理员已默认禁用私有房间和私聊消息端到端加密。 - 活跃的会话 + 可用会话 显示全部会话 管理会话 登出此会话 @@ -1318,7 +1318,7 @@ 使用现有会话来验证此会话,并授予其访问加密消息的权限。 验证 已验证 - 注意 + 警告 无法获取会话 会话 可信任 @@ -1394,7 +1394,7 @@ 将给定信息作为剧透发送 剧透 输入关键字以查找反应。 - 已阅 + 已读 跳至已读回执 事件被房间管理员调整,理由:%1$s 密钥已是最新! @@ -1441,16 +1441,16 @@ 不知道你的密钥备份口令词组,你可以 %s。 密钥备份恢复密钥 阻止应用内屏幕截图 - 启用此设置添加 FLAG_SECURE 到所有活动。重启应用使更改生效。 + 启用此设置会将 FLAG_SECURE 添加到所有活动项。重新启动应用程序以使更改生效。 无法保存媒体文件 设置新账户密码…… - 在你的其他设备上使用最新的${app_name} 网页版、${app_name} 桌面版、${app_name} iOS 版、${app_name} 安卓版,或其他能够交叉签名的 Matrix 客户端 + 在您的其它设备上使用最新的 ${app_name}、${app_name} Web、${app_name} Desktop、${app_name} iOS、${app_name} for Android 或其他支持交叉签名的 Matrix 客户端 ${app_name} Web \n${app_name} Desktop ${app_name} iOS \n${app_name} Android - 或其他能够交叉签名的 Matrix 客户端 - 在你的其他设备上使用最新的 ${app_name}: + 或其它支持交叉签名的 Matrix 客户端 + 在你的其它设备上使用最新的 ${app_name}: 强制丢弃加密房间中的当前出站群组会话 仅在加密房间中支持 使用你的 %1$s 或使用你的 %2$s 继续。 @@ -1465,7 +1465,7 @@ 使用文本手动验证 验证登录 使用表情交互式验证 - 通过从你的其他会话验证此登录确认你的身份,授权它访问你的加密消息。 + 通过从你的其它会话验证此登录确认你的身份,授权它访问你的加密消息。 请选择用户名。 请选择密码。 仔细检查此链接 @@ -1484,7 +1484,7 @@ 我们无法邀请用户,请检查你想要邀请的用户并重试。 当前语言 - 其他可用语言 + 其它可用语言 正在载入可用语言… 打开 %s 条款 是否从身份服务器 %s 断开? @@ -1492,12 +1492,12 @@ 无法执行此操作。主服务器已过期。 请先配置身份服务器。 请先在设置中接受身份服务器的条款。 - 为了你的隐私,${app_name} 仅支持发送用户电子邮件和电话号码的哈希值。 + 为了你的隐私,${app_name}仅支持发送经过哈希处理的用户电子邮件的和电话号码。 关联失败。 当前与此标识符没有关联。 你的主服务器(%1$s)建议使用 %2$s 作为你的身份服务器 使用 %1$s - 或者,你可以输入任何其他身份服务器 URL + 或者,你可以输入任何其它身份服务器网址 输入身份服务器 URL 提交 设置角色 @@ -1511,7 +1511,7 @@ 通过在你的服务器上备份加密密钥,防止失去对加密消息和数据的访问。 设置 使用安全密钥 - 生成安全密钥存储在安全的地方如密码管理器或保险箱。 + 生成安全密钥以存储在密码管理器或保险箱等安全位置。 使用安全短语 输入仅有你知道的秘密短语,生成备份用的密钥。 保存你的安全密钥 @@ -1521,7 +1521,7 @@ 安全短语 再次输入你的安全短语以确认。 房间名称 - 主题 + 话题 你已成功更改房间设置 你无法访问此消息 正在等待此消息,可能会花费一些时间 @@ -1555,20 +1555,20 @@ 启用 PIN 如果你想要重置你的 PIN,点按忘记 PIN 登出并重置。 防止意外通话 - 发起通话之前要求确认 + 在开始通话之前要求确认 你没有权限在此房间发起会议通话 发起视频会议 发起音频会议 - 会议使用 Jitsi 安全与许可政策。你的会议进行期间当前房间内的所有人将看到加入邀请。 + 会议使用 Jitsi 安全和权限策略。 当前在会议室中的所有人都会在会议进行期间看到加入邀请。 你无法呼叫你自己 你无法与自己通话,请等待参与者接受邀请 - 添加挂件失败 - 移除挂件失败 + 添加小部件失败 + 移除小部件失败 成功导入 %1$d/%2$d 个密钥。 管理集成 - 无活动挂件 + 没有活动的小部件 房间已创建,但由于以下原因一些邀请尚未发送: \n \n%s @@ -1605,9 +1605,9 @@ \n \n小心使用,它可能导致意外行为。 链接格式不正确 - 每次打开 ${app_name} 都要求 PIN 码。 - 在 2 分钟未使用 ${app_name} 后要求 PIN 码。 - 2 分钟后要求 PIN + 每次打开 ${app_name} 时都需要 PIN 码。 + 未使用 ${app_name} 2 分钟后需要 PIN 码。 + 2 分钟后需要 PIN 码 仅在一个简单的通知中显示未读消息的数量。 显示详情,如房间名称和消息内容。 在通知中显示内容 @@ -1622,7 +1622,7 @@ 你将重新启动,没有历史记录,消息,受信任的设备或受信任的用户 如果你重置一切 - 仅当没有其他设备可用来验证此设备时,才执行此操作。 + 仅当没有其它设备可用来验证此设备时,才执行此操作。 全部重置 忘记或丢失了所有的恢复选项?重置一切 你已加入。 @@ -1634,7 +1634,7 @@ \n \n你的消息受加密保护,并且只有你和消息接收者拥有唯一解密密钥。 此处的消息未经端到端加密。 - 此主服务器正在运行较旧版本。要求你的主服务器管理员升级。你可以继续,但一些功能可能无法正确工作。 + 此主服务器正在运行旧版本。 请让您的主服务器管理员升级。 您可以继续,但某些功能可能无法正常工作。 你将此房间设为仅邀请。 %1$s 仅发出此邀请。 在加密房间显示完整历史 @@ -1658,7 +1658,7 @@ 允许访问你的联系人。 如需扫描二维码,你须允许相机访问权限。 没有更多结果 - 开始畅聊 + 开始聊天 删除地址 \"%1$s\"? 取消发布地址 \"%1$s\"? 发布 @@ -1709,14 +1709,14 @@ 添加图像自 授予许可 撤销我的许可 - 你已同意发送电子邮件和电话号码到身份服务器以从你的联系人发现其他用户。 + 你已同意发送电子邮件地址和电话号码到身份服务器以从你的联系人发现其他用户。 发送电子邮件和电话号码 建议 已知用户 二维码 - 通过二维码添加 + 通过QR码添加 房间设置 - 主题 + 话题 房间话题(可选) 房间名称 此房间无法预览。你想加入吗? @@ -1731,10 +1731,10 @@ 为此房间设置地址以便用户通过你的主服务器(%1$s)找到此房间 本地地址 新的发布的地址(例如 #alias:server) - 尚无其他已发布地址。 + 尚无其它已发布地址。 还没有别的发布的地址,可在下方添加。 - 在消息框添加打开emoji键盘的按钮 - 显示emoji键盘 + 在消息框添加打开 emoji 键盘的按钮 + 显示 emoji 键盘 使用 /confetti 命令或发送包含 ❄️ 或 🎉 的消息 显示聊天效果 更改话题 @@ -1746,7 +1746,7 @@ 启用房间加密 更改房间主要地址 更改房间头像 - 修改挂件 + 修改小部件 通知每个人 移除其他人发送的消息 封禁用户 @@ -1774,7 +1774,7 @@ • 已允许匹配 %s 的服务器。 已勾选 已选中 - 活跃通话(%1$s) + 可用通话(%1$s) 需要重新验证 删除失败的消息 你确定要取消发送消息吗? @@ -1842,9 +1842,9 @@ 你为此房间设置了服务器访问控制列表。 在 Matrix 上查找联系人 用户尚未同意条款。 - 分享此二维码,其他人扫描后即可添加你,并开始聊天。 + 共享此二维码,其他人扫描后即可添加你,并开始聊天。 我的二维码 - 分享我的二维码 + 共享我的二维码 消息类型缺失 检查房间状态 查看已读回执 @@ -1862,8 +1862,8 @@ 此空间没有房间 请联系你的主服务器管理员以取得进一步资讯 看来你的主服务器尚未支持空间 - 想要做点实验? -\n你可以将现有的空间添加到其他空间中。 + 想要使用实验功能? +\n你可以将现有的空间添加到其它空间中。 管理房间和空间 标记为不建议 标记为建议 @@ -1894,7 +1894,7 @@ 刚到此房间 他们将可以探索 %s 邀请至 %s - 分享链接 + 共享链接 通过电子邮件进行邀请 此刻只有你。%s与他人一道会更好。 邀请至 %s @@ -1904,7 +1904,7 @@ 正在创建空间…… 随机 一般性 - 让我们为每个主题创建一个房间。你也可以稍后再进行增加,包括现有房间。 + 让我们为他们每个人创建一个房间。 您也可以稍后添加更多内容,包括已经存在的内容。 你在做些什么? 我们将会为此创建房间。你也可以在稍后增加更多。 你希望在 %s 中进行哪些讨论? @@ -1933,9 +1933,9 @@ 创建空间 公开房间 未检查 - 开启挂件 + 打开小部件 屏幕截图 - ${app_name} 要求你输入凭据才能执行此操作。 + ${app_name} 需要您输入凭据才能执行此操作。 呼叫转移时发生错误 先询问 查找电话号码时发生了错误 @@ -1944,9 +1944,9 @@ 有未保存的更改。要放弃更改吗? 房间尚未创建。取消创建房间? 未扫描二维码! - 无效的二维码(无效的 URI)! + 无效的二维码(无效的标识)! 无法向你自己发送私聊消息! - 通过文字分享 + 通过文字共享 更改你当前的 PIN 更改 PIN 🔐️ 在 ${app_name} 上加入我的行列 @@ -2049,7 +2049,7 @@ 房间版本 👓 通过比较表情符号来验证 使用此设备扫描 - 使用您的其他设备扫描代码或切换并使用此设备扫描 + 使用其它设备扫码或切换并使用本设备扫码 主服务器 API 网址 缺少权限 要执行此操作,请从系统设置中授予相机权限。 @@ -2078,7 +2078,7 @@ 录制语音消息 需要升级 语音 - 您可能不知道的其他空间或房间 + 您可能不知道的其它空间或房间 你知道的包含这个房间的空间 决定谁能找到并加入这个房间。 点按即可编辑空间 @@ -2102,19 +2102,19 @@ 其他 提及和关键词 默认通知 - 活跃视频通话 - 活跃语音通话 + 可用视频通话 + 可用语音通话 在 ${app_name} 中直接接收邀请的设置 %s。 - 将此邮箱与您的账户相链接 + 将此电子邮件地址与您的帐户相关联 加入这个空间的邀请被发送至 %s,此邮箱未与您的账户相关联 加入这个房间的邀请被发送至 %s,此邮箱未与您的账户相关联 你所在的全部房间将显示在主页上。 在主页上显示所有房间 滑动结束通话 %1$s 轻按返回 - 活跃通话 (%1$s) · + 可用通话 (%1$s) · - %1$d 个活跃通话· + %1$d 个可用通话· 无应答 未接视频通话 @@ -2170,7 +2170,7 @@ 任何人均可找到此空间并加入 空间访问 谁可以访问? - 启用 %s 的电邮通知 + 为 %s 启用电子邮件通知 要接收通知邮件,请将一个电子邮件地址关联到你的Matrix账户 电子邮件通知 升级空间 @@ -2213,16 +2213,16 @@ 添加选项 选项 %1$d 创建选项 - 问题或主题 - 投票问题或主题 + 问题或话题 + 投票问题或话题 创建投票 投票 - 向 %s 发送电子邮件和电话号码 + 向%s发送电子邮件地址和电话号码 您的联系人是私密的。 要从您的联系人中发现用户,我们需要您的许可才能将联系信息发送到您的身份服务器。 已登出此会话! 已离开此房间! 你同意发送此信息吗? - 要发现现有的联系人,您需要将联系人信息(电子邮件和电话号码)发送到您的身份服务器。出乎隐私考量,我们会在发送前对您的数据进行散列处理。 + 要发现现有的联系人,你需要将联系人信息(电子邮件地址和电话号码)发送到你的身份服务器。出乎隐私考量,我们会在发送前对您的数据进行散列处理。 不是现在 您确定要删除此投票吗?一旦移除,就无法恢复。 删除投票 @@ -2265,33 +2265,33 @@ \n你可以阅读我们所有的条款 %s。 帮助改进 ${app_name} 启用 - 不允许加入此房间 + 你不能加入这个房间 修改服务器 %d 的 ACLs 消息列帮助你的对话不离题且易于跟踪。 - 显示当前房间的所有子区 - 所有子区 - 筛选器 - 子区 - 在房间中筛选子区 - 复制子区的链接 + 显示当前房间的所有消息列 + 所有消息列 + 过滤器 + 消息列 + 过滤房间中的消息列 + 复制消息列的链接 在房间中查看 - 群组通知 - 我们越来越接近将消息列发布为公开Beta版。 + 房间通知 + 我们越来越接近发布消息列的公共 Beta 版。 \n -\n在我们为此准备时,我们需要做一些变动:在此之前创建的消息列将会被显示为普通回复。 +\n在我们为此做准备时,我们需要进行一些更改:在此之前创建的消息列将显示为常规回复。 \n -\n这会是一次性的过渡,因为消息列现在是Matrix规范的一部分了。 +\n这将是一次性的过渡,因为消息列现在是 Matrix 规范的一部分。 - 还有%1$d个 + %1$d 更多 - 请注意:这是一个使用临时实现的实验室功能。这意味着你将无法删除你的位置历史,并且在你停止与这个房间分享你的实时位置后,高级用户仍能看到你的位置历史。 + 请注意:这是使用临时实现的实验室功能。这意味着您将无法删除您的位置历史记录,即使您停止与此房间共享您的实时位置,高级用户也将能够看到您的位置历史记录。 当前网关:%s 网关 提供反馈 - 为你的团队传递消息。 - 消息列beta + 为您的团队发送消息。 + 消息列 beta 消息列 为所有消息显示最新资料信息(头像和显示名称)。 显示名称 @@ -2299,43 +2299,43 @@ 覆盖显示名称颜色 检查你的电子邮件。 电子邮件 - 你已掌控你的资料。 + 一切由您掌控。 BETA - 分享你的实时位置 + 共享你的实时位置 缩放到当前位置 地图上选定位置的图钉 无投票 验证你的电子邮件 - %d条消息已移除 + %d 条消息已移除 - 启用位置分享 + 启用位置共享 实时位置共享 找不到端点。 - 目前端点:%s + 当前端点:%s 端点 - 目前正在使用%s。 + 目前正在使用 %s。 方式 - 找到%d种方式。 + 找到 %d 个方式。 - 除了后台同步,没有发现其他方法。 - 找不到除了Google Play服务以外的方式。 + 除了后台同步,没有发现其它方法。 + 找不到除了 Google Play 服务以外的方式。 可用方式 通知方式 后台同步 - Google服务 + Google 服务 选择如何接收通知 屏幕共享进行中 - ${app_name}屏幕共享 + ${app_name} 屏幕共享 用户 通知整个房间 显示更少 - 分享位置 + 共享位置 显示消息气泡 - 分享位置 - 你需要有正确的权限,才能在这个房间里分享实时位置。 - 你没有权限分享实时位置 + 共享位置 + 您需要拥有正确的权限才能在此房间中共享实时位置。 + 你没有权限共享实时位置 %1$s前已更新 临时执行:地点在房间历史中持续存在 启用实时位置共享 @@ -2343,30 +2343,30 @@ ${app_name}实时位置 剩余%1$s 停止 - 实时分享直到%1$s + 实时共享直到 %1$s 查看实时位置 实时位置已结束 正在加载实时位置…… - 实时位置已启用 + 启用实时位置 加载地图失败 打开,用 ${app_name}无法访问你的位置。请稍后再试。 ${app_name}无法访问你的位置 在房间中查看 - MSC3061:为过去的消息分享房间密钥 - 当在分享历史的加密的房间中邀请时,加密的历史将总是可见。 + MSC3061:为过去的消息共享房间密钥 + 在共享历史的加密房间中邀请时,加密历史将可见。 8小时 1小时 15分钟 - 分享此位置 - 分享此位置 - 分享实时位置 - 分享实时位置 - 分享我目前的位置 - 分享我目前的位置 + 共享此位置 + 共享此位置 + 共享实时位置 + 共享实时位置 + 共享我当前的位置 + 共享我当前的位置 地图 位置 - 分享位置 + 共享位置 结果仅在你结束投票后展示 封闭式投票 投票者一投票就能看到结果 @@ -2419,14 +2419,14 @@ 我们会帮你建立连接 你会与谁聊最多? ${app_name}也非常适合工作场所。受到世界上最安全的组织信任。 - 选择保存你的对话的位置,给你控制权和独立性。通过Matrix连接。 + 选择保存你的对话的位置,给予你控制权和独立性。通过 Matrix 连接。 安全且独立的通信,为你提供和在家中面对面对话同样等级的隐私。 安全传送消息。 向主服务器注册端点token失败: \n%1$s - Threads帮助保持你的对话不离题且易于跟踪。%s启用消息列会刷新应用。这对一些账户可能需要更长时间。 + 消息列有助于使您的对话保持话题并易于跟踪。%s 创建消息列将刷新应用程序。对于某些帐户,这可能需要更长的时间。 重启应用以使更改生效。 - 启用LaTeX数学 + 启用 LaTeX 数学 (%1$s) %1$s(%2$s) 无法播放%1$s @@ -2445,8 +2445,8 @@ 离开全部 此空间里的东西 - 无法启用生物验证。 - 生物验证被停用了,因为最近新增了新的生物验证方式。你可以在设置里重新启用。 + 无法启用生物特征识别。 + 生物特征识别被禁用,因为最近添加了新的生物特征识别方法。 您可以在“设置”中再次启用它。 主服务器不接收仅有数字的用户名。 发送你的第一条消息邀请%s聊天 加密配置错误 @@ -2454,8 +2454,8 @@ 还原加密 请联系管理员将加密还原到有效状态。 加密被错误地配置了。 - 分享了他们的实时位置 - 分享了他们的位置 + 共享了他们的实时位置 + 共享了他们的位置 无法打开此链接:社群已被空间取代 我已经有账户了 创建账户 @@ -2473,7 +2473,7 @@ 你的对话将进行的地方 必须有8个及以上的字符 - 其他人可以通过%s发现你 + 其他人可以通过 %s 发现你 创建你的账户 恭喜! 你的账户%s已创建 @@ -2481,7 +2481,7 @@ 连接服务器 想要加入已有的服务器? 跳过此问题 - 朋友和家人 + 家人和朋友 拥有你的对话。 位置 Threads Beta反馈 @@ -2509,16 +2509,16 @@ 自动播放动画图片 端点成功注册到主服务器。 端点注册 - 你的主服务器当前不支持消息列,所以此功能可能不可靠。Some threaded messages may not be reliably available. %s你仍要启用消息列吗? + 您的主服务器当前不支持消息列,因此此功能可能不可靠。某些消息列的消息可能无法可靠地使用。 %s 您仍然要启用消息列吗? Threads接近Beta了 🎉 来自消息列 实用提示:长按消息并使用“%s”。 使用消息列来保持讨论的条理性 显示你参与的所有消息列 - 我的消息列s + 我的消息列 加密被错误地配置了,所以你无法发送消息。点击以打开设置。 加密被错误地配置了,所以你无法发送消息。请联系管理员将加密还原到有效的状态。 - %1$s、%2$s与其他人 + %1$s、%2$s 与其他人 %1$s与%2$s 共享屏幕 停止共享屏幕 @@ -2526,32 +2526,32 @@ 进一步了解 试试看 停用 - 查看Threads + 查看消息列 分钟 小时 - 一些用户已被取消忽略 初始同步请求 - %1$s与其他%2$d人 + %1$s 与其他 %2$d人 正在更新你的数据…… - 自动批准Element通话组件,授予相机/麦克风权限 - 启用Element通话权限捷径 + 自动允许 Element 通话小部件并授予相机/麦克风访问权限 + 启用 Element 通话权限快捷方式 实时位置 这个QR码看起来不正常。请尝试用另一个方法验证。 你无法访问加密消息历史。重置你的安全消息备份和验证密钥以重新开始。 无法验证此设备 你的服务器地址是什么? 你的对话发生的地方 - %1$s和%2$s + %1$s 和 %2$s 电子邮件未确认,检查你的收件箱 无法加载地图 \n此主服务器可能没有设置好显示地图。 打开设置 全部聊天 为获得最佳安全性,请验证你的会话,并从任何你不认识或不再使用的会话登出。 - 其他会话 + 其它会话 会话 打开空间列表 创建新对话或房间 @@ -2570,8 +2570,8 @@ 开始聊天 抱歉,未发现此房间。 \n请晚些重试。%s - 未验证 · 上次活跃 %1$s - 已验证 · 上次活跃 %1$s + 未验证 · 上次活动 %1$s + 已验证 · 上次活动 %1$s 查看全部(%1$d) 查看详情 验证会话 @@ -2587,32 +2587,32 @@ 没有新的东西。 你的新请求和邀请会在这里。 - %1$d+天不活跃(%2$s) + 闲置 %1$d+ 天 (%2$s) 安全建议 按照这些建议改善你的账户安全。 未验证的会话 验证未验证的会话或从之登出。 - 不活跃的会话 + 闲置会话 请考虑从不再使用的旧会话(%1$d天或更久)登出。 - 欢迎来到${app_name}, + 欢迎来到 ${app_name}, \n%s。 - 未读消息会在这里显示。 + 当您有一些未读消息时,这里会显示您的未读消息。 提供反馈 点击右上角查看反馈选项。 试用 空间是对房间和人进行分组的新方式。创建一个空间来开始吧。 启用新布局 IP地址 - 验证你的会话以增强消息传输的安全性,或从那些你不认识或不再使用的会话登出。 + 验证您的会话以增强安全消息传递或从您不再识别或不再使用的会话中登出。 尚未准备好安全收发消息 准备好安全收发消息 已验证 全部会话 - 筛选 - 上次活跃%1$s + 过滤器 + 上次活动 %1$s 设备 会话 当前会话 @@ -2624,5 +2624,147 @@ 启用延迟的私聊消息 简化的Element,带有可选的标签 无痕键盘 - 要求键盘不要基于你在对话中的输入更新任何个性化数据,如输入历史和字典。请注意,某些键盘可能不会遵守此设置。 + 请求键盘不要根据您在对话中输入的内容更新任何个性化数据,例如输入历史记录和字典。 请注意,某些键盘可能不遵守此设置。 + ${app_name}需要权限来显示通知。通知可以显示消息、邀请等。 +\n +\n请在下个弹窗允许访问以便查看通知。 + 试用富文本编辑器(纯文本模式即将到来) + 启用富文本编辑器 + 折叠 %s 子空间 + 展开 %s 子空间 + 启用新的会话管理器 + 访问空间 + 欢迎使用新视图! + ⚠ 此房间里有未经验证的设备,它们将无法解密你发送的消息。 + 永远不要向这个房间里未经验证的会话发送加密的消息。 + %s +\n看起来有点空荡荡的。 + 能够在房间时间线中录制和发送语音广播。 + 启用语音广播(正在积极开发中) + 记录客户端名称、版本和网址,以便在会话管理器中更轻松地识别会话。 + 启用客户端信息记录 + 对所有会话有更好的可见性和控制。 + 您加入的直接消息和聊天室中的其他用户可以查看您的会话的完整列表。 +\n +\n这让他们确信他们真的在与您交谈,但这也意味着他们可以看到您在此处输入的会话名称。 + 重命名会话 + 已验证会话已使用您的凭据登录,然后使用您的安全密码或通过交叉验证进行验证。 +\n +\n这意味着他们持有您之前消息的加密密钥,并向您正在与之通信的其他用户确认这些会话确实是您。 + 闲置会话是您一段时间未使用的会话,但它们会继续接收加密密钥。 +\n +\n删除闲置会话可以提高安全性和性能,并使您更容易识别新会话是否可疑。 + 闲置会话 + 您可以使用此设备通过二维码登录移动设备或网络设备。 有两种方法可以做到这一点: + 使用二维码登录 + 请注意,与您交流的人也可以看到会话名称。 + 自定义会话名称可以帮助您更轻松地识别您的设备。 + 重命名会话 + 操作系统 + 型号 + 浏览器 + 网址 + 版本 + 名称 + 应用 + 上次活动 + 会话名称 + 接收有关此会话的推送通知。 + 推送通知 + 应用程序、设备和活动信息。 + 会话详情 + 登出此会话 + 清除过滤器 + 未找到闲置会话。 + 未找到未验证的会话。 + 未找到已验证的会话。 + + 考虑登出您不再使用的旧会话(%1$d 天或更长时间)。 + + 闲置 + 未验证 + 为获得最佳安全性,请从您不认识或不再使用的任何会话中登出。 + 已验证 + 过滤器 + + 闲置 %1$d 天或更长时间 + + 未验证 + 未验证 · 您当前的会话 + 验证您当前的会话以显示此会话的验证状态。 + 未知的验证状态 + 开始语音广播 + 缓冲 + 暂停语音广播 + 实时 + 知道了 + 应用下划线格式 + 应用删除线格式 + 应用斜体格式 + 应用粗体格式 + 请确保您知道此代码的来源。 通过链接设备,您将为某人提供对您帐户的完全访问权限。 + 确认 + 再试一次 + 不匹配? + 登录 + 连接到设备 + 扫描二维码 + 登录移动设备? + 在此设备中显示二维码 + 选择“扫描二维码” + 从登录屏幕开始 + 选择“使用二维码登录” + 从登录屏幕开始 + 选择“显示二维码” + 转到设置 -> 安全和隐私 + 在您的其它设备上打开应用程序 + 主服务器不支持二维码登录。 + 登录已在另一台设备上取消。 + 该二维码无效。 + 另一台设备必须登录。 + 另一台设备已登录。 + 链接未在规定时间内完成。 + 设置安全消息传递时遇到安全问题。 以下其中一项可能会受到损害:您的家庭服务器; 您的互联网连接; 您的设备; + 请求失败。 + 该请求在另一台设备上被拒绝。 + 不支持与此设备链接。 + 连接不成功 + 检查您已登录的设备,应显示以下代码。 确认以下代码与该设备匹配: + 已建立安全连接 + 使用已退出登录的设备扫描下方二维码。 + 使用您已登录的设备扫描下方二维码: + 使用二维码登录 + 使用此设备上的相机扫描其它设备上显示的二维码: + 扫描二维码 + 3 + 2 + 1 + 为了简化您的 ${app_name},选项卡现在是可选的。 使用右上角的菜单管理它们。 + 无需报告。 + 适用于团队、朋友和组织的一体化安全聊天应用程序。 创建一个聊天室,或加入一个现有的房间,开始。 + 空间是一种对房间和人员进行分组的新方式。 使用右下角的按钮添加现有房间或创建新房间。 + 已验证会话 + 未验证会话是使用您的凭据登录但未经交叉验证的会话。 +\n +\n您应特别确定您识别这些会话,因为它们可能代表未经授权使用您的帐户。 + 未验证会话 + 闲置 + 会话名称 + 验证或登出此会话以获得最佳安全性和可靠性。 + 播放或恢复语音广播 + 此设备无法保证此加密消息的真实性。 + 将 (╯°□°)╯︵ ┻━┻ 添加到纯文本消息中 + ${app_name} 需要显示通知的权限。 +\n请授予权限。 + 打开开发者工具屏幕 + 🔒 你已在安全设置中为所有房间启用了仅对已验证会话加密。 + 授予权限 + 停止语音广播录制 + 暂停语音广播录制 + 继续语音广播录制 + 扫描QR码 + 语音广播 + 已启用: + 会话ID: + 出了点差错。请检查您的网络连接并重试。 \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index c9057cd289..739ea09755 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -942,7 +942,7 @@ 在您新增電話號碼後,探索選項將會出現。 與您的身份識別伺服器斷線代表您無法被其他使用者探索,且您將無法透過電子郵件或電話邀請其他人。 可探索的電話號碼 - 我們將會傳送電子郵件到 %s,請檢查您的電子郵件並在確認連結上點選 + 我們已傳送電子郵件到 %s,請檢查您的電子郵件並在確認連結上點選 輸入身份識別伺服器 URL 無法連線到身份識別伺服器 請輸入身份識別伺服器 URL @@ -2731,9 +2731,9 @@ 從登入畫面開始 選取「使用 QR code 登入」 從登入畫面開始 - 選取「在此裝置上顯示 QR code」 - 到「設定」→「安全與隱私」→「顯示所有工作階段」 - 在您的其他裝置上開啟 ${app_name} + 選取「顯示 QR code」 + 到「設定」→「安全與隱私」 + 在您的其他裝置上開啟應用程式 請求在另一台裝置上被拒絕。 連結未在規定時間內完成。 不支援與其裝置連結。 @@ -2751,4 +2751,34 @@ 您可以使用此裝置透過 QR code 登入移動裝置或網路裝置。有兩種方法可以作到: 使用 QR code 登入 掃描 QR code + 家伺服器不支援使用 QR code 登入。 + 登入已在其他裝置上取消。 + 該 QR code 無效。 + 其他裝置必須登入。 + 其他裝置已登入。 + 設定安全訊息傳遞時遇到安全問題。以下其中一項可能已被駭入:您的家伺服器、您的網際網路連線、您的裝置; + 請求失敗。 + 可以在聊天室時間軸中錄製並傳送語音廣播。 + 啟用語音廣播(正在積極開發中) + 正在緩衝 + 暫停語音廣播 + 播放或繼續語音廣播 + 停止語音廣播錄製 + 暫停語音廣播錄製 + 繼續語音廣播錄製 + 直播 + 選取工作階段 + 聯絡人 + 相機 + 位置 + 投票 + 音訊廣播 + 附件 + 貼圖 + 照片媒體庫 + 取消選取全部 + 選取全部 + + 已選取 %1$d + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index fac36ffa52..897c2853d8 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -1,6 +1,13 @@ + + + %1$d selected + %1$d selected + + + %s\'s invitation Your invitation %1$s created the room @@ -407,6 +414,8 @@ Learn more Next Got it + Select all + Deselect all Copied to clipboard @@ -3078,6 +3087,14 @@ %1$s (%2$s) (%1$s) + Live + Resume voice broadcast record + Pause voice broadcast record + Stop voice broadcast record + Play or resume voice broadcast + Pause voice broadcast + Buffering + Anyone in %s will be able to find and join this room - no need to manually invite everyone. You’ll be able to change this in room settings anytime. Anyone in a parent space will be able to find and join this room - no need to manually invite everyone. You’ll be able to change this in room settings anytime. @@ -3197,6 +3214,15 @@ Share location Start a voice broadcast + Photo library + Stickers + Attachments + Voice broadcast + Polls + Location + Camera + Contact + Show less "%1$d more" @@ -3311,6 +3337,7 @@ No unverified sessions found. No inactive sessions found. Clear Filter + Select sessions Sign out of this session Session details Application, device, and activity information. @@ -3386,9 +3413,16 @@ Linking with this device is not supported. The linking wasn’t completed in the required time. The request was denied on the other device. - Open ${app_name} on your other device - Go to Settings -> Security & Privacy -> Show All Sessions - Select \'Show QR code in this device\' + The request failed. + 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); + The other device is already signed in. + The other device must be signed in. + That QR code is invalid. + The sign in was cancelled on the other device. + The homeserver doesn\'t support sign in with QR code. + Open the app on your other device + Go to Settings -> Security & Privacy + Select \'Show QR code\' Start at the sign in screen Select \'Sign in with QR code\' Start at the sign in screen diff --git a/library/ui-styles/src/main/res/values/dimens.xml b/library/ui-styles/src/main/res/values/dimens.xml index 52d16eae7d..50d5aaf014 100644 --- a/library/ui-styles/src/main/res/values/dimens.xml +++ b/library/ui-styles/src/main/res/values/dimens.xml @@ -73,6 +73,9 @@ 12dp 22dp + + 48dp + 112dp diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index 4a6c0edf10..968d8515ac 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -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()}\"" diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt index 7119563617..00d74ab446 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt @@ -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 = emptyList() ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/extensions/MetricsExtensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/extensions/MetricsExtensions.kt new file mode 100644 index 0000000000..9487a27086 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/extensions/MetricsExtensions.kt @@ -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, 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. + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/logger/LoggerTag.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/logger/LoggerTag.kt index ae65963f37..22af8cebbd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/logger/LoggerTag.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/logger/LoggerTag.kt @@ -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 diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/DownloadDeviceKeysMetricsPlugin.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/DownloadDeviceKeysMetricsPlugin.kt new file mode 100644 index 0000000000..66ec0abf51 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/DownloadDeviceKeysMetricsPlugin.kt @@ -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") + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/MetricPlugin.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/MetricPlugin.kt new file mode 100644 index 0000000000..3a4b13c494 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/MetricPlugin.kt @@ -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 + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/Rendezvous.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/Rendezvous.kt new file mode 100644 index 0000000000..f724ac4b62 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/Rendezvous.kt @@ -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() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousChannel.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousChannel.kt new file mode 100644 index 0000000000..0956a5b0a0 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousChannel.kt @@ -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() +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousFailureReason.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousFailureReason.kt new file mode 100644 index 0000000000..18e625d825 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousFailureReason.kt @@ -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) +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousTransport.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousTransport.kt new file mode 100644 index 0000000000..81632e951a --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/RendezvousTransport.kt @@ -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() +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/channels/ECDHRendezvousChannel.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/channels/ECDHRendezvousChannel.kt new file mode 100644 index 0000000000..c1d6b1b70e --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/channels/ECDHRendezvousChannel.kt @@ -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() + + 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() + plainText.addAll(encryptCipher.update(Base64.decode(payload.ciphertext, Base64.NO_WRAP)).toList()) + plainText.addAll(encryptCipher.doFinal().toList()) + + return plainText.toByteArray() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/ECDHRendezvous.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/ECDHRendezvous.kt new file mode 100644 index 0000000000..55bac6397e --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/ECDHRendezvous.kt @@ -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 +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/ECDHRendezvousCode.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/ECDHRendezvousCode.kt new file mode 100644 index 0000000000..575b5d4bfd --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/ECDHRendezvousCode.kt @@ -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 +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Outcome.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Outcome.kt new file mode 100644 index 0000000000..0ebd1f88b3 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Outcome.kt @@ -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") +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Payload.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Payload.kt new file mode 100644 index 0000000000..04631ce959 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Payload.kt @@ -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? = 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 +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/PayloadType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/PayloadType.kt new file mode 100644 index 0000000000..33beb1f525 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/PayloadType.kt @@ -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") +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Protocol.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Protocol.kt new file mode 100644 index 0000000000..6fce2fa11c --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/Protocol.kt @@ -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") +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousError.kt new file mode 100644 index 0000000000..c52b11a322 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousError.kt @@ -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) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousIntent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousIntent.kt new file mode 100644 index 0000000000..65037e1252 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousIntent.kt @@ -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 +} diff --git a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginErrorType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousTransportDetails.kt similarity index 69% rename from vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginErrorType.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousTransportDetails.kt index 9a6cc13de0..1bde43ab7e 100644 --- a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginErrorType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousTransportDetails.kt @@ -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 +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousTransportType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousTransportType.kt new file mode 100644 index 0000000000..6fca7efa71 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/RendezvousTransportType.kt @@ -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") +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/SecureRendezvousChannelAlgorithm.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/SecureRendezvousChannelAlgorithm.kt new file mode 100644 index 0000000000..75f0024fda --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/SecureRendezvousChannelAlgorithm.kt @@ -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") +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/SimpleHttpRendezvousTransportDetails.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/SimpleHttpRendezvousTransportDetails.kt new file mode 100644 index 0000000000..049aa8b756 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/model/SimpleHttpRendezvousTransportDetails.kt @@ -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) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/transports/SimpleHttpRendezvousTransport.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/transports/SimpleHttpRendezvousTransport.kt new file mode 100644 index 0000000000..620b599e3d --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/transports/SimpleHttpRendezvousTransport.kt @@ -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") + } + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt index 71daf4cc4f..1f16041b54 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt @@ -401,7 +401,7 @@ fun Event.getRelationContent(): RelationDefaultContent? { when (getClearType()) { EventType.STICKER -> getClearContent().toModel()?.relatesTo in EventType.BEACON_LOCATION_DATA -> getClearContent().toModel()?.relatesTo - else -> null + else -> getClearContent()?.get("m.relates_to")?.toContent().toModel() } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt index 8c14ca892a..773e870ffd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt @@ -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 { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt index ff4977491f..b63656dc50 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt @@ -97,6 +97,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. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt index 1824d5dc6c..9ac33c0545 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/Timeline.kt @@ -106,6 +106,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) = Unit diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt index e5ac0a39b2..7eb44c1350 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt @@ -47,6 +47,11 @@ data class RoomSync( */ @Json(name = "unread_notifications") val unreadNotifications: RoomSyncUnreadNotifications? = null, + /** + * The count of threads with unread notifications (not the total # of notifications in all threads). + */ + @Json(name = "unread_thread_notifications") val unreadThreadNotifications: Map? = null, + /** * The room summary. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncUnreadThreadNotifications.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncUnreadThreadNotifications.kt new file mode 100644 index 0000000000..70524d299a --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncUnreadThreadNotifications.kt @@ -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 +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/HomeServerVersion.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/HomeServerVersion.kt index 75639c6a21..d443d6e3c8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/HomeServerVersion.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/HomeServerVersion.kt @@ -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) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt index 5e133fab9c..1245d8df4b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt @@ -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 } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt index 4f3900adb9..2ac6b8c854 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt @@ -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) } @@ -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() + + 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) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SASDefaultVerificationTransaction.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SASDefaultVerificationTransaction.kt index 1cbaff059a..29b416bb82 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SASDefaultVerificationTransaction.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SASDefaultVerificationTransaction.kt @@ -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 { return getEmojiCodeRepresentation(shortCodeBytes!!) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt index 9a2c32f97c..58c015b13b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt @@ -56,6 +56,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 javax.inject.Inject @@ -64,7 +66,7 @@ internal class RealmSessionStoreMigration @Inject constructor( private val normalizer: Normalizer ) : MatrixRealmMigration( dbName = "Session", - schemaVersion = 39L, + schemaVersion = 41L, ) { /** * Forces all RealmSessionStoreMigration instances to be equal. @@ -113,5 +115,7 @@ 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() } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/HomeServerCapabilitiesMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/HomeServerCapabilitiesMapper.kt index 63fa101c45..3528ca0051 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/HomeServerCapabilitiesMapper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/HomeServerCapabilitiesMapper.kt @@ -45,6 +45,7 @@ internal object HomeServerCapabilitiesMapper { canUseThreading = entity.canUseThreading, canControlLogoutDevices = entity.canControlLogoutDevices, canLoginWithQrCode = entity.canLoginWithQrCode, + canUseThreadReadReceiptsAndNotifications = entity.canUseThreadReadReceiptsAndNotifications ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/RoomSummaryMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/RoomSummaryMapper.kt index 72b0f7a043..6e9fff78e1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/RoomSummaryMapper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/RoomSummaryMapper.kt @@ -61,6 +61,8 @@ internal class RoomSummaryMapper @Inject constructor( otherMemberIds = roomSummaryEntity.otherMemberIds.toList(), highlightCount = roomSummaryEntity.highlightCount, notificationCount = roomSummaryEntity.notificationCount, + threadHighlightCount = roomSummaryEntity.threadHighlightCount, + threadNotificationCount = roomSummaryEntity.threadNotificationCount, hasUnreadMessages = roomSummaryEntity.hasUnreadMessages, tags = tags, typingUsers = typingUsers, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo040.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo040.kt new file mode 100644 index 0000000000..b3e02342dd --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo040.kt @@ -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() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo041.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo041.kt new file mode 100644 index 0000000000..b58d80e50a --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo041.kt @@ -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) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/HomeServerCapabilitiesEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/HomeServerCapabilitiesEntity.kt index cfa02b2c74..89f1e50b30 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/HomeServerCapabilitiesEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/HomeServerCapabilitiesEntity.kt @@ -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 diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomSummaryEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomSummaryEntity.kt index 471bec59af..650dd3c5cb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomSummaryEntity.kt @@ -115,6 +115,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 diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt index 30010f90fd..1b4b359916 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt @@ -110,8 +110,7 @@ internal fun RealmQuery.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) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageExifTagRemover.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageExifTagRemover.kt index 3fa9ffb0e1..1531d70083 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageExifTagRemover.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageExifTagRemover.kt @@ -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, + ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt index 676a4f6a38..77c5649709 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt @@ -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 diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/RoomEventFilter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/RoomEventFilter.kt index 220c401137..4bb66a6159 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/RoomEventFilter.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/RoomEventFilter.kt @@ -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) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt index 2c3cb440b6..a5953d870c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt @@ -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() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt index 6979d42827..7c83a4afa7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt @@ -39,6 +39,7 @@ import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.sync.model.RoomSyncSummary import org.matrix.android.sdk.api.session.sync.model.RoomSyncUnreadNotifications +import org.matrix.android.sdk.api.session.sync.model.RoomSyncUnreadThreadNotifications import org.matrix.android.sdk.internal.crypto.EventDecryptor import org.matrix.android.sdk.internal.crypto.crosssigning.DefaultCrossSigningService import org.matrix.android.sdk.internal.database.mapper.ContentMapper @@ -91,6 +92,7 @@ internal class RoomSummaryUpdater @Inject constructor( membership: Membership? = null, roomSummary: RoomSyncSummary? = null, unreadNotifications: RoomSyncUnreadNotifications? = null, + unreadThreadNotifications: Map? = null, updateMembers: Boolean = false, inviterId: String? = null, aggregator: SyncResponsePostTreatmentAggregator? = null @@ -111,6 +113,14 @@ internal class RoomSummaryUpdater @Inject constructor( roomSummaryEntity.highlightCount = unreadNotifications?.highlightCount ?: 0 roomSummaryEntity.notificationCount = unreadNotifications?.notificationCount ?: 0 + roomSummaryEntity.threadHighlightCount = unreadThreadNotifications + ?.count { (it.value.highlightCount ?: 0) > 0 } + ?: 0 + + roomSummaryEntity.threadNotificationCount = unreadThreadNotifications + ?.count { (it.value.notificationCount ?: 0) > 0 } + ?: 0 + if (membership != null) { roomSummaryEntity.membership = membership } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt index 20094e4be8..2d6082f9b5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt @@ -22,6 +22,8 @@ import io.realm.Sort import org.matrix.android.sdk.api.session.events.model.getRelationContent import org.matrix.android.sdk.api.session.events.model.isImageMessage import org.matrix.android.sdk.api.session.events.model.isVideoMessage +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.database.RealmSessionProvider @@ -74,7 +76,13 @@ internal class TimelineEventDataSource @Inject constructor( .distinct(TimelineEventEntityFields.EVENT_ID) .findAll() .mapNotNull { - timelineEventMapper.map(it).takeIf { it.root.getRelationContent()?.takeIf { it.type == eventType && it.eventId == eventId } != null } + timelineEventMapper.map(it) + .takeIf { + val isEventRelatedTo = it.root.getRelationContent()?.takeIf { it.type == eventType && it.eventId == eventId } != null + val isContentRelatedTo = it.root.getClearContent()?.toModel() + ?.relatesTo?.takeIf { it.type == eventType && it.eventId == eventId } != null + isEventRelatedTo || isContentRelatedTo + } } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt index ea296d379d..bc1a69769d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt @@ -140,7 +140,7 @@ internal class DefaultSyncTask @Inject constructor( executeRequest(globalErrorReceiver) { syncAPI.sync( params = requestParams, - readTimeOut = readTimeOut + readTimeOut = readTimeOut, ) } } @@ -178,7 +178,7 @@ internal class DefaultSyncTask @Inject constructor( syncRequestStateTracker.setSyncRequestState( SyncRequestState.IncrementalSyncParsing( rooms = nbRooms, - toDevice = nbToDevice + toDevice = nbToDevice, ) ) syncResponseHandler.handleResponse(syncResponse, token, null) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index a2f2251b70..2825be8291 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -287,6 +287,7 @@ internal class RoomSyncHandler @Inject constructor( Membership.JOIN, roomSync.summary, roomSync.unreadNotifications, + roomSync.unreadThreadNotifications, updateMembers = hasRoomMember, aggregator = aggregator ) @@ -372,7 +373,8 @@ internal class RoomSyncHandler @Inject constructor( roomEntity.chunks.clearWith { it.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true) } roomTypingUsersHandler.handle(realm, roomId, null) roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.LEAVE) - roomSummaryUpdater.update(realm, roomId, membership, roomSync.summary, roomSync.unreadNotifications, aggregator = aggregator) + roomSummaryUpdater.update(realm, roomId, membership, roomSync.summary, + roomSync.unreadNotifications, roomSync.unreadThreadNotifications, aggregator = aggregator) return roomEntity } diff --git a/tools/danger/dangerfile.js b/tools/danger/dangerfile.js index 1a36474470..d0b4e6d300 100644 --- a/tools/danger/dangerfile.js +++ b/tools/danger/dangerfile.js @@ -81,6 +81,8 @@ const allowList = [ "Florian14", "ganfra", "jmartinesp", + "jonnyandrew", + "kittykat", "langleyd", "MadLittleMods", "manuroe", diff --git a/tools/jitsi/build_jisti_libs.sh b/tools/jitsi/build_jisti_libs.sh index 445dc5e0fe..91c32fc597 100755 --- a/tools/jitsi/build_jisti_libs.sh +++ b/tools/jitsi/build_jisti_libs.sh @@ -25,12 +25,8 @@ export LIBRE_BUILD=true cd jitsi-meet -# This is commit after version 2.2.2, which does not compile -# git checkout 5a934c071a5cbe64de275a25d0ed62d8193cdd03 - -# Changelog: https://github.com/jitsi/jitsi-meet-release-notes/blob/master/CHANGELOG-MOBILE-SDKS.md - -git checkout android-sdk-5.0.2 +# Get the latest version from the changelog: https://github.com/jitsi/jitsi-meet-release-notes/blob/master/CHANGELOG-MOBILE-SDKS.md +git checkout android-sdk-6.2.2 echo echo "##################################################" diff --git a/vector-app/build.gradle b/vector-app/build.gradle index ca77e4b86f..9a0bfdfa63 100644 --- a/vector-app/build.gradle +++ b/vector-app/build.gradle @@ -37,7 +37,7 @@ ext.versionMinor = 5 // Note: even values are reserved for regular release, odd values for hotfix release. // When creating a hotfix, you should decrease the value, since the current value // is the value for the next regular release. -ext.versionPatch = 4 +ext.versionPatch = 6 static def getGitTimestamp() { def cmd = 'git show -s --format=%ct' @@ -372,7 +372,7 @@ dependencies { debugImplementation 'com.facebook.soloader:soloader:0.10.4' debugImplementation "com.kgurgul.flipper:flipper-realm-android:2.2.0" - gplayImplementation "com.google.android.gms:play-services-location:20.0.0" + gplayImplementation "com.google.android.gms:play-services-location:21.0.0" // UnifiedPush gplay flavor only gplayImplementation('com.google.firebase:firebase-messaging:23.1.0') { exclude group: 'com.google.firebase', module: 'firebase-core' diff --git a/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ViewActionsExt.kt b/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ViewActionsExt.kt new file mode 100644 index 0000000000..c1e5c0164b --- /dev/null +++ b/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ViewActionsExt.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.espresso.tools + +import android.view.View +import androidx.test.espresso.PerformException +import androidx.test.espresso.UiController +import androidx.test.espresso.ViewAction +import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import com.google.android.material.tabs.TabLayout +import org.hamcrest.Matchers.allOf + +fun selectTabAtPosition(tabIndex: Int): ViewAction { + return object : ViewAction { + override fun getDescription() = "with tab at index $tabIndex" + + override fun getConstraints() = allOf(isDisplayed(), isAssignableFrom(TabLayout::class.java)) + + override fun perform(uiController: UiController, view: View) { + val tabLayout = view as TabLayout + val tabAtIndex: TabLayout.Tab = tabLayout.getTabAt(tabIndex) + ?: throw PerformException.Builder() + .withCause(Throwable("No tab at index $tabIndex")) + .build() + + tabAtIndex.select() + } + } +} diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt index d4878b8dcc..52607bd9a1 100644 --- a/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt @@ -135,6 +135,14 @@ class UiAllScreensSanityTest { elementRobot.space { selectSpace(spaceName) } + elementRobot.layoutPreferences { + crawl() + } + + elementRobot.roomList { + crawlTabs() + } + elementRobot.withDeveloperMode { settings { advancedSettings { crawlDeveloperOptions() } diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt index d9dfb0facf..8f1df52863 100644 --- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt +++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt @@ -17,8 +17,10 @@ package im.vector.app.ui.robot import android.view.View +import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.closeSoftKeyboard import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.action.ViewActions import androidx.test.espresso.action.ViewActions.click @@ -94,6 +96,18 @@ class ElementRobot( waitUntilViewVisible(withId(R.id.roomListContainer)) } + fun layoutPreferences(block: LayoutPreferencesRobot.() -> Unit) { + openActionBarOverflowOrOptionsMenu( + ApplicationProvider.getApplicationContext() + ) + clickOn(R.string.home_layout_preferences) + waitUntilDialogVisible(withId(R.id.home_layout_settings_recents)) + + block(LayoutPreferencesRobot()) + + pressBack() + } + fun newDirectMessage(block: NewDirectMessageRobot.() -> Unit) { if (labsPreferences.isNewAppLayoutEnabled) { clickOn(R.id.newLayoutCreateChatButton) diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/LayoutPreferencesRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/LayoutPreferencesRobot.kt new file mode 100644 index 0000000000..429511e10f --- /dev/null +++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/LayoutPreferencesRobot.kt @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.ui.robot + +import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn +import im.vector.app.R + +class LayoutPreferencesRobot { + + fun crawl() { + toggleRecents() + toggleFilters() + useAZOrderd() + useActivityOrder() + } + + fun toggleRecents() { + clickOn(R.id.home_layout_settings_recents) + } + + fun toggleFilters() { + clickOn(R.id.home_layout_settings_filters) + } + + fun useAZOrderd() { + clickOn(R.id.home_layout_settings_sort_name) + } + + fun useActivityOrder() { + clickOn(R.id.home_layout_settings_sort_activity) + } +} diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt index e4984aeed0..cbc46f15e7 100644 --- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt +++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt @@ -21,29 +21,41 @@ import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.action.ViewActions import androidx.test.espresso.contrib.RecyclerViewActions -import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn import im.vector.app.R +import im.vector.app.espresso.tools.selectTabAtPosition import im.vector.app.espresso.tools.waitUntilActivityVisible import im.vector.app.espresso.tools.waitUntilDialogVisible +import im.vector.app.espresso.tools.waitUntilViewVisible +import im.vector.app.features.home.HomeActivity +import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import im.vector.app.features.roomdirectory.RoomDirectoryActivity import im.vector.app.ui.robot.settings.labs.LabFeaturesPreferences +import im.vector.app.waitForView class RoomListRobot(private val labsPreferences: LabFeaturesPreferences) { fun openRoom(roomName: String, block: RoomDetailRobot.() -> Unit) { - clickOn(roomName) + onView(withId(R.id.roomListView)) + .perform( + RecyclerViewActions.actionOnItem( + hasDescendant(withText(roomName)), + ViewActions.click() + ) + ) block(RoomDetailRobot()) pressBack() } fun verifyCreatedRoom() { - onView(ViewMatchers.withId(R.id.roomListView)) + onView(withId(R.id.roomListView)) .perform( RecyclerViewActions.actionOnItem( - ViewMatchers.hasDescendant(withText(R.string.room_displayname_empty_room)), + hasDescendant(withText(R.string.room_displayname_empty_room)), ViewActions.longClick() ) ) @@ -53,7 +65,7 @@ class RoomListRobot(private val labsPreferences: LabFeaturesPreferences) { fun newRoom(block: NewRoomRobot.() -> Unit) { if (labsPreferences.isNewAppLayoutEnabled) { clickOn(R.id.newLayoutCreateChatButton) - waitUntilDialogVisible(ViewMatchers.withId(R.id.create_room)) + waitUntilDialogVisible(withId(R.id.create_room)) clickOn(R.id.create_room) } else { clickOn(R.id.createGroupRoomButton) @@ -67,4 +79,19 @@ class RoomListRobot(private val labsPreferences: LabFeaturesPreferences) { pressBack() } } + + fun crawlTabs() { + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.roomListContainer)) + } + + selectFilterTab(HomeRoomFilter.UNREADS) + waitForView(withId(R.id.emptyTitleView)) + selectFilterTab(HomeRoomFilter.ALL) + waitForView(withId(R.id.roomNameView)) + } + + fun selectFilterTab(filter: HomeRoomFilter) { + onView(withId(R.id.home_filter_tabs_tabs)).perform(selectTabAtPosition(filter.ordinal)) + } } diff --git a/vector-app/src/debug/AndroidManifest.xml b/vector-app/src/debug/AndroidManifest.xml index a7867f4081..be2aadbeaf 100644 --- a/vector-app/src/debug/AndroidManifest.xml +++ b/vector-app/src/debug/AndroidManifest.xml @@ -4,6 +4,7 @@ + diff --git a/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt b/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt index f431192efd..af63e6eae0 100644 --- a/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt +++ b/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt @@ -35,6 +35,7 @@ import im.vector.app.core.utils.registerForPermissionsResult import im.vector.app.core.utils.toast import im.vector.app.features.debug.analytics.DebugAnalyticsActivity import im.vector.app.features.debug.features.DebugFeaturesSettingsActivity +import im.vector.app.features.debug.jitsi.DebugJitsiActivity import im.vector.app.features.debug.leak.DebugMemoryLeaksActivity import im.vector.app.features.debug.sas.DebugSasEmojiActivity import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity @@ -121,6 +122,9 @@ class DebugMenuActivity : VectorBaseActivity() { views.debugPermission.setOnClickListener { startActivity(Intent(this, DebugPermissionActivity::class.java)) } + views.debugJitsi.setOnClickListener { + startActivity(Intent(this, DebugJitsiActivity::class.java)) + } } private fun openPrivateSettings() { @@ -175,7 +179,7 @@ class DebugMenuActivity : VectorBaseActivity() { .setContentText("Content") // No effect because it's a group summary notif .setNumber(33) - .setSmallIcon(R.drawable.ic_status_bar) + .setSmallIcon(R.drawable.ic_notification) // This provocate the badge issue: no badge for group notification .setGroup("GroupKey") .setGroupSummary(true) @@ -208,7 +212,7 @@ class DebugMenuActivity : VectorBaseActivity() { // For shortcut on long press on launcher icon .setBadgeIconType(NotificationCompat.BADGE_ICON_NONE) .setStyle(messagingStyle1) - .setSmallIcon(R.drawable.ic_status_bar) + .setSmallIcon(R.drawable.ic_notification) .setGroup("GroupKey") .build() ) @@ -220,7 +224,7 @@ class DebugMenuActivity : VectorBaseActivity() { .setContentTitle("Title 2") .setContentText("Content 2") .setStyle(messagingStyle2) - .setSmallIcon(R.drawable.ic_status_bar) + .setSmallIcon(R.drawable.ic_notification) .setGroup("GroupKey") .build() ) diff --git a/vector-app/src/debug/java/im/vector/app/features/debug/jitsi/DebugJitsiActivity.kt b/vector-app/src/debug/java/im/vector/app/features/debug/jitsi/DebugJitsiActivity.kt new file mode 100644 index 0000000000..5c6c5d1898 --- /dev/null +++ b/vector-app/src/debug/java/im/vector/app/features/debug/jitsi/DebugJitsiActivity.kt @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.debug.jitsi + +import android.annotation.SuppressLint +import dagger.hilt.android.AndroidEntryPoint +import im.vector.app.core.platform.VectorBaseActivity +import im.vector.application.databinding.ActivityDebugJitsiBinding +import org.jitsi.meet.sdk.JitsiMeet + +@AndroidEntryPoint +class DebugJitsiActivity : VectorBaseActivity() { + + override fun getBinding() = ActivityDebugJitsiBinding.inflate(layoutInflater) + + override fun getCoordinatorLayout() = views.coordinatorLayout + + @SuppressLint("SetTextI18n") + override fun initUiAndData() { + val isCrashReportingDisabled = JitsiMeet.isCrashReportingDisabled(this) + views.status.text = "Jitsi crash reporting is disabled: $isCrashReportingDisabled" + + views.splash.setOnClickListener { + JitsiMeet.showSplashScreen(this) + } + + views.dev.setOnClickListener { + JitsiMeet.showDevOptions() + } + } +} diff --git a/vector-app/src/debug/java/im/vector/app/flipper/VectorFlipperProxy.kt b/vector-app/src/debug/java/im/vector/app/flipper/VectorFlipperProxy.kt index 2e4336c942..cbf9e4f11f 100644 --- a/vector-app/src/debug/java/im/vector/app/flipper/VectorFlipperProxy.kt +++ b/vector-app/src/debug/java/im/vector/app/flipper/VectorFlipperProxy.kt @@ -17,6 +17,7 @@ package im.vector.app.flipper import android.content.Context +import android.os.Build import com.facebook.flipper.android.AndroidFlipperClient import com.facebook.flipper.android.utils.FlipperUtils import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin @@ -31,6 +32,7 @@ import com.kgurgul.flipper.RealmDatabaseDriver import com.kgurgul.flipper.RealmDatabaseProvider import im.vector.app.core.debug.FlipperProxy import io.realm.RealmConfiguration +import okhttp3.Interceptor import org.matrix.android.sdk.api.Matrix import javax.inject.Inject import javax.inject.Singleton @@ -41,29 +43,43 @@ class VectorFlipperProxy @Inject constructor( ) : FlipperProxy { private val networkFlipperPlugin = NetworkFlipperPlugin() + private val isEnabled: Boolean + get() { + // https://github.com/facebook/flipper/issues/3572 + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { + return false + } + + return FlipperUtils.shouldEnableFlipper(context) + } + override fun init(matrix: Matrix) { + if (!isEnabled) return + SoLoader.init(context, false) - if (FlipperUtils.shouldEnableFlipper(context)) { - val client = AndroidFlipperClient.getInstance(context) - client.addPlugin(CrashReporterPlugin.getInstance()) - client.addPlugin(SharedPreferencesFlipperPlugin(context)) - client.addPlugin(InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())) - client.addPlugin(networkFlipperPlugin) - client.addPlugin( - DatabasesFlipperPlugin( - RealmDatabaseDriver( - context = context, - realmDatabaseProvider = object : RealmDatabaseProvider { - override fun getRealmConfigurations(): List { - return matrix.debugService().getAllRealmConfigurations() - } - }) - ) - ) - client.start() - } + val client = AndroidFlipperClient.getInstance(context) + client.addPlugin(CrashReporterPlugin.getInstance()) + client.addPlugin(SharedPreferencesFlipperPlugin(context)) + client.addPlugin(InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())) + client.addPlugin(networkFlipperPlugin) + client.addPlugin( + DatabasesFlipperPlugin( + RealmDatabaseDriver( + context = context, + realmDatabaseProvider = object : RealmDatabaseProvider { + override fun getRealmConfigurations(): List { + return matrix.debugService().getAllRealmConfigurations() + } + }) + ) + ) + client.start() } - override fun networkInterceptor() = FlipperOkhttpInterceptor(networkFlipperPlugin) + override fun networkInterceptor(): Interceptor? { + if (!isEnabled) return null + + return FlipperOkhttpInterceptor(networkFlipperPlugin) + } } diff --git a/vector-app/src/debug/res/layout/activity_debug_jitsi.xml b/vector-app/src/debug/res/layout/activity_debug_jitsi.xml new file mode 100644 index 0000000000..0a13594854 --- /dev/null +++ b/vector-app/src/debug/res/layout/activity_debug_jitsi.xml @@ -0,0 +1,47 @@ + + + + + + + + + +