diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
index 5ccd00a02b1..7eff52cc9fe 100644
--- a/.github/workflows/quality.yml
+++ b/.github/workflows/quality.yml
@@ -14,6 +14,7 @@ jobs:
- name: Run code quality check suite
run: ./tools/check/check_code_quality.sh
+# ktlint for all the modules
ktlint:
name: Kotlin Linter
runs-on: ubuntu-latest
@@ -23,12 +24,66 @@ jobs:
run: |
./gradlew ktlintCheck --continue
- name: Upload reports
+ if: always()
uses: actions/upload-artifact@v2
with:
name: ktlinting-report
- path: vector/build/reports/ktlint/*.*
+ path: |
+ */build/reports/ktlint/ktlint*/ktlint*.txt
+ - name: Handle Results
+ if: always()
+ id: ktlint-results
+ run: |
+ results="$(cat */*/build/reports/ktlint/ktlint*/ktlint*.txt */build/reports/ktlint/ktlint*/ktlint*.txt | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g")"
+ if [ -z "$results" ]; then
+ echo "::set-output name=add_comment::false"
+ else
+ body="👎\`Failed${results}\`"
+ body="${body//'%'/'%25'}"
+ body="${body//$'\n'/'%0A'}"
+ body="${body//$'\r'/'%0D'}"
+ body="$( echo $body | sed 's/\/home\/runner\/work\/element-android\/element-android\//\` \`/g')"
+ body="$( echo $body | sed 's/\/src\/main\/java\// 🔸 /g')"
+ body="$( echo $body | sed 's/im\/vector\/app\///g')"
+ body="$( echo $body | sed 's/im\/vector\/lib\/attachmentviewer\///g')"
+ body="$( echo $body | sed 's/im\/vector\/lib\/multipicker\///g')"
+ body="$( echo $body | sed 's/im\/vector\/lib\///g')"
+ body="$( echo $body | sed 's/org\/matrix\/android\/sdk\///g')"
+ body="$( echo $body | sed 's/\/src\/androidTest\/java\// 🔸 /g')"
+ echo "::set-output name=add_comment::true"
+ echo "::set-output name=body::$body"
+ fi
+ - name: Find Comment
+ if: always()
+ uses: peter-evans/find-comment@v1
+ id: fc
+ with:
+ issue-number: ${{ github.event.pull_request.number }}
+ comment-author: 'github-actions[bot]'
+ body-includes: Ktlint Results
+ - name: Add comment if needed
+ if: always() && steps.ktlint-results.outputs.add_comment == 'true'
+ uses: peter-evans/create-or-update-comment@v1
+ with:
+ comment-id: ${{ steps.fc.outputs.comment-id }}
+ issue-number: ${{ github.event.pull_request.number }}
+ body: |
+ ### Ktlint Results
+
+ ${{ steps.ktlint-results.outputs.body }}
+ edit-mode: replace
+ - name: Delete comment if needed
+ if: always() && steps.fc.outputs.comment-id != '' && steps.ktlint-results.outputs.add_comment == 'false'
+ uses: actions/github-script@v3
+ with:
+ script: |
+ github.issues.deleteComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: ${{ steps.fc.outputs.comment-id }}
+ })
-# Lint for main module and all the other modules
+# Lint for main module
android-lint:
name: Android Linter
runs-on: ubuntu-latest
@@ -45,6 +100,7 @@ jobs:
- name: Lint analysis
run: ./gradlew clean :vector:lint --stacktrace
- name: Upload reports
+ if: always()
uses: actions/upload-artifact@v2
with:
name: lint-report
@@ -73,8 +129,8 @@ jobs:
- name: Lint ${{ matrix.target }} release
run: ./gradlew clean lint${{ matrix.target }}Release --stacktrace
- name: Upload ${{ matrix.target }} linting report
- uses: actions/upload-artifact@v2
if: always()
+ uses: actions/upload-artifact@v2
with:
name: release-lint-report-${{ matrix.target }}
path: |
diff --git a/.github/workflows/triage-incoming.yml b/.github/workflows/triage-incoming.yml
index 4ecc8244241..6a22bf5223d 100644
--- a/.github/workflows/triage-incoming.yml
+++ b/.github/workflows/triage-incoming.yml
@@ -7,6 +7,8 @@ on:
jobs:
automate-project-columns:
runs-on: ubuntu-latest
+ # Skip in forks
+ if: github.repository == 'vector-im/element-android'
steps:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
with:
diff --git a/.github/workflows/triage-move-labelled.yml b/.github/workflows/triage-move-labelled.yml
index 67c4e9dbab6..e2f5cc32e91 100644
--- a/.github/workflows/triage-move-labelled.yml
+++ b/.github/workflows/triage-move-labelled.yml
@@ -3,11 +3,13 @@ name: Move labelled issues to correct boards and columns
on:
issues:
types: [labeled]
-
+
jobs:
move_needs_info_issues:
name: X-Needs-Info issues to Need info column on triage board
runs-on: ubuntu-latest
+ # Skip in forks
+ if: github.repository == 'vector-im/element-android'
steps:
- uses: konradpabjan/move-labeled-or-milestoned-issue@219d384e03fa4b6460cd24f9f37d19eb033a4338
with:
@@ -19,15 +21,17 @@ jobs:
add_priority_design_issues_to_project:
name: P1 X-Needs-Design to Design project board
runs-on: ubuntu-latest
+ # Skip in forks
if: >
- 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') ||
+ github.repository == 'vector-im/element-android' &&
+ 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') &&
- contains(github.event.issue.labels.*.name, 'O-Frequent'))
+ contains(github.event.issue.labels.*.name, 'S-Major') &&
+ contains(github.event.issue.labels.*.name, 'O-Frequent') ||
+ contains(github.event.issue.labels.*.name, 'A11y') &&
+ contains(github.event.issue.labels.*.name, 'O-Frequent'))
steps:
- uses: octokit/graphql-action@v2.x
id: add_to_project
@@ -47,36 +51,40 @@ jobs:
PROJECT_ID: "PN_kwDOAM0swc0sUA"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
-# delight_issues_to_board:
-# name: Spaces issues to new Delight project board
-# runs-on: ubuntu-latest
-# if: >
-# contains(github.event.issue.labels.*.name, 'A-Spaces') ||
-# contains(github.event.issue.labels.*.name, 'A-Space-Settings') ||
-# contains(github.event.issue.labels.*.name, 'A-Subspaces')
-# steps:
-# - uses: octokit/graphql-action@v2.x
-# with:
-# headers: '{"GraphQL-Features": "projects_next_graphql"}'
-# query: |
-# mutation add_to_project($projectid:ID!,$contentid:ID!) {
-# addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
-# projectNextItem {
-# id
-# }
-# }
-# }
-# projectid: ${{ env.PROJECT_ID }}
-# contentid: ${{ github.event.issue.node_id }}
-# env:
-# PROJECT_ID: "PN_kwDOAM0swc1HvQ"
-# GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
+ # delight_issues_to_board:
+ # name: Spaces issues to new Delight project board
+ # runs-on: ubuntu-latest
+ # # Skip in forks
+ # if: >
+ # github.repository == 'vector-im/element-android' &&
+ # contains(github.event.issue.labels.*.name, 'A-Spaces') ||
+ # contains(github.event.issue.labels.*.name, 'A-Space-Settings') ||
+ # contains(github.event.issue.labels.*.name, 'A-Subspaces')
+ # steps:
+ # - uses: octokit/graphql-action@v2.x
+ # with:
+ # headers: '{"GraphQL-Features": "projects_next_graphql"}'
+ # query: |
+ # mutation add_to_project($projectid:ID!,$contentid:ID!) {
+ # addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
+ # projectNextItem {
+ # id
+ # }
+ # }
+ # }
+ # projectid: ${{ env.PROJECT_ID }}
+ # contentid: ${{ github.event.issue.node_id }}
+ # env:
+ # PROJECT_ID: "PN_kwDOAM0swc1HvQ"
+ # GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
move_voice-message_issues:
name: A-Voice Messages to voice message board
runs-on: ubuntu-latest
+ # Skip in forks
if: >
- contains(github.event.issue.labels.*.name, 'A-Voice Messages')
+ github.repository == 'vector-im/element-android' &&
+ contains(github.event.issue.labels.*.name, 'A-Voice Messages')
steps:
- uses: octokit/graphql-action@v2.x
with:
@@ -98,8 +106,10 @@ jobs:
move_threads_issues:
name: A-Threads to Thread board
runs-on: ubuntu-latest
+ # Skip in forks
if: >
- contains(github.event.issue.labels.*.name, 'A-Threads')
+ github.repository == 'vector-im/element-android' &&
+ contains(github.event.issue.labels.*.name, 'A-Threads')
steps:
- uses: octokit/graphql-action@v2.x
with:
@@ -121,8 +131,10 @@ jobs:
move_message_bubbles_issues:
name: A-Message-Bubbles to Message bubbles board
runs-on: ubuntu-latest
+ # Skip in forks
if: >
- contains(github.event.issue.labels.*.name, 'A-Message-Bubbles')
+ github.repository == 'vector-im/element-android' &&
+ contains(github.event.issue.labels.*.name, 'A-Message-Bubbles')
steps:
- uses: octokit/graphql-action@v2.x
with:
diff --git a/.github/workflows/triage-move-unlabelled.yml b/.github/workflows/triage-move-unlabelled.yml
index 94bd049b919..eb90cdb5033 100644
--- a/.github/workflows/triage-move-unlabelled.yml
+++ b/.github/workflows/triage-move-unlabelled.yml
@@ -3,14 +3,15 @@ name: Move unlabelled from needs info columns to triaged
on:
issues:
types: [unlabeled]
-
+
jobs:
Move_Unabeled_Issue_On_Project_Board:
name: Move no longer X-Needs-Info issues to Triaged
runs-on: ubuntu-latest
+ # Skip in forks
if: >
- ${{
- !contains(github.event.issue.labels.*.name, 'X-Needs-Info') }}
+ github.repository == 'vector-im/element-android' &&
+ !contains(github.event.issue.labels.*.name, 'X-Needs-Info')
env:
BOARD_NAME: "Issue triage"
OWNER: ${{ github.repository_owner }}
diff --git a/.github/workflows/triage-priority-bugs.yml b/.github/workflows/triage-priority-bugs.yml
index 976879a3aee..daea78de191 100644
--- a/.github/workflows/triage-priority-bugs.yml
+++ b/.github/workflows/triage-priority-bugs.yml
@@ -7,23 +7,25 @@ on:
jobs:
p1_issues_to_team_workboard:
runs-on: ubuntu-latest
+ # Skip in forks
if: >
- (!contains(github.event.issue.labels.*.name, 'A-E2EE') &&
- !contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') &&
- !contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') &&
- !contains(github.event.issue.labels.*.name, 'A-E2EE-Key-Backup') &&
- !contains(github.event.issue.labels.*.name, 'A-E2EE-SAS-Verification') &&
- !contains(github.event.issue.labels.*.name, 'A-Spaces') &&
- !contains(github.event.issue.labels.*.name, 'A-Spaces-Settings') &&
- !contains(github.event.issue.labels.*.name, 'A-Subspaces')) &&
- (contains(github.event.issue.labels.*.name, 'T-Defect') &&
- contains(github.event.issue.labels.*.name, 'S-Critical') &&
- (contains(github.event.issue.labels.*.name, 'O-Frequent') ||
+ github.repository == 'vector-im/element-android' &&
+ (!contains(github.event.issue.labels.*.name, 'A-E2EE') &&
+ !contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') &&
+ !contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') &&
+ !contains(github.event.issue.labels.*.name, 'A-E2EE-Key-Backup') &&
+ !contains(github.event.issue.labels.*.name, 'A-E2EE-SAS-Verification') &&
+ !contains(github.event.issue.labels.*.name, 'A-Spaces') &&
+ !contains(github.event.issue.labels.*.name, 'A-Spaces-Settings') &&
+ !contains(github.event.issue.labels.*.name, 'A-Subspaces')) &&
+ (contains(github.event.issue.labels.*.name, 'T-Defect') &&
+ 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') &&
- contains(github.event.issue.labels.*.name, 'O-Frequent'))
+ contains(github.event.issue.labels.*.name, 'S-Major') &&
+ contains(github.event.issue.labels.*.name, 'O-Frequent') ||
+ contains(github.event.issue.labels.*.name, 'A11y') &&
+ contains(github.event.issue.labels.*.name, 'O-Frequent'))
steps:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
with:
@@ -33,20 +35,22 @@ jobs:
P1_issues_to_crypto_team_workboard:
runs-on: ubuntu-latest
+ # Skip in forks
if: >
- (contains(github.event.issue.labels.*.name, 'A-E2EE') ||
- contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') ||
- contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
- contains(github.event.issue.labels.*.name, 'A-E2EE-Key-Backup') ||
- contains(github.event.issue.labels.*.name, 'A-E2EE-SAS-Verification')) &&
- (contains(github.event.issue.labels.*.name, 'T-Defect') &&
- contains(github.event.issue.labels.*.name, 'S-Critical') &&
- (contains(github.event.issue.labels.*.name, 'O-Frequent') ||
+ github.repository == 'vector-im/element-android' &&
+ (contains(github.event.issue.labels.*.name, 'A-E2EE') ||
+ contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') ||
+ contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
+ contains(github.event.issue.labels.*.name, 'A-E2EE-Key-Backup') ||
+ contains(github.event.issue.labels.*.name, 'A-E2EE-SAS-Verification')) &&
+ (contains(github.event.issue.labels.*.name, 'T-Defect') &&
+ 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') &&
- contains(github.event.issue.labels.*.name, 'O-Frequent'))
+ contains(github.event.issue.labels.*.name, 'S-Major') &&
+ contains(github.event.issue.labels.*.name, 'O-Frequent') ||
+ contains(github.event.issue.labels.*.name, 'A11y') &&
+ contains(github.event.issue.labels.*.name, 'O-Frequent'))
steps:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
with:
diff --git a/.idea/dictionaries/bmarty.xml b/.idea/dictionaries/bmarty.xml
index a2e408b50de..f99842f0671 100644
--- a/.idea/dictionaries/bmarty.xml
+++ b/.idea/dictionaries/bmarty.xml
@@ -36,6 +36,7 @@
sssssygnalthreepid
+ uisiunpublishunwedgingvctr
diff --git a/CHANGES.md b/CHANGES.md
index fbefb75e06c..75d290d2e22 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,73 @@
+Changes in Element v1.3.13 (2022-01-11)
+=======================================
+
+Features ✨
+----------
+ - Updates onboarding splash screen to have a dedicated sign in button and removes the dual purpose sign in/up stage ([#4382](https://github.com/vector-im/element-android/issues/4382))
+ - Display Analytics opt-in screen at first start-up of the app ([#4892](https://github.com/vector-im/element-android/issues/4892))
+ - New attachment picker UI ([#3444](https://github.com/vector-im/element-android/issues/3444))
+ - Add labs support for rendering LaTeX maths (MSC2191) ([#2133](https://github.com/vector-im/element-android/issues/2133))
+ - Allow changing nick colors from the member detail screen ([#2614](https://github.com/vector-im/element-android/issues/2614))
+ - Analytics: Track Errors ([#4719](https://github.com/vector-im/element-android/issues/4719))
+ - Change internal timeline management. ([#4405](https://github.com/vector-im/element-android/issues/4405))
+ - Translate the error observed when the user is not allowed to join a room ([#4847](https://github.com/vector-im/element-android/issues/4847))
+
+Bugfixes 🐛
+----------
+ - Stop using CharSequence as EpoxyAttribute because it can lead to crash if the CharSequence mutates during rendering. ([#4837](https://github.com/vector-im/element-android/issues/4837))
+ - Better handling of misconfigured room encryption ([#4711](https://github.com/vector-im/element-android/issues/4711))
+ - Fix message replies/quotes to respect newlines. ([#4540](https://github.com/vector-im/element-android/issues/4540))
+ - Polls: unable to create a poll with more than 10 answers ([#4735](https://github.com/vector-im/element-android/issues/4735))
+ - Fix for broken unread message indicator on the room list when there are no messages in the room. ([#4749](https://github.com/vector-im/element-android/issues/4749))
+ - Fixes newer emojis rendering strangely when inserting from the system keyboard ([#4756](https://github.com/vector-im/element-android/issues/4756))
+ - Fixing unable to change change avatar in some scenarios ([#4767](https://github.com/vector-im/element-android/issues/4767))
+ - Tentative fix for the speaker being used instead of earpiece for the outgoing call ringtone on lineage os ([#4781](https://github.com/vector-im/element-android/issues/4781))
+ - Fixing crashes when quickly scrolling or restoring the room timeline ([#4789](https://github.com/vector-im/element-android/issues/4789))
+ - Fixing encrypted non message events showing up as notification messages (eg when a participant joins, mutes or leaves a voice call) ([#4804](https://github.com/vector-im/element-android/issues/4804))
+
+SDK API changes ⚠️
+------------------
+ - Introduce method onStateUpdated on Timeline.Callback ([#4405](https://github.com/vector-im/element-android/issues/4405))
+ - Support tagged events in Room Account Data (MSC2437) ([#4753](https://github.com/vector-im/element-android/issues/4753))
+
+Other changes
+-------------
+ - Workaround to fetch all the pending toDevice events from a Synapse homeserver ([#4612](https://github.com/vector-im/element-android/issues/4612))
+ - Toolbar is added to a views with QR code scan ([#4644](https://github.com/vector-im/element-android/issues/4644))
+ - Open share UI provides by the system when sharing media or text. ([#4745](https://github.com/vector-im/element-android/issues/4745))
+ - Cleaning rendering of state events in timeline ([#4747](https://github.com/vector-im/element-android/issues/4747))
+ - Enabling new FTUE Auth onboarding base, includes the "I already have an account" button in the splash ([#4872](https://github.com/vector-im/element-android/issues/4872))
+ - Olm lib is now hosted in MavenCentral - upgrade to 3.2.10 ([#4882](https://github.com/vector-im/element-android/issues/4882))
+ - Remove deprecated experimental restricted space lab option ([#4889](https://github.com/vector-im/element-android/issues/4889))
+ - Add ktlint results on github as a comment only on fail ([#4888](https://github.com/vector-im/element-android/issues/4888))
+ - Fix github actions ktlint reports and publish results on PR as comment ([#4864](https://github.com/vector-im/element-android/issues/4864))
+
+
+Changes in Element v1.3.12 (2021-12-20)
+=======================================
+
+Bugfixes 🐛
+----------
+ - Fixing emoji related crashes on android 8.1.1 and below ([#4769](https://github.com/vector-im/element-android/issues/4769))
+
+
+Changes in Element v1.3.11 (2021-12-17)
+=======================================
+
+Bugfixes 🐛
+----------
+ - Fixing proximity sensor still being active after a call ([#2467](https://github.com/vector-im/element-android/issues/2467))
+ - Fix name and shield are truncated in the room detail screen ([#4700](https://github.com/vector-im/element-android/issues/4700))
+ - Call banner: center text vertically ([#4710](https://github.com/vector-im/element-android/issues/4710))
+ - Fixes unable to render messages by allowing them to render whilst the emoji library is initialising ([#4733](https://github.com/vector-im/element-android/issues/4733))
+ - Fix app crash uppon long press on a reply event ([#4742](https://github.com/vector-im/element-android/issues/4742))
+ - Fixes crash when launching rooms which contain emojis in the emote content on android 12+ ([#4743](https://github.com/vector-im/element-android/issues/4743))
+
+Other changes
+-------------
+ - Avoids leaking the activity windows when loading dialogs are displaying ([#4713](https://github.com/vector-im/element-android/issues/4713))
+
+
Changes in Element v1.3.10 (2021-12-14)
=======================================
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index dbc0ce9b725..22d12ac6631 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -139,7 +139,7 @@ If a string is not used anymore, it should be removed from the resource, but ple
Instead, please comment the original string with:
```xml
-
+
```
The string will be removed during the next sync with Weblate.
diff --git a/README.md b/README.md
index a085bf7da12..0345c501460 100644
--- a/README.md
+++ b/README.md
@@ -46,3 +46,9 @@ If you would like to receive releases more quickly (bearing in mind that they ma
Please refer to [CONTRIBUTING.md](https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md) if you want to contribute on Matrix Android projects!
Come chat with the community in the dedicated Matrix [room](https://matrix.to/#/#element-android:matrix.org).
+
+## Triaging issues
+
+Issues are triaged by community members and the Android App Team, following the [triage process](https://github.com/vector-im/element-meta/wiki/Triage-process).
+
+We use [issue labels](https://github.com/vector-im/element-meta/wiki/Issue-labelling) to sort all incoming issues.
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index e17f3579051..b7299b01f75 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,21 +29,13 @@ buildscript {
// ktlint Plugin
plugins {
- id "org.jlleitschuh.gradle.ktlint" version "10.2.0"
+ id "org.jlleitschuh.gradle.ktlint" version "10.2.1"
}
allprojects {
apply plugin: "org.jlleitschuh.gradle.ktlint"
repositories {
- // For olm library.
- maven {
- url 'https://gitlab.matrix.org/api/v4/projects/27/packages/maven'
- content {
- groups.olm.regex.each { includeGroupByRegex it }
- groups.olm.group.each { includeGroup it }
- }
- }
maven {
url 'https://jitpack.io'
content {
diff --git a/dependencies.gradle b/dependencies.gradle
index 4a076a23bd5..6cb5fac64c2 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -95,6 +95,8 @@ ext.libs = [
],
markwon : [
'core' : "io.noties.markwon:core:$markwon",
+ 'extLatex' : "io.noties.markwon:ext-latex:$markwon",
+ 'inlineParser' : "io.noties.markwon:inline-parser:$markwon",
'html' : "io.noties.markwon:html:$markwon"
],
airbnb : [
diff --git a/dependencies_groups.gradle b/dependencies_groups.gradle
index 25a78bc0c39..3853919bcb1 100644
--- a/dependencies_groups.gradle
+++ b/dependencies_groups.gradle
@@ -14,13 +14,6 @@ ext.groups = [
'com.github.Zhuinden',
]
],
- olm : [
- regex: [
- ],
- group: [
- 'org.matrix.android',
- ]
- ],
jitsi : [
regex: [
],
@@ -166,6 +159,7 @@ ext.groups = [
'org.junit.jupiter',
'org.junit.platform',
'org.jvnet.staxex',
+ 'org.matrix.android',
'org.mockito',
'org.mongodb',
'org.objenesis',
@@ -179,6 +173,7 @@ ext.groups = [
'org.sonatype.oss',
'org.testng',
'org.threeten',
+ 'ru.noties',
'xerces',
'xml-apis',
]
diff --git a/docs/design.md b/docs/design.md
index 2e27f00ebf5..a79f19cf3e8 100644
--- a/docs/design.md
+++ b/docs/design.md
@@ -50,6 +50,17 @@ It's also possible for any icon to go to the main component by right-clicking on
- open the created vector drawable
- optionally update the color(s) to "#FF0000" (red) to ensure that the drawable is correctly tinted at runtime.
+### Images
+
+Android 4.3 (18+) fully supports the WebP image format which can often provide smaller image sizes without drastically impacting image quality (depending on the output encoding quality).
+When importing non vector images, WebP is the preferred format.
+
+Images can be converted to the WebP within Android Studio by
+ - right clicking the image file within the project file explorer
+ - select `Convert to WebP`
+
+https://developer.android.com/studio/write/convert-webp
+
## Figma links
Figma links can be included in the layout, for future reference, but it is also OK to add a paragraph below here, to centralize the information
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt
index e82655d352a..93093cb1a78 100644
--- a/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt
@@ -1,2 +1,2 @@
-Hlavní změny v této verzi: implementace hlasových zpráv dosupných v rámci laboratoře.
+Hlavní změny v této verzi: implementace hlasových zpráv dosupných v experimentálních funkcích.
Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103090.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103090.txt
new file mode 100644
index 00000000000..fe61a48d126
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Přidání podpory pro návrh hlasové zprávy. Opravy mnoha chyb!
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103100.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103100.txt
new file mode 100644
index 00000000000..02eb5b59ef4
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Přidání podpory pro hlasování (v experimentálních funkcích). Nový design náhledu URL.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103110.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103110.txt
new file mode 100644
index 00000000000..e765e1667db
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Opravy chyb!
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103120.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103120.txt
new file mode 100644
index 00000000000..81437c716b7
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Opravy chyb!
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/de-DE/changelogs/40103050.txt b/fastlane/metadata/android/de-DE/changelogs/40103050.txt
new file mode 100644
index 00000000000..a3e40e9e033
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40103050.txt
@@ -0,0 +1,2 @@
+Änderungen in dieser Version: Unterstützung für Anwesenheitsstatus in Direktnachrichten (Momentan auf matrix.org deaktiviert), Android Auto funktioniert wieder.
+Änderungsliste: https://github.com/vector-im/element-android/releases/tag/v1.3.5
diff --git a/fastlane/metadata/android/de-DE/changelogs/40103060.txt b/fastlane/metadata/android/de-DE/changelogs/40103060.txt
new file mode 100644
index 00000000000..dcd8d3634d3
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40103060.txt
@@ -0,0 +1,2 @@
+Änderungen in dieser Version: Unterstützung für Anwesenheitsstatus in Direktnachrichten (Momentan auf matrix.org deaktiviert), Android Auto funktioniert wieder.
+Änderungsliste: https://github.com/vector-im/element-android/releases/tag/v1.3.6
diff --git a/fastlane/metadata/android/de-DE/changelogs/40103090.txt b/fastlane/metadata/android/de-DE/changelogs/40103090.txt
new file mode 100644
index 00000000000..028df4942f5
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Hauptänderungen: Verbesserungen bei Sprachnachrichten, Bugfixes.
+Änderungsliste: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/en-US/changelogs/40103110.txt b/fastlane/metadata/android/en-US/changelogs/40103110.txt
new file mode 100644
index 00000000000..c28b303a35e
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.11
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40103120.txt b/fastlane/metadata/android/en-US/changelogs/40103120.txt
new file mode 100644
index 00000000000..90d55f5f48e
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.12
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40103130.txt b/fastlane/metadata/android/en-US/changelogs/40103130.txt
new file mode 100644
index 00000000000..1c0b5da2ee0
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40103130.txt
@@ -0,0 +1,2 @@
+Main changes in this version: First change in onboarding screens, including Analytics opt-in. Support for Events with Math added in the labs.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.13
\ No newline at end of file
diff --git a/fastlane/metadata/android/et/changelogs/40103090.txt b/fastlane/metadata/android/et/changelogs/40103090.txt
new file mode 100644
index 00000000000..e931ba53865
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: Häälsõnumite võimalus. Palju veaparandusi!
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/et/changelogs/40103100.txt b/fastlane/metadata/android/et/changelogs/40103100.txt
new file mode 100644
index 00000000000..2cb2ae0d880
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: katseline küsitluste tugi ja linkide eelvaate uus visuaal.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/et/changelogs/40103110.txt b/fastlane/metadata/android/et/changelogs/40103110.txt
new file mode 100644
index 00000000000..6271372e2b9
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: pinu veaparandusi!
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/et/changelogs/40103120.txt b/fastlane/metadata/android/et/changelogs/40103120.txt
new file mode 100644
index 00000000000..c1cc3ff6968
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: pinu veaparandusi!
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/fa/changelogs/40103090.txt b/fastlane/metadata/android/fa/changelogs/40103090.txt
new file mode 100644
index 00000000000..75810a0e232
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: افزودن پشتیبان از چرکنویسهای صوتی. رفع چندین مشکل!
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/fa/changelogs/40103100.txt b/fastlane/metadata/android/fa/changelogs/40103100.txt
new file mode 100644
index 00000000000..99c4e3faec5
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: افزودن پشتیبانی نظرسنجیها (در آزمایشگاهها). طرّاحی جدید پیشنمای نشانی.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/fa/changelogs/40103110.txt b/fastlane/metadata/android/fa/changelogs/40103110.txt
new file mode 100644
index 00000000000..56d8ba6b911
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: تعمیر مشکلات!
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/fa/changelogs/40103120.txt b/fastlane/metadata/android/fa/changelogs/40103120.txt
new file mode 100644
index 00000000000..67976a20247
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: تعمیر مشکلات!
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103090.txt b/fastlane/metadata/android/fr-FR/changelogs/40103090.txt
new file mode 100644
index 00000000000..3394e5ccfad
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : Ajout du support pour les brouillons de messages vocaux. Beaucoup de corrections de bugs !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103090.txt b/fastlane/metadata/android/hu-HU/changelogs/40103090.txt
new file mode 100644
index 00000000000..d4189121bb6
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Hang üzenet piszkozat támogatás. Sok egyéb hibajavítás.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103100.txt b/fastlane/metadata/android/hu-HU/changelogs/40103100.txt
new file mode 100644
index 00000000000..9e3cb21611b
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Szavazások támogatása (a laborok között). Új URL előnézet.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103110.txt b/fastlane/metadata/android/hu-HU/changelogs/40103110.txt
new file mode 100644
index 00000000000..86cb418a6c3
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Hibajavítások!
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103120.txt b/fastlane/metadata/android/hu-HU/changelogs/40103120.txt
new file mode 100644
index 00000000000..33fa44248d8
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Hibajavítások!
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/id/changelogs/40103090.txt b/fastlane/metadata/android/id/changelogs/40103090.txt
new file mode 100644
index 00000000000..b371ba9fab3
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Perubahan utama di versi ini: Tambahkan dukungan untuk draf pesan suara. Banyak perbaikan bug!
+Changelog lengkap: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/id/changelogs/40103100.txt b/fastlane/metadata/android/id/changelogs/40103100.txt
new file mode 100644
index 00000000000..39d127cd93f
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Dukungan untuk fitur poll (dalam Uji Coba), dan desain tampilan URL baru.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/id/changelogs/40103110.txt b/fastlane/metadata/android/id/changelogs/40103110.txt
new file mode 100644
index 00000000000..725e58d957a
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/id/changelogs/40103120.txt b/fastlane/metadata/android/id/changelogs/40103120.txt
new file mode 100644
index 00000000000..9a5dc8026c6
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt
index 1cd770dd730..72c520403c4 100644
--- a/fastlane/metadata/android/id/short_description.txt
+++ b/fastlane/metadata/android/id/short_description.txt
@@ -1 +1 @@
-Perpesanan grup - perpesanan, panggilan suara dan video grup terenkripsi
+Perpesanan grup — perpesanan, panggilan suara dan video grup terenkripsi
diff --git a/fastlane/metadata/android/id/title.txt b/fastlane/metadata/android/id/title.txt
index aec5dc9351a..08ad7afa677 100644
--- a/fastlane/metadata/android/id/title.txt
+++ b/fastlane/metadata/android/id/title.txt
@@ -1 +1 @@
-Element - Perpesanan Aman
+Element — Perpesanan Aman
diff --git a/fastlane/metadata/android/it-IT/changelogs/40103090.txt b/fastlane/metadata/android/it-IT/changelogs/40103090.txt
new file mode 100644
index 00000000000..d91ecfe5306
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: aggiunto supporto per le bozze dei vocali. Molte correzioni!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/it-IT/changelogs/40103100.txt b/fastlane/metadata/android/it-IT/changelogs/40103100.txt
new file mode 100644
index 00000000000..d6036ff048b
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: aggiunto supporto per i sondaggi (in labs). Nuovo design anteprime URL.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/it-IT/changelogs/40103110.txt b/fastlane/metadata/android/it-IT/changelogs/40103110.txt
new file mode 100644
index 00000000000..2db15676dce
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: correzioni di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/it-IT/changelogs/40103120.txt b/fastlane/metadata/android/it-IT/changelogs/40103120.txt
new file mode 100644
index 00000000000..7756f8f1864
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: correzioni di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/nl/changelogs/40103070.txt b/fastlane/metadata/android/nl/changelogs/40103070.txt
new file mode 100644
index 00000000000..c2496fa34da
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/40103070.txt
@@ -0,0 +1,2 @@
+Belangrijkste wijzigingen in deze versie: Bugfixes voornamelijk met betrekking tot de meldingen.
+Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.7-RC2
diff --git a/fastlane/metadata/android/nl/changelogs/40103080.txt b/fastlane/metadata/android/nl/changelogs/40103080.txt
new file mode 100644
index 00000000000..8ed093a4607
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/40103080.txt
@@ -0,0 +1,2 @@
+Belangrijkste wijzigingen in deze versie: Bugfixes!
+Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.8
diff --git a/fastlane/metadata/android/nl/changelogs/40103090.txt b/fastlane/metadata/android/nl/changelogs/40103090.txt
new file mode 100644
index 00000000000..e4a7f63089b
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Belangrijkste wijzigingen in deze versie: Ondersteuning toevoegen voor spraakberichtconcept. Veel bugfixes!
+Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/nl/changelogs/40103100.txt b/fastlane/metadata/android/nl/changelogs/40103100.txt
new file mode 100644
index 00000000000..883c6565770
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Belangrijkste wijzigingen in deze versie: Ondersteuning toevoegen voor polls (in labs). Nieuw URL-voorbeeldontwerp.
+Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/nl/changelogs/40103110.txt b/fastlane/metadata/android/nl/changelogs/40103110.txt
new file mode 100644
index 00000000000..ae1685270bb
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Belangrijkste wijzigingen in deze versie: Bugfixes!
+Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/nl/changelogs/40103120.txt b/fastlane/metadata/android/nl/changelogs/40103120.txt
new file mode 100644
index 00000000000..39d3f5fb431
--- /dev/null
+++ b/fastlane/metadata/android/nl/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Belangrijkste wijzigingen in deze versie: Bugfixes!
+Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/nl/short_description.txt b/fastlane/metadata/android/nl/short_description.txt
new file mode 100644
index 00000000000..107e30f48d4
--- /dev/null
+++ b/fastlane/metadata/android/nl/short_description.txt
@@ -0,0 +1 @@
+Groepsberichten - versleutelde berichten, groepschat en videogesprekken
diff --git a/fastlane/metadata/android/nl/title.txt b/fastlane/metadata/android/nl/title.txt
new file mode 100644
index 00000000000..7b5a8872130
--- /dev/null
+++ b/fastlane/metadata/android/nl/title.txt
@@ -0,0 +1 @@
+Element - Veilige Berichten
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103090.txt b/fastlane/metadata/android/pt-BR/changelogs/40103090.txt
new file mode 100644
index 00000000000..9f67fd2d625
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Adicionar suporte para rascunho de mensagem de voz. Muitos consertos de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103100.txt b/fastlane/metadata/android/pt-BR/changelogs/40103100.txt
new file mode 100644
index 00000000000..9912e2ccf10
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Adicionar suporte para sondagens (em labs). Novo design de previsualização de URL.
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103110.txt b/fastlane/metadata/android/pt-BR/changelogs/40103110.txt
new file mode 100644
index 00000000000..a1f4d11acf1
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Consertos de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103120.txt b/fastlane/metadata/android/pt-BR/changelogs/40103120.txt
new file mode 100644
index 00000000000..b5113481527
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Consertos de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/sk/changelogs/40101000.txt b/fastlane/metadata/android/sk/changelogs/40101000.txt
new file mode 100644
index 00000000000..5d267bd7dc6
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Vylepšenie VoIP (audio a video hovory v priamych správach) a opravy chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/sk/changelogs/40101010.txt b/fastlane/metadata/android/sk/changelogs/40101010.txt
new file mode 100644
index 00000000000..164166fba86
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/sk/changelogs/40101020.txt b/fastlane/metadata/android/sk/changelogs/40101020.txt
new file mode 100644
index 00000000000..379db42ccac
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/sk/changelogs/40101030.txt b/fastlane/metadata/android/sk/changelogs/40101030.txt
new file mode 100644
index 00000000000..b99ebb9e99c
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/sk/changelogs/40101040.txt b/fastlane/metadata/android/sk/changelogs/40101040.txt
new file mode 100644
index 00000000000..884305c478f
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/sk/changelogs/40101050.txt b/fastlane/metadata/android/sk/changelogs/40101050.txt
new file mode 100644
index 00000000000..22dc0953715
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: rýchle opravy pre verziu 1.1.4
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/sk/changelogs/40101060.txt b/fastlane/metadata/android/sk/changelogs/40101060.txt
new file mode 100644
index 00000000000..70ac5cad576
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: rýchle opravy pre verziu 1.1.5
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/sk/changelogs/40101070.txt b/fastlane/metadata/android/sk/changelogs/40101070.txt
new file mode 100644
index 00000000000..87eccd8f456
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: beta podpora pre priestory Spaces. Kompresia videa pred odoslaním.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/sk/changelogs/40101080.txt b/fastlane/metadata/android/sk/changelogs/40101080.txt
new file mode 100644
index 00000000000..9484062b474
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: vylepšenie pre Priestory.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/sk/changelogs/40101090.txt b/fastlane/metadata/android/sk/changelogs/40101090.txt
new file mode 100644
index 00000000000..5778db23a9c
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: pridanie podpory pre sieť gitter.im.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/sk/changelogs/40101100.txt b/fastlane/metadata/android/sk/changelogs/40101100.txt
new file mode 100644
index 00000000000..a23198c88b6
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: aktualizácia témy a štýlu a nové funkcie pre priestory.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/sk/changelogs/40101110.txt b/fastlane/metadata/android/sk/changelogs/40101110.txt
new file mode 100644
index 00000000000..45a095f0a8c
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: aktualizácia témy a štýlu a nové funkcie pre priestory (oprava chyby pre verziu 1.1.10)
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/sk/changelogs/40101120.txt b/fastlane/metadata/android/sk/changelogs/40101120.txt
new file mode 100644
index 00000000000..ba345c3150e
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: aktualizácia témy a štýlu a oprava pádu po videohovore
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/sk/changelogs/40101130.txt b/fastlane/metadata/android/sk/changelogs/40101130.txt
new file mode 100644
index 00000000000..6daf3e789bc
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: hlavne aktualizácia stability a opravy chýb.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/sk/changelogs/40101140.txt b/fastlane/metadata/android/sk/changelogs/40101140.txt
new file mode 100644
index 00000000000..c93fe1bb15b
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: oprava problému so šifrovanými správami.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/sk/changelogs/40101150.txt b/fastlane/metadata/android/sk/changelogs/40101150.txt
new file mode 100644
index 00000000000..87256269ab9
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: implementácia hlasových správ v rámci nastavení laboratórií.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/sk/changelogs/40101160.txt b/fastlane/metadata/android/sk/changelogs/40101160.txt
new file mode 100644
index 00000000000..5e12aab2825
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40101160.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Oprava chyby pri odosielaní zašifrovanej správy, ak sa niekto v miestnosti odhlási.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.16
diff --git a/fastlane/metadata/android/sk/changelogs/40102000.txt b/fastlane/metadata/android/sk/changelogs/40102000.txt
new file mode 100644
index 00000000000..4d0093469ba
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40102000.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Hlasová správa je predvolene povolená.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.2.0
diff --git a/fastlane/metadata/android/sk/changelogs/40102010.txt b/fastlane/metadata/android/sk/changelogs/40102010.txt
new file mode 100644
index 00000000000..ac1cbc4509c
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40102010.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Mnohé vylepšenia v oblasti VoIP a Priestorov (stále v beta verzii).
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.2.1
diff --git a/fastlane/metadata/android/sk/changelogs/40103000.txt b/fastlane/metadata/android/sk/changelogs/40103000.txt
new file mode 100644
index 00000000000..2a669aa744e
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103000.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Usporiadajte svoje miestnosti pomocou Priestorov!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.0
diff --git a/fastlane/metadata/android/sk/changelogs/40103010.txt b/fastlane/metadata/android/sk/changelogs/40103010.txt
new file mode 100644
index 00000000000..3a12a5910ef
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103010.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Usporiadajte svoje miestnosti pomocou Priestorov! Verzia v1.3.1 opravuje pád, ktorý sa môže vyskytnúť vo verzii v1.3.0.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.1
diff --git a/fastlane/metadata/android/sk/changelogs/40103020.txt b/fastlane/metadata/android/sk/changelogs/40103020.txt
new file mode 100644
index 00000000000..96cefe73ed7
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103020.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Pridanie podpory pre Android Auto. Množstvo opráv chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.2
diff --git a/fastlane/metadata/android/sk/changelogs/40103030.txt b/fastlane/metadata/android/sk/changelogs/40103030.txt
new file mode 100644
index 00000000000..a14dba2c9d5
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103030.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Zviditeľnite zásad servera totožností v nastaveniach. Dočasne odstránenie podpory Android Auto.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.3
diff --git a/fastlane/metadata/android/sk/changelogs/40103040.txt b/fastlane/metadata/android/sk/changelogs/40103040.txt
new file mode 100644
index 00000000000..e2e6a98b075
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103040.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Pridanie podpory prítomnosti pre miestnosť s priamymi správami (poznámka: prítomnosť je na matrix.org vypnutá). Opätovné pridanie podpory Android Auto.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.4
diff --git a/fastlane/metadata/android/sk/changelogs/40103050.txt b/fastlane/metadata/android/sk/changelogs/40103050.txt
new file mode 100644
index 00000000000..f5cc73a4e20
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103050.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Pridanie podpory prítomnosti pre miestnosť s priamymi správami (poznámka: prítomnosť je na matrix.org vypnutá). Opätovné pridanie podpory Android Auto.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.5
diff --git a/fastlane/metadata/android/sk/changelogs/40103060.txt b/fastlane/metadata/android/sk/changelogs/40103060.txt
new file mode 100644
index 00000000000..c9a3b8bb750
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103060.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Pridanie podpory prítomnosti pre miestnosť s priamymi správami (poznámka: prítomnosť je na matrix.org vypnutá). Opätovné pridanie podpory Android Auto.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.6
diff --git a/fastlane/metadata/android/sk/changelogs/40103090.txt b/fastlane/metadata/android/sk/changelogs/40103090.txt
new file mode 100644
index 00000000000..d719d5055c4
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Pridanie podpory pre návrh hlasovej správy. Oprava mnohých chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/sk/changelogs/40103100.txt b/fastlane/metadata/android/sk/changelogs/40103100.txt
new file mode 100644
index 00000000000..14a667c78d1
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Pridanie podpory pre ankety (v laboratóriách). Nový dizajn náhľadu URL.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/sk/changelogs/40103110.txt b/fastlane/metadata/android/sk/changelogs/40103110.txt
new file mode 100644
index 00000000000..2c2ee1aa6d3
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Opravy chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/sk/changelogs/40103120.txt b/fastlane/metadata/android/sk/changelogs/40103120.txt
new file mode 100644
index 00000000000..363e4aef24e
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Opravy chýb!
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/sk/full_description.txt b/fastlane/metadata/android/sk/full_description.txt
index b4c9e987770..78661e961e4 100644
--- a/fastlane/metadata/android/sk/full_description.txt
+++ b/fastlane/metadata/android/sk/full_description.txt
@@ -1,30 +1,41 @@
-Element je inovatívny kolaboračný komunikátor a messenger ktorý:
+Element je zabezpečený messenger a zároveň aplikácia na tímovú spoluprácu, ktorá je ideálna na skupinové konverzácie pri práci na diaľku. Táto komunikačná aplikácia využíva end-to-end šifrovanie na poskytovanie výkonných videokonferencií, zdieľania súborov a hlasových hovorov.
-1. Ponecháva kontrolu nad vaším súkromím
-2. Umožňuje komunikovať s kýmkoľvek v sieti Matrix a vďaka integráciám aj s rôznymi inými aplikáciami ako napríklad Slack
-3. Chráni vás pred reklamami, zhromažďovaním údajov a uzavretými platformami
-4. Posilňuje vašu bezpečnosť vďaka E2E šifrovaniu a krížovému podpisovaniu určenému na overovanie ostatných
+Funkcie aplikácie Element zahŕňajú:
+- Pokročilé nástroje na online komunikáciu
+- Plne šifrované správy umožňujúce bezpečnejšiu firemnú komunikáciu aj pre pracovníkov na diaľku
+- Decentralizované konverzácie založené na open source frameworku Matrix
+- Bezpečné zdieľanie súborov so šifrovanými údajmi pri správe projektov
+- Videochaty s funkciou Voice over IP a zdieľaním obrazovky
+- Jednoduchá integrácia s obľúbenými nástrojmi na online spoluprácu, nástrojmi na riadenie projektov, službami VoIP a inými aplikáciami na tímovú komunikáciu
-Element sa od ostatných komunikačných a kolaboračných aplikácií odlišuje tým, že je decentralizovaný a open-source.
+Element sa úplne líši od ostatných aplikácií na zasielanie správ a spoluprácu. Funguje na Matrixe, otvorenej sieti na bezpečné posielanie správ a decentralizovanú komunikáciu. Umožňuje vlastný hosting, aby používatelia získali maximálne vlastníctvo a kontrolu nad svojimi údajmi a správami.
-S Elementom sa môžete pripojiť k vlastnému serveru alebo si môžete vybrať server s dôveryhodným poskytovateľom, čím si zachováte súkromie, vlastníctvo a kontrolu nad vašimi konverzáciami a údajmi. Získate tak prístup do otvorenej siete a teda nie ste limitovaní na komunikáciu len s ostatnými Element používateľmi. A samozrejme je vaša komunikácia dobre zabezpečná.
+Súkromie a šifrovanie správ
+Element vás chráni pred nežiaducimi reklamami, ťažbou údajov a tzv. walled gardens. Zabezpečuje tiež všetky vaše údaje, video a hlasovú komunikáciu jeden na jedného prostredníctvom end-to-end šifrovania a overovania zariadení krížovým podpisovaním
+Element vám poskytuje kontrolu nad vaším súkromím a zároveň vám umožňuje bezpečne komunikovať s kýmkoľvek v sieti Matrix alebo s inými nástrojmi na podnikovú spoluprácu vďaka integrácii s aplikáciami, ako je napríklad Slack.
-Element všetko toto dokáže vďaka tomu, že pracuje podľa protokolu Matrix - štandardu na otvorenú, decentralizovanú komunikáciu.
+Element môže byť na vašom vlastnom serveri.
+Aby ste mali väčšiu kontrolu nad svojimi citlivými údajmi a konverzáciami, Element môže byť na vašom vlastnom serveri alebo si môžete vybrať ľubovoľný hosting založený na systéme Matrix - štandarde pre decentralizovanú komunikáciu s otvoreným zdrojovým kódom. Element vám poskytuje súkromie, súlad s bezpečnostnými predpismi a flexibilitu integrácie.
-Element vám dáva kontrolu tým, že si samy vyberiete, ako budete spravovať (ang. host) vaše konverzácie. Priamo v aplikácii Element si môžete vybrať z rôznych spôsobov hostovania:
+Vlastnite svoje údaje
+Vy rozhodujete o tom, kde budú vaše údaje a správy uložené. Bez rizika ťažby údajov alebo prístupu tretích strán.
-1. Získajte účet zdarma na verejnom servery matrix.org od vývojárov protokolu Matrix alebo si vyberte z tísíce iných serverov hostovaných dobrovoľníkmi
-2. Hostujte si účet spustením vlastného servera použitím vlastného hardvéru
-3. Prihláste sa k účtu na vlastnom servery objednaním služieb na platforme Element Matrix Services
+Element vám dáva kontrolu rôznymi spôsobmi:
+1. Získajte bezplatné konto na verejnom serveri matrix.org, ktorý hostia vývojári Matrixu, alebo si vyberte z tisícov verejných serverov, ktoré hostia dobrovoľníci.
+2. Vlastný hosting účtu spustením servera na vlastnej IT infraštruktúre.
+3. Zaregistrujte si účet na vlastnom serveri tak, že si jednoducho predplatíte hostingovú platformu Element Matrix Services.
-Prečo si vybrať Element?
+Otvorené zasielanie správ a spolupráca
+Môžete komunikovať s kýmkoľvek v sieti Matrix, či už používa aplikáciu Element, inú aplikáciu Matrix alebo dokonca ak používa inú aplikáciu na zasielanie správ.
-PONECHAJTE SI VAŠE ÚDAJE: Len vy rozhodujete o tom, kde si budete uchovávať vaše správy a ostatné údaje. Len vy vlastníte vaše údaje a riadite zaobchádzanie s nimi, nie nejaká megakorporácia, ktorá z nich ťaží alebo ich poskytuje tretím stranám.
+Vynikajúce zabezpečenie
+Skutočné end-to-end šifrovanie (správy môžu dešifrovať len účastníci konverzácie) a krížové overovanie zariadení.
-OTVORENÁ KOMUNIKÁCIA a KOLABORÁCIA: Konverzovať môžete s kýmkoľvek v otvorenej sieti Matrix nezávisle na tom, či používa Element, inú kompatibilnú aplikáciu, ba dokkonca aj s tými, ktorí používajú úplne inú platformu určenú na okamžitú komunikáciu ako sú Slack, IRC alebo XMPP.
+Kompletná komunikácia a integrácia
+Správy, hlasové a video hovory, zdieľanie súborov, zdieľanie obrazovky a celý rad integrácií, botov a widgetov. Vytvárajte miestnosti, komunity, zostaňte v kontakte a vybavujte veci.
-VEĽMI VYSOKÉ ZABEZPEČENIE: Skutočné šifrovanie od zariadenia k zariadeniu (len diskutujúci môžu dešifrovať správy) a krížové podpisovanie určené na overovanie jednotlivých zariadení členov konverzácií.
+Nadviažte tam, kde ste skončili
+Buďte v kontakte, nech ste kdekoľvek, vďaka plne synchronizovanej histórii správ vo všetkých zariadeniach a na webe na adrese https://app.element.io.
-KOMPLETNÁ KOMUNIKÁCIA: Okamžité správy, telefonáty a video hovory, zdieľanie súborov, zdieľanie obrazovky a veľké množstvo integrácií, botov a widgetov. Vytvorte si vlastné miestnosti, založte komunity, ostante v kontakte a vyriešte problémy.
-
-KDEKOĽVEK SA NACHÁDZATE: Ostante v kontakte kdekoľvek ste s plne synchronizovanou históriou konverzácií naprieč všetkými vašimi zariadeniami a aj cez web na adrese https://app.element.io.
+Otvorený zdroj
+Element Android je projekt s otvoreným zdrojovým kódom, ktorého hostiteľom je GitHub. Nahlasujte chyby a/alebo prispievajte k jeho vývoju na adrese https://github.com/vector-im/element-android.
diff --git a/fastlane/metadata/android/sk/title.txt b/fastlane/metadata/android/sk/title.txt
index dd02c784e8e..fa7155e82ed 100644
--- a/fastlane/metadata/android/sk/title.txt
+++ b/fastlane/metadata/android/sk/title.txt
@@ -1 +1 @@
-Element (kedysi Riot.im)
+Element - Bezpečný messenger
diff --git a/fastlane/metadata/android/sq/changelogs/40103090.txt b/fastlane/metadata/android/sq/changelogs/40103090.txt
new file mode 100644
index 00000000000..2dae814fc12
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Shtim mbulimi për skica mesazhesh zanore. Mjaft ndreqje të metash!
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103090.txt b/fastlane/metadata/android/sv-SE/changelogs/40103090.txt
new file mode 100644
index 00000000000..dce7ffe5a7d
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Lägg till stöd för röstmeddelandeutkast. Många buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103100.txt b/fastlane/metadata/android/sv-SE/changelogs/40103100.txt
new file mode 100644
index 00000000000..d2ea16da98b
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Lägg till stöd för omröstningar (i experiment). Ny design för URL-förhandsgranskning.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103110.txt b/fastlane/metadata/android/sv-SE/changelogs/40103110.txt
new file mode 100644
index 00000000000..ae1fcddda9d
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103120.txt b/fastlane/metadata/android/sv-SE/changelogs/40103120.txt
new file mode 100644
index 00000000000..b9d73b692b6
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/uk/changelogs/40103090.txt b/fastlane/metadata/android/uk/changelogs/40103090.txt
new file mode 100644
index 00000000000..37f8959d4cb
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: підтримка чернеток голосових повідомлень. Багато виправлень помилок!
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/uk/changelogs/40103100.txt b/fastlane/metadata/android/uk/changelogs/40103100.txt
new file mode 100644
index 00000000000..99e4be65ebe
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: Додано підтримку опитувань (в експериментальних). Новий вигляд попереднього перегляду посилань.
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/uk/changelogs/40103110.txt b/fastlane/metadata/android/uk/changelogs/40103110.txt
new file mode 100644
index 00000000000..cc5af09cdac
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Основні зміни у цій версії: Виправлення помилок!
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/uk/changelogs/40103120.txt b/fastlane/metadata/android/uk/changelogs/40103120.txt
new file mode 100644
index 00000000000..a37498b4f13
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Основні зміни у цій версії: Виправлення помилок!
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40103090.txt b/fastlane/metadata/android/zh-CN/changelogs/40103090.txt
new file mode 100644
index 00000000000..7eb68d61e4c
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+版本的主要变化:增加了对语音信息草稿的支持。许多修正!
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103090.txt b/fastlane/metadata/android/zh-TW/changelogs/40103090.txt
new file mode 100644
index 00000000000..c74a27acbfd
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:新增對語音訊息草稿的支援。許多臭蟲修復!
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103100.txt b/fastlane/metadata/android/zh-TW/changelogs/40103100.txt
new file mode 100644
index 00000000000..70d93e833db
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:新增對投票(在實驗室中)的支援。新的 URL 預覽設計。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103110.txt b/fastlane/metadata/android/zh-TW/changelogs/40103110.txt
new file mode 100644
index 00000000000..d5450f4c6ac
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:臭蟲修復!
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103120.txt b/fastlane/metadata/android/zh-TW/changelogs/40103120.txt
new file mode 100644
index 00000000000..0ee60318c12
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:臭蟲修復!
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index cf2b23094e4..ee6ba9a3ac4 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=b75392c5625a88bccd58a574552a5a323edca82dab5942d2d41097f809c6bcce
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip
+distributionSha256Sum=c9490e938b221daf0094982288e4038deed954a3f12fb54cbf270ddf4e37d879
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml
new file mode 100644
index 00000000000..fa3aea4cab8
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml
new file mode 100644
index 00000000000..f696823a6e2
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml
new file mode 100644
index 00000000000..b114f9c804f
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml
new file mode 100644
index 00000000000..e8ee3644319
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml b/library/ui-styles/src/main/res/drawable/ic_debug_icon.xml
similarity index 100%
rename from library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml
rename to library/ui-styles/src/main/res/drawable/ic_debug_icon.xml
diff --git a/library/ui-styles/src/main/res/values-sw600dp/dimens.xml b/library/ui-styles/src/main/res/values-sw600dp/dimens.xml
index 204d663d9cc..f399a350b13 100644
--- a/library/ui-styles/src/main/res/values-sw600dp/dimens.xml
+++ b/library/ui-styles/src/main/res/values-sw600dp/dimens.xml
@@ -2,4 +2,8 @@
400dp
+
+
+ 0.25
+ 0.75
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/dimens.xml b/library/ui-styles/src/main/res/values/dimens.xml
index 864f3d3d7ff..a2a6b34b0f3 100644
--- a/library/ui-styles/src/main/res/values/dimens.xml
+++ b/library/ui-styles/src/main/res/values/dimens.xml
@@ -42,4 +42,13 @@
8dp
+
+
+ 56dp
+ 52dp
+ 1dp
+
+
+ 0.05
+ 0.95
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/stylable_pool_result_line.xml b/library/ui-styles/src/main/res/values/stylable_pool_result_line.xml
deleted file mode 100644
index 93e98511068..00000000000
--- a/library/ui-styles/src/main/res/values/stylable_pool_result_line.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowSession.kt b/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowSession.kt
index 2a0abd3d24b..669e27edfdb 100644
--- a/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowSession.kt
+++ b/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowSession.kt
@@ -152,6 +152,13 @@ class FlowSession(private val session: Session) {
}
}
+ fun liveUserAccountData(type: String): Flow> {
+ return session.accountDataService().getLiveUserAccountDataEvent(type).asFlow()
+ .startWith(session.coroutineDispatchers.io) {
+ session.accountDataService().getUserAccountDataEvent(type).toOptional()
+ }
+ }
+
fun liveRoomAccountData(types: Set): Flow> {
return session.accountDataService().getLiveRoomAccountDataEvents(types).asFlow()
.startWith(session.coroutineDispatchers.io) {
diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle
index 477f971e04a..936609c1d77 100644
--- a/matrix-sdk-android/build.gradle
+++ b/matrix-sdk-android/build.gradle
@@ -31,7 +31,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
- buildConfigField "String", "SDK_VERSION", "\"1.3.10\""
+ buildConfigField "String", "SDK_VERSION", "\"1.3.13\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
@@ -140,8 +140,8 @@ dependencies {
implementation libs.arrow.core
implementation libs.arrow.instances
- // olm lib is now hosted by maven at https://gitlab.matrix.org/api/v4/projects/27/packages/maven
- implementation 'org.matrix.android:olm:3.2.7'
+ // olm lib is now hosted in MavenCentral
+ implementation 'org.matrix.android:olm-sdk:3.2.10'
// DI
implementation libs.dagger.dagger
@@ -158,7 +158,7 @@ dependencies {
implementation libs.apache.commonsImaging
// Phone number https://github.com/google/libphonenumber
- implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.39'
+ implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.40'
testImplementation libs.tests.junit
testImplementation 'org.robolectric:robolectric:4.7.3'
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/LiveDataTestObserver.java b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/LiveDataTestObserver.java
index 26920fbb35d..18de66e69e2 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/LiveDataTestObserver.java
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/LiveDataTestObserver.java
@@ -208,4 +208,4 @@ public static LiveDataTestObserver test(LiveData liveData) {
liveData.observeForever(observer);
return observer;
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt
index 8e21828562f..3cb699378fa 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt
@@ -145,36 +145,9 @@ class CommonTestHelper(context: Context) {
* @param nbOfMessages the number of time the message will be sent
*/
fun sendTextMessage(room: Room, message: String, nbOfMessages: Int, timeout: Long = TestConstants.timeOutMillis): List {
- val sentEvents = ArrayList(nbOfMessages)
val timeline = room.createTimeline(null, TimelineSettings(10))
timeline.start()
- waitWithLatch(timeout + 1_000L * nbOfMessages) { latch ->
- val timelineListener = object : Timeline.Listener {
- override fun onTimelineFailure(throwable: Throwable) {
- }
-
- override fun onNewTimelineEvents(eventIds: List) {
- // noop
- }
-
- override fun onTimelineUpdated(snapshot: List) {
- val newMessages = snapshot
- .filter { it.root.sendState == SendState.SYNCED }
- .filter { it.root.getClearType() == EventType.MESSAGE }
- .filter { it.root.getClearContent().toModel()?.body?.startsWith(message) == true }
-
- Timber.v("New synced message size: ${newMessages.size}")
- if (newMessages.size == nbOfMessages) {
- sentEvents.addAll(newMessages)
- // Remove listener now, if not at the next update sendEvents could change
- timeline.removeListener(this)
- latch.countDown()
- }
- }
- }
- timeline.addListener(timelineListener)
- sendTextMessagesBatched(room, message, nbOfMessages)
- }
+ val sentEvents = sendTextMessagesBatched(timeline, room, message, nbOfMessages, timeout)
timeline.dispose()
// Check that all events has been created
assertEquals("Message number do not match $sentEvents", nbOfMessages.toLong(), sentEvents.size.toLong())
@@ -182,9 +155,10 @@ class CommonTestHelper(context: Context) {
}
/**
- * Will send nb of messages provided by count parameter but waits a bit every 10 messages to avoid gap in sync
+ * Will send nb of messages provided by count parameter but waits every 10 messages to avoid gap in sync
*/
- private fun sendTextMessagesBatched(room: Room, message: String, count: Int) {
+ private fun sendTextMessagesBatched(timeline: Timeline, room: Room, message: String, count: Int, timeout: Long): List {
+ val sentEvents = ArrayList(count)
(1 until count + 1)
.map { "$message #$it" }
.chunked(10)
@@ -192,8 +166,34 @@ class CommonTestHelper(context: Context) {
batchedMessages.forEach { formattedMessage ->
room.sendTextMessage(formattedMessage)
}
- Thread.sleep(1_000L)
+ waitWithLatch(timeout) { latch ->
+ val timelineListener = object : Timeline.Listener {
+
+ override fun onTimelineUpdated(snapshot: List) {
+ val allSentMessages = snapshot
+ .filter { it.root.sendState == SendState.SYNCED }
+ .filter { it.root.getClearType() == EventType.MESSAGE }
+ .filter { it.root.getClearContent().toModel()?.body?.startsWith(message) == true }
+
+ val hasSyncedAllBatchedMessages = allSentMessages
+ .map {
+ it.root.getClearContent().toModel()?.body
+ }
+ .containsAll(batchedMessages)
+
+ if (allSentMessages.size == count) {
+ sentEvents.addAll(allSentMessages)
+ }
+ if (hasSyncedAllBatchedMessages) {
+ timeline.removeListener(this)
+ latch.countDown()
+ }
+ }
+ }
+ timeline.addListener(timelineListener)
+ }
}
+ return sentEvents
}
// PRIVATE METHODS *****************************************************************************
@@ -332,13 +332,6 @@ class CommonTestHelper(context: Context) {
fun createEventListener(latch: CountDownLatch, predicate: (List) -> Boolean): Timeline.Listener {
return object : Timeline.Listener {
- override fun onTimelineFailure(throwable: Throwable) {
- // noop
- }
-
- override fun onNewTimelineEvents(eventIds: List) {
- // noop
- }
override fun onTimelineUpdated(snapshot: List) {
if (predicate(snapshot)) {
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt
index ccea6f53b9a..71796192a8d 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt
@@ -246,8 +246,7 @@ class CryptoTestHelper(private val testHelper: CommonTestHelper) {
val bobRoomSummariesLive = bob.getRoomSummariesLive(roomSummaryQueryParams { })
val newRoomObserver = object : Observer> {
override fun onChanged(t: List?) {
- val indexOfFirst = t?.indexOfFirst { it.roomId == roomId } ?: -1
- if (indexOfFirst != -1) {
+ if (t?.any { it.roomId == roomId }.orFalse()) {
bobRoomSummariesLive.removeObserver(this)
latch.countDown()
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParserTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParserTest.kt
index 1ed2f899773..8625e97902c 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParserTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParserTest.kt
@@ -49,6 +49,7 @@ class MarkdownParserTest : InstrumentedTest {
* Create the same parser than in the RoomModule
*/
private val markdownParser = MarkdownParser(
+ Parser.builder().build(),
Parser.builder().build(),
HtmlRenderer.builder().softbreak(" ").build(),
TextPillsUtils(
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineBackToPreviousLastForwardTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineBackToPreviousLastForwardTest.kt
deleted file mode 100644
index 7628f287c97..00000000000
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineBackToPreviousLastForwardTest.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright 2020 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.session.room.timeline
-
-import org.amshove.kluent.shouldBeFalse
-import org.amshove.kluent.shouldBeTrue
-import org.junit.Assert.assertTrue
-import org.junit.FixMethodOrder
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import org.junit.runners.MethodSorters
-import org.matrix.android.sdk.InstrumentedTest
-import org.matrix.android.sdk.api.extensions.orFalse
-import org.matrix.android.sdk.api.session.events.model.EventType
-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.Timeline
-import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
-import org.matrix.android.sdk.common.CommonTestHelper
-import org.matrix.android.sdk.common.CryptoTestHelper
-import org.matrix.android.sdk.common.checkSendOrder
-import timber.log.Timber
-import java.util.concurrent.CountDownLatch
-
-@RunWith(JUnit4::class)
-@FixMethodOrder(MethodSorters.JVM)
-class TimelineBackToPreviousLastForwardTest : InstrumentedTest {
-
- private val commonTestHelper = CommonTestHelper(context())
- private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
-
- /**
- * This test ensure that if we have a chunk in the timeline which is due to a sync, and we click to permalink of an
- * even contained in a previous lastForward chunk, we will be able to go back to the live
- */
- @Test
- fun backToPreviousLastForwardTest() {
- val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
-
- val aliceSession = cryptoTestData.firstSession
- val bobSession = cryptoTestData.secondSession!!
- val aliceRoomId = cryptoTestData.roomId
-
- aliceSession.cryptoService().setWarnOnUnknownDevices(false)
- bobSession.cryptoService().setWarnOnUnknownDevices(false)
-
- val roomFromAlicePOV = aliceSession.getRoom(aliceRoomId)!!
- val roomFromBobPOV = bobSession.getRoom(aliceRoomId)!!
-
- val bobTimeline = roomFromBobPOV.createTimeline(null, TimelineSettings(30))
- bobTimeline.start()
-
- var roomCreationEventId: String? = null
-
- run {
- val lock = CountDownLatch(1)
- val eventsListener = commonTestHelper.createEventListener(lock) { snapshot ->
- Timber.e("Bob timeline updated: with ${snapshot.size} events:")
- snapshot.forEach {
- Timber.w(" event ${it.root}")
- }
-
- roomCreationEventId = snapshot.lastOrNull()?.root?.eventId
- // Ok, we have the 8 first messages of the initial sync (room creation and bob join event)
- snapshot.size == 8
- }
-
- bobTimeline.addListener(eventsListener)
- commonTestHelper.await(lock)
- bobTimeline.removeAllListeners()
-
- bobTimeline.hasMoreToLoad(Timeline.Direction.BACKWARDS).shouldBeFalse()
- bobTimeline.hasMoreToLoad(Timeline.Direction.FORWARDS).shouldBeFalse()
- }
-
- // Bob stop to sync
- bobSession.stopSync()
-
- val messageRoot = "First messages from Alice"
-
- // Alice sends 30 messages
- commonTestHelper.sendTextMessage(
- roomFromAlicePOV,
- messageRoot,
- 30)
-
- // Bob start to sync
- bobSession.startSync(true)
-
- run {
- val lock = CountDownLatch(1)
- val eventsListener = commonTestHelper.createEventListener(lock) { snapshot ->
- Timber.e("Bob timeline updated: with ${snapshot.size} events:")
- snapshot.forEach {
- Timber.w(" event ${it.root}")
- }
-
- // Ok, we have the 10 last messages from Alice.
- snapshot.size == 10 &&
- snapshot.all { it.root.content.toModel()?.body?.startsWith(messageRoot).orFalse() }
- }
-
- bobTimeline.addListener(eventsListener)
- commonTestHelper.await(lock)
- bobTimeline.removeAllListeners()
-
- bobTimeline.hasMoreToLoad(Timeline.Direction.BACKWARDS).shouldBeTrue()
- bobTimeline.hasMoreToLoad(Timeline.Direction.FORWARDS).shouldBeFalse()
- }
-
- // Bob navigate to the first event (room creation event), so inside the previous last forward chunk
- run {
- val lock = CountDownLatch(1)
- val eventsListener = commonTestHelper.createEventListener(lock) { snapshot ->
- Timber.e("Bob timeline updated: with ${snapshot.size} events:")
- snapshot.forEach {
- Timber.w(" event ${it.root}")
- }
-
- // The event is in db, so it is fetch and auto pagination occurs, half of the number of events we have for this chunk (?)
- snapshot.size == 4
- }
-
- bobTimeline.addListener(eventsListener)
-
- // Restart the timeline to the first sent event, which is already in the database, so pagination should start automatically
- assertTrue(roomFromBobPOV.getTimeLineEvent(roomCreationEventId!!) != null)
-
- bobTimeline.restartWithEventId(roomCreationEventId)
-
- commonTestHelper.await(lock)
- bobTimeline.removeAllListeners()
-
- bobTimeline.hasMoreToLoad(Timeline.Direction.FORWARDS).shouldBeTrue()
- bobTimeline.hasMoreToLoad(Timeline.Direction.BACKWARDS).shouldBeFalse()
- }
-
- // Bob scroll to the future
- run {
- val lock = CountDownLatch(1)
- val eventsListener = commonTestHelper.createEventListener(lock) { snapshot ->
- Timber.e("Bob timeline updated: with ${snapshot.size} events:")
- snapshot.forEach {
- Timber.w(" event ${it.root}")
- }
-
- // Bob can see the first event of the room (so Back pagination has worked)
- snapshot.lastOrNull()?.root?.getClearType() == EventType.STATE_ROOM_CREATE &&
- // 8 for room creation item, and 30 for the forward pagination
- snapshot.size == 38 &&
- snapshot.checkSendOrder(messageRoot, 30, 0)
- }
-
- bobTimeline.addListener(eventsListener)
-
- bobTimeline.paginate(Timeline.Direction.FORWARDS, 50)
-
- commonTestHelper.await(lock)
- bobTimeline.removeAllListeners()
-
- bobTimeline.hasMoreToLoad(Timeline.Direction.FORWARDS).shouldBeFalse()
- bobTimeline.hasMoreToLoad(Timeline.Direction.BACKWARDS).shouldBeFalse()
- }
- bobTimeline.dispose()
-
- cryptoTestData.cleanUp(commonTestHelper)
- }
-}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt
index bc9722c922b..05a43de0ac6 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt
@@ -16,6 +16,8 @@
package org.matrix.android.sdk.session.room.timeline
+import kotlinx.coroutines.runBlocking
+import org.amshove.kluent.internal.assertEquals
import org.amshove.kluent.shouldBeFalse
import org.amshove.kluent.shouldBeTrue
import org.junit.FixMethodOrder
@@ -123,54 +125,29 @@ class TimelineForwardPaginationTest : InstrumentedTest {
// Alice paginates BACKWARD and FORWARD of 50 events each
// Then she can only navigate FORWARD
run {
- val lock = CountDownLatch(1)
- val aliceEventsListener = commonTestHelper.createEventListener(lock) { snapshot ->
- Timber.e("Alice timeline updated: with ${snapshot.size} events:")
- snapshot.forEach {
- Timber.w(" event ${it.root.content}")
- }
-
- // Alice can see the first event of the room (so Back pagination has worked)
- snapshot.lastOrNull()?.root?.getClearType() == EventType.STATE_ROOM_CREATE &&
- // 6 for room creation item (backward pagination), 1 for the context, and 50 for the forward pagination
- snapshot.size == 57 // 6 + 1 + 50
+ val snapshot = runBlocking {
+ aliceTimeline.awaitPaginate(Timeline.Direction.BACKWARDS, 50)
+ aliceTimeline.awaitPaginate(Timeline.Direction.FORWARDS, 50)
}
-
- aliceTimeline.addListener(aliceEventsListener)
-
- // Restart the timeline to the first sent event
- // We ask to load event backward and forward
- aliceTimeline.paginate(Timeline.Direction.BACKWARDS, 50)
- aliceTimeline.paginate(Timeline.Direction.FORWARDS, 50)
-
- commonTestHelper.await(lock)
- aliceTimeline.removeAllListeners()
-
aliceTimeline.hasMoreToLoad(Timeline.Direction.FORWARDS).shouldBeTrue()
aliceTimeline.hasMoreToLoad(Timeline.Direction.BACKWARDS).shouldBeFalse()
+
+ assertEquals(EventType.STATE_ROOM_CREATE, snapshot.lastOrNull()?.root?.getClearType())
+ // 6 for room creation item (backward pagination), 1 for the context, and 50 for the forward pagination
+ // 6 + 1 + 50
+ assertEquals(57, snapshot.size)
}
// Alice paginates once again FORWARD for 50 events
// All the timeline is retrieved, she cannot paginate anymore in both direction
run {
- val lock = CountDownLatch(1)
- val aliceEventsListener = commonTestHelper.createEventListener(lock) { snapshot ->
- Timber.e("Alice timeline updated: with ${snapshot.size} events:")
- snapshot.forEach {
- Timber.w(" event ${it.root.content}")
- }
- // 6 for room creation item (backward pagination),and numberOfMessagesToSend (all the message of the room)
- snapshot.size == 6 + numberOfMessagesToSend &&
- snapshot.checkSendOrder(message, numberOfMessagesToSend, 0)
- }
-
- aliceTimeline.addListener(aliceEventsListener)
-
// Ask for a forward pagination
- aliceTimeline.paginate(Timeline.Direction.FORWARDS, 50)
-
- commonTestHelper.await(lock)
- aliceTimeline.removeAllListeners()
+ val snapshot = runBlocking {
+ aliceTimeline.awaitPaginate(Timeline.Direction.FORWARDS, 50)
+ }
+ // 6 for room creation item (backward pagination),and numberOfMessagesToSend (all the message of the room)
+ snapshot.size == 6 + numberOfMessagesToSend &&
+ snapshot.checkSendOrder(message, numberOfMessagesToSend, 0)
// The timeline is fully loaded
aliceTimeline.hasMoreToLoad(Timeline.Direction.FORWARDS).shouldBeFalse()
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelinePreviousLastForwardTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelinePreviousLastForwardTest.kt
index e865fe17da8..c6fdec150d5 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelinePreviousLastForwardTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelinePreviousLastForwardTest.kt
@@ -168,10 +168,8 @@ class TimelinePreviousLastForwardTest : InstrumentedTest {
bobTimeline.addListener(eventsListener)
- // Restart the timeline to the first sent event, and paginate in both direction
+ // Restart the timeline to the first sent event
bobTimeline.restartWithEventId(firstMessageFromAliceId)
- bobTimeline.paginate(Timeline.Direction.BACKWARDS, 50)
- bobTimeline.paginate(Timeline.Direction.FORWARDS, 50)
commonTestHelper.await(lock)
bobTimeline.removeAllListeners()
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineSimpleBackPaginationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineSimpleBackPaginationTest.kt
new file mode 100644
index 00000000000..b75df9b5a21
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineSimpleBackPaginationTest.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2020 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.session.room.timeline
+
+import kotlinx.coroutines.runBlocking
+import org.amshove.kluent.internal.assertEquals
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.extensions.orFalse
+import org.matrix.android.sdk.api.session.events.model.isTextMessage
+import org.matrix.android.sdk.api.session.events.model.toModel
+import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent
+import org.matrix.android.sdk.api.session.room.timeline.Timeline
+import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.CryptoTestHelper
+import org.matrix.android.sdk.common.TestConstants
+
+@RunWith(JUnit4::class)
+@FixMethodOrder(MethodSorters.JVM)
+class TimelineSimpleBackPaginationTest : InstrumentedTest {
+
+ private val commonTestHelper = CommonTestHelper(context())
+ private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
+
+ @Test
+ fun timeline_backPaginate_shouldReachEndOfTimeline() {
+ val numberOfMessagesToSent = 200
+
+ val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
+
+ val aliceSession = cryptoTestData.firstSession
+ val bobSession = cryptoTestData.secondSession!!
+ val roomId = cryptoTestData.roomId
+
+ aliceSession.cryptoService().setWarnOnUnknownDevices(false)
+ bobSession.cryptoService().setWarnOnUnknownDevices(false)
+
+ val roomFromAlicePOV = aliceSession.getRoom(roomId)!!
+ val roomFromBobPOV = bobSession.getRoom(roomId)!!
+
+ // Alice sends X messages
+ val message = "Message from Alice"
+ commonTestHelper.sendTextMessage(
+ roomFromAlicePOV,
+ message,
+ numberOfMessagesToSent)
+
+ val bobTimeline = roomFromBobPOV.createTimeline(null, TimelineSettings(30))
+ bobTimeline.start()
+
+ commonTestHelper.waitWithLatch(timeout = TestConstants.timeOutMillis * 10) {
+ val listener = object : Timeline.Listener {
+
+ override fun onStateUpdated(direction: Timeline.Direction, state: Timeline.PaginationState) {
+ if (direction == Timeline.Direction.FORWARDS) {
+ return
+ }
+ if (state.hasMoreToLoad && !state.loading) {
+ bobTimeline.paginate(Timeline.Direction.BACKWARDS, 30)
+ } else if (!state.hasMoreToLoad) {
+ bobTimeline.removeListener(this)
+ it.countDown()
+ }
+ }
+ }
+ bobTimeline.addListener(listener)
+ bobTimeline.paginate(Timeline.Direction.BACKWARDS, 30)
+ }
+ assertEquals(false, bobTimeline.hasMoreToLoad(Timeline.Direction.FORWARDS))
+ assertEquals(false, bobTimeline.hasMoreToLoad(Timeline.Direction.BACKWARDS))
+
+ val onlySentEvents = runBlocking {
+ bobTimeline.getSnapshot()
+ }
+ .filter {
+ it.root.isTextMessage()
+ }.filter {
+ (it.root.content.toModel())?.body?.startsWith(message).orFalse()
+ }
+ assertEquals(numberOfMessagesToSent, onlySentEvents.size)
+
+ bobTimeline.dispose()
+ cryptoTestData.cleanUp(commonTestHelper)
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineTest.kt
deleted file mode 100644
index 9be0a5d5af5..00000000000
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineTest.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2020 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.session.room.timeline
-
-import com.zhuinden.monarchy.Monarchy
-import org.matrix.android.sdk.InstrumentedTest
-
-internal class TimelineTest : InstrumentedTest {
-
- companion object {
- private const val ROOM_ID = "roomId"
- }
-
- private lateinit var monarchy: Monarchy
-
-// @Before
-// fun setup() {
-// Timber.plant(Timber.DebugTree())
-// Realm.init(context())
-// val testConfiguration = RealmConfiguration.Builder().name("test-realm")
-// .modules(SessionRealmModule()).build()
-//
-// Realm.deleteRealm(testConfiguration)
-// monarchy = Monarchy.Builder().setRealmConfiguration(testConfiguration).build()
-// RoomDataHelper.fakeInitialSync(monarchy, ROOM_ID)
-// }
-//
-// private fun createTimeline(initialEventId: String? = null): Timeline {
-// val taskExecutor = TaskExecutor(testCoroutineDispatchers)
-// val tokenChunkEventPersistor = TokenChunkEventPersistor(monarchy)
-// val paginationTask = FakePaginationTask @Inject constructor(tokenChunkEventPersistor)
-// val getContextOfEventTask = FakeGetContextOfEventTask @Inject constructor(tokenChunkEventPersistor)
-// val roomMemberExtractor = SenderRoomMemberExtractor(ROOM_ID)
-// val timelineEventFactory = TimelineEventFactory(roomMemberExtractor, EventRelationExtractor())
-// return DefaultTimeline(
-// ROOM_ID,
-// initialEventId,
-// monarchy.realmConfiguration,
-// taskExecutor,
-// getContextOfEventTask,
-// timelineEventFactory,
-// paginationTask,
-// null)
-// }
-//
-// @Test
-// fun backPaginate_shouldLoadMoreEvents_whenPaginateIsCalled() {
-// val timeline = createTimeline()
-// timeline.start()
-// val paginationCount = 30
-// var initialLoad = 0
-// val latch = CountDownLatch(2)
-// var timelineEvents: List = emptyList()
-// timeline.listener = object : Timeline.Listener {
-// override fun onTimelineUpdated(snapshot: List) {
-// if (snapshot.isNotEmpty()) {
-// if (initialLoad == 0) {
-// initialLoad = snapshot.size
-// }
-// timelineEvents = snapshot
-// latch.countDown()
-// timeline.paginate(Timeline.Direction.BACKWARDS, paginationCount)
-// }
-// }
-// }
-// latch.await()
-// timelineEvents.size shouldBeEqualTo initialLoad + paginationCount
-// timeline.dispose()
-// }
-}
diff --git a/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/DisplayMaths.kt b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/DisplayMaths.kt
new file mode 100644
index 00000000000..b8ee36e7240
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/DisplayMaths.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2021 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.commonmark.ext.maths
+
+import org.commonmark.node.CustomBlock
+
+class DisplayMaths(private val delimiter: DisplayDelimiter) : CustomBlock() {
+ enum class DisplayDelimiter {
+ DOUBLE_DOLLAR,
+ SQUARE_BRACKET_ESCAPED
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/InlineMaths.kt b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/InlineMaths.kt
new file mode 100644
index 00000000000..962b1b8cbf3
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/InlineMaths.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2021 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.commonmark.ext.maths
+
+import org.commonmark.node.CustomNode
+import org.commonmark.node.Delimited
+
+class InlineMaths(private val delimiter: InlineDelimiter) : CustomNode(), Delimited {
+ enum class InlineDelimiter {
+ SINGLE_DOLLAR,
+ ROUND_BRACKET_ESCAPED
+ }
+
+ override fun getOpeningDelimiter(): String {
+ return when (delimiter) {
+ InlineDelimiter.SINGLE_DOLLAR -> "$"
+ InlineDelimiter.ROUND_BRACKET_ESCAPED -> "\\("
+ }
+ }
+
+ override fun getClosingDelimiter(): String {
+ return when (delimiter) {
+ InlineDelimiter.SINGLE_DOLLAR -> "$"
+ InlineDelimiter.ROUND_BRACKET_ESCAPED -> "\\)"
+ }
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/MathsExtension.kt b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/MathsExtension.kt
new file mode 100644
index 00000000000..18c0fc4284b
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/MathsExtension.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2021 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.commonmark.ext.maths
+
+import org.commonmark.Extension
+import org.commonmark.ext.maths.internal.DollarMathsDelimiterProcessor
+import org.commonmark.ext.maths.internal.MathsHtmlNodeRenderer
+import org.commonmark.parser.Parser
+import org.commonmark.renderer.html.HtmlRenderer
+
+class MathsExtension private constructor() : Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension {
+ override fun extend(parserBuilder: Parser.Builder) {
+ parserBuilder.customDelimiterProcessor(DollarMathsDelimiterProcessor())
+ }
+
+ override fun extend(rendererBuilder: HtmlRenderer.Builder) {
+ rendererBuilder.nodeRendererFactory { context -> MathsHtmlNodeRenderer(context) }
+ }
+
+ companion object {
+ fun create(): Extension {
+ return MathsExtension()
+ }
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/DollarMathsDelimiterProcessor.kt b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/DollarMathsDelimiterProcessor.kt
new file mode 100644
index 00000000000..cfd03fa8f16
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/DollarMathsDelimiterProcessor.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2021 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.commonmark.ext.maths.internal
+
+import org.commonmark.ext.maths.DisplayMaths
+import org.commonmark.ext.maths.InlineMaths
+import org.commonmark.node.Text
+import org.commonmark.parser.delimiter.DelimiterProcessor
+import org.commonmark.parser.delimiter.DelimiterRun
+
+class DollarMathsDelimiterProcessor : DelimiterProcessor {
+ override fun getOpeningCharacter() = '$'
+
+ override fun getClosingCharacter() = '$'
+
+ override fun getMinLength() = 1
+
+ override fun getDelimiterUse(opener: DelimiterRun, closer: DelimiterRun): Int {
+ return if (opener.length() == 1 && closer.length() == 1) 1 // inline
+ else if (opener.length() == 2 && closer.length() == 2) 2 // display
+ else 0
+ }
+
+ override fun process(opener: Text, closer: Text, delimiterUse: Int) {
+ val maths = if (delimiterUse == 1) {
+ InlineMaths(InlineMaths.InlineDelimiter.SINGLE_DOLLAR)
+ } else {
+ DisplayMaths(DisplayMaths.DisplayDelimiter.DOUBLE_DOLLAR)
+ }
+ var tmp = opener.next
+ while (tmp != null && tmp !== closer) {
+ val next = tmp.next
+ maths.appendChild(tmp)
+ tmp = next
+ }
+ opener.insertAfter(maths)
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/MathsHtmlNodeRenderer.kt b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/MathsHtmlNodeRenderer.kt
new file mode 100644
index 00000000000..94652ed7ad8
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/MathsHtmlNodeRenderer.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.commonmark.ext.maths.internal
+
+import org.commonmark.ext.maths.DisplayMaths
+import org.commonmark.node.Node
+import org.commonmark.node.Text
+import org.commonmark.renderer.html.HtmlNodeRendererContext
+import org.commonmark.renderer.html.HtmlWriter
+import java.util.Collections
+
+class MathsHtmlNodeRenderer(private val context: HtmlNodeRendererContext) : MathsNodeRenderer() {
+ private val html: HtmlWriter = context.writer
+ override fun render(node: Node) {
+ val display = node.javaClass == DisplayMaths::class.java
+ val contents = node.firstChild // should be the only child
+ val latex = (contents as Text).literal
+ val attributes = context.extendAttributes(node, if (display) "div" else "span", Collections.singletonMap("data-mx-maths",
+ latex))
+ html.tag(if (display) "div" else "span", attributes)
+ html.tag("code")
+ context.render(contents)
+ html.tag("/code")
+ html.tag(if (display) "/div" else "/span")
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/MathsNodeRenderer.kt b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/MathsNodeRenderer.kt
new file mode 100644
index 00000000000..55cdc05c398
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/commonmark/ext/maths/internal/MathsNodeRenderer.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2021 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.commonmark.ext.maths.internal
+
+import org.commonmark.ext.maths.DisplayMaths
+import org.commonmark.ext.maths.InlineMaths
+import org.commonmark.node.Node
+import org.commonmark.renderer.NodeRenderer
+import java.util.HashSet
+
+abstract class MathsNodeRenderer : NodeRenderer {
+ override fun getNodeTypes(): Set> {
+ val types: MutableSet> = HashSet()
+ types.add(InlineMaths::class.java)
+ types.add(DisplayMaths::class.java)
+ return types
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/RoomEncryptionTrustLevel.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/RoomEncryptionTrustLevel.kt
index f381ae8455a..8ba99ad70b4 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/RoomEncryptionTrustLevel.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/RoomEncryptionTrustLevel.kt
@@ -27,5 +27,8 @@ enum class RoomEncryptionTrustLevel {
Warning,
// All devices in the room are verified -> the app should display a green shield
- Trusted
+ Trusted,
+
+ // e2e is active but with an unsupported algorithm
+ E2EWithUnsupportedAlgorithm
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/EventStreamService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/EventStreamService.kt
new file mode 100644
index 00000000000..a1316a54445
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/EventStreamService.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2021 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
+
+interface EventStreamService {
+
+ fun addEventStreamListener(streamListener: LiveEventListener)
+
+ fun removeEventStreamListener(streamListener: LiveEventListener)
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/LiveEventListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/LiveEventListener.kt
new file mode 100644
index 00000000000..6fda65953ac
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/LiveEventListener.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2021 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
+
+import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.util.JsonDict
+
+interface LiveEventListener {
+
+ fun onLiveEvent(roomId: String, event: Event)
+
+ fun onPaginatedEvent(roomId: String, event: Event)
+
+ fun onEventDecrypted(eventId: String, roomId: String, clearEvent: JsonDict)
+
+ fun onEventDecryptionError(eventId: String, roomId: String, throwable: Throwable)
+
+ fun onLiveToDeviceEvent(event: Event)
+
+ // Maybe later add more, like onJoin, onLeave..
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
index 3f817ec4d2b..36ab0073142 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
@@ -84,7 +84,9 @@ interface Session :
SyncStatusService,
HomeServerCapabilitiesService,
SecureStorageService,
- AccountService {
+ AccountService,
+ ToDeviceService,
+ EventStreamService {
val coroutineDispatchers: MatrixCoroutineDispatchers
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/ToDeviceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/ToDeviceService.kt
new file mode 100644
index 00000000000..45fd39fa954
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/ToDeviceService.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 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
+
+import org.matrix.android.sdk.api.session.events.model.Content
+import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap
+import java.util.UUID
+
+interface ToDeviceService {
+
+ /**
+ * Send an event to a specific list of devices
+ */
+ suspend fun sendToDevice(eventType: String, contentMap: MXUsersDevicesMap, txnId: String? = UUID.randomUUID().toString())
+
+ suspend fun sendToDevice(eventType: String, userId: String, deviceId: String, content: Content, txnId: String? = UUID.randomUUID().toString()) {
+ sendToDevice(eventType, mapOf(userId to listOf(deviceId)), content, txnId)
+ }
+
+ suspend fun sendToDevice(eventType: String, targets: Map>, content: Content, txnId: String? = UUID.randomUUID().toString())
+
+ suspend fun sendEncryptedToDevice(eventType: String, targets: Map>, content: Content, txnId: String? = UUID.randomUUID().toString())
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataTypes.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataTypes.kt
index 69b15ff7d4c..91167d896f0 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataTypes.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataTypes.kt
@@ -27,4 +27,5 @@ object UserAccountDataTypes {
const val TYPE_ALLOWED_WIDGETS = "im.vector.setting.allowed_widgets"
const val TYPE_IDENTITY_SERVER = "m.identity_server"
const val TYPE_ACCEPTED_TERMS = "m.accepted_terms"
+ const val TYPE_OVERRIDE_COLORS = "im.vector.setting.override_colors"
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt
index 96eb86c0d65..312fb7e1645 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/accountdata/RoomAccountDataTypes.kt
@@ -21,4 +21,5 @@ object RoomAccountDataTypes {
const val EVENT_TYPE_TAG = "m.tag"
const val EVENT_TYPE_FULLY_READ = "m.fully_read"
const val EVENT_TYPE_SPACE_ORDER = "org.matrix.msc3230.space_order" // m.space_order
+ const val EVENT_TYPE_TAGGED_EVENTS = "m.tagged_events"
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt
index 6581247b90a..445d16b72bc 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt
@@ -27,9 +27,12 @@ interface RoomCryptoService {
fun shouldEncryptForInvitedMembers(): Boolean
/**
- * Enable encryption of the room
+ * Enable encryption of the room.
+ * @param Use force to ensure that this algorithm will be used. Otherwise this call
+ * will throw if encryption is already setup or if the algorithm is not supported. Only to
+ * be used by admins to fix misconfigured encryption.
*/
- suspend fun enableEncryption(algorithm: String = MXCRYPTO_ALGORITHM_MEGOLM)
+ suspend fun enableEncryption(algorithm: String = MXCRYPTO_ALGORITHM_MEGOLM, force: Boolean = false)
/**
* Ensures all members of the room are loaded and outbound session keys are shared.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomEncryptionAlgorithm.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomEncryptionAlgorithm.kt
new file mode 100644
index 00000000000..f6812169294
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomEncryptionAlgorithm.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2021 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.room.model
+
+import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
+
+sealed class RoomEncryptionAlgorithm {
+
+ abstract class SupportedAlgorithm(val alg: String) : RoomEncryptionAlgorithm()
+
+ object Megolm : SupportedAlgorithm(MXCRYPTO_ALGORITHM_MEGOLM)
+
+ data class UnsupportedAlgorithm(val name: String?) : RoomEncryptionAlgorithm()
+}
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 10cad026bcb..c793a04f9de 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
@@ -62,7 +62,8 @@ data class RoomSummary(
val roomType: String? = null,
val spaceParents: List? = null,
val spaceChildren: List? = null,
- val flattenParentIds: List = emptyList()
+ val flattenParentIds: List = emptyList(),
+ val roomEncryptionAlgorithm: RoomEncryptionAlgorithm? = null
) {
val isVersioned: Boolean
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt
index 5b387c3413e..606500c4e72 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt
@@ -56,6 +56,15 @@ interface SendService {
*/
fun sendFormattedTextMessage(text: String, formattedText: String, msgType: String = MessageType.MSGTYPE_TEXT): Cancelable
+ /**
+ * Method to quote an events content.
+ * @param quotedEvent The event to which we will quote it's content.
+ * @param text the text message to send
+ * @param autoMarkdown If true, the SDK will generate a formatted HTML message from the body text if markdown syntax is present
+ * @return a [Cancelable]
+ */
+ fun sendQuotedTextMessage(quotedEvent: TimelineEvent, text: String, autoMarkdown: Boolean): Cancelable
+
/**
* Method to send a media asynchronously.
* @param attachment the media to send
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 06c88db8316..241e5f3b9b8 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
@@ -71,14 +71,10 @@ interface Timeline {
fun paginate(direction: Direction, count: Int)
/**
- * Returns the number of sending events
+ * This is the same than the regular paginate method but waits for the results instead
+ * of relying on the timeline listener.
*/
- fun pendingEventCount(): Int
-
- /**
- * Returns the number of failed sending events.
- */
- fun failedToDeliverEventCount(): Int
+ suspend fun awaitPaginate(direction: Direction, count: Int): List
/**
* Returns the index of a built event or null.
@@ -86,14 +82,14 @@ interface Timeline {
fun getIndexOfEvent(eventId: String?): Int?
/**
- * Returns the built [TimelineEvent] at index or null
+ * Returns the current pagination state for the direction.
*/
- fun getTimelineEventAtIndex(index: Int): TimelineEvent?
+ fun getPaginationState(direction: Direction): PaginationState
/**
- * Returns the built [TimelineEvent] with eventId or null
+ * Returns a snapshot of the timeline in his current state.
*/
- fun getTimelineEventWithId(eventId: String?): TimelineEvent?
+ fun getSnapshot(): List
interface Listener {
/**
@@ -101,19 +97,33 @@ interface Timeline {
* The latest event is the first in the list
* @param snapshot the most up to date snapshot
*/
- fun onTimelineUpdated(snapshot: List)
+ fun onTimelineUpdated(snapshot: List) = Unit
/**
* Called whenever an error we can't recover from occurred
*/
- fun onTimelineFailure(throwable: Throwable)
+ fun onTimelineFailure(throwable: Throwable) = Unit
/**
* Called when new events come through the sync
*/
- fun onNewTimelineEvents(eventIds: List)
+ fun onNewTimelineEvents(eventIds: List) = Unit
+
+ /**
+ * Called when the pagination state has changed in one direction
+ */
+ fun onStateUpdated(direction: Direction, state: PaginationState) = Unit
}
+ /**
+ * Pagination state
+ */
+ data class PaginationState(
+ val hasMoreToLoad: Boolean = true,
+ val loading: Boolean = false,
+ val inError: Boolean = false
+ )
+
/**
* This is used to paginate in one or another direction.
*/
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
index 932439c81c6..45dc322420f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
@@ -47,6 +47,10 @@ data class TimelineEvent(
*/
val localId: Long,
val eventId: String,
+ /**
+ * This display index is the position in the current chunk.
+ * It's not unique on the timeline as it's reset on each chunk.
+ */
val displayIndex: Int,
val senderInfo: SenderInfo,
val annotations: EventAnnotationsSummary? = null,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt
index 5338e7e92f5..82eced43711 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt
@@ -37,7 +37,6 @@ internal class CryptoSessionInfoProvider @Inject constructor(
fun isRoomEncrypted(roomId: String): Boolean {
val encryptionEvent = monarchy.fetchCopied { realm ->
EventEntity.whereType(realm, roomId = roomId, type = EventType.STATE_ROOM_ENCRYPTION)
- .contains(EventEntityFields.CONTENT, "\"algorithm\":\"$MXCRYPTO_ALGORITHM_MEGOLM\"")
.isEmpty(EventEntityFields.STATE_KEY)
.findFirst()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt
index 7d9c3514100..7dd8cc73ae2 100755
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt
@@ -90,6 +90,7 @@ import org.matrix.android.sdk.internal.di.MoshiProvider
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.extensions.foldToCallback
import org.matrix.android.sdk.internal.session.SessionScope
+import org.matrix.android.sdk.internal.session.StreamEventsManager
import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask
import org.matrix.android.sdk.internal.task.TaskExecutor
import org.matrix.android.sdk.internal.task.TaskThread
@@ -168,14 +169,15 @@ internal class DefaultCryptoService @Inject constructor(
private val coroutineDispatchers: MatrixCoroutineDispatchers,
private val taskExecutor: TaskExecutor,
private val cryptoCoroutineScope: CoroutineScope,
- private val eventDecryptor: EventDecryptor
+ private val eventDecryptor: EventDecryptor,
+ private val liveEventManager: Lazy
) : CryptoService {
private val isStarting = AtomicBoolean(false)
private val isStarted = AtomicBoolean(false)
fun onStateEvent(roomId: String, event: Event) {
- when (event.getClearType()) {
+ when (event.type) {
EventType.STATE_ROOM_ENCRYPTION -> onRoomEncryptionEvent(roomId, event)
EventType.STATE_ROOM_MEMBER -> onRoomMembershipEvent(roomId, event)
EventType.STATE_ROOM_HISTORY_VISIBILITY -> onRoomHistoryVisibilityEvent(roomId, event)
@@ -183,10 +185,13 @@ internal class DefaultCryptoService @Inject constructor(
}
fun onLiveEvent(roomId: String, event: Event) {
- when (event.getClearType()) {
- EventType.STATE_ROOM_ENCRYPTION -> onRoomEncryptionEvent(roomId, event)
- EventType.STATE_ROOM_MEMBER -> onRoomMembershipEvent(roomId, event)
- EventType.STATE_ROOM_HISTORY_VISIBILITY -> onRoomHistoryVisibilityEvent(roomId, event)
+ // handle state events
+ if (event.isStateEvent()) {
+ when (event.type) {
+ EventType.STATE_ROOM_ENCRYPTION -> onRoomEncryptionEvent(roomId, event)
+ EventType.STATE_ROOM_MEMBER -> onRoomMembershipEvent(roomId, event)
+ EventType.STATE_ROOM_HISTORY_VISIBILITY -> onRoomHistoryVisibilityEvent(roomId, event)
+ }
}
}
@@ -429,7 +434,17 @@ internal class DefaultCryptoService @Inject constructor(
val currentCount = syncResponse.deviceOneTimeKeysCount.signedCurve25519 ?: 0
oneTimeKeysUploader.updateOneTimeKeyCount(currentCount)
}
- if (isStarted()) {
+ // There is a limit of to_device events returned per sync.
+ // If we are in a case of such limited to_device sync we can't try to generate/upload
+ // new otk now, because there might be some pending olm pre-key to_device messages that would fail if we rotate
+ // the old otk too early. In this case we want to wait for the pending to_device before doing anything
+ // As per spec:
+ // If there is a large queue of send-to-device messages, the server should limit the number sent in each /sync response.
+ // 100 messages is recommended as a reasonable limit.
+ // The limit is not part of the spec, so it's probably safer to handle that when there are no more to_device ( so we are sure
+ // that there are no pending to_device
+ val toDevices = syncResponse.toDevice?.events.orEmpty()
+ if (isStarted() && toDevices.isEmpty()) {
// Make sure we process to-device messages before generating new one-time-keys #2782
deviceListManager.refreshOutdatedDeviceLists()
// The presence of device_unused_fallback_key_types indicates that the server supports fallback keys.
@@ -563,26 +578,31 @@ internal class DefaultCryptoService @Inject constructor(
// (for now at least. Maybe we should alert the user somehow?)
val existingAlgorithm = cryptoStore.getRoomAlgorithm(roomId)
- if (!existingAlgorithm.isNullOrEmpty() && existingAlgorithm != algorithm) {
- Timber.tag(loggerTag.value).e("setEncryptionInRoom() : Ignoring m.room.encryption event which requests a change of config in $roomId")
+ if (existingAlgorithm == algorithm) {
+ // ignore
+ Timber.tag(loggerTag.value).e("setEncryptionInRoom() : Ignoring m.room.encryption for same alg ($algorithm) in $roomId")
return false
}
val encryptingClass = MXCryptoAlgorithms.hasEncryptorClassForAlgorithm(algorithm)
+ // Always store even if not supported
+ cryptoStore.storeRoomAlgorithm(roomId, algorithm)
+
if (!encryptingClass) {
Timber.tag(loggerTag.value).e("setEncryptionInRoom() : Unable to encrypt room $roomId with $algorithm")
return false
}
- cryptoStore.storeRoomAlgorithm(roomId, algorithm!!)
-
- val alg: IMXEncrypting = when (algorithm) {
+ val alg: IMXEncrypting? = when (algorithm) {
MXCRYPTO_ALGORITHM_MEGOLM -> megolmEncryptionFactory.create(roomId)
- else -> olmEncryptionFactory.create(roomId)
+ MXCRYPTO_ALGORITHM_OLM -> olmEncryptionFactory.create(roomId)
+ else -> null
}
- roomEncryptorsStore.put(roomId, alg)
+ if (alg != null) {
+ roomEncryptorsStore.put(roomId, alg)
+ }
// if encryption was not previously enabled in this room, we will have been
// ignoring new device events for these users so far. We may well have
@@ -772,6 +792,7 @@ internal class DefaultCryptoService @Inject constructor(
}
}
}
+ liveEventManager.get().dispatchOnLiveToDevice(event)
}
/**
@@ -914,6 +935,7 @@ internal class DefaultCryptoService @Inject constructor(
}
private fun onRoomHistoryVisibilityEvent(roomId: String, event: Event) {
+ if (!event.isStateEvent()) return
val eventContent = event.content.toModel()
eventContent?.historyVisibility?.let {
cryptoStore.setShouldEncryptForInvitedMembers(roomId, it != RoomHistoryVisibility.JOINED)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt
index 8bbc71543cf..2ee24dfbb06 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt
@@ -16,6 +16,7 @@
package org.matrix.android.sdk.internal.crypto.algorithms.megolm
+import dagger.Lazy
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
@@ -43,6 +44,7 @@ import org.matrix.android.sdk.internal.crypto.model.rest.ForwardedRoomKeyContent
import org.matrix.android.sdk.internal.crypto.model.rest.RoomKeyRequestBody
import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask
+import org.matrix.android.sdk.internal.session.StreamEventsManager
import timber.log.Timber
private val loggerTag = LoggerTag("MXMegolmDecryption", LoggerTag.CRYPTO)
@@ -56,7 +58,8 @@ internal class MXMegolmDecryption(private val userId: String,
private val cryptoStore: IMXCryptoStore,
private val sendToDeviceTask: SendToDeviceTask,
private val coroutineDispatchers: MatrixCoroutineDispatchers,
- private val cryptoCoroutineScope: CoroutineScope
+ private val cryptoCoroutineScope: CoroutineScope,
+ private val liveEventManager: Lazy
) : IMXDecrypting, IMXWithHeldExtension {
var newSessionListener: NewSessionListener? = null
@@ -108,12 +111,15 @@ internal class MXMegolmDecryption(private val userId: String,
claimedEd25519Key = olmDecryptionResult.keysClaimed?.get("ed25519"),
forwardingCurve25519KeyChain = olmDecryptionResult.forwardingCurve25519KeyChain
.orEmpty()
- )
+ ).also {
+ liveEventManager.get().dispatchLiveEventDecrypted(event, it)
+ }
} else {
throw MXCryptoError.Base(MXCryptoError.ErrorType.MISSING_FIELDS, MXCryptoError.MISSING_FIELDS_REASON)
}
},
{ throwable ->
+ liveEventManager.get().dispatchLiveEventDecryptionFailed(event, throwable)
if (throwable is MXCryptoError.OlmError) {
// TODO Check the value of .message
if (throwable.olmException.message == "UNKNOWN_MESSAGE_INDEX") {
@@ -133,6 +139,11 @@ internal class MXMegolmDecryption(private val userId: String,
if (requestKeysOnFail) {
requestKeysForEvent(event, false)
}
+
+ throw MXCryptoError.Base(
+ MXCryptoError.ErrorType.UNKNOWN_MESSAGE_INDEX,
+ "UNKNOWN_MESSAGE_INDEX",
+ null)
}
val reason = String.format(MXCryptoError.OLM_REASON, throwable.olmException.message)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt
index 29f9d193f84..3eba04b9f18 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt
@@ -16,6 +16,7 @@
package org.matrix.android.sdk.internal.crypto.algorithms.megolm
+import dagger.Lazy
import kotlinx.coroutines.CoroutineScope
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.internal.crypto.DeviceListManager
@@ -26,6 +27,7 @@ import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter
import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask
import org.matrix.android.sdk.internal.di.UserId
+import org.matrix.android.sdk.internal.session.StreamEventsManager
import javax.inject.Inject
internal class MXMegolmDecryptionFactory @Inject constructor(
@@ -38,7 +40,8 @@ internal class MXMegolmDecryptionFactory @Inject constructor(
private val cryptoStore: IMXCryptoStore,
private val sendToDeviceTask: SendToDeviceTask,
private val coroutineDispatchers: MatrixCoroutineDispatchers,
- private val cryptoCoroutineScope: CoroutineScope
+ private val cryptoCoroutineScope: CoroutineScope,
+ private val eventsManager: Lazy
) {
fun create(): MXMegolmDecryption {
@@ -52,6 +55,7 @@ internal class MXMegolmDecryptionFactory @Inject constructor(
cryptoStore,
sendToDeviceTask,
coroutineDispatchers,
- cryptoCoroutineScope)
+ cryptoCoroutineScope,
+ eventsManager)
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/event/EncryptionEventContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/event/EncryptionEventContent.kt
index b64cd97ff60..dd76ae1d8e1 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/event/EncryptionEventContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/event/EncryptionEventContent.kt
@@ -27,7 +27,7 @@ data class EncryptionEventContent(
* Required. The encryption algorithm to be used to encrypt messages sent in this room. Must be 'm.megolm.v1.aes-sha2'.
*/
@Json(name = "algorithm")
- val algorithm: String,
+ val algorithm: String?,
/**
* How long the session should be used before changing it. 604800000 (a week) is the recommended default.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/IMXCryptoStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/IMXCryptoStore.kt
index 9b75f88f917..82fb5653777 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/IMXCryptoStore.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/IMXCryptoStore.kt
@@ -230,7 +230,7 @@ internal interface IMXCryptoStore {
* @param roomId the id of the room.
* @param algorithm the algorithm.
*/
- fun storeRoomAlgorithm(roomId: String, algorithm: String)
+ fun storeRoomAlgorithm(roomId: String, algorithm: String?)
/**
* Provides the algorithm used in a dedicated room.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt
index 40678a6ce64..33578ba06af 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt
@@ -629,7 +629,7 @@ internal class RealmCryptoStore @Inject constructor(
}
}
- override fun storeRoomAlgorithm(roomId: String, algorithm: String) {
+ override fun storeRoomAlgorithm(roomId: String, algorithm: String?) {
doRealmTransaction(realmConfiguration) {
CryptoRoomEntity.getOrCreate(it, roomId).algorithm = algorithm
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt
deleted file mode 100644
index 7341d4656a4..00000000000
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2020 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
-
-import io.realm.Realm
-import io.realm.RealmConfiguration
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import org.matrix.android.sdk.api.session.Session
-import org.matrix.android.sdk.api.session.SessionLifecycleObserver
-import org.matrix.android.sdk.internal.database.helper.nextDisplayIndex
-import org.matrix.android.sdk.internal.database.model.ChunkEntity
-import org.matrix.android.sdk.internal.database.model.ChunkEntityFields
-import org.matrix.android.sdk.internal.database.model.EventEntity
-import org.matrix.android.sdk.internal.database.model.RoomEntity
-import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
-import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
-import org.matrix.android.sdk.internal.database.model.deleteOnCascade
-import org.matrix.android.sdk.internal.di.SessionDatabase
-import org.matrix.android.sdk.internal.session.room.timeline.PaginationDirection
-import org.matrix.android.sdk.internal.task.TaskExecutor
-import timber.log.Timber
-import javax.inject.Inject
-
-private const val MAX_NUMBER_OF_EVENTS_IN_DB = 35_000L
-private const val MIN_NUMBER_OF_EVENTS_BY_CHUNK = 300
-
-/**
- * This class makes sure to stay under a maximum number of events as it makes Realm to be unusable when listening to events
- * when the database is getting too big. This will try incrementally to remove the biggest chunks until we get below the threshold.
- * We make sure to still have a minimum number of events so it's not becoming unusable.
- * So this won't work for users with a big number of very active rooms.
- */
-internal class DatabaseCleaner @Inject constructor(@SessionDatabase private val realmConfiguration: RealmConfiguration,
- private val taskExecutor: TaskExecutor) : SessionLifecycleObserver {
-
- override fun onSessionStarted(session: Session) {
- taskExecutor.executorScope.launch(Dispatchers.Default) {
- awaitTransaction(realmConfiguration) { realm ->
- val allRooms = realm.where(RoomEntity::class.java).findAll()
- Timber.v("There are ${allRooms.size} rooms in this session")
- cleanUp(realm, MAX_NUMBER_OF_EVENTS_IN_DB / 2L)
- }
- }
- }
-
- private fun cleanUp(realm: Realm, threshold: Long) {
- val numberOfEvents = realm.where(EventEntity::class.java).findAll().size
- val numberOfTimelineEvents = realm.where(TimelineEventEntity::class.java).findAll().size
- Timber.v("Number of events in db: $numberOfEvents | Number of timeline events in db: $numberOfTimelineEvents")
- if (threshold <= MIN_NUMBER_OF_EVENTS_BY_CHUNK || numberOfTimelineEvents < MAX_NUMBER_OF_EVENTS_IN_DB) {
- Timber.v("Db is low enough")
- } else {
- val thresholdChunks = realm.where(ChunkEntity::class.java)
- .greaterThan(ChunkEntityFields.NUMBER_OF_TIMELINE_EVENTS, threshold)
- .findAll()
-
- Timber.v("There are ${thresholdChunks.size} chunks to clean with more than $threshold events")
- for (chunk in thresholdChunks) {
- val maxDisplayIndex = chunk.nextDisplayIndex(PaginationDirection.FORWARDS)
- val thresholdDisplayIndex = maxDisplayIndex - threshold
- val eventsToRemove = chunk.timelineEvents.where().lessThan(TimelineEventEntityFields.DISPLAY_INDEX, thresholdDisplayIndex).findAll()
- Timber.v("There are ${eventsToRemove.size} events to clean in chunk: ${chunk.identifier()} from room ${chunk.room?.first()?.roomId}")
- chunk.numberOfTimelineEvents = chunk.numberOfTimelineEvents - eventsToRemove.size
- eventsToRemove.forEach {
- val canDeleteRoot = it.root?.stateKey == null
- it.deleteOnCascade(canDeleteRoot)
- }
- // We reset the prevToken so we will need to fetch again.
- chunk.prevToken = null
- }
- cleanUp(realm, (threshold / 1.5).toLong())
- }
- }
-}
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 2256d931001..1f45ac2a753 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
@@ -25,6 +25,8 @@ import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
import org.matrix.android.sdk.api.session.room.model.VersioningState
import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
+import org.matrix.android.sdk.internal.crypto.model.event.EncryptionEventContent
+import org.matrix.android.sdk.internal.database.model.ChunkEntityFields
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntityFields
import org.matrix.android.sdk.internal.database.model.EditAggregatedSummaryEntityFields
import org.matrix.android.sdk.internal.database.model.EditionOfEventFields
@@ -54,7 +56,7 @@ internal class RealmSessionStoreMigration @Inject constructor(
) : RealmMigration {
companion object {
- const val SESSION_STORE_SCHEMA_VERSION = 19L
+ const val SESSION_STORE_SCHEMA_VERSION = 21L
}
/**
@@ -86,6 +88,8 @@ internal class RealmSessionStoreMigration @Inject constructor(
if (oldVersion <= 16) migrateTo17(realm)
if (oldVersion <= 17) migrateTo18(realm)
if (oldVersion <= 18) migrateTo19(realm)
+ if (oldVersion <= 19) migrateTo20(realm)
+ if (oldVersion <= 20) migrateTo21(realm)
}
private fun migrateTo1(realm: DynamicRealm) {
@@ -390,4 +394,55 @@ internal class RealmSessionStoreMigration @Inject constructor(
}
}
}
+
+ private fun migrateTo20(realm: DynamicRealm) {
+ Timber.d("Step 19 -> 20")
+
+ realm.schema.get("ChunkEntity")?.apply {
+ if (hasField("numberOfTimelineEvents")) {
+ removeField("numberOfTimelineEvents")
+ }
+ var cleanOldChunks = false
+ if (!hasField(ChunkEntityFields.NEXT_CHUNK.`$`)) {
+ cleanOldChunks = true
+ addRealmObjectField(ChunkEntityFields.NEXT_CHUNK.`$`, this)
+ }
+ if (!hasField(ChunkEntityFields.PREV_CHUNK.`$`)) {
+ cleanOldChunks = true
+ addRealmObjectField(ChunkEntityFields.PREV_CHUNK.`$`, this)
+ }
+ if (cleanOldChunks) {
+ val chunkEntities = realm.where("ChunkEntity").equalTo(ChunkEntityFields.IS_LAST_FORWARD, false).findAll()
+ chunkEntities.deleteAllFromRealm()
+ }
+ }
+ }
+
+ private fun migrateTo21(realm: DynamicRealm) {
+ Timber.d("Step 20 -> 21")
+
+ realm.schema.get("RoomSummaryEntity")
+ ?.addField(RoomSummaryEntityFields.E2E_ALGORITHM, String::class.java)
+ ?.transform { obj ->
+
+ val encryptionContentAdapter = MoshiProvider.providesMoshi().adapter(EncryptionEventContent::class.java)
+
+ val encryptionEvent = realm.where("CurrentStateEventEntity")
+ .equalTo(CurrentStateEventEntityFields.ROOM_ID, obj.getString(RoomSummaryEntityFields.ROOM_ID))
+ .equalTo(CurrentStateEventEntityFields.TYPE, EventType.STATE_ROOM_ENCRYPTION)
+ .findFirst()
+
+ val encryptionEventRoot = encryptionEvent?.getObject(CurrentStateEventEntityFields.ROOT.`$`)
+ val algorithm = encryptionEventRoot
+ ?.getString(EventEntityFields.CONTENT)?.let {
+ encryptionContentAdapter.fromJson(it)?.algorithm
+ }
+
+ obj.setString(RoomSummaryEntityFields.E2E_ALGORITHM, algorithm)
+ obj.setBoolean(RoomSummaryEntityFields.IS_ENCRYPTED, encryptionEvent != null)
+ encryptionEventRoot?.getLong(EventEntityFields.ORIGIN_SERVER_TS)?.let {
+ obj.setLong(RoomSummaryEntityFields.ENCRYPTION_EVENT_TS, it)
+ }
+ }
+ }
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt
index f74e4b0f4c6..c21bf74d934 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt
@@ -110,7 +110,7 @@ internal fun ChunkEntity.addTimelineEvent(roomId: String,
true
}
}
- numberOfTimelineEvents++
+ // numberOfTimelineEvents++
timelineEvents.add(timelineEventEntity)
}
@@ -191,3 +191,29 @@ internal fun ChunkEntity.nextDisplayIndex(direction: PaginationDirection): Int {
}
}
}
+
+internal fun ChunkEntity.doesNextChunksVerifyCondition(linkCondition: (ChunkEntity) -> Boolean): Boolean {
+ var nextChunkToCheck = this.nextChunk
+ while (nextChunkToCheck != null) {
+ if (linkCondition(nextChunkToCheck)) {
+ return true
+ }
+ nextChunkToCheck = nextChunkToCheck.nextChunk
+ }
+ return false
+}
+
+internal fun ChunkEntity.isMoreRecentThan(chunkToCheck: ChunkEntity): Boolean {
+ if (this.isLastForward) return true
+ if (chunkToCheck.isLastForward) return false
+ // Check if the chunk to check is linked to this one
+ if (chunkToCheck.doesNextChunksVerifyCondition { it == this }) {
+ return true
+ }
+ // Otherwise check if this chunk is linked to last forward
+ if (this.doesNextChunksVerifyCondition { it.isLastForward }) {
+ return true
+ }
+ // We don't know, so we assume it's false
+ return false
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt
index 3993e8e7991..1d2cbcad51d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt
@@ -28,3 +28,13 @@ internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long {
currentIdNum.toLong() + 1
}
}
+
+internal fun TimelineEventEntity.isMoreRecentThan(eventToCheck: TimelineEventEntity): Boolean {
+ val currentChunk = this.chunk?.first() ?: return false
+ val chunkToCheck = eventToCheck.chunk?.firstOrNull() ?: return false
+ return if (currentChunk == chunkToCheck) {
+ this.displayIndex >= eventToCheck.displayIndex
+ } else {
+ currentChunk.isMoreRecentThan(chunkToCheck)
+ }
+}
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 3a15e0acf01..63b326096a8 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
@@ -16,12 +16,15 @@
package org.matrix.android.sdk.internal.database.mapper
+import org.matrix.android.sdk.api.crypto.RoomEncryptionTrustLevel
+import org.matrix.android.sdk.api.session.room.model.RoomEncryptionAlgorithm
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo
import org.matrix.android.sdk.api.session.room.model.SpaceParentInfo
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.api.session.typing.TypingUsersTracker
+import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
import org.matrix.android.sdk.internal.database.model.presence.toUserPresence
import javax.inject.Inject
@@ -68,7 +71,9 @@ internal class RoomSummaryMapper @Inject constructor(private val timelineEventMa
isEncrypted = roomSummaryEntity.isEncrypted,
encryptionEventTs = roomSummaryEntity.encryptionEventTs,
breadcrumbsIndex = roomSummaryEntity.breadcrumbsIndex,
- roomEncryptionTrustLevel = roomSummaryEntity.roomEncryptionTrustLevel,
+ roomEncryptionTrustLevel = if (roomSummaryEntity.isEncrypted && roomSummaryEntity.e2eAlgorithm != MXCRYPTO_ALGORITHM_MEGOLM) {
+ RoomEncryptionTrustLevel.E2EWithUnsupportedAlgorithm
+ } else roomSummaryEntity.roomEncryptionTrustLevel,
inviterId = roomSummaryEntity.inviterId,
hasFailedSending = roomSummaryEntity.hasFailedSending,
roomType = roomSummaryEntity.roomType,
@@ -99,7 +104,13 @@ internal class RoomSummaryMapper @Inject constructor(private val timelineEventMa
worldReadable = it.childSummaryEntity?.joinRules == RoomJoinRules.PUBLIC
)
},
- flattenParentIds = roomSummaryEntity.flattenParentIds?.split("|") ?: emptyList()
+ flattenParentIds = roomSummaryEntity.flattenParentIds?.split("|") ?: emptyList(),
+ roomEncryptionAlgorithm = when (val alg = roomSummaryEntity.e2eAlgorithm) {
+ // I should probably use #hasEncryptorClassForAlgorithm but it says it supports
+ // OLM which is some legacy? Now only megolm allowed in rooms
+ MXCRYPTO_ALGORITHM_MEGOLM -> RoomEncryptionAlgorithm.Megolm
+ else -> RoomEncryptionAlgorithm.UnsupportedAlgorithm(alg)
+ }
)
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt
index 68533a3c199..ecb602019ab 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt
@@ -27,9 +27,10 @@ import org.matrix.android.sdk.internal.extensions.clearWith
internal open class ChunkEntity(@Index var prevToken: String? = null,
// Because of gaps we can have several chunks with nextToken == null
@Index var nextToken: String? = null,
+ var prevChunk: ChunkEntity? = null,
+ var nextChunk: ChunkEntity? = null,
var stateEvents: RealmList = RealmList(),
var timelineEvents: RealmList = RealmList(),
- var numberOfTimelineEvents: Long = 0,
// Only one chunk will have isLastForward == true
@Index var isLastForward: Boolean = false,
@Index var isLastBackward: Boolean = false
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt
index 836fc4efaf9..ce2d1efc1d2 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventEntity.kt
@@ -40,8 +40,6 @@ internal open class EventEntity(@Index var eventId: String = "",
var unsignedData: String? = null,
var redacts: String? = null,
var decryptionResultJson: String? = null,
- var decryptionErrorCode: String? = null,
- var decryptionErrorReason: String? = null,
var ageLocalTs: Long? = null
) : RealmObject() {
@@ -55,6 +53,16 @@ internal open class EventEntity(@Index var eventId: String = "",
sendStateStr = value.name
}
+ var decryptionErrorCode: String? = null
+ set(value) {
+ if (value != field) field = value
+ }
+
+ var decryptionErrorReason: String? = null
+ set(value) {
+ if (value != field) field = value
+ }
+
companion object
fun setDecryptionResult(result: MXEventDecryptionResult, clearEvent: JsonDict? = null) {
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 67672f03add..febedc34563 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
@@ -205,6 +205,11 @@ internal open class RoomSummaryEntity(
if (value != field) field = value
}
+ var e2eAlgorithm: String? = null
+ set(value) {
+ if (value != field) field = value
+ }
+
var encryptionEventTs: Long? = 0
set(value) {
if (value != field) field = value
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt
index 30bbde70c2e..185f0e2dcc4 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt
@@ -46,7 +46,5 @@ internal fun TimelineEventEntity.deleteOnCascade(canDeleteRoot: Boolean) {
if (canDeleteRoot) {
root?.deleteFromRealm()
}
- annotations?.deleteOnCascade()
- readReceipts?.deleteOnCascade()
deleteFromRealm()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt
index 60096777d9f..c9c96b9cc10 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.database.query
import io.realm.Realm
import io.realm.RealmConfiguration
import org.matrix.android.sdk.api.session.events.model.LocalEcho
+import org.matrix.android.sdk.internal.database.helper.isMoreRecentThan
import org.matrix.android.sdk.internal.database.model.ChunkEntity
import org.matrix.android.sdk.internal.database.model.ReadMarkerEntity
import org.matrix.android.sdk.internal.database.model.ReadReceiptEntity
@@ -33,28 +34,26 @@ internal fun isEventRead(realmConfiguration: RealmConfiguration,
if (LocalEcho.isLocalEchoId(eventId)) {
return true
}
+ // If we don't know if the event has been read, we assume it's not
var isEventRead = false
Realm.getInstance(realmConfiguration).use { realm ->
- val liveChunk = ChunkEntity.findLastForwardChunkOfRoom(realm, roomId) ?: return@use
- val eventToCheck = liveChunk.timelineEvents.find(eventId)
+ val latestEvent = TimelineEventEntity.latestEvent(realm, roomId, true)
+ // If latest event is from you we are sure the event is read
+ if (latestEvent?.root?.sender == userId) {
+ return true
+ }
+ val eventToCheck = TimelineEventEntity.where(realm, roomId, eventId).findFirst()
isEventRead = when {
- eventToCheck == null -> hasReadMissingEvent(
- realm = realm,
- latestChunkEntity = liveChunk,
- roomId = roomId,
- userId = userId,
- eventId = eventId
- )
+ eventToCheck == null -> false
eventToCheck.root?.sender == userId -> true
else -> {
val readReceipt = ReadReceiptEntity.where(realm, roomId, userId).findFirst() ?: return@use
- val readReceiptIndex = liveChunk.timelineEvents.find(readReceipt.eventId)?.displayIndex ?: Int.MIN_VALUE
- eventToCheck.displayIndex <= readReceiptIndex
+ val readReceiptEvent = TimelineEventEntity.where(realm, roomId, readReceipt.eventId).findFirst() ?: return@use
+ readReceiptEvent.isMoreRecentThan(eventToCheck)
}
}
}
-
return isEventRead
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultEventStreamService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultEventStreamService.kt
new file mode 100644
index 00000000000..ed21e9f1c62
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultEventStreamService.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2021 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.session
+
+import org.matrix.android.sdk.api.session.EventStreamService
+import org.matrix.android.sdk.api.session.LiveEventListener
+import javax.inject.Inject
+
+internal class DefaultEventStreamService @Inject constructor(
+ private val streamEventsManager: StreamEventsManager
+) : EventStreamService {
+
+ override fun addEventStreamListener(streamListener: LiveEventListener) {
+ streamEventsManager.addLiveEventListener(streamListener)
+ }
+
+ override fun removeEventStreamListener(streamListener: LiveEventListener) {
+ streamEventsManager.removeLiveEventListener(streamListener)
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt
index c07ff48cf48..1e533158a76 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt
@@ -27,8 +27,10 @@ import org.matrix.android.sdk.api.auth.data.SessionParams
import org.matrix.android.sdk.api.failure.GlobalError
import org.matrix.android.sdk.api.federation.FederationService
import org.matrix.android.sdk.api.pushrules.PushRuleService
+import org.matrix.android.sdk.api.session.EventStreamService
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.SessionLifecycleObserver
+import org.matrix.android.sdk.api.session.ToDeviceService
import org.matrix.android.sdk.api.session.account.AccountService
import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService
import org.matrix.android.sdk.api.session.cache.CacheService
@@ -133,6 +135,8 @@ internal class DefaultSession @Inject constructor(
private val spaceService: Lazy,
private val openIdService: Lazy,
private val presenceService: Lazy,
+ private val toDeviceService: Lazy,
+ private val eventStreamService: Lazy,
@UnauthenticatedWithCertificate
private val unauthenticatedWithCertificateOkHttpClient: Lazy
) : Session,
@@ -152,7 +156,9 @@ internal class DefaultSession @Inject constructor(
HomeServerCapabilitiesService by homeServerCapabilitiesService.get(),
ProfileService by profileService.get(),
PresenceService by presenceService.get(),
- AccountService by accountService.get() {
+ AccountService by accountService.get(),
+ ToDeviceService by toDeviceService.get(),
+ EventStreamService by eventStreamService.get() {
override val sharedSecretStorageService: SharedSecretStorageService
get() = _sharedSecretStorageService.get()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt
new file mode 100644
index 00000000000..1615b8eef9a
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2021 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.session
+
+import org.matrix.android.sdk.api.session.ToDeviceService
+import org.matrix.android.sdk.api.session.events.model.Content
+import org.matrix.android.sdk.api.session.events.model.EventType
+import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter
+import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap
+import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
+import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask
+import javax.inject.Inject
+
+internal class DefaultToDeviceService @Inject constructor(
+ private val sendToDeviceTask: SendToDeviceTask,
+ private val messageEncrypter: MessageEncrypter,
+ private val cryptoStore: IMXCryptoStore
+) : ToDeviceService {
+
+ override suspend fun sendToDevice(eventType: String, targets: Map>, content: Content, txnId: String?) {
+ val sendToDeviceMap = MXUsersDevicesMap()
+ targets.forEach { (userId, deviceIdList) ->
+ deviceIdList.forEach { deviceId ->
+ sendToDeviceMap.setObject(userId, deviceId, content)
+ }
+ }
+ sendToDevice(eventType, sendToDeviceMap, txnId)
+ }
+
+ override suspend fun sendToDevice(eventType: String, contentMap: MXUsersDevicesMap, txnId: String?) {
+ sendToDeviceTask.executeRetry(
+ SendToDeviceTask.Params(
+ eventType = eventType,
+ contentMap = contentMap,
+ transactionId = txnId
+ ),
+ 3
+ )
+ }
+
+ override suspend fun sendEncryptedToDevice(eventType: String, targets: Map>, content: Content, txnId: String?) {
+ val payloadJson = mapOf(
+ "type" to eventType,
+ "content" to content
+ )
+ val sendToDeviceMap = MXUsersDevicesMap()
+
+ // Should I do an ensure olm session?
+ targets.forEach { (userId, deviceIdList) ->
+ deviceIdList.forEach { deviceId ->
+ cryptoStore.getUserDevice(userId, deviceId)?.let { deviceInfo ->
+ sendToDeviceMap.setObject(userId, deviceId, messageEncrypter.encryptMessage(payloadJson, listOf(deviceInfo)))
+ }
+ }
+ }
+
+ sendToDevice(EventType.ENCRYPTED, sendToDeviceMap, txnId)
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt
index ebc2176a130..531dea1d5a6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt
@@ -32,8 +32,10 @@ import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
import org.matrix.android.sdk.api.auth.data.SessionParams
import org.matrix.android.sdk.api.auth.data.sessionId
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
+import org.matrix.android.sdk.api.session.EventStreamService
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.SessionLifecycleObserver
+import org.matrix.android.sdk.api.session.ToDeviceService
import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService
import org.matrix.android.sdk.api.session.events.EventService
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService
@@ -47,7 +49,6 @@ import org.matrix.android.sdk.internal.crypto.secrets.DefaultSharedSecretStorage
import org.matrix.android.sdk.internal.crypto.tasks.DefaultRedactEventTask
import org.matrix.android.sdk.internal.crypto.tasks.RedactEventTask
import org.matrix.android.sdk.internal.crypto.verification.VerificationMessageProcessor
-import org.matrix.android.sdk.internal.database.DatabaseCleaner
import org.matrix.android.sdk.internal.database.EventInsertLiveObserver
import org.matrix.android.sdk.internal.database.RealmSessionProvider
import org.matrix.android.sdk.internal.database.SessionRealmConfigurationFactory
@@ -339,10 +340,6 @@ internal abstract class SessionModule {
@IntoSet
abstract fun bindIdentityService(service: DefaultIdentityService): SessionLifecycleObserver
- @Binds
- @IntoSet
- abstract fun bindDatabaseCleaner(cleaner: DatabaseCleaner): SessionLifecycleObserver
-
@Binds
@IntoSet
abstract fun bindRealmSessionProvider(provider: RealmSessionProvider): SessionLifecycleObserver
@@ -379,6 +376,12 @@ internal abstract class SessionModule {
@Binds
abstract fun bindOpenIdTokenService(service: DefaultOpenIdService): OpenIdService
+ @Binds
+ abstract fun bindToDeviceService(service: DefaultToDeviceService): ToDeviceService
+
+ @Binds
+ abstract fun bindEventStreamService(service: DefaultEventStreamService): EventStreamService
+
@Binds
abstract fun bindTypingUsersTracker(tracker: DefaultTypingUsersTracker): TypingUsersTracker
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt
new file mode 100644
index 00000000000..bb0ca114454
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2021 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.session
+
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.launch
+import org.matrix.android.sdk.api.extensions.tryOrNull
+import org.matrix.android.sdk.api.session.LiveEventListener
+import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.internal.crypto.MXEventDecryptionResult
+import timber.log.Timber
+import javax.inject.Inject
+
+@SessionScope
+internal class StreamEventsManager @Inject constructor() {
+
+ private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
+
+ private val listeners = mutableListOf()
+
+ fun addLiveEventListener(listener: LiveEventListener) {
+ listeners.add(listener)
+ }
+
+ fun removeLiveEventListener(listener: LiveEventListener) {
+ listeners.remove(listener)
+ }
+
+ fun dispatchLiveEventReceived(event: Event, roomId: String, initialSync: Boolean) {
+ Timber.v("## dispatchLiveEventReceived ${event.eventId}")
+ coroutineScope.launch {
+ if (!initialSync) {
+ listeners.forEach {
+ tryOrNull {
+ it.onLiveEvent(roomId, event)
+ }
+ }
+ }
+ }
+ }
+
+ fun dispatchPaginatedEventReceived(event: Event, roomId: String) {
+ Timber.v("## dispatchPaginatedEventReceived ${event.eventId}")
+ coroutineScope.launch {
+ listeners.forEach {
+ tryOrNull {
+ it.onPaginatedEvent(roomId, event)
+ }
+ }
+ }
+ }
+
+ fun dispatchLiveEventDecrypted(event: Event, result: MXEventDecryptionResult) {
+ Timber.v("## dispatchLiveEventDecrypted ${event.eventId}")
+ coroutineScope.launch {
+ listeners.forEach {
+ tryOrNull {
+ it.onEventDecrypted(event.eventId ?: "", event.roomId ?: "", result.clearEvent)
+ }
+ }
+ }
+ }
+
+ fun dispatchLiveEventDecryptionFailed(event: Event, error: Throwable) {
+ Timber.v("## dispatchLiveEventDecryptionFailed ${event.eventId}")
+ coroutineScope.launch {
+ listeners.forEach {
+ tryOrNull {
+ it.onEventDecryptionError(event.eventId ?: "", event.roomId ?: "", error)
+ }
+ }
+ }
+ }
+
+ fun dispatchOnLiveToDevice(event: Event) {
+ Timber.v("## dispatchOnLiveToDevice ${event.eventId}")
+ coroutineScope.launch {
+ listeners.forEach {
+ tryOrNull {
+ it.onLiveToDeviceEvent(event)
+ }
+ }
+ }
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt
index 1b0ccbb4895..b988f2253cd 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt
@@ -109,18 +109,23 @@ internal class FileUploader @Inject constructor(
filename: String?,
mimeType: String?,
progressListener: ProgressRequestBody.Listener? = null): ContentUploadResponse {
- val inputStream = withContext(Dispatchers.IO) {
- context.contentResolver.openInputStream(uri)
- } ?: throw FileNotFoundException()
- val workingFile = temporaryFileCreator.create()
- workingFile.outputStream().use {
- inputStream.copyTo(it)
- }
+ val workingFile = context.copyUriToTempFile(uri)
return uploadFile(workingFile, filename, mimeType, progressListener).also {
tryOrNull { workingFile.delete() }
}
}
+ private suspend fun Context.copyUriToTempFile(uri: Uri): File {
+ return withContext(Dispatchers.IO) {
+ val inputStream = contentResolver.openInputStream(uri) ?: throw FileNotFoundException()
+ val workingFile = temporaryFileCreator.create()
+ workingFile.outputStream().use {
+ inputStream.copyTo(it)
+ }
+ workingFile
+ }
+ }
+
private suspend fun upload(uploadBody: RequestBody,
filename: String?,
progressListener: ProgressRequestBody.Listener?): ContentUploadResponse {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt
index a19832c5230..caf41586579 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt
@@ -68,7 +68,7 @@ internal class DefaultProfileService @Inject constructor(private val taskExecuto
}
override suspend fun updateAvatar(userId: String, newAvatarUri: Uri, fileName: String) {
- withContext(coroutineDispatchers.main) {
+ withContext(coroutineDispatchers.io) {
val response = fileUploader.uploadFromUri(newAvatarUri, fileName, MimeTypes.Jpeg)
setAvatarUrlTask.execute(SetAvatarUrlTask.Params(userId = userId, newAvatarUrl = response.contentUri))
userStore.updateAvatar(userId, response.contentUri)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt
index cb4bcdb606a..1fe7503141d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt
@@ -119,15 +119,15 @@ internal class DefaultRoom(override val roomId: String,
}
}
- override suspend fun enableEncryption(algorithm: String) {
+ override suspend fun enableEncryption(algorithm: String, force: Boolean) {
when {
- isEncrypted() -> {
+ (!force && isEncrypted() && encryptionAlgorithm() == MXCRYPTO_ALGORITHM_MEGOLM) -> {
throw IllegalStateException("Encryption is already enabled for this room")
}
- algorithm != MXCRYPTO_ALGORITHM_MEGOLM -> {
+ (!force && algorithm != MXCRYPTO_ALGORITHM_MEGOLM) -> {
throw InvalidParameterException("Only MXCRYPTO_ALGORITHM_MEGOLM algorithm is supported")
}
- else -> {
+ else -> {
val params = SendStateTask.Params(
roomId = roomId,
stateKey = null,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomModule.kt
index dbd0ae6f060..64f6bc0b30d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomModule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomModule.kt
@@ -19,6 +19,9 @@ package org.matrix.android.sdk.internal.session.room
import dagger.Binds
import dagger.Module
import dagger.Provides
+import org.commonmark.Extension
+import org.commonmark.ext.maths.MathsExtension
+import org.commonmark.node.BlockQuote
import org.commonmark.parser.Parser
import org.commonmark.renderer.html.HtmlRenderer
import org.matrix.android.sdk.api.session.file.FileService
@@ -98,12 +101,29 @@ import org.matrix.android.sdk.internal.session.room.version.DefaultRoomVersionUp
import org.matrix.android.sdk.internal.session.room.version.RoomVersionUpgradeTask
import org.matrix.android.sdk.internal.session.space.DefaultSpaceService
import retrofit2.Retrofit
+import javax.inject.Qualifier
+
+/**
+ * Used to inject the simple commonmark Parser
+ */
+@Qualifier
+@Retention(AnnotationRetention.RUNTIME)
+internal annotation class SimpleCommonmarkParser
+
+/**
+ * Used to inject the advanced commonmark Parser
+ */
+@Qualifier
+@Retention(AnnotationRetention.RUNTIME)
+internal annotation class AdvancedCommonmarkParser
@Module
internal abstract class RoomModule {
@Module
companion object {
+ private val extensions: List = listOf(MathsExtension.create())
+
@Provides
@JvmStatic
@SessionScope
@@ -119,9 +139,21 @@ internal abstract class RoomModule {
}
@Provides
+ @AdvancedCommonmarkParser
@JvmStatic
- fun providesParser(): Parser {
- return Parser.builder().build()
+ fun providesAdvancedParser(): Parser {
+ return Parser.builder().extensions(extensions).build()
+ }
+
+ @Provides
+ @SimpleCommonmarkParser
+ @JvmStatic
+ fun providesSimpleParser(): Parser {
+ // The simple parser disables all blocks but quotes.
+ // Inline parsing(bold, italic, etc) is also enabled and is not easy to disable in commonmark currently.
+ return Parser.builder()
+ .enabledBlockTypes(setOf(BlockQuote::class.java))
+ .build()
}
@Provides
@@ -129,6 +161,7 @@ internal abstract class RoomModule {
fun providesHtmlRenderer(): HtmlRenderer {
return HtmlRenderer
.builder()
+ .extensions(extensions)
.softbreak(" ")
.build()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt
index 28f55a01eeb..b30c66c82ed 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/read/DefaultReadService.kt
@@ -34,12 +34,10 @@ import org.matrix.android.sdk.internal.database.query.isEventRead
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.di.UserId
-import org.matrix.android.sdk.internal.task.TaskExecutor
internal class DefaultReadService @AssistedInject constructor(
@Assisted private val roomId: String,
@SessionDatabase private val monarchy: Monarchy,
- private val taskExecutor: TaskExecutor,
private val setReadMarkersTask: SetReadMarkersTask,
private val readReceiptsSummaryMapper: ReadReceiptsSummaryMapper,
@UserId private val userId: String
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/CancelSendTracker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/CancelSendTracker.kt
index 5f6ebc68c2b..fe180536c89 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/CancelSendTracker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/CancelSendTracker.kt
@@ -44,10 +44,10 @@ internal class CancelSendTracker @Inject constructor() {
}
fun isCancelRequestedFor(eventId: String?, roomId: String?): Boolean {
- val index = synchronized(cancellingRequests) {
- cancellingRequests.indexOfFirst { it.localId == eventId && it.roomId == roomId }
+ val found = synchronized(cancellingRequests) {
+ cancellingRequests.any { it.localId == eventId && it.roomId == roomId }
}
- return index != -1
+ return found
}
fun markCancelled(eventId: String, roomId: String) {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt
index d3162aef796..fb2fb3950af 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt
@@ -97,6 +97,12 @@ internal class DefaultSendService @AssistedInject constructor(
.let { sendEvent(it) }
}
+ override fun sendQuotedTextMessage(quotedEvent: TimelineEvent, text: String, autoMarkdown: Boolean): Cancelable {
+ return localEchoEventFactory.createQuotedTextEvent(roomId, quotedEvent, text, autoMarkdown)
+ .also { createLocalEcho(it) }
+ .let { sendEvent(it) }
+ }
+
override fun sendPoll(question: String, options: List): Cancelable {
return localEchoEventFactory.createPollEvent(roomId, question, options)
.also { createLocalEcho(it) }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt
index 85b22628d78..c4caedc4077 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt
@@ -198,20 +198,23 @@ internal class LocalEchoEventFactory @Inject constructor(
eventReplaced: TimelineEvent,
originalEvent: TimelineEvent,
newBodyText: String,
- newBodyAutoMarkdown: Boolean,
+ autoMarkdown: Boolean,
msgType: String,
compatibilityText: String): Event {
val permalink = permalinkFactory.createPermalink(roomId, originalEvent.root.eventId ?: "", false)
val userLink = originalEvent.root.senderId?.let { permalinkFactory.createPermalink(it, false) } ?: ""
val body = bodyForReply(originalEvent.getLastMessageContent(), originalEvent.isReply())
- val replyFormatted = REPLY_PATTERN.format(
+ // As we always supply formatted body for replies we should force the MarkdownParser to produce html.
+ val newBodyFormatted = markdownParser.parse(newBodyText, force = true, advanced = autoMarkdown).takeFormatted()
+ // Body of the original message may not have formatted version, so may also have to convert to html.
+ val bodyFormatted = body.formattedText ?: markdownParser.parse(body.text, force = true, advanced = autoMarkdown).takeFormatted()
+ val replyFormatted = buildFormattedReply(
permalink,
userLink,
originalEvent.senderInfo.disambiguatedDisplayName,
- // Remove inner mx_reply tags if any
- body.takeFormatted().replace(MX_REPLY_REGEX, ""),
- createTextContent(newBodyText, newBodyAutoMarkdown).takeFormatted()
+ bodyFormatted,
+ newBodyFormatted
)
//
// > <@alice:example.org> This is the original body
@@ -391,13 +394,17 @@ internal class LocalEchoEventFactory @Inject constructor(
val userLink = permalinkFactory.createPermalink(userId, false) ?: return null
val body = bodyForReply(eventReplied.getLastMessageContent(), eventReplied.isReply())
- val replyFormatted = REPLY_PATTERN.format(
+
+ // As we always supply formatted body for replies we should force the MarkdownParser to produce html.
+ val replyTextFormatted = markdownParser.parse(replyText, force = true, advanced = autoMarkdown).takeFormatted()
+ // Body of the original message may not have formatted version, so may also have to convert to html.
+ val bodyFormatted = body.formattedText ?: markdownParser.parse(body.text, force = true, advanced = autoMarkdown).takeFormatted()
+ val replyFormatted = buildFormattedReply(
permalink,
userLink,
userId,
- // Remove inner mx_reply tags if any
- body.takeFormatted().replace(MX_REPLY_REGEX, ""),
- createTextContent(replyText, autoMarkdown).takeFormatted()
+ bodyFormatted,
+ replyTextFormatted
)
//
// > <@alice:example.org> This is the original body
@@ -415,6 +422,16 @@ internal class LocalEchoEventFactory @Inject constructor(
return createMessageEvent(roomId, content)
}
+ private fun buildFormattedReply(permalink: String, userLink: String, userId: String, bodyFormatted: String, newBodyFormatted: String): String {
+ return REPLY_PATTERN.format(
+ permalink,
+ userLink,
+ userId,
+ // Remove inner mx_reply tags if any
+ bodyFormatted.replace(MX_REPLY_REGEX, ""),
+ newBodyFormatted
+ )
+ }
private fun buildReplyFallback(body: TextContent, originalSenderId: String?, newBodyText: String): String {
return buildString {
append("> <")
@@ -498,6 +515,38 @@ internal class LocalEchoEventFactory @Inject constructor(
localEchoRepository.createLocalEcho(event)
}
+ fun createQuotedTextEvent(
+ roomId: String,
+ quotedEvent: TimelineEvent,
+ text: String,
+ autoMarkdown: Boolean,
+ ): Event {
+ val messageContent = quotedEvent.getLastMessageContent()
+ val textMsg = messageContent?.body
+ val quoteText = legacyRiotQuoteText(textMsg, text)
+ return createFormattedTextEvent(roomId, markdownParser.parse(quoteText, force = true, advanced = autoMarkdown), MessageType.MSGTYPE_TEXT)
+ }
+
+ private fun legacyRiotQuoteText(quotedText: String?, myText: String): String {
+ val messageParagraphs = quotedText?.split("\n\n".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()
+ return buildString {
+ if (messageParagraphs != null) {
+ for (i in messageParagraphs.indices) {
+ if (messageParagraphs[i].isNotBlank()) {
+ append("> ")
+ append(messageParagraphs[i])
+ }
+
+ if (i != messageParagraphs.lastIndex) {
+ append("\n\n")
+ }
+ }
+ }
+ append("\n\n")
+ append(myText)
+ }
+ }
+
companion object {
//
//
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParser.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParser.kt
index c99d482300a..ef7945cf8cc 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParser.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/MarkdownParser.kt
@@ -18,6 +18,8 @@ package org.matrix.android.sdk.internal.session.room.send
import org.commonmark.parser.Parser
import org.commonmark.renderer.html.HtmlRenderer
+import org.matrix.android.sdk.internal.session.room.AdvancedCommonmarkParser
+import org.matrix.android.sdk.internal.session.room.SimpleCommonmarkParser
import org.matrix.android.sdk.internal.session.room.send.pills.TextPillsUtils
import javax.inject.Inject
@@ -27,22 +29,30 @@ import javax.inject.Inject
* If any change is required, please add a test covering the problem and make sure all the tests are still passing.
*/
internal class MarkdownParser @Inject constructor(
- private val parser: Parser,
+ @AdvancedCommonmarkParser private val advancedParser: Parser,
+ @SimpleCommonmarkParser private val simpleParser: Parser,
private val htmlRenderer: HtmlRenderer,
private val textPillsUtils: TextPillsUtils
) {
- private val mdSpecialChars = "[`_\\-*>.\\[\\]#~]".toRegex()
+ private val mdSpecialChars = "[`_\\-*>.\\[\\]#~$]".toRegex()
- fun parse(text: CharSequence): TextContent {
+ /**
+ * Parses some input text and produces html.
+ * @param text An input CharSequence to be parsed.
+ * @param force Skips the check for detecting if the input contains markdown and always converts to html.
+ * @param advanced Whether to use the full markdown support or the simple version.
+ * @return TextContent containing the plain text and the formatted html if generated.
+ */
+ fun parse(text: CharSequence, force: Boolean = false, advanced: Boolean = true): TextContent {
val source = textPillsUtils.processSpecialSpansToMarkdown(text) ?: text.toString()
// If no special char are detected, just return plain text
- if (source.contains(mdSpecialChars).not()) {
+ if (!force && source.contains(mdSpecialChars).not()) {
return TextContent(source)
}
- val document = parser.parse(source)
+ val document = if (advanced) advancedParser.parse(source) else simpleParser.parse(source)
val htmlText = htmlRenderer.render(document)
// Cleanup extra paragraph
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 3556cabb335..a7887d77f87 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
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.session.room.summary
import io.realm.Realm
import io.realm.kotlin.createObject
+import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toModel
@@ -37,13 +38,11 @@ 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.internal.crypto.EventDecryptor
-import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import org.matrix.android.sdk.internal.crypto.crosssigning.DefaultCrossSigningService
+import org.matrix.android.sdk.internal.crypto.model.event.EncryptionEventContent
import org.matrix.android.sdk.internal.database.mapper.ContentMapper
import org.matrix.android.sdk.internal.database.mapper.asDomain
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntity
-import org.matrix.android.sdk.internal.database.model.EventEntity
-import org.matrix.android.sdk.internal.database.model.EventEntityFields
import org.matrix.android.sdk.internal.database.model.GroupSummaryEntity
import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntityFields
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
@@ -56,7 +55,6 @@ import org.matrix.android.sdk.internal.database.query.getOrCreate
import org.matrix.android.sdk.internal.database.query.getOrNull
import org.matrix.android.sdk.internal.database.query.isEventRead
import org.matrix.android.sdk.internal.database.query.where
-import org.matrix.android.sdk.internal.database.query.whereType
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.extensions.clearWith
import org.matrix.android.sdk.internal.query.process
@@ -122,10 +120,8 @@ internal class RoomSummaryUpdater @Inject constructor(
Timber.v("## Space: Updating summary room [$roomId] roomType: [$roomType]")
// Don't use current state for this one as we are only interested in having MXCRYPTO_ALGORITHM_MEGOLM event in the room
- val encryptionEvent = EventEntity.whereType(realm, roomId = roomId, type = EventType.STATE_ROOM_ENCRYPTION)
- .contains(EventEntityFields.CONTENT, "\"algorithm\":\"$MXCRYPTO_ALGORITHM_MEGOLM\"")
- .isNotNull(EventEntityFields.STATE_KEY)
- .findFirst()
+ val encryptionEvent = CurrentStateEventEntity.getOrNull(realm, roomId, type = EventType.STATE_ROOM_ENCRYPTION, stateKey = "")?.root
+ Timber.v("## CRYPTO: currentEncryptionEvent is $encryptionEvent")
val latestPreviewableEvent = RoomSummaryEventsHelper.getLatestPreviewableEvent(realm, roomId)
@@ -136,7 +132,7 @@ internal class RoomSummaryUpdater @Inject constructor(
roomSummaryEntity.hasUnreadMessages = roomSummaryEntity.notificationCount > 0 ||
// avoid this call if we are sure there are unread events
- !isEventRead(realm.configuration, userId, roomId, latestPreviewableEvent?.eventId)
+ latestPreviewableEvent?.let { !isEventRead(realm.configuration, userId, roomId, it.eventId) } ?: false
roomSummaryEntity.setDisplayName(roomDisplayNameResolver.resolve(realm, roomId))
roomSummaryEntity.avatarUrl = roomAvatarResolver.resolve(realm, roomId)
@@ -151,6 +147,11 @@ internal class RoomSummaryUpdater @Inject constructor(
.orEmpty()
roomSummaryEntity.updateAliases(roomAliases)
roomSummaryEntity.isEncrypted = encryptionEvent != null
+
+ roomSummaryEntity.e2eAlgorithm = ContentMapper.map(encryptionEvent?.content)
+ ?.toModel()
+ ?.algorithm
+
roomSummaryEntity.encryptionEventTs = encryptionEvent?.originServerTs
if (roomSummaryEntity.membership == Membership.INVITE && inviterId != null) {
@@ -236,7 +237,7 @@ internal class RoomSummaryUpdater @Inject constructor(
.findFirst()
?.let { childSum ->
lookupMap.entries.firstOrNull { it.key.roomId == lookedUp.roomId }?.let { entry ->
- if (entry.value.indexOfFirst { it.roomId == childSum.roomId } == -1) {
+ if (entry.value.none { it.roomId == childSum.roomId }) {
// add looked up as a parent
entry.value.add(childSum)
}
@@ -299,7 +300,7 @@ internal class RoomSummaryUpdater @Inject constructor(
.process(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.activeMemberships())
.findFirst()
?.let { parentSum ->
- if (lookupMap[parentSum]?.indexOfFirst { it.roomId == lookedUp.roomId } == -1) {
+ if (lookupMap[parentSum]?.none { it.roomId == lookedUp.roomId }.orFalse()) {
// add lookedup as a parent
lookupMap[parentSum]?.add(lookedUp)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/taggedevents/TaggedEventsContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/taggedevents/TaggedEventsContent.kt
new file mode 100644
index 00000000000..1b19d27e1d4
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/taggedevents/TaggedEventsContent.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 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.session.room.taggedevents
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+/**
+ * Keys are event IDs, values are event information.
+ */
+typealias TaggedEvent = Map
+
+/**
+ * Keys are tagged event names (eg. m.favourite), values are the related events.
+ */
+typealias TaggedEvents = Map
+
+/**
+ * Class used to parse the content of a m.tagged_events type event.
+ * This kind of event defines the tagged events in a room.
+ *
+ * The content of this event is a tags key whose value is an object mapping the name of each tag
+ * to another object. The JSON object associated with each tag is an object where the keys are the
+ * event IDs and values give information about the events.
+ *
+ * Ref: https://github.com/matrix-org/matrix-doc/pull/2437
+ */
+@JsonClass(generateAdapter = true)
+data class TaggedEventsContent(
+ @Json(name = "tags")
+ var tags: TaggedEvents = emptyMap()
+) {
+ val favouriteEvents
+ get() = tags[TAG_FAVOURITE].orEmpty()
+
+ val hiddenEvents
+ get() = tags[TAG_HIDDEN].orEmpty()
+
+ fun tagEvent(eventId: String, info: TaggedEventInfo, tag: String) {
+ val taggedEvents = tags[tag].orEmpty().plus(eventId to info)
+ tags = tags.plus(tag to taggedEvents)
+ }
+
+ fun untagEvent(eventId: String, tag: String) {
+ val taggedEvents = tags[tag]?.minus(eventId).orEmpty()
+ tags = tags.plus(tag to taggedEvents)
+ }
+
+ companion object {
+ const val TAG_FAVOURITE = "m.favourite"
+ const val TAG_HIDDEN = "m.hidden"
+ }
+}
+
+@JsonClass(generateAdapter = true)
+data class TaggedEventInfo(
+ @Json(name = "keywords")
+ val keywords: List? = null,
+
+ @Json(name = "origin_server_ts")
+ val originServerTs: Long? = null,
+
+ @Json(name = "tagged_at")
+ val taggedAt: Long? = null
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt
index 2744b5129e0..71823cd4585 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 The Matrix.org Foundation C.I.C.
+ * Copyright (c) 2021 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.
@@ -16,738 +16,338 @@
package org.matrix.android.sdk.internal.session.room.timeline
-import io.realm.OrderedCollectionChangeSet
-import io.realm.OrderedRealmCollectionChangeListener
import io.realm.Realm
import io.realm.RealmConfiguration
-import io.realm.RealmQuery
-import io.realm.RealmResults
-import io.realm.Sort
-import kotlinx.coroutines.runBlocking
-import org.matrix.android.sdk.api.MatrixCallback
-import org.matrix.android.sdk.api.extensions.orFalse
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.android.asCoroutineDispatcher
+import kotlinx.coroutines.cancelChildren
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.sample
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import okhttp3.internal.closeQuietly
+import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.extensions.tryOrNull
-import org.matrix.android.sdk.api.session.events.model.EventType
-import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.session.room.timeline.Timeline
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
-import org.matrix.android.sdk.api.util.CancelableBag
-import org.matrix.android.sdk.internal.database.RealmSessionProvider
-import org.matrix.android.sdk.internal.database.mapper.EventMapper
import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper
-import org.matrix.android.sdk.internal.database.model.ChunkEntity
-import org.matrix.android.sdk.internal.database.model.RoomEntity
-import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
-import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
-import org.matrix.android.sdk.internal.database.query.findAllInRoomWithSendStates
-import org.matrix.android.sdk.internal.database.query.where
-import org.matrix.android.sdk.internal.database.query.whereRoomId
import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask
import org.matrix.android.sdk.internal.session.sync.handler.room.ReadReceiptHandler
import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler
-import org.matrix.android.sdk.internal.task.TaskExecutor
-import org.matrix.android.sdk.internal.task.configureWith
-import org.matrix.android.sdk.internal.util.Debouncer
+import org.matrix.android.sdk.internal.task.SemaphoreCoroutineSequencer
import org.matrix.android.sdk.internal.util.createBackgroundHandler
-import org.matrix.android.sdk.internal.util.createUIHandler
import timber.log.Timber
-import java.util.Collections
import java.util.UUID
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference
-import kotlin.math.max
-
-private const val MIN_FETCHING_COUNT = 30
-
-internal class DefaultTimeline(
- private val roomId: String,
- private var initialEventId: String? = null,
- private val realmConfiguration: RealmConfiguration,
- private val taskExecutor: TaskExecutor,
- private val contextOfEventTask: GetContextOfEventTask,
- private val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
- private val paginationTask: PaginationTask,
- private val timelineEventMapper: TimelineEventMapper,
- private val settings: TimelineSettings,
- private val timelineInput: TimelineInput,
- private val eventDecryptor: TimelineEventDecryptor,
- private val realmSessionProvider: RealmSessionProvider,
- private val loadRoomMembersTask: LoadRoomMembersTask,
- private val threadsAwarenessHandler: ThreadsAwarenessHandler,
- private val readReceiptHandler: ReadReceiptHandler
-) : Timeline,
- TimelineInput.Listener,
- UIEchoManager.Listener {
+
+internal class DefaultTimeline(private val roomId: String,
+ private val initialEventId: String?,
+ private val realmConfiguration: RealmConfiguration,
+ private val loadRoomMembersTask: LoadRoomMembersTask,
+ private val readReceiptHandler: ReadReceiptHandler,
+ private val settings: TimelineSettings,
+ private val coroutineDispatchers: MatrixCoroutineDispatchers,
+ paginationTask: PaginationTask,
+ getEventTask: GetContextOfEventTask,
+ fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
+ timelineEventMapper: TimelineEventMapper,
+ timelineInput: TimelineInput,
+ threadsAwarenessHandler: ThreadsAwarenessHandler,
+ eventDecryptor: TimelineEventDecryptor) : Timeline {
companion object {
- val BACKGROUND_HANDLER = createBackgroundHandler("TIMELINE_DB_THREAD")
+ val BACKGROUND_HANDLER = createBackgroundHandler("DefaultTimeline_Thread")
}
- private val listeners = CopyOnWriteArrayList()
- private val isStarted = AtomicBoolean(false)
- private val isReady = AtomicBoolean(false)
- private val mainHandler = createUIHandler()
- private val backgroundRealm = AtomicReference()
- private val cancelableBag = CancelableBag()
- private val debouncer = Debouncer(mainHandler)
-
- private lateinit var timelineEvents: RealmResults
- private lateinit var sendingEvents: RealmResults
-
- private var prevDisplayIndex: Int? = null
- private var nextDisplayIndex: Int? = null
-
- private val uiEchoManager = UIEchoManager(settings, this)
-
- private val builtEvents = Collections.synchronizedList(ArrayList())
- private val builtEventsIdMap = Collections.synchronizedMap(HashMap())
- private val backwardsState = AtomicReference(TimelineState())
- private val forwardsState = AtomicReference(TimelineState())
-
override val timelineID = UUID.randomUUID().toString()
- override val isLive
- get() = !hasMoreToLoad(Timeline.Direction.FORWARDS)
-
- private val eventsChangeListener = OrderedRealmCollectionChangeListener> { results, changeSet ->
- if (!results.isLoaded || !results.isValid) {
- return@OrderedRealmCollectionChangeListener
- }
- Timber.v("## SendEvent: [${System.currentTimeMillis()}] DB update for room $roomId")
- handleUpdates(results, changeSet)
- }
+ private val listeners = CopyOnWriteArrayList()
+ private val isStarted = AtomicBoolean(false)
+ private val forwardState = AtomicReference(Timeline.PaginationState())
+ private val backwardState = AtomicReference(Timeline.PaginationState())
- // Public methods ******************************************************************************
+ private val backgroundRealm = AtomicReference()
+ private val timelineDispatcher = BACKGROUND_HANDLER.asCoroutineDispatcher()
+ private val timelineScope = CoroutineScope(SupervisorJob() + timelineDispatcher)
+ private val sequencer = SemaphoreCoroutineSequencer()
+ private val postSnapshotSignalFlow = MutableSharedFlow(0)
+
+ private val strategyDependencies = LoadTimelineStrategy.Dependencies(
+ timelineSettings = settings,
+ realm = backgroundRealm,
+ eventDecryptor = eventDecryptor,
+ paginationTask = paginationTask,
+ fetchTokenAndPaginateTask = fetchTokenAndPaginateTask,
+ getContextOfEventTask = getEventTask,
+ timelineInput = timelineInput,
+ timelineEventMapper = timelineEventMapper,
+ threadsAwarenessHandler = threadsAwarenessHandler,
+ onEventsUpdated = this::sendSignalToPostSnapshot,
+ onLimitedTimeline = this::onLimitedTimeline,
+ onNewTimelineEvents = this::onNewTimelineEvents
+ )
+
+ private var strategy: LoadTimelineStrategy = buildStrategy(LoadTimelineStrategy.Mode.Live)
+
+ override val isLive: Boolean
+ get() = !getPaginationState(Timeline.Direction.FORWARDS).hasMoreToLoad
- override fun paginate(direction: Timeline.Direction, count: Int) {
- BACKGROUND_HANDLER.post {
- if (!canPaginate(direction)) {
- return@post
- }
- Timber.v("Paginate $direction of $count items")
- val startDisplayIndex = if (direction == Timeline.Direction.BACKWARDS) prevDisplayIndex else nextDisplayIndex
- val shouldPostSnapshot = paginateInternal(startDisplayIndex, direction, count)
- if (shouldPostSnapshot) {
- postSnapshot()
+ override fun addListener(listener: Timeline.Listener): Boolean {
+ listeners.add(listener)
+ timelineScope.launch {
+ val snapshot = strategy.buildSnapshot()
+ withContext(coroutineDispatchers.main) {
+ tryOrNull { listener.onTimelineUpdated(snapshot) }
}
}
+ return true
}
- override fun pendingEventCount(): Int {
- return realmSessionProvider.withRealm {
- RoomEntity.where(it, roomId).findFirst()?.sendingTimelineEvents?.count() ?: 0
- }
+ override fun removeListener(listener: Timeline.Listener): Boolean {
+ return listeners.remove(listener)
}
- override fun failedToDeliverEventCount(): Int {
- return realmSessionProvider.withRealm {
- TimelineEventEntity.findAllInRoomWithSendStates(it, roomId, SendState.HAS_FAILED_STATES).count()
- }
+ override fun removeAllListeners() {
+ listeners.clear()
}
override fun start() {
- if (isStarted.compareAndSet(false, true)) {
- Timber.v("Start timeline for roomId: $roomId and eventId: $initialEventId")
- timelineInput.listeners.add(this)
- BACKGROUND_HANDLER.post {
- eventDecryptor.start()
- val realm = Realm.getInstance(realmConfiguration)
- backgroundRealm.set(realm)
-
- val roomEntity = RoomEntity.where(realm, roomId = roomId).findFirst()
- ?: throw IllegalStateException("Can't open a timeline without a room")
-
- // We don't want to filter here because some sending events that are not displayed
- // are still used for ui echo (relation like reaction)
- sendingEvents = roomEntity.sendingTimelineEvents.where()/*.filterEventsWithSettings()*/.findAll()
- sendingEvents.addChangeListener { events ->
- uiEchoManager.onSentEventsInDatabase(events.map { it.eventId })
+ timelineScope.launch {
+ loadRoomMembersIfNeeded()
+ }
+ timelineScope.launch {
+ sequencer.post {
+ if (isStarted.compareAndSet(false, true)) {
+ val realm = Realm.getInstance(realmConfiguration)
+ ensureReadReceiptAreLoaded(realm)
+ backgroundRealm.set(realm)
+ listenToPostSnapshotSignals()
+ openAround(initialEventId)
postSnapshot()
}
-
- timelineEvents = buildEventQuery(realm).sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING).findAll()
- timelineEvents.addChangeListener(eventsChangeListener)
- handleInitialLoad()
- loadRoomMembersTask
- .configureWith(LoadRoomMembersTask.Params(roomId))
- .executeBy(taskExecutor)
-
- // Ensure ReadReceipt from init sync are loaded
- ensureReadReceiptAreLoaded(realm)
-
- isReady.set(true)
}
}
}
- private fun ensureReadReceiptAreLoaded(realm: Realm) {
- readReceiptHandler.getContentFromInitSync(roomId)
- ?.also {
- Timber.w("INIT_SYNC Insert when opening timeline RR for room $roomId")
- }
- ?.let { readReceiptContent ->
- realm.executeTransactionAsync {
- readReceiptHandler.handle(it, roomId, readReceiptContent, false, null)
- readReceiptHandler.onContentFromInitSyncHandled(roomId)
- }
- }
- }
-
override fun dispose() {
- if (isStarted.compareAndSet(true, false)) {
- isReady.set(false)
- timelineInput.listeners.remove(this)
- Timber.v("Dispose timeline for roomId: $roomId and eventId: $initialEventId")
- cancelableBag.cancel()
- BACKGROUND_HANDLER.removeCallbacksAndMessages(null)
- BACKGROUND_HANDLER.post {
- if (this::sendingEvents.isInitialized) {
- sendingEvents.removeAllChangeListeners()
- }
- if (this::timelineEvents.isInitialized) {
- timelineEvents.removeAllChangeListeners()
+ timelineScope.coroutineContext.cancelChildren()
+ timelineScope.launch {
+ sequencer.post {
+ if (isStarted.compareAndSet(true, false)) {
+ strategy.onStop()
+ backgroundRealm.get().closeQuietly()
}
- clearAllValues()
- backgroundRealm.getAndSet(null).also {
- it?.close()
- }
- eventDecryptor.destroy()
}
}
}
override fun restartWithEventId(eventId: String?) {
- dispose()
- initialEventId = eventId
- start()
- postSnapshot()
- }
-
- override fun getTimelineEventAtIndex(index: Int): TimelineEvent? {
- return builtEvents.getOrNull(index)
- }
-
- override fun getIndexOfEvent(eventId: String?): Int? {
- return builtEventsIdMap[eventId]
- }
-
- override fun getTimelineEventWithId(eventId: String?): TimelineEvent? {
- return builtEventsIdMap[eventId]?.let {
- getTimelineEventAtIndex(it)
- }
- }
-
- override fun hasMoreToLoad(direction: Timeline.Direction): Boolean {
- return hasMoreInCache(direction) || !hasReachedEnd(direction)
- }
-
- override fun addListener(listener: Timeline.Listener): Boolean {
- if (listeners.contains(listener)) {
- return false
- }
- return listeners.add(listener).also {
+ timelineScope.launch {
+ openAround(eventId)
postSnapshot()
}
}
- override fun removeListener(listener: Timeline.Listener): Boolean {
- return listeners.remove(listener)
- }
-
- override fun removeAllListeners() {
- listeners.clear()
+ override fun hasMoreToLoad(direction: Timeline.Direction): Boolean {
+ return getPaginationState(direction).hasMoreToLoad
}
- override fun onNewTimelineEvents(roomId: String, eventIds: List) {
- if (isLive && this.roomId == roomId) {
- listeners.forEach {
- it.onNewTimelineEvents(eventIds)
+ override fun paginate(direction: Timeline.Direction, count: Int) {
+ timelineScope.launch {
+ val postSnapshot = loadMore(count, direction, fetchOnServerIfNeeded = true)
+ if (postSnapshot) {
+ postSnapshot()
}
}
}
- override fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent) {
- if (roomId != this.roomId || !isLive) return
- uiEchoManager.onLocalEchoCreated(timelineEvent)
- listeners.forEach {
- tryOrNull {
- it.onNewTimelineEvents(listOf(timelineEvent.eventId))
- }
+ override suspend fun awaitPaginate(direction: Timeline.Direction, count: Int): List {
+ withContext(timelineDispatcher) {
+ loadMore(count, direction, fetchOnServerIfNeeded = true)
}
- postSnapshot()
+ return getSnapshot()
}
- override fun onLocalEchoUpdated(roomId: String, eventId: String, sendState: SendState) {
- if (roomId != this.roomId || !isLive) return
- if (uiEchoManager.onSendStateUpdated(eventId, sendState)) {
- postSnapshot()
- }
+ override fun getSnapshot(): List {
+ return strategy.buildSnapshot()
}
- override fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean {
- return tryOrNull {
- builtEventsIdMap[eventId]?.let { builtIndex ->
- // Update the relation of existing event
- builtEvents[builtIndex]?.let { te ->
- val rebuiltEvent = builder(te)
- // If rebuilt event is filtered its returned as null and should be removed.
- if (rebuiltEvent == null) {
- builtEventsIdMap.remove(eventId)
- builtEventsIdMap.entries.filter { it.value > builtIndex }.forEach { it.setValue(it.value - 1) }
- builtEvents.removeAt(builtIndex)
- } else {
- builtEvents[builtIndex] = rebuiltEvent
- }
- true
- }
- }
- } ?: false
+ override fun getIndexOfEvent(eventId: String?): Int? {
+ if (eventId == null) return null
+ return strategy.getBuiltEventIndex(eventId)
}
-// Private methods *****************************************************************************
-
- private fun hasMoreInCache(direction: Timeline.Direction) = getState(direction).hasMoreInCache
-
- private fun hasReachedEnd(direction: Timeline.Direction) = getState(direction).hasReachedEnd
-
- private fun updateLoadingStates(results: RealmResults) {
- val lastCacheEvent = results.lastOrNull()
- val firstCacheEvent = results.firstOrNull()
- val chunkEntity = getLiveChunk()
-
- updateState(Timeline.Direction.FORWARDS) {
- it.copy(
- hasMoreInCache = !builtEventsIdMap.containsKey(firstCacheEvent?.eventId),
- hasReachedEnd = chunkEntity?.isLastForward ?: false
- )
- }
- updateState(Timeline.Direction.BACKWARDS) {
- it.copy(
- hasMoreInCache = !builtEventsIdMap.containsKey(lastCacheEvent?.eventId),
- hasReachedEnd = chunkEntity?.isLastBackward ?: false || lastCacheEvent?.root?.type == EventType.STATE_ROOM_CREATE
- )
- }
+ override fun getPaginationState(direction: Timeline.Direction): Timeline.PaginationState {
+ return if (direction == Timeline.Direction.BACKWARDS) {
+ backwardState
+ } else {
+ forwardState
+ }.get()
}
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- * @return true if createSnapshot should be posted
- */
- private fun paginateInternal(startDisplayIndex: Int?,
- direction: Timeline.Direction,
- count: Int): Boolean {
- if (count == 0) {
+ private suspend fun loadMore(count: Int, direction: Timeline.Direction, fetchOnServerIfNeeded: Boolean): Boolean {
+ val baseLogMessage = "loadMore(count: $count, direction: $direction, roomId: $roomId, fetchOnServer: $fetchOnServerIfNeeded)"
+ Timber.v("$baseLogMessage started")
+ if (!isStarted.get()) {
+ throw IllegalStateException("You should call start before using timeline")
+ }
+ val currentState = getPaginationState(direction)
+ if (!currentState.hasMoreToLoad) {
+ Timber.v("$baseLogMessage : nothing more to load")
return false
}
- updateState(direction) { it.copy(requestedPaginationCount = count, isPaginating = true) }
- val builtCount = buildTimelineEvents(startDisplayIndex, direction, count.toLong())
- val shouldFetchMore = builtCount < count && !hasReachedEnd(direction)
- if (shouldFetchMore) {
- val newRequestedCount = count - builtCount
- updateState(direction) { it.copy(requestedPaginationCount = newRequestedCount) }
- val fetchingCount = max(MIN_FETCHING_COUNT, newRequestedCount)
- executePaginationTask(direction, fetchingCount)
- } else {
- updateState(direction) { it.copy(isPaginating = false, requestedPaginationCount = 0) }
+ if (currentState.loading) {
+ Timber.v("$baseLogMessage : already loading")
+ return false
}
- return !shouldFetchMore
- }
-
- private fun createSnapshot(): List {
- return buildSendingEvents() + builtEvents.toList()
- }
-
- private fun buildSendingEvents(): List {
- val builtSendingEvents = mutableListOf()
- if (hasReachedEnd(Timeline.Direction.FORWARDS) && !hasMoreInCache(Timeline.Direction.FORWARDS)) {
- uiEchoManager.getInMemorySendingEvents()
- .updateWithUiEchoInto(builtSendingEvents)
- sendingEvents
- .filter { timelineEvent ->
- builtSendingEvents.none { it.eventId == timelineEvent.eventId }
- }
- .map { timelineEventMapper.map(it) }
- .updateWithUiEchoInto(builtSendingEvents)
+ updateState(direction) {
+ it.copy(loading = true)
}
- return builtSendingEvents
- }
-
- private fun List.updateWithUiEchoInto(target: MutableList) {
- target.addAll(
- // Get most up to date send state (in memory)
- map { uiEchoManager.updateSentStateWithUiEcho(it) }
- )
- }
-
- private fun canPaginate(direction: Timeline.Direction): Boolean {
- return isReady.get() && !getState(direction).isPaginating && hasMoreToLoad(direction)
- }
-
- private fun getState(direction: Timeline.Direction): TimelineState {
- return when (direction) {
- Timeline.Direction.FORWARDS -> forwardsState.get()
- Timeline.Direction.BACKWARDS -> backwardsState.get()
+ val loadMoreResult = strategy.loadMore(count, direction, fetchOnServerIfNeeded)
+ Timber.v("$baseLogMessage: result $loadMoreResult")
+ val hasMoreToLoad = loadMoreResult != LoadMoreResult.REACHED_END
+ updateState(direction) {
+ it.copy(loading = false, hasMoreToLoad = hasMoreToLoad)
}
+ return true
}
- private fun updateState(direction: Timeline.Direction, update: (TimelineState) -> TimelineState) {
- val stateReference = when (direction) {
- Timeline.Direction.FORWARDS -> forwardsState
- Timeline.Direction.BACKWARDS -> backwardsState
+ private suspend fun openAround(eventId: String?) = withContext(timelineDispatcher) {
+ val baseLogMessage = "openAround(eventId: $eventId)"
+ Timber.v("$baseLogMessage started")
+ if (!isStarted.get()) {
+ throw IllegalStateException("You should call start before using timeline")
}
- val currentValue = stateReference.get()
- val newValue = update(currentValue)
- stateReference.set(newValue)
- }
-
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- */
- private fun handleInitialLoad() {
- var shouldFetchInitialEvent = false
- val currentInitialEventId = initialEventId
- val initialDisplayIndex = if (currentInitialEventId == null) {
- timelineEvents.firstOrNull()?.displayIndex
+ strategy.onStop()
+ strategy = if (eventId == null) {
+ buildStrategy(LoadTimelineStrategy.Mode.Live)
} else {
- val initialEvent = timelineEvents.where()
- .equalTo(TimelineEventEntityFields.EVENT_ID, initialEventId)
- .findFirst()
+ buildStrategy(LoadTimelineStrategy.Mode.Permalink(eventId))
+ }
+ initPaginationStates(eventId)
+ strategy.onStart()
+ loadMore(
+ count = strategyDependencies.timelineSettings.initialSize,
+ direction = Timeline.Direction.BACKWARDS,
+ fetchOnServerIfNeeded = false
+ )
+ Timber.v("$baseLogMessage finished")
+ }
- shouldFetchInitialEvent = initialEvent == null
- initialEvent?.displayIndex
+ private fun initPaginationStates(eventId: String?) {
+ updateState(Timeline.Direction.FORWARDS) {
+ it.copy(loading = false, hasMoreToLoad = eventId != null)
}
- prevDisplayIndex = initialDisplayIndex
- nextDisplayIndex = initialDisplayIndex
- if (currentInitialEventId != null && shouldFetchInitialEvent) {
- fetchEvent(currentInitialEventId)
- } else {
- val count = timelineEvents.size.coerceAtMost(settings.initialSize)
- if (initialEventId == null) {
- paginateInternal(initialDisplayIndex, Timeline.Direction.BACKWARDS, count)
- } else {
- paginateInternal(initialDisplayIndex, Timeline.Direction.FORWARDS, (count / 2).coerceAtLeast(1))
- paginateInternal(initialDisplayIndex?.minus(1), Timeline.Direction.BACKWARDS, (count / 2).coerceAtLeast(1))
- }
+ updateState(Timeline.Direction.BACKWARDS) {
+ it.copy(loading = false, hasMoreToLoad = true)
}
- postSnapshot()
}
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- */
- private fun handleUpdates(results: RealmResults, changeSet: OrderedCollectionChangeSet) {
- // If changeSet has deletion we are having a gap, so we clear everything
- if (changeSet.deletionRanges.isNotEmpty()) {
- clearAllValues()
- }
- var postSnapshot = false
- changeSet.insertionRanges.forEach { range ->
- val (startDisplayIndex, direction) = if (range.startIndex == 0) {
- Pair(results[range.length - 1]!!.displayIndex, Timeline.Direction.FORWARDS)
- } else {
- Pair(results[range.startIndex]!!.displayIndex, Timeline.Direction.BACKWARDS)
- }
- val state = getState(direction)
- if (state.isPaginating) {
- // We are getting new items from pagination
- postSnapshot = paginateInternal(startDisplayIndex, direction, state.requestedPaginationCount)
+ private fun sendSignalToPostSnapshot(withThrottling: Boolean) {
+ timelineScope.launch {
+ if (withThrottling) {
+ postSnapshotSignalFlow.emit(Unit)
} else {
- // We are getting new items from sync
- buildTimelineEvents(startDisplayIndex, direction, range.length.toLong())
- postSnapshot = true
- }
- }
- changeSet.changes.forEach { index ->
- val eventEntity = results[index]
- eventEntity?.eventId?.let { eventId ->
- postSnapshot = rebuildEvent(eventId) {
- buildTimelineEvent(eventEntity)
- } || postSnapshot
+ postSnapshot()
}
}
- if (postSnapshot) {
- postSnapshot()
- }
}
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- */
- private fun executePaginationTask(direction: Timeline.Direction, limit: Int) {
- val currentChunk = getLiveChunk()
- val token = if (direction == Timeline.Direction.BACKWARDS) currentChunk?.prevToken else currentChunk?.nextToken
- if (token == null) {
- if (direction == Timeline.Direction.BACKWARDS ||
- (direction == Timeline.Direction.FORWARDS && currentChunk?.hasBeenALastForwardChunk().orFalse())) {
- // We are in the case where event exists, but we do not know the token.
- // Fetch (again) the last event to get a token
- val lastKnownEventId = if (direction == Timeline.Direction.FORWARDS) {
- timelineEvents.firstOrNull()?.eventId
- } else {
- timelineEvents.lastOrNull()?.eventId
- }
- if (lastKnownEventId == null) {
- updateState(direction) { it.copy(isPaginating = false, requestedPaginationCount = 0) }
- } else {
- val params = FetchTokenAndPaginateTask.Params(
- roomId = roomId,
- limit = limit,
- direction = direction.toPaginationDirection(),
- lastKnownEventId = lastKnownEventId
- )
- cancelableBag += fetchTokenAndPaginateTask
- .configureWith(params) {
- this.callback = createPaginationCallback(limit, direction)
- }
- .executeBy(taskExecutor)
+ @Suppress("EXPERIMENTAL_API_USAGE")
+ private fun listenToPostSnapshotSignals() {
+ postSnapshotSignalFlow
+ .sample(150)
+ .onEach {
+ postSnapshot()
}
- } else {
- updateState(direction) { it.copy(isPaginating = false, requestedPaginationCount = 0) }
- }
- } else {
- val params = PaginationTask.Params(
- roomId = roomId,
- from = token,
- direction = direction.toPaginationDirection(),
- limit = limit
- )
- Timber.v("Should fetch $limit items $direction")
- cancelableBag += paginationTask
- .configureWith(params) {
- this.callback = createPaginationCallback(limit, direction)
- }
- .executeBy(taskExecutor)
- }
+ .launchIn(timelineScope)
}
- // For debug purpose only
- private fun dumpAndLogChunks() {
- val liveChunk = getLiveChunk()
- Timber.w("Live chunk: $liveChunk")
-
- Realm.getInstance(realmConfiguration).use { realm ->
- ChunkEntity.where(realm, roomId).findAll()
- .also { Timber.w("Found ${it.size} chunks") }
- .forEach {
- Timber.w("")
- Timber.w("ChunkEntity: $it")
- Timber.w("prevToken: ${it.prevToken}")
- Timber.w("nextToken: ${it.nextToken}")
- Timber.w("isLastBackward: ${it.isLastBackward}")
- Timber.w("isLastForward: ${it.isLastForward}")
- it.timelineEvents.forEach { tle ->
- Timber.w(" TLE: ${tle.root?.content}")
- }
- }
+ private fun onLimitedTimeline() {
+ timelineScope.launch {
+ initPaginationStates(null)
+ loadMore(settings.initialSize, Timeline.Direction.BACKWARDS, false)
+ postSnapshot()
}
}
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- */
- private fun getTokenLive(direction: Timeline.Direction): String? {
- val chunkEntity = getLiveChunk() ?: return null
- return if (direction == Timeline.Direction.BACKWARDS) chunkEntity.prevToken else chunkEntity.nextToken
- }
-
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- * Return the current Chunk
- */
- private fun getLiveChunk(): ChunkEntity? {
- return timelineEvents.firstOrNull()?.chunk?.firstOrNull()
- }
-
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- * @return the number of items who have been added
- */
- private fun buildTimelineEvents(startDisplayIndex: Int?,
- direction: Timeline.Direction,
- count: Long): Int {
- if (count < 1 || startDisplayIndex == null) {
- return 0
- }
- val start = System.currentTimeMillis()
- val offsetResults = getOffsetResults(startDisplayIndex, direction, count)
- if (offsetResults.isEmpty()) {
- return 0
- }
- val offsetIndex = offsetResults.last()!!.displayIndex
- if (direction == Timeline.Direction.BACKWARDS) {
- prevDisplayIndex = offsetIndex - 1
- } else {
- nextDisplayIndex = offsetIndex + 1
- }
-
- // Prerequisite to in order for the ThreadsAwarenessHandler to work properly
- fetchRootThreadEventsIfNeeded(offsetResults)
-
- offsetResults.forEach { eventEntity ->
-
- val timelineEvent = buildTimelineEvent(eventEntity)
- val transactionId = timelineEvent.root.unsignedData?.transactionId
- uiEchoManager.onSyncedEvent(transactionId)
-
- if (timelineEvent.isEncrypted() &&
- timelineEvent.root.mxDecryptionResult == null) {
- timelineEvent.root.eventId?.also { eventDecryptor.requestDecryption(TimelineEventDecryptor.DecryptionRequest(timelineEvent.root, timelineID)) }
+ private suspend fun postSnapshot() {
+ val snapshot = strategy.buildSnapshot()
+ Timber.v("Post snapshot of ${snapshot.size} events")
+ withContext(coroutineDispatchers.main) {
+ listeners.forEach {
+ tryOrNull { it.onTimelineUpdated(snapshot) }
}
-
- val position = if (direction == Timeline.Direction.FORWARDS) 0 else builtEvents.size
- builtEvents.add(position, timelineEvent)
- // Need to shift :/
- builtEventsIdMap.entries.filter { it.value >= position }.forEach { it.setValue(it.value + 1) }
- builtEventsIdMap[eventEntity.eventId] = position
}
- val time = System.currentTimeMillis() - start
- Timber.v("Built ${offsetResults.size} items from db in $time ms")
- // For the case where wo reach the lastForward chunk
- updateLoadingStates(timelineEvents)
- return offsetResults.size
- }
-
- /**
- * This function is responsible to fetch and store the root event of a thread event
- * in order to be able to display the event to the user appropriately
- */
- private fun fetchRootThreadEventsIfNeeded(offsetResults: RealmResults) = runBlocking {
- val eventEntityList = offsetResults
- .mapNotNull {
- it?.root
- }.map {
- EventMapper.map(it)
- }
- threadsAwarenessHandler.fetchRootThreadEventsIfNeeded(eventEntityList)
}
- private fun buildTimelineEvent(eventEntity: TimelineEventEntity): TimelineEvent {
- return timelineEventMapper.map(
- timelineEventEntity = eventEntity,
- buildReadReceipts = settings.buildReadReceipts
- ).let { timelineEvent ->
- // eventually enhance with ui echo?
- uiEchoManager.decorateEventWithReactionUiEcho(timelineEvent) ?: timelineEvent
+ private fun onNewTimelineEvents(eventIds: List) {
+ timelineScope.launch(coroutineDispatchers.main) {
+ listeners.forEach {
+ tryOrNull { it.onNewTimelineEvents(eventIds) }
+ }
}
}
- /**
- * This has to be called on TimelineThread as it accesses realm live results
- */
- private fun getOffsetResults(startDisplayIndex: Int,
- direction: Timeline.Direction,
- count: Long): RealmResults {
- val offsetQuery = timelineEvents.where()
- if (direction == Timeline.Direction.BACKWARDS) {
- offsetQuery
- .sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING)
- .lessThanOrEqualTo(TimelineEventEntityFields.DISPLAY_INDEX, startDisplayIndex)
- } else {
- offsetQuery
- .sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.ASCENDING)
- .greaterThanOrEqualTo(TimelineEventEntityFields.DISPLAY_INDEX, startDisplayIndex)
+ private fun updateState(direction: Timeline.Direction, update: (Timeline.PaginationState) -> Timeline.PaginationState) {
+ val stateReference = when (direction) {
+ Timeline.Direction.FORWARDS -> forwardState
+ Timeline.Direction.BACKWARDS -> backwardState
}
- return offsetQuery
- .limit(count)
- .findAll()
- }
-
- private fun buildEventQuery(realm: Realm): RealmQuery {
- return if (initialEventId == null) {
- TimelineEventEntity
- .whereRoomId(realm, roomId = roomId)
- .equalTo(TimelineEventEntityFields.CHUNK.IS_LAST_FORWARD, true)
- } else {
- TimelineEventEntity
- .whereRoomId(realm, roomId = roomId)
- .`in`("${TimelineEventEntityFields.CHUNK.TIMELINE_EVENTS}.${TimelineEventEntityFields.EVENT_ID}", arrayOf(initialEventId))
+ val currentValue = stateReference.get()
+ val newValue = update(currentValue)
+ stateReference.set(newValue)
+ if (newValue != currentValue) {
+ postPaginationState(direction, newValue)
}
}
- private fun fetchEvent(eventId: String) {
- val params = GetContextOfEventTask.Params(roomId, eventId)
- cancelableBag += contextOfEventTask.configureWith(params) {
- callback = object : MatrixCallback {
- override fun onSuccess(data: TokenChunkEventPersistor.Result) {
- postSnapshot()
- }
-
- override fun onFailure(failure: Throwable) {
- postFailure(failure)
- }
+ private fun postPaginationState(direction: Timeline.Direction, state: Timeline.PaginationState) {
+ timelineScope.launch(coroutineDispatchers.main) {
+ Timber.v("Post $direction pagination state: $state ")
+ listeners.forEach {
+ tryOrNull { it.onStateUpdated(direction, state) }
}
}
- .executeBy(taskExecutor)
}
- private fun postSnapshot() {
- BACKGROUND_HANDLER.post {
- if (isReady.get().not()) {
- return@post
- }
- updateLoadingStates(timelineEvents)
- val snapshot = createSnapshot()
- val runnable = Runnable {
- listeners.forEach {
- it.onTimelineUpdated(snapshot)
- }
- }
- debouncer.debounce("post_snapshot", runnable, 1)
- }
+ private fun buildStrategy(mode: LoadTimelineStrategy.Mode): LoadTimelineStrategy {
+ return LoadTimelineStrategy(
+ roomId = roomId,
+ timelineId = timelineID,
+ mode = mode,
+ dependencies = strategyDependencies
+ )
}
- private fun postFailure(throwable: Throwable) {
- if (isReady.get().not()) {
- return
+ private suspend fun loadRoomMembersIfNeeded() {
+ val loadRoomMembersParam = LoadRoomMembersTask.Params(roomId)
+ try {
+ loadRoomMembersTask.execute(loadRoomMembersParam)
+ } catch (failure: Throwable) {
+ Timber.v("Failed to load room members. Retry in 10s.")
+ delay(10_000L)
+ loadRoomMembersIfNeeded()
}
- val runnable = Runnable {
- listeners.forEach {
- it.onTimelineFailure(throwable)
- }
- }
- mainHandler.post(runnable)
}
- private fun clearAllValues() {
- prevDisplayIndex = null
- nextDisplayIndex = null
- builtEvents.clear()
- builtEventsIdMap.clear()
- backwardsState.set(TimelineState())
- forwardsState.set(TimelineState())
- }
-
- private fun createPaginationCallback(limit: Int, direction: Timeline.Direction): MatrixCallback {
- return object : MatrixCallback {
- override fun onSuccess(data: TokenChunkEventPersistor.Result) {
- when (data) {
- TokenChunkEventPersistor.Result.SUCCESS -> {
- Timber.v("Success fetching $limit items $direction from pagination request")
- }
- TokenChunkEventPersistor.Result.REACHED_END -> {
- postSnapshot()
+ private fun ensureReadReceiptAreLoaded(realm: Realm) {
+ readReceiptHandler.getContentFromInitSync(roomId)
+ ?.also {
+ Timber.w("INIT_SYNC Insert when opening timeline RR for room $roomId")
+ }
+ ?.let { readReceiptContent ->
+ realm.executeTransactionAsync {
+ readReceiptHandler.handle(it, roomId, readReceiptContent, false, null)
+ readReceiptHandler.onContentFromInitSyncHandled(roomId)
}
- TokenChunkEventPersistor.Result.SHOULD_FETCH_MORE ->
- // Database won't be updated, so we force pagination request
- BACKGROUND_HANDLER.post {
- executePaginationTask(direction, limit)
- }
}
- }
-
- override fun onFailure(failure: Throwable) {
- updateState(direction) { it.copy(isPaginating = false, requestedPaginationCount = 0) }
- postSnapshot()
- Timber.v("Failure fetching $limit items $direction from pagination request")
- }
- }
- }
-
- // Extension methods ***************************************************************************
-
- private fun Timeline.Direction.toPaginationDirection(): PaginationDirection {
- return if (this == Timeline.Direction.BACKWARDS) PaginationDirection.BACKWARDS else PaginationDirection.FORWARDS
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt
index 75e7e774df4..126374b430c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt
@@ -23,6 +23,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import io.realm.Sort
import io.realm.kotlin.where
+import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
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.room.timeline.Timeline
@@ -54,7 +55,8 @@ internal class DefaultTimelineService @AssistedInject constructor(
private val timelineEventMapper: TimelineEventMapper,
private val loadRoomMembersTask: LoadRoomMembersTask,
private val threadsAwarenessHandler: ThreadsAwarenessHandler,
- private val readReceiptHandler: ReadReceiptHandler
+ private val readReceiptHandler: ReadReceiptHandler,
+ private val coroutineDispatchers: MatrixCoroutineDispatchers
) : TimelineService {
@AssistedFactory
@@ -66,19 +68,18 @@ internal class DefaultTimelineService @AssistedInject constructor(
return DefaultTimeline(
roomId = roomId,
initialEventId = eventId,
+ settings = settings,
realmConfiguration = monarchy.realmConfiguration,
- taskExecutor = taskExecutor,
- contextOfEventTask = contextOfEventTask,
+ coroutineDispatchers = coroutineDispatchers,
paginationTask = paginationTask,
timelineEventMapper = timelineEventMapper,
- settings = settings,
timelineInput = timelineInput,
eventDecryptor = eventDecryptor,
fetchTokenAndPaginateTask = fetchTokenAndPaginateTask,
- realmSessionProvider = realmSessionProvider,
loadRoomMembersTask = loadRoomMembersTask,
- threadsAwarenessHandler = threadsAwarenessHandler,
- readReceiptHandler = readReceiptHandler
+ readReceiptHandler = readReceiptHandler,
+ getEventTask = contextOfEventTask,
+ threadsAwarenessHandler = threadsAwarenessHandler
)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadMoreResult.kt
similarity index 76%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineState.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadMoreResult.kt
index 0143d9bab3d..c419e8325ee 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineState.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadMoreResult.kt
@@ -16,9 +16,8 @@
package org.matrix.android.sdk.internal.session.room.timeline
-internal data class TimelineState(
- val hasReachedEnd: Boolean = false,
- val hasMoreInCache: Boolean = true,
- val isPaginating: Boolean = false,
- val requestedPaginationCount: Int = 0
-)
+internal enum class LoadMoreResult {
+ REACHED_END,
+ SUCCESS,
+ FAILURE
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt
new file mode 100644
index 00000000000..528b564e8b1
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt
@@ -0,0 +1,232 @@
+/*
+ * Copyright (c) 2021 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.session.room.timeline
+
+import io.realm.OrderedCollectionChangeSet
+import io.realm.OrderedRealmCollectionChangeListener
+import io.realm.Realm
+import io.realm.RealmResults
+import kotlinx.coroutines.CompletableDeferred
+import org.matrix.android.sdk.api.extensions.orFalse
+import org.matrix.android.sdk.api.session.room.send.SendState
+import org.matrix.android.sdk.api.session.room.timeline.Timeline
+import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
+import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
+import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper
+import org.matrix.android.sdk.internal.database.model.ChunkEntity
+import org.matrix.android.sdk.internal.database.model.ChunkEntityFields
+import org.matrix.android.sdk.internal.database.query.findAllIncludingEvents
+import org.matrix.android.sdk.internal.database.query.where
+import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler
+import java.util.concurrent.atomic.AtomicReference
+
+/**
+ * This class is responsible for keeping an instance of chunkEntity and timelineChunk according to the strategy.
+ * There is 2 different mode: Live and Permalink.
+ * In Live, we will query for the live chunk (isLastForward = true).
+ * In Permalink, we will query for the chunk including the eventId we are looking for.
+ * Once we got a ChunkEntity we wrap it with TimelineChunk class so we dispatch any methods for loading data.
+ */
+
+internal class LoadTimelineStrategy(
+ private val roomId: String,
+ private val timelineId: String,
+ private val mode: Mode,
+ private val dependencies: Dependencies) {
+
+ sealed interface Mode {
+ object Live : Mode
+ data class Permalink(val originEventId: String) : Mode
+
+ fun originEventId(): String? {
+ return if (this is Permalink) {
+ originEventId
+ } else {
+ null
+ }
+ }
+ }
+
+ data class Dependencies(
+ val timelineSettings: TimelineSettings,
+ val realm: AtomicReference,
+ val eventDecryptor: TimelineEventDecryptor,
+ val paginationTask: PaginationTask,
+ val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
+ val getContextOfEventTask: GetContextOfEventTask,
+ val timelineInput: TimelineInput,
+ val timelineEventMapper: TimelineEventMapper,
+ val threadsAwarenessHandler: ThreadsAwarenessHandler,
+ val onEventsUpdated: (Boolean) -> Unit,
+ val onLimitedTimeline: () -> Unit,
+ val onNewTimelineEvents: (List) -> Unit
+ )
+
+ private var getContextLatch: CompletableDeferred? = null
+ private var chunkEntity: RealmResults? = null
+ private var timelineChunk: TimelineChunk? = null
+
+ private val chunkEntityListener = OrderedRealmCollectionChangeListener { _: RealmResults, changeSet: OrderedCollectionChangeSet ->
+ // Can be call either when you open a permalink on an unknown event
+ // or when there is a gap in the timeline.
+ val shouldRebuildChunk = changeSet.insertions.isNotEmpty()
+ if (shouldRebuildChunk) {
+ timelineChunk?.close(closeNext = true, closePrev = true)
+ timelineChunk = chunkEntity?.createTimelineChunk()
+ // If we are waiting for a result of get context, post completion
+ getContextLatch?.complete(Unit)
+ // If we have a gap, just tell the timeline about it.
+ if (timelineChunk?.hasReachedLastForward().orFalse()) {
+ dependencies.onLimitedTimeline()
+ }
+ }
+ }
+
+ private val uiEchoManagerListener = object : UIEchoManager.Listener {
+ override fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean {
+ return timelineChunk?.rebuildEvent(eventId, builder, searchInNext = true, searchInPrev = true).orFalse()
+ }
+ }
+
+ private val timelineInputListener = object : TimelineInput.Listener {
+
+ override fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent) {
+ if (roomId != this@LoadTimelineStrategy.roomId) {
+ return
+ }
+ if (uiEchoManager.onLocalEchoCreated(timelineEvent)) {
+ dependencies.onNewTimelineEvents(listOf(timelineEvent.eventId))
+ dependencies.onEventsUpdated(false)
+ }
+ }
+
+ override fun onLocalEchoUpdated(roomId: String, eventId: String, sendState: SendState) {
+ if (roomId != this@LoadTimelineStrategy.roomId) {
+ return
+ }
+ if (uiEchoManager.onSendStateUpdated(eventId, sendState)) {
+ dependencies.onEventsUpdated(false)
+ }
+ }
+
+ override fun onNewTimelineEvents(roomId: String, eventIds: List) {
+ if (roomId == this@LoadTimelineStrategy.roomId && hasReachedLastForward()) {
+ dependencies.onNewTimelineEvents(eventIds)
+ }
+ }
+ }
+
+ private val uiEchoManager = UIEchoManager(uiEchoManagerListener)
+ private val sendingEventsDataSource: SendingEventsDataSource = RealmSendingEventsDataSource(
+ roomId = roomId,
+ realm = dependencies.realm,
+ uiEchoManager = uiEchoManager,
+ timelineEventMapper = dependencies.timelineEventMapper,
+ onEventsUpdated = dependencies.onEventsUpdated
+ )
+
+ fun onStart() {
+ dependencies.eventDecryptor.start()
+ dependencies.timelineInput.listeners.add(timelineInputListener)
+ val realm = dependencies.realm.get()
+ sendingEventsDataSource.start()
+ chunkEntity = getChunkEntity(realm).also {
+ it.addChangeListener(chunkEntityListener)
+ timelineChunk = it.createTimelineChunk()
+ }
+ }
+
+ fun onStop() {
+ dependencies.eventDecryptor.destroy()
+ dependencies.timelineInput.listeners.remove(timelineInputListener)
+ chunkEntity?.removeChangeListener(chunkEntityListener)
+ sendingEventsDataSource.stop()
+ timelineChunk?.close(closeNext = true, closePrev = true)
+ getContextLatch?.cancel()
+ chunkEntity = null
+ timelineChunk = null
+ }
+
+ suspend fun loadMore(count: Int, direction: Timeline.Direction, fetchOnServerIfNeeded: Boolean = true): LoadMoreResult {
+ if (mode is Mode.Permalink && timelineChunk == null) {
+ val params = GetContextOfEventTask.Params(roomId, mode.originEventId)
+ try {
+ getContextLatch = CompletableDeferred()
+ dependencies.getContextOfEventTask.execute(params)
+ // waits for the query to be fulfilled
+ getContextLatch?.await()
+ getContextLatch = null
+ } catch (failure: Throwable) {
+ return LoadMoreResult.FAILURE
+ }
+ }
+ return timelineChunk?.loadMore(count, direction, fetchOnServerIfNeeded) ?: LoadMoreResult.FAILURE
+ }
+
+ fun getBuiltEventIndex(eventId: String): Int? {
+ return timelineChunk?.getBuiltEventIndex(eventId, searchInNext = true, searchInPrev = true)
+ }
+
+ fun getBuiltEvent(eventId: String): TimelineEvent? {
+ return timelineChunk?.getBuiltEvent(eventId, searchInNext = true, searchInPrev = true)
+ }
+
+ fun buildSnapshot(): List {
+ return buildSendingEvents() + timelineChunk?.builtItems(includesNext = true, includesPrev = true).orEmpty()
+ }
+
+ private fun buildSendingEvents(): List {
+ return if (hasReachedLastForward()) {
+ sendingEventsDataSource.buildSendingEvents()
+ } else {
+ emptyList()
+ }
+ }
+
+ private fun getChunkEntity(realm: Realm): RealmResults {
+ return if (mode is Mode.Permalink) {
+ ChunkEntity.findAllIncludingEvents(realm, listOf(mode.originEventId))
+ } else {
+ ChunkEntity.where(realm, roomId)
+ .equalTo(ChunkEntityFields.IS_LAST_FORWARD, true)
+ .findAll()
+ }
+ }
+
+ private fun hasReachedLastForward(): Boolean {
+ return timelineChunk?.hasReachedLastForward().orFalse()
+ }
+
+ private fun RealmResults.createTimelineChunk(): TimelineChunk? {
+ return firstOrNull()?.let {
+ return TimelineChunk(
+ chunkEntity = it,
+ timelineSettings = dependencies.timelineSettings,
+ roomId = roomId,
+ timelineId = timelineId,
+ eventDecryptor = dependencies.eventDecryptor,
+ paginationTask = dependencies.paginationTask,
+ fetchTokenAndPaginateTask = dependencies.fetchTokenAndPaginateTask,
+ timelineEventMapper = dependencies.timelineEventMapper,
+ uiEchoManager = uiEchoManager,
+ threadsAwarenessHandler = dependencies.threadsAwarenessHandler,
+ initialEventId = mode.originEventId(),
+ onBuiltEvents = dependencies.onEventsUpdated
+ )
+ }
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt
new file mode 100644
index 00000000000..a98de1c595a
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2021 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.session.room.timeline
+
+import io.realm.Realm
+import io.realm.RealmChangeListener
+import io.realm.RealmList
+import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
+import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper
+import org.matrix.android.sdk.internal.database.model.RoomEntity
+import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
+import org.matrix.android.sdk.internal.database.query.where
+import java.util.concurrent.atomic.AtomicReference
+
+internal interface SendingEventsDataSource {
+ fun start()
+ fun stop()
+ fun buildSendingEvents(): List
+}
+
+internal class RealmSendingEventsDataSource(
+ private val roomId: String,
+ private val realm: AtomicReference,
+ private val uiEchoManager: UIEchoManager,
+ private val timelineEventMapper: TimelineEventMapper,
+ private val onEventsUpdated: (Boolean) -> Unit
+) : SendingEventsDataSource {
+
+ private var roomEntity: RoomEntity? = null
+ private var sendingTimelineEvents: RealmList? = null
+ private var frozenSendingTimelineEvents: RealmList? = null
+
+ private val sendingTimelineEventsListener = RealmChangeListener> { events ->
+ uiEchoManager.onSentEventsInDatabase(events.map { it.eventId })
+ frozenSendingTimelineEvents = sendingTimelineEvents?.freeze()
+ onEventsUpdated(false)
+ }
+
+ override fun start() {
+ val safeRealm = realm.get()
+ roomEntity = RoomEntity.where(safeRealm, roomId = roomId).findFirst()
+ sendingTimelineEvents = roomEntity?.sendingTimelineEvents
+ sendingTimelineEvents?.addChangeListener(sendingTimelineEventsListener)
+ }
+
+ override fun stop() {
+ sendingTimelineEvents?.removeChangeListener(sendingTimelineEventsListener)
+ sendingTimelineEvents = null
+ roomEntity = null
+ }
+
+ override fun buildSendingEvents(): List {
+ val builtSendingEvents = mutableListOf()
+ uiEchoManager.getInMemorySendingEvents()
+ .addWithUiEcho(builtSendingEvents)
+ frozenSendingTimelineEvents
+ ?.filter { timelineEvent ->
+ builtSendingEvents.none { it.eventId == timelineEvent.eventId }
+ }
+ ?.map {
+ timelineEventMapper.map(it)
+ }?.addWithUiEcho(builtSendingEvents)
+
+ return builtSendingEvents
+ }
+
+ private fun List.addWithUiEcho(target: MutableList) {
+ target.addAll(
+ map { uiEchoManager.updateSentStateWithUiEcho(it) }
+ )
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
new file mode 100644
index 00000000000..14cba2a4b8d
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
@@ -0,0 +1,479 @@
+/*
+ * Copyright (c) 2021 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.session.room.timeline
+
+import io.realm.OrderedCollectionChangeSet
+import io.realm.OrderedRealmCollectionChangeListener
+import io.realm.RealmObjectChangeListener
+import io.realm.RealmQuery
+import io.realm.RealmResults
+import io.realm.Sort
+import kotlinx.coroutines.CompletableDeferred
+import org.matrix.android.sdk.api.extensions.orFalse
+import org.matrix.android.sdk.api.extensions.tryOrNull
+import org.matrix.android.sdk.api.session.events.model.EventType
+import org.matrix.android.sdk.api.session.room.timeline.Timeline
+import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
+import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
+import org.matrix.android.sdk.internal.database.mapper.EventMapper
+import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper
+import org.matrix.android.sdk.internal.database.model.ChunkEntity
+import org.matrix.android.sdk.internal.database.model.ChunkEntityFields
+import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
+import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
+import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler
+import timber.log.Timber
+import java.util.Collections
+import java.util.concurrent.atomic.AtomicBoolean
+
+/**
+ * This is a wrapper around a ChunkEntity in the database.
+ * It does mainly listen to the db timeline events.
+ * It also triggers pagination to the server when needed, or dispatch to the prev or next chunk if any.
+ */
+internal class TimelineChunk(private val chunkEntity: ChunkEntity,
+ private val timelineSettings: TimelineSettings,
+ private val roomId: String,
+ private val timelineId: String,
+ private val eventDecryptor: TimelineEventDecryptor,
+ private val paginationTask: PaginationTask,
+ private val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
+ private val timelineEventMapper: TimelineEventMapper,
+ private val uiEchoManager: UIEchoManager? = null,
+ private val threadsAwarenessHandler: ThreadsAwarenessHandler,
+ private val initialEventId: String?,
+ private val onBuiltEvents: (Boolean) -> Unit) {
+
+ private val isLastForward = AtomicBoolean(chunkEntity.isLastForward)
+ private val isLastBackward = AtomicBoolean(chunkEntity.isLastBackward)
+ private var prevChunkLatch: CompletableDeferred? = null
+ private var nextChunkLatch: CompletableDeferred? = null
+
+ private val chunkObjectListener = RealmObjectChangeListener { _, changeSet ->
+ if (changeSet == null) return@RealmObjectChangeListener
+ if (changeSet.isDeleted.orFalse()) {
+ return@RealmObjectChangeListener
+ }
+ Timber.v("on chunk (${chunkEntity.identifier()}) changed: ${changeSet.changedFields?.joinToString(",")}")
+ if (changeSet.isFieldChanged(ChunkEntityFields.IS_LAST_FORWARD)) {
+ isLastForward.set(chunkEntity.isLastForward)
+ }
+ if (changeSet.isFieldChanged(ChunkEntityFields.IS_LAST_BACKWARD)) {
+ isLastBackward.set(chunkEntity.isLastBackward)
+ }
+ if (changeSet.isFieldChanged(ChunkEntityFields.NEXT_CHUNK.`$`)) {
+ nextChunk = createTimelineChunk(chunkEntity.nextChunk)
+ nextChunkLatch?.complete(Unit)
+ }
+ if (changeSet.isFieldChanged(ChunkEntityFields.PREV_CHUNK.`$`)) {
+ prevChunk = createTimelineChunk(chunkEntity.prevChunk)
+ prevChunkLatch?.complete(Unit)
+ }
+ }
+
+ private val timelineEventsChangeListener =
+ OrderedRealmCollectionChangeListener { results: RealmResults, changeSet: OrderedCollectionChangeSet ->
+ Timber.v("on timeline events chunk update")
+ val frozenResults = results.freeze()
+ handleDatabaseChangeSet(frozenResults, changeSet)
+ }
+
+ private var timelineEventEntities: RealmResults = chunkEntity.sortedTimelineEvents()
+ private val builtEvents: MutableList = Collections.synchronizedList(ArrayList())
+ private val builtEventsIndexes: MutableMap = Collections.synchronizedMap(HashMap())
+
+ private var nextChunk: TimelineChunk? = null
+ private var prevChunk: TimelineChunk? = null
+
+ init {
+ timelineEventEntities.addChangeListener(timelineEventsChangeListener)
+ chunkEntity.addChangeListener(chunkObjectListener)
+ }
+
+ fun hasReachedLastForward(): Boolean {
+ return if (isLastForward.get()) {
+ true
+ } else {
+ nextChunk?.hasReachedLastForward().orFalse()
+ }
+ }
+
+ fun builtItems(includesNext: Boolean, includesPrev: Boolean): List {
+ val deepBuiltItems = ArrayList(builtEvents.size)
+ if (includesNext) {
+ val nextEvents = nextChunk?.builtItems(includesNext = true, includesPrev = false).orEmpty()
+ deepBuiltItems.addAll(nextEvents)
+ }
+ deepBuiltItems.addAll(builtEvents)
+ if (includesPrev) {
+ val prevEvents = prevChunk?.builtItems(includesNext = false, includesPrev = true).orEmpty()
+ deepBuiltItems.addAll(prevEvents)
+ }
+ return deepBuiltItems
+ }
+
+ /**
+ * This will take care of loading and building events of this chunk for the given direction and count.
+ * If @param fetchFromServerIfNeeded is true, it will try to fetch more events on server to get the right amount of data.
+ * This method will also post a snapshot as soon the data is built from db to avoid waiting for server response.
+ */
+ suspend fun loadMore(count: Int, direction: Timeline.Direction, fetchOnServerIfNeeded: Boolean = true): LoadMoreResult {
+ if (direction == Timeline.Direction.FORWARDS && nextChunk != null) {
+ return nextChunk?.loadMore(count, direction, fetchOnServerIfNeeded) ?: LoadMoreResult.FAILURE
+ } else if (direction == Timeline.Direction.BACKWARDS && prevChunk != null) {
+ return prevChunk?.loadMore(count, direction, fetchOnServerIfNeeded) ?: LoadMoreResult.FAILURE
+ }
+ val loadFromStorageCount = loadFromStorage(count, direction)
+ Timber.v("Has loaded $loadFromStorageCount items from storage in $direction")
+ val offsetCount = count - loadFromStorageCount
+ return if (direction == Timeline.Direction.FORWARDS && isLastForward.get()) {
+ LoadMoreResult.REACHED_END
+ } else if (direction == Timeline.Direction.BACKWARDS && isLastBackward.get()) {
+ LoadMoreResult.REACHED_END
+ } else if (offsetCount == 0) {
+ LoadMoreResult.SUCCESS
+ } else {
+ delegateLoadMore(fetchOnServerIfNeeded, offsetCount, direction)
+ }
+ }
+
+ private suspend fun delegateLoadMore(fetchFromServerIfNeeded: Boolean, offsetCount: Int, direction: Timeline.Direction): LoadMoreResult {
+ return if (direction == Timeline.Direction.FORWARDS) {
+ val nextChunkEntity = chunkEntity.nextChunk
+ when {
+ nextChunkEntity != null -> {
+ if (nextChunk == null) {
+ nextChunk = createTimelineChunk(nextChunkEntity)
+ }
+ nextChunk?.loadMore(offsetCount, direction, fetchFromServerIfNeeded) ?: LoadMoreResult.FAILURE
+ }
+ fetchFromServerIfNeeded -> {
+ fetchFromServer(offsetCount, chunkEntity.nextToken, direction)
+ }
+ else -> {
+ LoadMoreResult.SUCCESS
+ }
+ }
+ } else {
+ val prevChunkEntity = chunkEntity.prevChunk
+ when {
+ prevChunkEntity != null -> {
+ if (prevChunk == null) {
+ prevChunk = createTimelineChunk(prevChunkEntity)
+ }
+ prevChunk?.loadMore(offsetCount, direction, fetchFromServerIfNeeded) ?: LoadMoreResult.FAILURE
+ }
+ fetchFromServerIfNeeded -> {
+ fetchFromServer(offsetCount, chunkEntity.prevToken, direction)
+ }
+ else -> {
+ LoadMoreResult.SUCCESS
+ }
+ }
+ }
+ }
+
+ fun getBuiltEventIndex(eventId: String, searchInNext: Boolean, searchInPrev: Boolean): Int? {
+ val builtEventIndex = builtEventsIndexes[eventId]
+ if (builtEventIndex != null) {
+ return getOffsetIndex() + builtEventIndex
+ }
+ if (searchInNext) {
+ val nextBuiltEventIndex = nextChunk?.getBuiltEventIndex(eventId, searchInNext = true, searchInPrev = false)
+ if (nextBuiltEventIndex != null) {
+ return nextBuiltEventIndex
+ }
+ }
+ if (searchInPrev) {
+ val prevBuiltEventIndex = prevChunk?.getBuiltEventIndex(eventId, searchInNext = false, searchInPrev = true)
+ if (prevBuiltEventIndex != null) {
+ return prevBuiltEventIndex
+ }
+ }
+ return null
+ }
+
+ fun getBuiltEvent(eventId: String, searchInNext: Boolean, searchInPrev: Boolean): TimelineEvent? {
+ val builtEventIndex = builtEventsIndexes[eventId]
+ if (builtEventIndex != null) {
+ return builtEvents.getOrNull(builtEventIndex)
+ }
+ if (searchInNext) {
+ val nextBuiltEvent = nextChunk?.getBuiltEvent(eventId, searchInNext = true, searchInPrev = false)
+ if (nextBuiltEvent != null) {
+ return nextBuiltEvent
+ }
+ }
+ if (searchInPrev) {
+ val prevBuiltEvent = prevChunk?.getBuiltEvent(eventId, searchInNext = false, searchInPrev = true)
+ if (prevBuiltEvent != null) {
+ return prevBuiltEvent
+ }
+ }
+ return null
+ }
+
+ fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?, searchInNext: Boolean, searchInPrev: Boolean): Boolean {
+ return tryOrNull {
+ val builtIndex = getBuiltEventIndex(eventId, searchInNext = false, searchInPrev = false)
+ if (builtIndex == null) {
+ val foundInPrev = searchInPrev && prevChunk?.rebuildEvent(eventId, builder, searchInNext = false, searchInPrev = true).orFalse()
+ if (foundInPrev) {
+ return true
+ }
+ if (searchInNext) {
+ return prevChunk?.rebuildEvent(eventId, builder, searchInPrev = false, searchInNext = true).orFalse()
+ }
+ return false
+ }
+ // Update the relation of existing event
+ builtEvents.getOrNull(builtIndex)?.let { te ->
+ val rebuiltEvent = builder(te)
+ builtEvents[builtIndex] = rebuiltEvent!!
+ true
+ }
+ }
+ ?: false
+ }
+
+ fun close(closeNext: Boolean, closePrev: Boolean) {
+ if (closeNext) {
+ nextChunk?.close(closeNext = true, closePrev = false)
+ }
+ if (closePrev) {
+ prevChunk?.close(closeNext = false, closePrev = true)
+ }
+ nextChunk = null
+ nextChunkLatch?.cancel()
+ prevChunk = null
+ prevChunkLatch?.cancel()
+ chunkEntity.removeChangeListener(chunkObjectListener)
+ timelineEventEntities.removeChangeListener(timelineEventsChangeListener)
+ }
+
+ /**
+ * This method tries to read events from the current chunk.
+ */
+ private suspend fun loadFromStorage(count: Int, direction: Timeline.Direction): Int {
+ val displayIndex = getNextDisplayIndex(direction) ?: return 0
+ val baseQuery = timelineEventEntities.where()
+ val timelineEvents = baseQuery.offsets(direction, count, displayIndex).findAll().orEmpty()
+ if (timelineEvents.isEmpty()) return 0
+ fetchRootThreadEventsIfNeeded(timelineEvents)
+ if (direction == Timeline.Direction.FORWARDS) {
+ builtEventsIndexes.entries.forEach { it.setValue(it.value + timelineEvents.size) }
+ }
+ timelineEvents
+ .mapIndexed { index, timelineEventEntity ->
+ val timelineEvent = timelineEventEntity.buildAndDecryptIfNeeded()
+ if (timelineEvent.root.type == EventType.STATE_ROOM_CREATE) {
+ isLastBackward.set(true)
+ }
+ if (direction == Timeline.Direction.FORWARDS) {
+ builtEventsIndexes[timelineEvent.eventId] = index
+ builtEvents.add(index, timelineEvent)
+ } else {
+ builtEventsIndexes[timelineEvent.eventId] = builtEvents.size
+ builtEvents.add(timelineEvent)
+ }
+ }
+ return timelineEvents.size
+ }
+
+ /**
+ * This function is responsible to fetch and store the root event of a thread event
+ * in order to be able to display the event to the user appropriately
+ */
+ private suspend fun fetchRootThreadEventsIfNeeded(offsetResults: List) {
+ val eventEntityList = offsetResults
+ .mapNotNull {
+ it.root
+ }.map {
+ EventMapper.map(it)
+ }
+ threadsAwarenessHandler.fetchRootThreadEventsIfNeeded(eventEntityList)
+ }
+
+ private fun TimelineEventEntity.buildAndDecryptIfNeeded(): TimelineEvent {
+ val timelineEvent = buildTimelineEvent(this)
+ val transactionId = timelineEvent.root.unsignedData?.transactionId
+ uiEchoManager?.onSyncedEvent(transactionId)
+ if (timelineEvent.isEncrypted() &&
+ timelineEvent.root.mxDecryptionResult == null) {
+ timelineEvent.root.eventId?.also { eventDecryptor.requestDecryption(TimelineEventDecryptor.DecryptionRequest(timelineEvent.root, timelineId)) }
+ }
+ return timelineEvent
+ }
+
+ private fun buildTimelineEvent(eventEntity: TimelineEventEntity) = timelineEventMapper.map(
+ timelineEventEntity = eventEntity,
+ buildReadReceipts = timelineSettings.buildReadReceipts
+ ).let {
+ // eventually enhance with ui echo?
+ (uiEchoManager?.decorateEventWithReactionUiEcho(it) ?: it)
+ }
+
+ /**
+ * Will try to fetch a new chunk on the home server.
+ * It will take care to update the database by inserting new events and linking new chunk
+ * with this one.
+ */
+ private suspend fun fetchFromServer(count: Int, token: String?, direction: Timeline.Direction): LoadMoreResult {
+ val latch = if (direction == Timeline.Direction.FORWARDS) {
+ nextChunkLatch = CompletableDeferred()
+ nextChunkLatch
+ } else {
+ prevChunkLatch = CompletableDeferred()
+ prevChunkLatch
+ }
+ val loadMoreResult = try {
+ if (token == null) {
+ if (direction == Timeline.Direction.BACKWARDS || !chunkEntity.hasBeenALastForwardChunk()) return LoadMoreResult.REACHED_END
+ val lastKnownEventId = chunkEntity.sortedTimelineEvents().firstOrNull()?.eventId ?: return LoadMoreResult.FAILURE
+ val taskParams = FetchTokenAndPaginateTask.Params(roomId, lastKnownEventId, direction.toPaginationDirection(), count)
+ fetchTokenAndPaginateTask.execute(taskParams).toLoadMoreResult()
+ } else {
+ Timber.v("Fetch $count more events on server")
+ val taskParams = PaginationTask.Params(roomId, token, direction.toPaginationDirection(), count)
+ paginationTask.execute(taskParams).toLoadMoreResult()
+ }
+ } catch (failure: Throwable) {
+ Timber.e("Failed to fetch from server: $failure", failure)
+ LoadMoreResult.FAILURE
+ }
+ return if (loadMoreResult == LoadMoreResult.SUCCESS) {
+ latch?.await()
+ loadMore(count, direction, fetchOnServerIfNeeded = false)
+ } else {
+ loadMoreResult
+ }
+ }
+
+ private fun TokenChunkEventPersistor.Result.toLoadMoreResult(): LoadMoreResult {
+ return when (this) {
+ TokenChunkEventPersistor.Result.REACHED_END -> LoadMoreResult.REACHED_END
+ TokenChunkEventPersistor.Result.SHOULD_FETCH_MORE,
+ TokenChunkEventPersistor.Result.SUCCESS -> LoadMoreResult.SUCCESS
+ }
+ }
+
+ private fun getOffsetIndex(): Int {
+ var offset = 0
+ var currentNextChunk = nextChunk
+ while (currentNextChunk != null) {
+ offset += currentNextChunk.builtEvents.size
+ currentNextChunk = currentNextChunk.nextChunk
+ }
+ return offset
+ }
+
+ /**
+ * This method is responsible for managing insertions and updates of events on this chunk.
+ *
+ */
+ private fun handleDatabaseChangeSet(frozenResults: RealmResults, changeSet: OrderedCollectionChangeSet) {
+ val insertions = changeSet.insertionRanges
+ for (range in insertions) {
+ val newItems = frozenResults
+ .subList(range.startIndex, range.startIndex + range.length)
+ .map { it.buildAndDecryptIfNeeded() }
+ builtEventsIndexes.entries.filter { it.value >= range.startIndex }.forEach { it.setValue(it.value + range.length) }
+ newItems.mapIndexed { index, timelineEvent ->
+ if (timelineEvent.root.type == EventType.STATE_ROOM_CREATE) {
+ isLastBackward.set(true)
+ }
+ val correctedIndex = range.startIndex + index
+ builtEvents.add(correctedIndex, timelineEvent)
+ builtEventsIndexes[timelineEvent.eventId] = correctedIndex
+ }
+ }
+ val modifications = changeSet.changeRanges
+ for (range in modifications) {
+ for (modificationIndex in (range.startIndex until range.startIndex + range.length)) {
+ val updatedEntity = frozenResults[modificationIndex] ?: continue
+ try {
+ builtEvents[modificationIndex] = updatedEntity.buildAndDecryptIfNeeded()
+ } catch (failure: Throwable) {
+ Timber.v("Fail to update items at index: $modificationIndex")
+ }
+ }
+ }
+ if (insertions.isNotEmpty() || modifications.isNotEmpty()) {
+ onBuiltEvents(true)
+ }
+ }
+
+ private fun getNextDisplayIndex(direction: Timeline.Direction): Int? {
+ val frozenTimelineEvents = timelineEventEntities.freeze()
+ if (frozenTimelineEvents.isEmpty()) {
+ return null
+ }
+ return if (builtEvents.isEmpty()) {
+ if (initialEventId != null) {
+ frozenTimelineEvents.where().equalTo(TimelineEventEntityFields.EVENT_ID, initialEventId).findFirst()?.displayIndex
+ } else if (direction == Timeline.Direction.BACKWARDS) {
+ frozenTimelineEvents.first()?.displayIndex
+ } else {
+ frozenTimelineEvents.last()?.displayIndex
+ }
+ } else if (direction == Timeline.Direction.FORWARDS) {
+ builtEvents.first().displayIndex + 1
+ } else {
+ builtEvents.last().displayIndex - 1
+ }
+ }
+
+ private fun createTimelineChunk(chunkEntity: ChunkEntity?): TimelineChunk? {
+ if (chunkEntity == null) return null
+ return TimelineChunk(
+ chunkEntity = chunkEntity,
+ timelineSettings = timelineSettings,
+ roomId = roomId,
+ timelineId = timelineId,
+ eventDecryptor = eventDecryptor,
+ paginationTask = paginationTask,
+ fetchTokenAndPaginateTask = fetchTokenAndPaginateTask,
+ timelineEventMapper = timelineEventMapper,
+ uiEchoManager = uiEchoManager,
+ threadsAwarenessHandler = threadsAwarenessHandler,
+ initialEventId = null,
+ onBuiltEvents = this.onBuiltEvents
+ )
+ }
+}
+
+private fun RealmQuery.offsets(
+ direction: Timeline.Direction,
+ count: Int,
+ startDisplayIndex: Int
+): RealmQuery {
+ sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING)
+ if (direction == Timeline.Direction.BACKWARDS) {
+ lessThanOrEqualTo(TimelineEventEntityFields.DISPLAY_INDEX, startDisplayIndex)
+ } else {
+ greaterThanOrEqualTo(TimelineEventEntityFields.DISPLAY_INDEX, startDisplayIndex)
+ }
+ return limit(count.toLong())
+}
+
+private fun Timeline.Direction.toPaginationDirection(): PaginationDirection {
+ return if (this == Timeline.Direction.BACKWARDS) PaginationDirection.BACKWARDS else PaginationDirection.FORWARDS
+}
+
+private fun ChunkEntity.sortedTimelineEvents(): RealmResults {
+ return timelineEvents.sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING)
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt
index cdc85ea7227..a953db07044 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt
@@ -23,6 +23,9 @@ import javax.inject.Inject
@SessionScope
internal class TimelineInput @Inject constructor() {
+
+ val listeners = mutableSetOf()
+
fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent) {
listeners.toSet().forEach { it.onLocalEchoCreated(roomId, timelineEvent) }
}
@@ -35,8 +38,6 @@ internal class TimelineInput @Inject constructor() {
listeners.toSet().forEach { it.onNewTimelineEvents(roomId, eventIds) }
}
- val listeners = mutableSetOf()
-
internal interface Listener {
fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent) = Unit
fun onLocalEchoUpdated(roomId: String, eventId: String, sendState: SendState) = Unit
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt
index dbcc37a918a..a85f0dbdc93 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt
@@ -17,6 +17,7 @@
package org.matrix.android.sdk.internal.session.room.timeline
import com.zhuinden.monarchy.Monarchy
+import dagger.Lazy
import io.realm.Realm
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toModel
@@ -25,93 +26,27 @@ import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.internal.database.helper.addIfNecessary
import org.matrix.android.sdk.internal.database.helper.addStateEvent
import org.matrix.android.sdk.internal.database.helper.addTimelineEvent
-import org.matrix.android.sdk.internal.database.helper.merge
import org.matrix.android.sdk.internal.database.mapper.toEntity
import org.matrix.android.sdk.internal.database.model.ChunkEntity
import org.matrix.android.sdk.internal.database.model.EventInsertType
import org.matrix.android.sdk.internal.database.model.RoomEntity
-import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
-import org.matrix.android.sdk.internal.database.model.deleteOnCascade
+import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
import org.matrix.android.sdk.internal.database.query.copyToRealmOrIgnore
import org.matrix.android.sdk.internal.database.query.create
import org.matrix.android.sdk.internal.database.query.find
-import org.matrix.android.sdk.internal.database.query.findAllIncludingEvents
-import org.matrix.android.sdk.internal.database.query.findLastForwardChunkOfRoom
-import org.matrix.android.sdk.internal.database.query.getOrCreate
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
-import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryEventsHelper
+import org.matrix.android.sdk.internal.session.StreamEventsManager
import org.matrix.android.sdk.internal.util.awaitTransaction
import timber.log.Timber
import javax.inject.Inject
/**
- * Insert Chunk in DB, and eventually merge with existing chunk event
+ * Insert Chunk in DB, and eventually link next and previous chunk in db.
*/
-internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase private val monarchy: Monarchy) {
-
- /**
- *
- */
+internal class TokenChunkEventPersistor @Inject constructor(
+ @SessionDatabase private val monarchy: Monarchy,
+ private val liveEventManager: Lazy) {
enum class Result {
SHOULD_FETCH_MORE,
@@ -136,21 +71,21 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
prevToken = receivedChunk.end
}
+ val existingChunk = ChunkEntity.find(realm, roomId, prevToken = prevToken, nextToken = nextToken)
+ if (existingChunk != null) {
+ Timber.v("This chunk is already in the db, returns")
+ return@awaitTransaction
+ }
val prevChunk = ChunkEntity.find(realm, roomId, nextToken = prevToken)
val nextChunk = ChunkEntity.find(realm, roomId, prevToken = nextToken)
-
- // The current chunk is the one we will keep all along the merge processChanges.
- // We try to look for a chunk next to the token,
- // otherwise we create a whole new one which is unlinked (not live)
- val currentChunk = if (direction == PaginationDirection.FORWARDS) {
- prevChunk?.apply { this.nextToken = nextToken }
- } else {
- nextChunk?.apply { this.prevToken = prevToken }
+ val currentChunk = ChunkEntity.create(realm, prevToken = prevToken, nextToken = nextToken).apply {
+ this.nextChunk = nextChunk
+ this.prevChunk = prevChunk
}
- ?: ChunkEntity.create(realm, prevToken, nextToken)
-
- if (receivedChunk.events.isNullOrEmpty() && !receivedChunk.hasMore()) {
- handleReachEnd(realm, roomId, direction, currentChunk)
+ nextChunk?.prevChunk = currentChunk
+ prevChunk?.nextChunk = currentChunk
+ if (receivedChunk.events.isEmpty() && !receivedChunk.hasMore()) {
+ handleReachEnd(roomId, direction, currentChunk)
} else {
handlePagination(realm, roomId, direction, receivedChunk, currentChunk)
}
@@ -166,17 +101,10 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
}
}
- private fun handleReachEnd(realm: Realm, roomId: String, direction: PaginationDirection, currentChunk: ChunkEntity) {
+ private fun handleReachEnd(roomId: String, direction: PaginationDirection, currentChunk: ChunkEntity) {
Timber.v("Reach end of $roomId")
if (direction == PaginationDirection.FORWARDS) {
- val currentLastForwardChunk = ChunkEntity.findLastForwardChunkOfRoom(realm, roomId)
- if (currentChunk != currentLastForwardChunk) {
- currentChunk.isLastForward = true
- currentLastForwardChunk?.deleteOnCascade(deleteStateEvents = false, canDeleteRoot = false)
- RoomSummaryEntity.where(realm, roomId).findFirst()?.apply {
- latestPreviewableEvent = RoomSummaryEventsHelper.getLatestPreviewableEvent(realm, roomId)
- }
- }
+ Timber.v("We should keep the lastForward chunk unique, the one from sync")
} else {
currentChunk.isLastBackward = true
}
@@ -204,45 +132,52 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri
roomMemberContentsByUser[stateEvent.stateKey] = stateEvent.content.toModel()
}
}
- val eventIds = ArrayList(eventList.size)
- eventList.forEach { event ->
- if (event.eventId == null || event.senderId == null) {
- return@forEach
- }
- val ageLocalTs = event.unsignedData?.age?.let { now - it }
- eventIds.add(event.eventId)
- val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
- if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null) {
- val contentToUse = if (direction == PaginationDirection.BACKWARDS) {
- event.prevContent
- } else {
- event.content
+ run processTimelineEvents@{
+ eventList.forEach { event ->
+ if (event.eventId == null || event.senderId == null) {
+ return@forEach
}
- roomMemberContentsByUser[event.stateKey] = contentToUse.toModel()
- }
-
- currentChunk.addTimelineEvent(roomId, eventEntity, direction, roomMemberContentsByUser)
- }
- // Find all the chunks which contain at least one event from the list of eventIds
- val chunks = ChunkEntity.findAllIncludingEvents(realm, eventIds)
- Timber.d("Found ${chunks.size} chunks containing at least one of the eventIds")
- val chunksToDelete = ArrayList()
- chunks.forEach {
- if (it != currentChunk) {
- Timber.d("Merge $it")
- currentChunk.merge(roomId, it, direction)
- chunksToDelete.add(it)
+ // We check for the timeline event with this id
+ val eventId = event.eventId
+ val existingTimelineEvent = TimelineEventEntity.where(realm, roomId, eventId).findFirst()
+ // If it exists, we want to stop here, just link the prevChunk
+ val existingChunk = existingTimelineEvent?.chunk?.firstOrNull()
+ if (existingChunk != null) {
+ when (direction) {
+ PaginationDirection.BACKWARDS -> {
+ if (currentChunk.nextChunk == existingChunk) {
+ Timber.w("Avoid double link, shouldn't happen in an ideal world")
+ } else {
+ currentChunk.prevChunk = existingChunk
+ existingChunk.nextChunk = currentChunk
+ }
+ }
+ PaginationDirection.FORWARDS -> {
+ if (currentChunk.prevChunk == existingChunk) {
+ Timber.w("Avoid double link, shouldn't happen in an ideal world")
+ } else {
+ currentChunk.nextChunk = existingChunk
+ existingChunk.prevChunk = currentChunk
+ }
+ }
+ }
+ // Stop processing here
+ return@processTimelineEvents
+ }
+ val ageLocalTs = event.unsignedData?.age?.let { now - it }
+ val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
+ if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null) {
+ val contentToUse = if (direction == PaginationDirection.BACKWARDS) {
+ event.prevContent
+ } else {
+ event.content
+ }
+ roomMemberContentsByUser[event.stateKey] = contentToUse.toModel()
+ }
+ liveEventManager.get().dispatchPaginatedEventReceived(event, roomId)
+ currentChunk.addTimelineEvent(roomId, eventEntity, direction, roomMemberContentsByUser)
}
}
- chunksToDelete.forEach {
- it.deleteOnCascade(deleteStateEvents = false, canDeleteRoot = false)
- }
- val roomSummaryEntity = RoomSummaryEntity.getOrCreate(realm, roomId)
- val shouldUpdateSummary = roomSummaryEntity.latestPreviewableEvent == null ||
- (chunksToDelete.isNotEmpty() && currentChunk.isLastForward && direction == PaginationDirection.FORWARDS)
- if (shouldUpdateSummary) {
- roomSummaryEntity.latestPreviewableEvent = RoomSummaryEventsHelper.getLatestPreviewableEvent(realm, roomId)
- }
if (currentChunk.isValid) {
RoomEntity.where(realm, roomId).findFirst()?.addIfNecessary(currentChunk)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/UIEchoManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/UIEchoManager.kt
index 4804fbd7314..16d36c0cd92 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/UIEchoManager.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/UIEchoManager.kt
@@ -24,14 +24,10 @@ import org.matrix.android.sdk.api.session.room.model.ReactionAggregatedSummary
import org.matrix.android.sdk.api.session.room.model.relation.ReactionContent
import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
-import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
import timber.log.Timber
import java.util.Collections
-internal class UIEchoManager(
- private val settings: TimelineSettings,
- private val listener: Listener
-) {
+internal class UIEchoManager(private val listener: Listener) {
interface Listener {
fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean
@@ -70,13 +66,12 @@ internal class UIEchoManager(
return existingState != sendState
}
- fun onLocalEchoCreated(timelineEvent: TimelineEvent) {
- // Manage some ui echos (do it before filter because actual event could be filtered out)
+ fun onLocalEchoCreated(timelineEvent: TimelineEvent): Boolean {
when (timelineEvent.root.getClearType()) {
EventType.REDACTION -> {
}
EventType.REACTION -> {
- val content = timelineEvent.root.content?.toModel()
+ val content: ReactionContent? = timelineEvent.root.content?.toModel()
if (RelationType.ANNOTATION == content?.relatesTo?.type) {
val reaction = content.relatesTo.key
val relatedEventID = content.relatesTo.eventId
@@ -96,11 +91,12 @@ internal class UIEchoManager(
}
Timber.v("On local echo created: ${timelineEvent.eventId}")
inMemorySendingEvents.add(0, timelineEvent)
+ return true
}
- fun decorateEventWithReactionUiEcho(timelineEvent: TimelineEvent): TimelineEvent? {
+ fun decorateEventWithReactionUiEcho(timelineEvent: TimelineEvent): TimelineEvent {
val relatedEventID = timelineEvent.eventId
- val contents = inMemoryReactions[relatedEventID] ?: return null
+ val contents = inMemoryReactions[relatedEventID] ?: return timelineEvent
var existingAnnotationSummary = timelineEvent.annotations ?: EventAnnotationsSummary(
relatedEventID
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 1a7e15e14c4..24722445be4 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
@@ -16,6 +16,7 @@
package org.matrix.android.sdk.internal.session.sync.handler.room
+import dagger.Lazy
import io.realm.Realm
import io.realm.kotlin.createObject
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
@@ -52,6 +53,7 @@ import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.MoshiProvider
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.extensions.clearWith
+import org.matrix.android.sdk.internal.session.StreamEventsManager
import org.matrix.android.sdk.internal.session.events.getFixedRoomMemberContent
import org.matrix.android.sdk.internal.session.initsync.ProgressReporter
import org.matrix.android.sdk.internal.session.initsync.mapWithProgress
@@ -79,7 +81,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
private val threadsAwarenessHandler: ThreadsAwarenessHandler,
private val roomChangeMembershipStateDataSource: RoomChangeMembershipStateDataSource,
@UserId private val userId: String,
- private val timelineInput: TimelineInput) {
+ private val timelineInput: TimelineInput,
+ private val liveEventService: Lazy) {
sealed class HandlingStrategy {
data class JOINED(val data: Map) : HandlingStrategy()
@@ -218,6 +221,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
}
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
+ Timber.v("## received state event ${event.type} and key ${event.stateKey}")
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
// Timber.v("## Space state event: $eventEntity")
eventId = event.eventId
@@ -345,15 +349,17 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
syncLocalTimestampMillis: Long,
aggregator: SyncResponsePostTreatmentAggregator): ChunkEntity {
val lastChunk = ChunkEntity.findLastForwardChunkOfRoom(realm, roomEntity.roomId)
+ if (isLimited && lastChunk != null) {
+ lastChunk.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true)
+ }
val chunkEntity = if (!isLimited && lastChunk != null) {
lastChunk
} else {
- realm.createObject().apply { this.prevToken = prevToken }
+ realm.createObject().apply {
+ this.prevToken = prevToken
+ this.isLastForward = true
+ }
}
- // Only one chunk has isLastForward set to true
- lastChunk?.isLastForward = false
- chunkEntity.isLastForward = true
-
val eventIds = ArrayList(eventList.size)
val roomMemberContentsByUser = HashMap()
@@ -362,6 +368,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
continue
}
eventIds.add(event.eventId)
+ liveEventService.get().dispatchLiveEventReceived(event, roomId, insertType == EventInsertType.INITIAL_SYNC)
val isInitialSync = insertType == EventInsertType.INITIAL_SYNC
@@ -387,6 +394,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
roomMemberEventHandler.handle(realm, roomEntity.roomId, event.stateKey, fixedContent, aggregator)
}
}
+
roomMemberContentsByUser.getOrPut(event.senderId) {
// If we don't have any new state on this user, get it from db
val rootStateEvent = CurrentStateEventEntity.getOrNull(realm, roomId, event.senderId, EventType.STATE_ROOM_MEMBER)?.root
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt
index 3faa0c9488a..b6ea7a68f76 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt
@@ -30,6 +30,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
+import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.failure.Failure
import org.matrix.android.sdk.api.failure.isTokenError
import org.matrix.android.sdk.api.logger.LoggerTag
@@ -71,6 +72,7 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask,
private var isStarted = false
private var isTokenValid = true
private var retryNoNetworkTask: TimerTask? = null
+ private var previousSyncResponseHasToDevice = false
private val activeCallListObserver = Observer> { activeCalls ->
if (activeCalls.isEmpty() && backgroundDetectionObserver.isInBackground) {
@@ -171,12 +173,15 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask,
if (state !is SyncState.Running) {
updateStateTo(SyncState.Running(afterPause = true))
}
- // No timeout after a pause
- val timeout = state.let { if (it is SyncState.Running && it.afterPause) 0 else DEFAULT_LONG_POOL_TIMEOUT }
+ val timeout = when {
+ previousSyncResponseHasToDevice -> 0L /* Force timeout to 0 */
+ state.let { it is SyncState.Running && it.afterPause } -> 0L /* No timeout after a pause */
+ else -> DEFAULT_LONG_POOL_TIMEOUT
+ }
Timber.tag(loggerTag.value).d("Execute sync request with timeout $timeout")
val params = SyncTask.Params(timeout, SyncPresence.Online)
val sync = syncScope.launch {
- doSync(params)
+ previousSyncResponseHasToDevice = doSync(params)
}
runBlocking {
sync.join()
@@ -203,10 +208,14 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask,
}
}
- private suspend fun doSync(params: SyncTask.Params) {
- try {
+ /**
+ * Will return true if the sync response contains some toDevice events.
+ */
+ private suspend fun doSync(params: SyncTask.Params): Boolean {
+ return try {
val syncResponse = syncTask.execute(params)
_syncFlow.emit(syncResponse)
+ syncResponse.toDevice?.events?.isNotEmpty().orFalse()
} catch (failure: Throwable) {
if (failure is Failure.NetworkConnection) {
canReachServer = false
@@ -229,6 +238,7 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask,
delay(RETRY_WAIT_TIME_MS)
}
}
+ false
} finally {
state.let {
if (it is SyncState.Running && it.afterPause) {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt
index 763cd55714b..2f1241f4d8f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt
@@ -20,6 +20,7 @@ import androidx.work.BackoffPolicy
import androidx.work.ExistingWorkPolicy
import androidx.work.WorkerParameters
import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.failure.isTokenError
import org.matrix.android.sdk.internal.SessionManager
import org.matrix.android.sdk.internal.di.WorkManagerProvider
@@ -34,8 +35,8 @@ import timber.log.Timber
import java.util.concurrent.TimeUnit
import javax.inject.Inject
-private const val DEFAULT_LONG_POOL_TIMEOUT = 6L
-private const val DEFAULT_DELAY_TIMEOUT = 30_000L
+private const val DEFAULT_LONG_POOL_TIMEOUT_SECONDS = 6L
+private const val DEFAULT_DELAY_MILLIS = 30_000L
/**
* Possible previous worker: None
@@ -47,9 +48,12 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
@JsonClass(generateAdapter = true)
internal data class Params(
override val sessionId: String,
- val timeout: Long = DEFAULT_LONG_POOL_TIMEOUT,
- val delay: Long = DEFAULT_DELAY_TIMEOUT,
+ // In seconds
+ val timeout: Long = DEFAULT_LONG_POOL_TIMEOUT_SECONDS,
+ // In milliseconds
+ val delay: Long = DEFAULT_DELAY_MILLIS,
val periodic: Boolean = false,
+ val forceImmediate: Boolean = false,
override val lastFailureMessage: String? = null
) : SessionWorkerParams
@@ -65,13 +69,26 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
Timber.i("Sync work starting")
return runCatching {
- doSync(params.timeout)
+ doSync(if (params.forceImmediate) 0 else params.timeout)
}.fold(
- {
+ { hasToDeviceEvents ->
Result.success().also {
if (params.periodic) {
- // we want to schedule another one after delay
- automaticallyBackgroundSync(workManagerProvider, params.sessionId, params.timeout, params.delay)
+ // we want to schedule another one after a delay, or immediately if hasToDeviceEvents
+ automaticallyBackgroundSync(
+ workManagerProvider = workManagerProvider,
+ sessionId = params.sessionId,
+ serverTimeoutInSeconds = params.timeout,
+ delayInSeconds = params.delay,
+ forceImmediate = hasToDeviceEvents
+ )
+ } else if (hasToDeviceEvents) {
+ // Previous response has toDevice events, request an immediate sync request
+ requireBackgroundSync(
+ workManagerProvider = workManagerProvider,
+ sessionId = params.sessionId,
+ serverTimeoutInSeconds = 0
+ )
}
}
},
@@ -92,16 +109,29 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
return params.copy(lastFailureMessage = params.lastFailureMessage ?: message)
}
- private suspend fun doSync(timeout: Long) {
+ /**
+ * Will return true if the sync response contains some toDevice events.
+ */
+ private suspend fun doSync(timeout: Long): Boolean {
val taskParams = SyncTask.Params(timeout * 1000, SyncPresence.Offline)
- syncTask.execute(taskParams)
+ val syncResponse = syncTask.execute(taskParams)
+ return syncResponse.toDevice?.events?.isNotEmpty().orFalse()
}
companion object {
private const val BG_SYNC_WORK_NAME = "BG_SYNCP"
- fun requireBackgroundSync(workManagerProvider: WorkManagerProvider, sessionId: String, serverTimeout: Long = 0) {
- val data = WorkerParamsFactory.toData(Params(sessionId, serverTimeout, 0L, false))
+ fun requireBackgroundSync(workManagerProvider: WorkManagerProvider,
+ sessionId: String,
+ serverTimeoutInSeconds: Long = 0) {
+ val data = WorkerParamsFactory.toData(
+ Params(
+ sessionId = sessionId,
+ timeout = serverTimeoutInSeconds,
+ delay = 0L,
+ periodic = false
+ )
+ )
val workRequest = workManagerProvider.matrixOneTimeWorkRequestBuilder()
.setConstraints(WorkManagerProvider.workConstraints)
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
@@ -111,13 +141,24 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
.enqueueUniqueWork(BG_SYNC_WORK_NAME, ExistingWorkPolicy.APPEND_OR_REPLACE, workRequest)
}
- fun automaticallyBackgroundSync(workManagerProvider: WorkManagerProvider, sessionId: String, serverTimeout: Long = 0, delayInSeconds: Long = 30) {
- val data = WorkerParamsFactory.toData(Params(sessionId, serverTimeout, delayInSeconds, true))
+ fun automaticallyBackgroundSync(workManagerProvider: WorkManagerProvider,
+ sessionId: String,
+ serverTimeoutInSeconds: Long = 0,
+ delayInSeconds: Long = 30,
+ forceImmediate: Boolean = false) {
+ val data = WorkerParamsFactory.toData(
+ Params(
+ sessionId = sessionId,
+ timeout = serverTimeoutInSeconds,
+ delay = delayInSeconds,
+ forceImmediate = forceImmediate
+ )
+ )
val workRequest = workManagerProvider.matrixOneTimeWorkRequestBuilder()
.setConstraints(WorkManagerProvider.workConstraints)
.setInputData(data)
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
- .setInitialDelay(delayInSeconds, TimeUnit.SECONDS)
+ .setInitialDelay(if (forceImmediate) 0 else delayInSeconds, TimeUnit.SECONDS)
.build()
// Avoid risking multiple chains of syncs by replacing the existing chain
workManagerProvider.workManager
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/terms/DefaultTermsService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/terms/DefaultTermsService.kt
index c52c6a404ed..313fb6319d5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/terms/DefaultTermsService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/terms/DefaultTermsService.kt
@@ -36,6 +36,7 @@ import org.matrix.android.sdk.internal.session.sync.model.accountdata.AcceptedTe
import org.matrix.android.sdk.internal.session.user.accountdata.UpdateUserAccountDataTask
import org.matrix.android.sdk.internal.session.user.accountdata.UserAccountDataDataSource
import org.matrix.android.sdk.internal.util.ensureTrailingSlash
+import timber.log.Timber
import javax.inject.Inject
internal class DefaultTermsService @Inject constructor(
@@ -63,19 +64,28 @@ internal class DefaultTermsService @Inject constructor(
*/
override suspend fun getHomeserverTerms(baseUrl: String): TermsResponse {
return try {
+ val request = baseUrl + NetworkConstants.URI_API_PREFIX_PATH_R0 + "register"
executeRequest(null) {
- termsAPI.register(baseUrl + NetworkConstants.URI_API_PREFIX_PATH_R0 + "register")
+ termsAPI.register(request)
}
// Return empty result if it succeed, but it should never happen
+ Timber.w("Request $request succeeded, it should never happen")
TermsResponse()
} catch (throwable: Throwable) {
- @Suppress("UNCHECKED_CAST")
- TermsResponse(
- policies = (throwable.toRegistrationFlowResponse()
- ?.params
- ?.get(LoginFlowTypes.TERMS) as? JsonDict)
- ?.get("policies") as? JsonDict
- )
+ val registrationFlowResponse = throwable.toRegistrationFlowResponse()
+ if (registrationFlowResponse != null) {
+ @Suppress("UNCHECKED_CAST")
+ TermsResponse(
+ policies = (registrationFlowResponse
+ .params
+ ?.get(LoginFlowTypes.TERMS) as? JsonDict)
+ ?.get("policies") as? JsonDict
+ )
+ } else {
+ // Other error
+ Timber.e(throwable, "Error while getting homeserver terms")
+ throw throwable
+ }
}
}
diff --git a/tools/check/forbidden_strings_in_code.txt b/tools/check/forbidden_strings_in_code.txt
index 6ca86be0950..293e0b2a583 100644
--- a/tools/check/forbidden_strings_in_code.txt
+++ b/tools/check/forbidden_strings_in_code.txt
@@ -160,7 +160,7 @@ Formatter\.formatShortFileSize===1
# android\.text\.TextUtils
### This is not a rule, but a warning: the number of "enum class" has changed. For Json classes, it is mandatory that they have `@JsonClass(generateAdapter = false)`. If the enum is not used as a Json class, change the value in file forbidden_strings_in_code.txt
-enum class===114
+enum class===119
### Do not import temporary legacy classes
import org.matrix.android.sdk.internal.legacy.riot===3
diff --git a/tools/release/sign_apk.sh b/tools/release/sign_apk.sh
index aae9e1a378a..de5a22dd34e 100755
--- a/tools/release/sign_apk.sh
+++ b/tools/release/sign_apk.sh
@@ -17,7 +17,7 @@ PARAM_KEYSTORE_PATH=$1
PARAM_APK=$2
# Other params
-BUILD_TOOLS_VERSION="31.0.0-rc5"
+BUILD_TOOLS_VERSION="31.0.0"
MIN_SDK_VERSION=21
echo "Signing APK with build-tools version ${BUILD_TOOLS_VERSION} for min SDK version ${MIN_SDK_VERSION}..."
diff --git a/tools/release/sign_apk_unsafe.sh b/tools/release/sign_apk_unsafe.sh
index 5d209a4a2b4..a7536616e98 100755
--- a/tools/release/sign_apk_unsafe.sh
+++ b/tools/release/sign_apk_unsafe.sh
@@ -23,7 +23,7 @@ PARAM_KS_PASS=$3
PARAM_KEY_PASS=$4
# Other params
-BUILD_TOOLS_VERSION="31.0.0-rc5"
+BUILD_TOOLS_VERSION="31.0.0"
MIN_SDK_VERSION=21
echo "Signing APK with build-tools version ${BUILD_TOOLS_VERSION} for min SDK version ${MIN_SDK_VERSION}..."
diff --git a/vector/build.gradle b/vector/build.gradle
index a578fdb52f3..2be5fa984dd 100644
--- a/vector/build.gradle
+++ b/vector/build.gradle
@@ -15,7 +15,7 @@ kapt {
// Note: 2 digits max for each value
ext.versionMajor = 1
ext.versionMinor = 3
-ext.versionPatch = 10
+ext.versionPatch = 13
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
@@ -140,7 +140,7 @@ android {
buildConfigField "String", "BUILD_NUMBER", "\"${buildNumber}\""
resValue "string", "build_number", "\"${buildNumber}\""
- buildConfigField "im.vector.app.features.VectorFeatures.LoginVersion", "LOGIN_VERSION", "im.vector.app.features.VectorFeatures.LoginVersion.V1"
+ buildConfigField "im.vector.app.features.VectorFeatures.OnboardingVariant", "ONBOARDING_VARIANT", "im.vector.app.features.VectorFeatures.OnboardingVariant.FTUE_AUTH"
buildConfigField "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy", "outboundSessionKeySharingStrategy", "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy.WhenTyping"
@@ -359,7 +359,7 @@ dependencies {
implementation 'com.facebook.stetho:stetho:1.6.0'
// Phone number https://github.com/google/libphonenumber
- implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.39'
+ implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.40'
// FlowBinding
implementation libs.github.flowBinding
@@ -389,6 +389,8 @@ dependencies {
implementation libs.google.material
implementation 'me.gujun.android:span:1.7'
implementation libs.markwon.core
+ implementation libs.markwon.extLatex
+ implementation libs.markwon.inlineParser
implementation libs.markwon.html
implementation 'com.googlecode.htmlcompressor:htmlcompressor:1.5.2'
implementation 'me.saket:better-link-movement-method:2.2.0'
@@ -452,7 +454,7 @@ dependencies {
// OSS License, gplay flavor only
gplayImplementation 'com.google.android.gms:play-services-oss-licenses:17.0.0'
- implementation "androidx.emoji2:emoji2:1.0.0"
+ implementation "androidx.emoji2:emoji2:1.0.1"
implementation('com.github.BillCarsonFr:JsonViewer:0.7')
// WebRTC
diff --git a/vector/lint.xml b/vector/lint.xml
index 9d9b208df7b..818349da240 100644
--- a/vector/lint.xml
+++ b/vector/lint.xml
@@ -72,6 +72,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/main/res/layout/fragment_ftue_splash.xml b/vector/src/main/res/layout/fragment_ftue_splash.xml
new file mode 100644
index 00000000000..f38bbc049ea
--- /dev/null
+++ b/vector/src/main/res/layout/fragment_ftue_splash.xml
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/main/res/layout/fragment_ftue_splash_carousel.xml b/vector/src/main/res/layout/fragment_ftue_splash_carousel.xml
new file mode 100644
index 00000000000..6791a091305
--- /dev/null
+++ b/vector/src/main/res/layout/fragment_ftue_splash_carousel.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/main/res/layout/fragment_join_rules_recycler.xml b/vector/src/main/res/layout/fragment_join_rules_recycler.xml
index c31b111e158..a6ff49c5b3c 100644
--- a/vector/src/main/res/layout/fragment_join_rules_recycler.xml
+++ b/vector/src/main/res/layout/fragment_join_rules_recycler.xml
@@ -35,14 +35,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
- android:text="@string/cancel" />
+ android:text="@string/action_cancel" />
+ android:text="@string/action_save" />
diff --git a/vector/src/main/res/layout/fragment_login_terms_2.xml b/vector/src/main/res/layout/fragment_login_terms_2.xml
index 25a461ff350..a64ec081849 100644
--- a/vector/src/main/res/layout/fragment_login_terms_2.xml
+++ b/vector/src/main/res/layout/fragment_login_terms_2.xml
@@ -62,7 +62,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="36dp"
- android:text="@string/accept"
+ android:text="@string/action_accept"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
diff --git a/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml b/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml
index 5af96c7d2b8..d85bd707ce0 100644
--- a/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml
+++ b/vector/src/main/res/layout/fragment_matrix_to_room_space_card.xml
@@ -219,7 +219,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="@dimen/layout_vertical_margin_big"
- app:bsv_button_text="@string/accept"
+ app:bsv_button_text="@string/action_accept"
app:bsv_loaded_image_src="@drawable/ic_tick"
app:bsv_use_flat_button="false"
app:layout_constraintEnd_toEndOf="parent"
@@ -260,7 +260,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="@dimen/layout_vertical_margin_big"
- app:bsv_button_text="@string/dismiss"
+ app:bsv_button_text="@string/action_dismiss"
app:bsv_loaded_image_src="@drawable/ic_tick"
app:bsv_use_flat_button="true"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/vector/src/main/res/layout/fragment_qr_code_scanner.xml b/vector/src/main/res/layout/fragment_qr_code_scanner.xml
index 78003e70324..59e732d0b83 100644
--- a/vector/src/main/res/layout/fragment_qr_code_scanner.xml
+++ b/vector/src/main/res/layout/fragment_qr_code_scanner.xml
@@ -1,9 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@id/appBarLayout" />
diff --git a/vector/src/main/res/layout/fragment_qr_code_scanner_with_button.xml b/vector/src/main/res/layout/fragment_qr_code_scanner_with_button.xml
index 1a144044113..68e8187f5da 100644
--- a/vector/src/main/res/layout/fragment_qr_code_scanner_with_button.xml
+++ b/vector/src/main/res/layout/fragment_qr_code_scanner_with_button.xml
@@ -1,9 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@id/appBarLayout" />
+ android:text="@string/action_decline" />
+ android:text="@string/action_accept" />
diff --git a/vector/src/main/res/layout/fragment_room_preview_no_preview.xml b/vector/src/main/res/layout/fragment_room_preview_no_preview.xml
index 264dd83c164..a3210907b83 100644
--- a/vector/src/main/res/layout/fragment_room_preview_no_preview.xml
+++ b/vector/src/main/res/layout/fragment_room_preview_no_preview.xml
@@ -139,7 +139,7 @@
android:layout_marginTop="@dimen/layout_vertical_margin"
android:layout_marginBottom="@dimen/layout_vertical_margin"
android:minWidth="120dp"
- app:bsv_button_text="@string/join"
+ app:bsv_button_text="@string/action_join"
app:bsv_loaded_image_src="@drawable/ic_tick"
app:bsv_use_flat_button="false" />
diff --git a/vector/src/main/res/layout/fragment_space_leave_advanced.xml b/vector/src/main/res/layout/fragment_space_leave_advanced.xml
index 137ba8262d4..2c50ebe001b 100644
--- a/vector/src/main/res/layout/fragment_space_leave_advanced.xml
+++ b/vector/src/main/res/layout/fragment_space_leave_advanced.xml
@@ -81,7 +81,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
- android:text="@string/cancel" />
+ android:text="@string/action_cancel" />
+ android:text="@string/action_decline" />
+ android:text="@string/action_accept" />
diff --git a/vector/src/main/res/layout/fragment_ssss_reset_all.xml b/vector/src/main/res/layout/fragment_ssss_reset_all.xml
index f9baea52c00..3fba9b11bb8 100644
--- a/vector/src/main/res/layout/fragment_ssss_reset_all.xml
+++ b/vector/src/main/res/layout/fragment_ssss_reset_all.xml
@@ -91,7 +91,7 @@
style="@style/Widget.Vector.Button.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/cancel"
+ android:text="@string/action_cancel"
tools:ignore="MissingConstraints" />
diff --git a/vector/src/main/res/layout/item_public_room.xml b/vector/src/main/res/layout/item_public_room.xml
index ac9e26b1320..84ba2efe78a 100644
--- a/vector/src/main/res/layout/item_public_room.xml
+++ b/vector/src/main/res/layout/item_public_room.xml
@@ -101,7 +101,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginEnd="8dp"
- app:bsv_button_text="@string/join"
+ app:bsv_button_text="@string/action_join"
app:bsv_loaded_image_src="@drawable/ic_tick"
app:bsv_use_flat_button="true"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/vector/src/main/res/layout/item_pushgateway.xml b/vector/src/main/res/layout/item_pushgateway.xml
index efdf44f041c..c43f9eea7c7 100644
--- a/vector/src/main/res/layout/item_pushgateway.xml
+++ b/vector/src/main/res/layout/item_pushgateway.xml
@@ -130,6 +130,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:text="@string/remove" />
+ android:text="@string/action_remove" />
diff --git a/vector/src/main/res/layout/item_room_directory_server.xml b/vector/src/main/res/layout/item_room_directory_server.xml
index fc13a4a4dfe..8bb3a1a4cd0 100644
--- a/vector/src/main/res/layout/item_room_directory_server.xml
+++ b/vector/src/main/res/layout/item_room_directory_server.xml
@@ -54,7 +54,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/layout_horizontal_margin"
android:layout_marginEnd="@dimen/layout_horizontal_margin"
- android:contentDescription="@string/remove"
+ android:contentDescription="@string/action_remove"
android:padding="8dp"
android:src="@drawable/ic_delete"
android:visibility="gone"
diff --git a/vector/src/main/res/layout/item_room_invitation.xml b/vector/src/main/res/layout/item_room_invitation.xml
index 7ef0096d19d..07f4e4c349e 100644
--- a/vector/src/main/res/layout/item_room_invitation.xml
+++ b/vector/src/main/res/layout/item_room_invitation.xml
@@ -82,7 +82,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:minWidth="122dp"
- app:bsv_button_text="@string/accept"
+ app:bsv_button_text="@string/action_accept"
app:bsv_loaded_image_src="@drawable/ic_tick"
app:bsv_use_flat_button="false"
app:layout_constraintEnd_toEndOf="@id/roomInvitationNameView"
@@ -94,7 +94,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/layout_vertical_margin"
android:minWidth="122dp"
- app:bsv_button_text="@string/reject"
+ app:bsv_button_text="@string/action_reject"
app:bsv_loaded_image_src="@drawable/ic_tick"
app:bsv_use_flat_button="true"
app:layout_constraintEnd_toStartOf="@id/roomInvitationAccept"
diff --git a/vector/src/main/res/layout/item_settings_continue_cancel.xml b/vector/src/main/res/layout/item_settings_continue_cancel.xml
index 130296e5529..b765b9c887a 100644
--- a/vector/src/main/res/layout/item_settings_continue_cancel.xml
+++ b/vector/src/main/res/layout/item_settings_continue_cancel.xml
@@ -14,7 +14,7 @@
style="@style/Widget.Vector.Button.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/cancel"
+ android:text="@string/action_cancel"
android:textColor="?colorError"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
diff --git a/vector/src/main/res/layout/item_settings_three_pid.xml b/vector/src/main/res/layout/item_settings_three_pid.xml
index 84c8d171ba0..b2904d5e592 100644
--- a/vector/src/main/res/layout/item_settings_three_pid.xml
+++ b/vector/src/main/res/layout/item_settings_three_pid.xml
@@ -42,7 +42,7 @@
android:id="@+id/item_settings_three_pid_delete"
android:layout_width="@dimen/layout_touch_size"
android:layout_height="@dimen/layout_touch_size"
- android:contentDescription="@string/delete"
+ android:contentDescription="@string/action_delete"
android:scaleType="center"
android:src="@drawable/ic_trash_24"
app:layout_constraintBottom_toBottomOf="parent"
diff --git a/vector/src/main/res/layout/item_splash_carousel.xml b/vector/src/main/res/layout/item_splash_carousel.xml
new file mode 100644
index 00000000000..bb1b9fa0d29
--- /dev/null
+++ b/vector/src/main/res/layout/item_splash_carousel.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/main/res/layout/item_suggested_room.xml b/vector/src/main/res/layout/item_suggested_room.xml
index feace834c5a..23607c5c183 100644
--- a/vector/src/main/res/layout/item_suggested_room.xml
+++ b/vector/src/main/res/layout/item_suggested_room.xml
@@ -79,7 +79,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:maxWidth="@dimen/button_max_width"
- android:text="@string/join"
+ android:text="@string/action_join"
app:layout_constraintBottom_toTopOf="@id/inlineErrorText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
diff --git a/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml b/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml
index 8d8120dec08..a7d7a02fca9 100644
--- a/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml
+++ b/vector/src/main/res/layout/item_timeline_event_call_tile_stub.xml
@@ -61,7 +61,7 @@
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/itemCallRejectView"
app:layout_constraintTop_toTopOf="@id/itemCallRejectView"
- tools:text="@string/join" />
+ tools:text="@string/action_join" />
+ tools:text="@string/action_ignore" />
diff --git a/vector/src/main/res/layout/item_timeline_event_media_message_stub.xml b/vector/src/main/res/layout/item_timeline_event_media_message_stub.xml
index 9e2a5ef3ede..60fe8dafcd1 100644
--- a/vector/src/main/res/layout/item_timeline_event_media_message_stub.xml
+++ b/vector/src/main/res/layout/item_timeline_event_media_message_stub.xml
@@ -23,7 +23,7 @@
android:id="@+id/messageMediaPlayView"
android:layout_width="40dp"
android:layout_height="40dp"
- android:contentDescription="@string/play_video"
+ android:contentDescription="@string/action_play"
android:src="@drawable/ic_material_play_circle"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/messageThumbnailView"
diff --git a/vector/src/main/res/layout/item_timeline_event_verification_stub.xml b/vector/src/main/res/layout/item_timeline_event_verification_stub.xml
index 371828d9148..d6658d10797 100644
--- a/vector/src/main/res/layout/item_timeline_event_verification_stub.xml
+++ b/vector/src/main/res/layout/item_timeline_event_verification_stub.xml
@@ -47,14 +47,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
- android:text="@string/decline" />
+ android:text="@string/action_decline" />
+ android:text="@string/action_accept" />
diff --git a/vector/src/main/res/layout/item_uploads_file.xml b/vector/src/main/res/layout/item_uploads_file.xml
index f2a67e96803..544b5fef272 100644
--- a/vector/src/main/res/layout/item_uploads_file.xml
+++ b/vector/src/main/res/layout/item_uploads_file.xml
@@ -56,7 +56,7 @@
android:id="@+id/uploadsFileActionDownload"
android:layout_width="@dimen/layout_touch_size"
android:layout_height="@dimen/layout_touch_size"
- android:contentDescription="@string/download"
+ android:contentDescription="@string/action_download"
android:scaleType="center"
android:src="@drawable/ic_download"
app:layout_constraintBottom_toBottomOf="parent"
@@ -70,7 +70,7 @@
android:layout_width="@dimen/layout_touch_size"
android:layout_height="@dimen/layout_touch_size"
android:layout_marginEnd="@dimen/layout_horizontal_margin"
- android:contentDescription="@string/share"
+ android:contentDescription="@string/action_share"
android:scaleType="center"
android:src="@drawable/ic_material_share"
app:layout_constraintBottom_toBottomOf="parent"
diff --git a/vector/src/main/res/layout/item_uploads_video.xml b/vector/src/main/res/layout/item_uploads_video.xml
index 20349c4bc97..176b1079278 100644
--- a/vector/src/main/res/layout/item_uploads_video.xml
+++ b/vector/src/main/res/layout/item_uploads_video.xml
@@ -24,7 +24,7 @@
-
-
-
+
+
+
+
+ android:layout_marginStart="4dp"
+ android:scrollbars="none"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toEndOf="@id/attachmentCloseButton"
+ app:layout_constraintTop_toTopOf="parent">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/vector/src/main/res/layout/view_button_state.xml b/vector/src/main/res/layout/view_button_state.xml
index 5cc63ca59f9..9da22877c46 100644
--- a/vector/src/main/res/layout/view_button_state.xml
+++ b/vector/src/main/res/layout/view_button_state.xml
@@ -12,7 +12,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:layout_gravity="center_horizontal"
- tools:text="@string/join" />
+ tools:text="@string/action_join" />
+ tools:text="@string/action_join" />
+ android:textColor="?colorOnPrimary"
+ tools:text="@string/call_only_active" />
diff --git a/vector/src/main/res/layout/view_poll_result_line.xml b/vector/src/main/res/layout/view_poll_result_line.xml
deleted file mode 100644
index bf115a3c439..00000000000
--- a/vector/src/main/res/layout/view_poll_result_line.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/vector/src/main/res/layout/view_stub_room_member_profile_header.xml b/vector/src/main/res/layout/view_stub_room_member_profile_header.xml
index 6df10101964..40f4bd85152 100644
--- a/vector/src/main/res/layout/view_stub_room_member_profile_header.xml
+++ b/vector/src/main/res/layout/view_stub_room_member_profile_header.xml
@@ -12,8 +12,8 @@
android:id="@+id/memberProfileInfoContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingStart="16dp"
- android:paddingEnd="16dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp"
app:layout_constraintBottom_toTopOf="@id/memberProfileNameView"
app:layout_constraintTop_toTopOf="@id/memberProfileNameView">
@@ -23,7 +23,7 @@
android:layout_height="128dp"
android:layout_marginBottom="16dp"
android:contentDescription="@string/avatar"
- app:layout_constraintBottom_toTopOf="@id/memberProfileNameView"
+ app:layout_constraintBottom_toTopOf="@id/memberProfileLinearLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
@@ -45,30 +45,36 @@
tools:src="@drawable/ic_presence_offline"
tools:visibility="visible" />
-
-
-
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/memberProfileAvatarView">
+
+
+
+
+
+
+ android:title="@string/action_send" />
\ No newline at end of file
diff --git a/vector/src/main/res/menu/menu_manage_space.xml b/vector/src/main/res/menu/menu_manage_space.xml
index ac657e0df25..86defa78695 100644
--- a/vector/src/main/res/menu/menu_manage_space.xml
+++ b/vector/src/main/res/menu/menu_manage_space.xml
@@ -5,7 +5,7 @@
\ No newline at end of file
diff --git a/vector/src/main/res/menu/menu_timeline.xml b/vector/src/main/res/menu/menu_timeline.xml
index 54967f1706c..d7c3115ce0f 100644
--- a/vector/src/main/res/menu/menu_timeline.xml
+++ b/vector/src/main/res/menu/menu_timeline.xml
@@ -16,7 +16,7 @@
diff --git a/vector/src/main/res/menu/menu_widget.xml b/vector/src/main/res/menu/menu_widget.xml
index cdf2ae8e333..d2dd6614c16 100644
--- a/vector/src/main/res/menu/menu_widget.xml
+++ b/vector/src/main/res/menu/menu_widget.xml
@@ -19,7 +19,7 @@
diff --git a/vector/src/main/res/menu/vector_media_viewer.xml b/vector/src/main/res/menu/vector_media_viewer.xml
index 1af6203ac96..bc187d3869f 100644
--- a/vector/src/main/res/menu/vector_media_viewer.xml
+++ b/vector/src/main/res/menu/vector_media_viewer.xml
@@ -4,7 +4,7 @@
\ No newline at end of file
diff --git a/vector/src/main/res/menu/vector_room_member_profile.xml b/vector/src/main/res/menu/vector_room_member_profile.xml
index 0667550a9bf..4bec253b1bc 100644
--- a/vector/src/main/res/menu/vector_room_member_profile.xml
+++ b/vector/src/main/res/menu/vector_room_member_profile.xml
@@ -4,7 +4,7 @@
\ No newline at end of file
diff --git a/vector/src/main/res/menu/vector_room_profile.xml b/vector/src/main/res/menu/vector_room_profile.xml
index ef1bbbc7d89..637481b37ee 100644
--- a/vector/src/main/res/menu/vector_room_profile.xml
+++ b/vector/src/main/res/menu/vector_room_profile.xml
@@ -4,7 +4,7 @@
\ No newline at end of file
diff --git a/vector/src/main/res/menu/vector_room_settings.xml b/vector/src/main/res/menu/vector_room_settings.xml
index c009f569896..e75eada0a24 100644
--- a/vector/src/main/res/menu/vector_room_settings.xml
+++ b/vector/src/main/res/menu/vector_room_settings.xml
@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
\ No newline at end of file
diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml
index 536f41194e6..5b2ec472b0a 100644
--- a/vector/src/main/res/values-ar/strings.xml
+++ b/vector/src/main/res/values-ar/strings.xml
@@ -32,7 +32,7 @@
حدَّثَ %1$s ملفه الشخصي %2$sأرسلَ %1$s دعوة إلى %2$s للإنضمام إلى الغُرفة** يتعذَّر فك التشفير: %s **
- لم يُرسل جِهاز المُرسل مفاتيحًا لهذه الرِّسالة.
+ لم يُرسل جِهاز المُرسل مفاتيحًا لهذه الرِّسالة.تعذَّر إرسال الرِّسالةفَشلَ رفع الصُّورةخطأ في الشَّبكة
@@ -225,19 +225,19 @@
الأرشيفأبلِغ عن علةحسنا
- ألغِ
- احفظ
- اترك
- أرسِل
- أعِد الإرسال
- اقتبس
- شارِك
- مرّر
+ ألغِ
+ احفظ
+ اترك
+ أرسِل
+ أعِد الإرسال
+ اقتبس
+ شارِك
+ مرّررابط دائماعرض المصدراعرض المصدر بلا تعمية
- احذف
- غيّر الاسم
+ احذف
+ غيّر الاسمأبلِغ عن المحتوىمكالمة نشطةمكالمة اجتماع جارية.
@@ -258,7 +258,7 @@
افتحأغلِقنُسخ إلى الحافظة
- عطّل
+ عطّلأكّدتحذيرالرئيسيّة
@@ -373,9 +373,9 @@
نعملاتابع
- أزِل
- انضم
- ارفض
+ أزِل
+ انضم
+ ارفضانتقل إلى أول رسالة غير مقروءة.لقد دعاك %s للانضمام إلى هذه الغرفةهذه معاينة عن الغرفة. عُطّل التفاعل مع الغرفة.
@@ -428,14 +428,6 @@
الغرفالرسائلالملفات
- الدليل
- المفضلة
- الغرف
- الدعوات
- أنشئ غرفة
- انضم إلى غرفة
- انضم إلى غرفة
- اكتب معرّف غرفة أو اختصارهايبحث في الدليل..اترك المحادثةانسَ
@@ -526,7 +518,6 @@
لست في هذه الغرفة.ليس لديك تصريح لفعل هذا في هذه الغرفة.استخدم الكمرة الأصيلة
-
تحذير!لم تُرسل الرسائل بسبب وجود أجهزة مجهولة. ماذا أفعل؟ %1$s. %2$s.ليس ’%s‘ تنسيقا صالحا لاختصار
@@ -586,11 +577,9 @@
الغرفة %s غير ظاهرة.لقد أضفت جهازا جديدا ’%s‘ يطلب مفاتيح التعمية.تجاهل الطلب
-
خطأ في الأمرلم يُفهم الأمر: %s
-
- أزل
+ أزلتحتاج تصريح الدعوة لبدء اجتماع في هذه الغرفةأوردّ سريع
@@ -699,14 +688,14 @@
رجاءً اسمح بالوصول في المنبثقة التالية لتستكشف مستخدميك في دفتر العناوين من Element.حُفظت
- عايِن
+ عايِنيُزامن…أُرسلت الدعوة إلى %s غير المرتبط بهذا الحساب.
لربما عليك الولوج بحساب آخر، أو إضافة هذا البريد إلى حسابك هذا.تحاول الوصول إلى %s. أتريد الانضمام للمشاركة في النقاش؟إحدى الغرفعضو واحد
- ادعُ
+ ادعُانضم إلى الغرفةلقد أكّدت عنوان بريدي الإلكترونيقائمة علامات القراءة
@@ -737,7 +726,6 @@
ابحثرشّح أعضاء الغرفةالناس
- أولوية منخفضةكل الرسائل (مزعج)كل الرسائلالإشارات فقط
@@ -774,13 +762,11 @@
%d ودجة نشطة%d ودجة نشطة
-
أضِف تطبيقات ماترِكسيطلب جهازك غير المؤكّد ”%s“ مفاتيح التعمية.ابدأ التأكيدشارِك دون تأكيدرسالة معمّاة
-
أنشئاسم المجتمعمعرّف المجتمع
@@ -853,7 +839,6 @@
معطّلمزعجما زالت مكالمات الاجتماعات قيد التطوير وقد لا يُعتمد عليها.
-
تحتوي هذه الغرفة أجهزة مجهولة لم يُتأكّد منها.
يعني هذا عدم وجود أي ضمانات بأن الأجهزة هي فعلا ملك لمن يستخدمها.
ننصحك بأن تبدأ عملية التأكيد لكل جهاز وذلك قبل أن تتابع. يمكنك طبعا إرسال الرسالة دون تأكيد إن أردت ذلك.
@@ -875,8 +860,6 @@
قد يعني هذا بأن أحدهم يعترض الاتصال بعدوانية، أو أن هاتفك لا يثق بالشهادة التي قدّمها الخادوم البعيد.إن قال مدير الخادوم بأن هذا متوقع، فتأكد من أن البصمة أدناه تطابق البصمة التي وفّرها.تغيّرت الشهادة من شهادة كنت تثق بها إلى شهادة لا تثق بها. لربما جدّد الخادوم شهادته. راسل إدارة الخادوم واسألهم عن البصمة المتوقعة.
- انضم
- ابدأ دردشةتصفح الدليللم يُعثر على غرف تطابق %2$s
@@ -918,13 +901,12 @@
يجب أن يكون مستوى السلطة عددا صحيحا موجبا.مثالمثال
-
الغرفةدعوةأرسل إلىأرسِل ملصقارُخص الأطراف الثالثة
- نزِّل
+ نزِّلأرسِل صوتًاأرسِل ملصقًاليس ثمة أية حزمة ملصقات مفعّلة حاليًا.
@@ -935,8 +917,8 @@
أُرسل طلب المفتاح.أُرسل الطلبرجاءً أطلِق Element في جهاز آخر يقدر على فك تعمية الرسالة ليُرسل المفاتيح إلى هذا الجهاز.
- انطِق
- امسح
+ انطِق
+ امسحمتّصلغير متّصلخامل
@@ -1097,7 +1079,7 @@
ظهور الرسائل في «ماترِكس» شبيه كثيرًا بالبريد الإلكتروني. نسياننا لرسائلك يعني أن الرسائل التي أرسلتها لن تُشارك مع أي مستخدم جديد أو غير مسجّل، إلا أن المستخدمين المسجّلين الذي يقدرون على الوصول إليها سيمتلكون نسخة عنها.طُلب مفتاح البصمة Ed25519الرسائل الآمنة
- تخطي
+ تخطيتمخطأالمكالمات
@@ -1114,14 +1096,14 @@
ليس لديك تصريح لبدء إجتماعليس لديك تصريح لبدء إجتماع في هذه الغرفةإبدأ بالمحادثة
- إعادة ضبط
- إصرف
- أوقف
- شغل
- إفصل
- أبّطل
+ إعادة ضبط
+ إصرف
+ أوقف
+ شغل
+ إفصل
+ أبّطللاشيء
- إبقى
+ إبقىستفقد الوصول إلى رسائلك المشفرة إلا إذا أخذت نسخة إحتياطية من مفاتيحك قبل تسجيلك للخروج.نسخة إحتياطيةهل أنت متأكد؟
@@ -1175,7 +1157,6 @@
مرحبًا بك في المساحات!تعد المساحات طريقة جديدة لتجميع الغرف والأشخاص.أنت مدعو
- مساحة تجريبية - غُرفة مقيدة.علم كمقترحةعلم كغير مقترحةإدارة الغُرف والمساحات
@@ -1187,7 +1168,6 @@
قد تكون بعض الغُرف مخفية لأنها خاصة وأنك بحاجة إلى دعوة.
\nليس لديك إذن لإضافة غُرف.قد تكون بعض الغُرف مخفية لأنها خاصة وأنك بحاجة إلى دعوة.
- يتطلب التحذير دعم الخادم وإصدار الغرفة التجريبية%s يدعوكتبحث عن شخص ما ليس في %s؟إدارة الغُرف
@@ -1313,11 +1293,11 @@
أمتأكد من الخروج؟رَفضقبُول
- رَفض
- مراجعة
- تجاهل
- إِجهَاض
- قبُول
+ رَفض
+ مراجعة
+ تجاهل
+ إِجهَاض
+ قبُولاتصل على أي حاللا يمكن مكالمة نفسكتَعَلَّم المَزِيد
diff --git a/vector/src/main/res/values-az/strings.xml b/vector/src/main/res/values-az/strings.xml
index 3821dcfb73d..d92a66f2c3e 100644
--- a/vector/src/main/res/values-az/strings.xml
+++ b/vector/src/main/res/values-az/strings.xml
@@ -50,7 +50,7 @@
%1$s %2$s üçün dəvəti qəbul etdi** Şifrəni aça bilmir: %s **
- Göndərənin cihazı bu mesaj üçün açarları bizə göndərməyib.
+ Göndərənin cihazı bu mesaj üçün açarları bizə göndərməyib.Redaktə etmək olmurMesaj göndərmək olmur
diff --git a/vector/src/main/res/values-b+sr+Latn/strings.xml b/vector/src/main/res/values-b+sr+Latn/strings.xml
index c5f3d3b4074..942c012bfc3 100644
--- a/vector/src/main/res/values-b+sr+Latn/strings.xml
+++ b/vector/src/main/res/values-b+sr+Latn/strings.xml
@@ -34,18 +34,18 @@
Učitavanje…U redu
- Otkaži
- Sačuvaj
- Napusti
- Ostani
- Pošalji
- Pošalji ponovo
- Ukloni
- Podeli
+ Otkaži
+ Sačuvaj
+ Napusti
+ Ostani
+ Pošalji
+ Pošalji ponovo
+ Ukloni
+ PodeliKasnije
- Prosledi
- Obriši
- Preimenuj
+ Prosledi
+ Obriši
+ PreimenujKonferencijski poziv u toku.
\nPriključi se kao %1$s ili %2$sGlas
@@ -60,14 +60,14 @@
Ipak zoviIpak pošaljiili
- Pošalji pozivnicu
- Prihvati
- Preskoči
+ Pošalji pozivnicu
+ Prihvati
+ PreskočiGotovo
- Obustavi
- Ignoriši
- Pregledaj
- Odbaci
+ Obustavi
+ Ignoriši
+ Pregledaj
+ OdbaciIzađiAkcije
@@ -81,7 +81,7 @@
Označi kao pročitanoOtvoriZatvori
- Onemogući
+ OnemogućiPotvrdaUpozorenje
@@ -128,7 +128,7 @@
Ponovi lozinkuPotvrdite vašu novu lozinkuPogrešno korisničko ime i/ili lozinka
- Obriši
+ ObrišiVidi izvorPrijavi sadržajNapredak (%s%%)
diff --git a/vector/src/main/res/values-bg/strings.xml b/vector/src/main/res/values-bg/strings.xml
index 13e254acf79..f6c80b48174 100644
--- a/vector/src/main/res/values-bg/strings.xml
+++ b/vector/src/main/res/values-bg/strings.xml
@@ -47,7 +47,7 @@
В момента не е възможно да се присъедините отново към празна стая.Имейл адресТелефонен номер
- Устройството на подателя не изпрати ключовете за това съобщение.
+ Устройството на подателя не изпрати ключовете за това съобщение.%1$s изпрати стикер.Покана от %sПокана за стая
@@ -212,7 +212,6 @@
Създадохте дискусията%1$s създаде дискусиятаШифровано съобщение
-
Светла темаТъмна темаЧерна тема
@@ -272,20 +271,20 @@
Информация за общносттаЗареждане…ОК
- Откажи
- Запази
- Напусни
- Изпрати
- Изпрати отново
- Премахни
- Цитирай
- Сподели
+ Откажи
+ Запази
+ Напусни
+ Изпрати
+ Изпрати отново
+ Премахни
+ Цитирай
+ СподелиПо-късно
- Препрати
+ ПрепратиPermalinkВиж източника
- Изтрий
- Преименувай
+ Изтрий
+ ПреименувайДокладвай съдържаниетоАктивен разговорСледене за събития
@@ -305,7 +304,7 @@
Групови разговори не се поддържат в шифровани стаиИзпрати въпреки товаили
- Покани
+ ПоканиОфлайнИзходДействия
@@ -318,7 +317,7 @@
Бърз отговорОтвориЗатвори
- Изключи
+ ИзключиПотвърждениеПредупреждениеНачало
@@ -517,17 +516,6 @@
СЪОБЩЕНИЯХОРАФАЙЛОВЕ
- ВЛЕЗ
- ДИРЕКТОРИЯ
- ЛЮБИМИ
- СТАИ
- НИСЪК ПРИОРИТЕТ
- ПОКАНИ
- Започни чат
- Създай стая
- Присъедини се към стая
- Присъединяване към стая
- Напишете ID или псевдоним на стаяПрегледай директорията%d стая
@@ -759,7 +747,6 @@
%d активно приспособление%d активни приспособления
-
Неуспешно създаване на приспособление.Неуспешно изпращане на заявката.Нивото на достъп трябва да бъде позитивно число.
@@ -793,10 +780,10 @@
ДАНЕПродължи
- Премахни
- Влез
- Прегледай
- Откажи
+ Премахни
+ Влез
+ Прегледай
+ ОткажиПовторно присъединяванеЗабрави стаятаПрофилна снимка
@@ -861,19 +848,15 @@
Най-голямОгроменИзползване на камерата на телефона
-
Добавихте ново устройство \'%s\', което изисква ключове за шифроване.Вашето непотвърдено устройство \'%s\' изисква ключове за шифроване.Започни потвърждениетоСподели без потвърждениеИгнорирай поканата
-
Предупреждение!Груповите разговори са в процес на разработка и не са надеждни.
-
Грешка в командатаНеразпозната команда: %s
-
ИзключеноШумноСъздай
@@ -882,7 +865,6 @@
ПримерID на общностпример
-
НачалоХораСтаи
@@ -937,9 +919,9 @@
За да продължите, моля въведете паролата си:Деактивирай акаунтаЛицензи от трети страни
- Изтегли
- Говори
- Изчисти
+ Изтегли
+ Говори
+ ИзчистиИзисквай повторно ключове за шифроване от другите ми устройства.Заявката за ключове беше изпратена.Изпратена заявка
@@ -1037,7 +1019,7 @@
+%d%d+Звънни въпреки това
- Приемам
+ ПриемамМоля прегледайте и приемете политиките на сървъра:ОбажданияИзползвай мелодията по подразбиране на ${app_name} за входящи повиквания
@@ -1133,7 +1115,7 @@
Резервно копие на ключоветеИзползвай резервно копие на ключоветеРезервното копиране на ключовете не е завършило. Моля почакайте…
- Пропусни
+ ПропусниГотовоРазширени настройки за известияВажност на известията според типа събитие
@@ -1230,8 +1212,8 @@
Сигурни ли сте?Резервно копиеАко не направите резервно копие на ключовете преди да излезете, ще загубите достъп до шифрованите съобщения.
- Остани
- Прекрати
+ Остани
+ ПрекратиСигурни ли сте, че искате да се отпишете\?Режим икономия на данни игнорира уведомленията за пишещи хора, както и информация за онлайн статуса на потребители.Възстановяване на шифровани съобщения
@@ -1277,7 +1259,7 @@
Изчисляване на ключ за възстановяване…Изтегляне на ключове…Импортиране на ключове…
- Отхвърли
+ ОтхвърлиURL адресът не е достъпен, моля проверетеУстройството Ви използва остарял TLS протокол за сигурност, който е уязвим към атаки. За ваша безопасност няма да може да се свържетеИзпращай съобщения с Enter
@@ -1387,8 +1369,8 @@
СтаиВашите стаи се показват тукРеакции
- Съгласен съм
- Харесвам
+ Съгласен съм
+ ХаресвамДобави реакцияВиж реакциитеРеакции
@@ -1470,8 +1452,8 @@
Филтрирай по потребител или ID…Присъединяване в стая…Виж историята на редакциите
- Прегледай
- Откажи
+ Прегледай
+ ОткажиЗа да продължите трябва да приемете условията за използване на услугата.Условия за ползванеПрегледай условията
@@ -1479,8 +1461,8 @@
Използвайте ботове, връзки с други мрежи, приспособления и стикериПрочетете наНищо
- Оттегли
- Прекъсни
+ Оттегли
+ ПрекъсниНе е настроен сървър за самоличност.Обаждането се провали поради грешно настроен сървърПопитайте администратора на сървъра (%1$s) да конфигурира TURN сървър за да може разговорите да работят надеждно.
@@ -1782,8 +1764,8 @@
Съобщението беше изтритоПоказвай премахнатите съобщенияПоказвай индикатор на мястото на премахнатите съобщения
- Възпроизведи
- Пауза
+ Възпроизведи
+ ПаузаПричина за изгонванеИзгонване на потребителСигурни ли сте, че искате да откажете изпратената към този потребител покана\?
@@ -1836,8 +1818,8 @@
Нямате привилегии да започнете разговор в тази стаяНямате привилегии да започнете конферентен разговорНямате привилегии да стартирате конферентен разговор в тази стая
- Нулирай
- Затвори
+ Нулирай
+ ЗатвориКръстосано-подписванеНовата ви сесия вече е потвърдена и има достъп до шифрованите съобщения. Другите потребители ще я виждат като доверена.Съобщенията с този потребител са шифровани от-край-до-край и не могат да бъдат разчетени от трети страни.
@@ -1921,7 +1903,6 @@
Изчакване…Резултат от проверкаРеагира с: %s
- Бот бутониАнкетаСтикерФайл
@@ -2065,15 +2046,6 @@
Ако не можете да достъпите съществуваща сесияИзползвай парола или ключ за възстановяванеСъздава проста анкета
- Избрана опция
-
- %d глас - Финални резултати
- %d гласа - Финални резултати
-
-
- %d глас
- %d гласа
- Изтриване на профилните данни от тип %1$s\?
\n
\nВнимавайте с това - може да доведе до неочаквано поведение.
@@ -2174,7 +2146,7 @@
Поддържа се само в шифровани стаиПринудително премахва текущата изходяща групова сесия от шифрованата стаяИзползвайте последната версия на ${app_name} за устройствата си:
- или друг Matrix клиент поддържаш кръстосано-подписване
+ или друг Matrix клиент поддържаш кръстосано-подписване${app_name} iOS
\n${app_name} Android${app_name} Web
diff --git a/vector/src/main/res/values-bn-rBD/strings.xml b/vector/src/main/res/values-bn-rBD/strings.xml
index db2ee10bbcf..f834222d257 100644
--- a/vector/src/main/res/values-bn-rBD/strings.xml
+++ b/vector/src/main/res/values-bn-rBD/strings.xml
@@ -395,17 +395,6 @@
%d ঘরগুলিব্রাউস নির্দেশনা
- আদর্শ ঘরের পরিচয় অথবা একটা ঘর আর উপনাম
- যোগকরুন একটা ঘর
- যোগদান করুন ঘরে
- ঘর তৈরিকরা
- চ্যাট শুরু করুন
- আমন্ত্রণ
- কম গুরুত্ব
- ঘরগুলি
- প্রিয়
- নির্দেশক
- যোগদাননথিলোকজনবার্তাগুলি
@@ -686,7 +675,7 @@
ত্রুটিসতর্কতাপ্রতিপাদন
- অক্ষম
+ অক্ষমক্লিপবোর্ডে অনুলিপি করা হয়েছেঅনুলিপিবন্ধ
@@ -705,10 +694,10 @@
বন্ধ করুনপতনগ্রহণ
- পতন
- পর্যালোচনা
- উপেক্ষা
- বাতিল
+ পতন
+ পর্যালোচনা
+ উপেক্ষা
+ বাতিলসম্পন্ন\'%s\' একটি উপনাম জন্য বৈধ বিন্যাস নয়অবৈধ উদীয়মান বিন্যাস
@@ -911,10 +900,10 @@
রায়ট এমনভাবে পটভূমিতে সিঙ্ক হবে যা ডিভাইসের সীমিত সংস্থান (ব্যাটারি) সংরক্ষণ করে।
\nআপনার ডিভাইস রিসোর্স স্থিতির উপর নির্ভর করে সিঙ্কটি অপারেটিং সিস্টেম দ্বারা পিছিয়ে যেতে পারে।ব্যাটারির জন্য অনুকূলিত
- বাদ
- স্বীকার
+ বাদ
+ স্বীকারঅফলাইন
- আমন্ত্রণ
+ আমন্ত্রণবাযেকোন ভাবেই পাঠাওযেকোন ভাবেই কল করুন
@@ -929,33 +918,33 @@
ধ্বনিচলমান সম্মেলন কল।
\n %1$s বা %2$s হিসাবলে জুড়ুন
- বাতিল
- থামাও
- চালু
+ বাতিল
+ থামাও
+ চালুসক্রিয় কলকন্টেন্ট রিপোর্ট করুন
- বিযুক্ত
- রদ কর
+ বিযুক্ত
+ রদ করকোনটা না
- পুনঃনামকরণ
- মুছুন
+ পুনঃনামকরণ
+ মুছুনডিক্রিপ্টেড সোর্স দেখুনসোর্স দেখুনপার্মালিঙ্ক
- ফরওয়ার্ড
+ ফরওয়ার্ডপরে
- পরিষ্কার
- বলা
- ভাগ
- ডাউনলোড
- উদ্ধৃতি
- অপসারণ
- আবার পাঠান
- পাঠান
- থাক
- ত্যাগ
- সংরক্ষিত
- বাতিল
+ পরিষ্কার
+ বলা
+ ভাগ
+ ডাউনলোড
+ উদ্ধৃতি
+ অপসারণ
+ আবার পাঠান
+ পাঠান
+ থাক
+ ত্যাগ
+ সংরক্ষিত
+ বাতিলঠিকলোড হচ্ছে…তৃতীয় পক্ষের লাইসেন্সগুলি
@@ -1077,7 +1066,7 @@
চিত্র আপলোড করতে ব্যর্থবার্তা পাঠাতে অক্ষমপুনরায় প্রতিক্রিয়া করতে পারেনি
- প্রেরকের ডিভাইস আমাদের এই বার্তার জন্য কীগুলি প্রেরণ করেনি।
+ প্রেরকের ডিভাইস আমাদের এই বার্তার জন্য কীগুলি প্রেরণ করেনি।** ডিক্রিপ্ট করতে অক্ষম: %s **%1$s %2$s থেকে %3$s পর্যন্ত%1$s %2$s এর পাওয়ার স্তর পরিবর্তন করেছে।
@@ -1290,10 +1279,10 @@
সিঙ্ক করা হচ্ছে…হেডার খোলোসদস্যদের তালিকা
- প্রত্যাখ্যান
- প্রিভিউ
- যোগদান
- অপসারণ
+ প্রত্যাখ্যান
+ প্রিভিউ
+ যোগদান
+ অপসারণপ্রলম্বিতনাহ্যাঁ
diff --git a/vector/src/main/res/values-bn-rIN/strings.xml b/vector/src/main/res/values-bn-rIN/strings.xml
index 0fd00b03fe3..1307061350e 100644
--- a/vector/src/main/res/values-bn-rIN/strings.xml
+++ b/vector/src/main/res/values-bn-rIN/strings.xml
@@ -99,7 +99,7 @@
%1$s %2$s এর পাওয়ার স্তর পরিবর্তন করেছে।%1$s %2$s থেকে %3$s পর্যন্ত** ডিক্রিপ্ট করতে অক্ষম: %s **
- প্রেরকের ডিভাইস আমাদের এই বার্তার জন্য কীগুলি প্রেরণ করেনি।
+ প্রেরকের ডিভাইস আমাদের এই বার্তার জন্য কীগুলি প্রেরণ করেনি।পুনরায় প্রতিক্রিয়া করতে পারেনিবার্তা পাঠাতে অক্ষমচিত্র আপলোড করতে ব্যর্থ
@@ -226,25 +226,25 @@
লোড হচ্ছে…ঠিক
- বাতিল
- সংরক্ষিত
- ত্যাগ
- থাক
- পাঠান
- আবার পাঠান
- অপসারণ
- উদ্ধৃতি
- ডাউনলোড
- ভাগ
- বলা
- পরিষ্কার
+ বাতিল
+ সংরক্ষিত
+ ত্যাগ
+ থাক
+ পাঠান
+ আবার পাঠান
+ অপসারণ
+ উদ্ধৃতি
+ ডাউনলোড
+ ভাগ
+ বলা
+ পরিষ্কারপরে
- ফরওয়ার্ড
+ ফরওয়ার্ডপার্মালিঙ্কসোর্স দেখুনডিক্রিপ্টেড সোর্স দেখুন
- মুছুন
- পুনঃনামকরণ
+ মুছুন
+ পুনঃনামকরণকন্টেন্ট রিপোর্ট করুনসক্রিয় কলচলমান সম্মেলন কল।
@@ -261,13 +261,13 @@
যেকোন ভাবেই কল করুনযেকোন ভাবেই পাঠাওবা
- আমন্ত্রণ
+ আমন্ত্রণঅফলাইন
- স্বীকার
- বাদ
+ স্বীকার
+ বাদসম্পন্ন
- বাতিল
- উপেক্ষা
+ বাতিল
+ উপেক্ষাপ্রস্থানক্রিয়াকলাপ
@@ -282,7 +282,7 @@
খুলুনবন্ধক্লিপবোর্ডে অনুলিপি করা হয়েছে
- অক্ষম
+ অক্ষমপ্রতিপাদনসতর্কতা
@@ -529,10 +529,10 @@
নাপ্রলম্বিত
- অপসারণ
- যোগদান
- প্রিভিউ
- প্রত্যাখ্যান
+ অপসারণ
+ যোগদান
+ প্রিভিউ
+ প্রত্যাখ্যানসদস্যদের তালিকাহেডার খোলো
@@ -684,18 +684,6 @@
লোকজননথি
- যোগদান
- নির্দেশক
- প্রিয়
- ঘরগুলি
- "কম গুরুত্ব "
- আমন্ত্রণ
- চ্যাট শুরু করুন
- ঘর তৈরিকরা
- যোগদান করুন ঘরে
- যোগকরুন একটা ঘর
- আদর্শ ঘরের পরিচয় অথবা একটা ঘর আর উপনাম
-
ব্রাউস নির্দেশনা"একটা ঘর "
@@ -1260,10 +1248,10 @@
কর্ম প্রদর্শন করেদেওয়া আইডি সঙ্গে ব্যবহারকারী কে নিষিদ্ধ করেকোনটা না
- রদ কর
- বিযুক্ত
- পর্যালোচনা
- পতন
+ রদ কর
+ বিযুক্ত
+ পর্যালোচনা
+ পতনকোনও পরিচয় সার্ভার কনফিগার করা নেই।
@@ -1427,9 +1415,9 @@
এই হোমসার্ভারটি তার মাসিক অ্যাক্টিভ ব্যবহারকারীর সীমাটিতে আঘাত করেছে তাই কিছু ব্যবহারকারী লগ ইন করতে পারবেন না ।এই হোমসার্ভারটি তার মাসিক সক্রিয় ব্যবহারকারীর সীমাতে ছুঁয়েছে।
- চালু
- থামাও
- বাতিল
+ চালু
+ থামাও
+ বাতিলঅনুলিপি
diff --git a/vector/src/main/res/values-bs/strings.xml b/vector/src/main/res/values-bs/strings.xml
index 8628a56a26d..01cf6ae13df 100644
--- a/vector/src/main/res/values-bs/strings.xml
+++ b/vector/src/main/res/values-bs/strings.xml
@@ -18,21 +18,21 @@
IstorijskiIzvještaj o GreškiOK
- Otkaži
- Snimi
- Napusti
- Pošalji
- Pošalji Ponovo
- Uredi
- Citat
- Podijeli
+ Otkaži
+ Snimi
+ Napusti
+ Pošalji
+ Pošalji Ponovo
+ Uredi
+ Citat
+ PodijeliPoslije
- Proslijedi
+ ProslijediPermalinkPogledaj IzvorPogledaj Dekriptovani Izvor
- Izbriši
- Preimenuj
+ Izbriši
+ PreimenujPrijavi sadržajAktivni poziv"Konferencijski poziv u toku.\nPridruži se putem %1$s ili %2$s."
@@ -46,7 +46,7 @@
Konferencijski pozivi nisu podržani u šifriranim sobamaIpak pošaljiili
- Pozovi
+ PozoviOfflineOdjavi seGlasovni Poziv
@@ -58,7 +58,7 @@
OtvoriZatvoriKopirano
- Isključi
+ IsključiPotvrdaUpozorenjeNaslovna
@@ -226,10 +226,10 @@ Dopustite pristup sljedećem skočnom prozoru da biste otkrili kontakte koji kor
DANENastavi
- Ukloni
- Spoji
- Pregled
- Odbij
+ Ukloni
+ Spoji
+ Pregled
+ OdbijIdi na prvu nepročitanu poruku.Pozvani ste da %s se pridružite u ovu sobuOva je pozivnica poslana na%, koja nije povezana s ovim računom.
@@ -318,17 +318,6 @@ Da li ste sigurani?PORUKELJUDIFAJLOVI
- PRIDRUŽI SE
- DIREKTORIJ
- FAVORITI
- SOBE
- NISKI PRIORITET
- POZIVI
- Započni razgovor
- Napravi sobu
- Pridruži se sobi
- Pridriži se u sobu
- Upišite ID sobe ili alias sobePretražite imenikTraži direktorij..Favorit
diff --git a/vector/src/main/res/values-ca/strings.xml b/vector/src/main/res/values-ca/strings.xml
index 9f8f2a98b01..d55d9b8fd53 100644
--- a/vector/src/main/res/values-ca/strings.xml
+++ b/vector/src/main/res/values-ca/strings.xml
@@ -38,7 +38,7 @@
%1$s ha enviat una invitació a %2$s perquè s\'uneixi a la sala%1$s ha acceptat la invitació de %2$s** No s\'ha pogut desxifrar: %s **
- El dispositiu del remitent no ens ha enviat les claus per aquest missatge.
+ El dispositiu del remitent no ens ha enviat les claus per aquest missatge.No s\'ha pogut redactarNo s\'ha pogut enviar el missatgeNo s\'ha pogut pujar la imatge
@@ -48,7 +48,6 @@
%1$s a canviat el seu àlies a %2$s%s ha realitzat una videotrucada.%s ha realitzat una trucada de veu.
-
Invitació de %sConvida a la sala%1$s i %2$s
@@ -263,16 +262,13 @@
%1$s ha iniciat una videoconferènciaHas iniciat una videoconferència%1$s ha finalitzat la videoconferència
-
Tema clarTema foscTema negre
-
Sincronitzant…Escoltant esdevenimentsNotificacions amb soNotificacions silencioses
-
MissatgesSalaConfiguració
@@ -280,23 +276,22 @@
HistorialInforme d\'errorsDetalls de la comunitat
-
D\'acord
- Cancel·la
- Desa
- Marxa
- Envia
- Reenvia
- Elimina
- Cita
- Comparteix
+ Cancel·la
+ Desa
+ Marxa
+ Envia
+ Reenvia
+ Elimina
+ Cita
+ ComparteixMés tard
- Reenvia
+ ReenviaEnllaç permanentVisualitza el codi fontVisualitza el codi font desencriptat
- Elimina
- Canvia el nom
+ Elimina
+ Canvia el nomInforma del contingutTrucada activaVideoconferència en curs.
@@ -311,9 +306,8 @@
No s\'admeten conferències en sales xifradesEnvia igualmento
- Convida
+ ConvidaFora de línia
-
Tanca la sessióTrucadaVideotrucada
@@ -324,25 +318,20 @@
ObreTancaS\'ha copiat al porta-retalls
- Desactiva
-
+ DesactivaConfirmacióAvís
-
IniciPreferitsPersonesSales
-
Filtra noms de salaFiltra preferitsFiltra personesFiltra noms de salaFiltra noms de comunitat
-
InvitacionsPrioritat baixa
-
Xats personalsLlibreta d\'adreces localDirectori d\'usuari
@@ -350,7 +339,6 @@
No hi ha xatsNo has donat permís a ${app_name} perquè pugui accedir als teus contactes localsSense resultats
-
SalesDirectori de salaNo hi ha sales
@@ -359,7 +347,6 @@
%d usuari%d usuaris
-
ConvidaComunitatsNo hi ha grups
@@ -395,7 +382,6 @@
Fes una foto o un vídeoFes una fotoFes un vídeo
-
EntraCrea un compteTramet
@@ -443,7 +429,6 @@
La contrasenya s\'ha reiniciat.
\n
\nSe 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.
-
La URL ha de començar per http[s]://No s\'ha pogut iniciar la sessió: error de xarxaNo s\'ha pogut iniciar la sessió
@@ -458,28 +443,20 @@
S\'han enviat massa peticionsAquest nom d\'usuari ja està en úsL\'enllaç del correu electrònic que encara no heu fet clic
-
-
Llista de confirmacions de lectura
-
-
Envia comOriginalGranMitjanaPetita
-
"Voleu cancel·lar la baixada?Voleu cancel·lar la pujada?%d s%1$dm %2$ds
-
AhirAvui
-
Nom de la salaTema de la sala
-
TrucaTrucada establertaEstablint la trucada…
@@ -493,10 +470,8 @@
Ha fallat la connexió de mitjansNo es pot iniciar la càmeras\'ha contestat la trucada des d\'un altre lloc
-
Fes una foto o un vídeo"No es poden gravar vídeos"
-
InformacióPer poder enviar i desar fitxers adjunts, ${app_name} necessita permís per accedir a la galeria de fotos i vídeos.
\n
@@ -517,31 +492,25 @@
\n
\nPermets que ${app_name} accedeixi als teus contactes amb aquesta finalitat\?No s\'ha realitzat l\'acció per falta de permisos
-
DesatDesar a baixades?SÍNOContinua
-
- Elimina
- Uneix-te
- Previsualitza
- Rebutja
-
+ Elimina
+ Uneix-te
+ Previsualitza
+ RebutjaVés fins al primer no llegit
-
L\'usuari %s t\'ha convidat a unir-te a aquesta salaAquesta invitació s\'ha enviat a %s, que no està associat amb aquest compte.
\nPotser hauries d\'iniciar sessió amb un compte diferent o afegir aquest correu electrònic al teu compte.Estàs intentant accedir a %s. Vols unir-te per poder participar en la discussió\?una salaAixò és una previsualització de la sala. Les interaccions de la sala estan desactivades.
-
Nou xatAfegeix un participant1 participant
-
Marxa de la salaEstàs segur que vols marxar de la sala\?Estàs segur que vols eliminar %s d\'aquest xat\?
@@ -570,7 +539,6 @@
\nN\'estàs segur\?Estàs segur que vols convidar a %s a aquest xat\?Si vetes un usuari, se l\'expulsarà d\'aquesta sala i no podrà tornar a unir-s\'hi.
-
Convida per IDCONTACTES LOCALS (%d)DIRECTORI D\'USUARI (%s)
@@ -578,7 +546,6 @@
Convida un usuari per IDIntrodueix un o més correus electrònics o identificadors de MatrixCorreu electrònic o ID de Matrix
-
Cerca%s està escrivint…%1$s & %2$s estan escrivint…
@@ -594,7 +561,6 @@
Elimina els missatges no enviatsNo s\'ha trobat el fitxerNo tens permís per publicar en aquesta sala.
-
ConfiaNo hi confiïsTanca sessió
@@ -606,7 +572,6 @@
El certificat ha canviat respecte aquell en el qual el telefon confia. Això NO ÉS GENS HABITUAL. Es recomana que NO ACCEPTEU el certificat nou.El certificat en el que confiàveu ha canviat per un en el que no confieu. El servidor pot haver renovat el certificat. Contacteu amb l\'administrador del servidor per saber l\'empremta digital esperada.Només accepteu el certificat si l\'administrador del servidor ha publicat una empremta digital que coincideixi amb l\'anterior.
-
Detalls de la salaParticipantsFitxers
@@ -614,14 +579,12 @@
L\'ID és incorrecte. Ha de ser una adreça de correu electrònic o un identificador de Matrix com \'@partlocal:domini\'CONVIDATSS\'HAN UNIT
-
Motiu per informar d\'aquest contingutVols amagar tots els missatges d\'aquest usuari\?
\n
\nTingues en compte que aquesta acció reiniciarà l\'aplicació i pot trigar una estona.Cancel·la la pujadaCancel·la la baixada
-
CercaFiltra els participants de la salaNo hi ha resultats
@@ -629,29 +592,14 @@
MISSATGESPARTICIPANTSFITXERS
-
- UNEIX-TE
- DIRECTORI
- PREFERITS
- SALES
- PRIORITAT BAIXA
- CONVIDA
- Inicia un xat
- Crea una sala
- Uneix-te a la sala
- Uneix-te a una sala
- Escriviu un id de sala o un àlies de sala
-
Navega pel directoriS\'està cercant al directori…
-
PreferitTreu prioritatXat directeMarxa del xatOblidaAfegeix a la pantalla d\'inici
-
MissatgesConfiguracióVersió
@@ -659,7 +607,6 @@
Avisos de tercersCopyrightPolítica de privacitat
-
Foto de perfilÀliesCorreu electrònic
@@ -711,7 +658,6 @@
Mostra sempre l\'hora a tots els missatgesMostra l\'hora en el format de 12 horesVibra quan mencionin un usuari
-
AnalítiquesMode d\'estalvi de dadesDetalls de la sessió
@@ -758,42 +704,33 @@
S\'ha produït un error mentre es validava el número de telèfonCodiInsígnia
-
Tres diesUna setmanaUn mesPer sempre
-
-
Foto de la salaNom de la salaTemaEtiqueta de la salaEtiquetat com a:
-
PreferitPrioritat baixaCap
-
Accés i visibilitatMostra aquesta sala al directori de salesAccés a la salaPermisos de lectura de l\'històric de la salaQui pot llegir l\'històric\?Qui pot accedir a la sala?
-
QualsevolNomés participants (a partir del moment en què es seleccioni aquesta opció)Només participants (des de que són convidats)Només participants (des de que s\'uneixen a la sala)
-
La sala ha de tenir una adreça per tal d\'unir-s\'hi.Només persones que hagin estat convidadesQualsevol que tingui l\'enllaç de la sala, a part dels convidatsQualsevol que tingui l\'enllaç de la sala, inclosos els convidats
-
Usuaris vetats
-
AvançatID intern d\'aquesta salaAdreces
@@ -804,7 +741,6 @@
Necessites tancar la sessió per poder activar el xifrat.Xifra només a sessions verificadesNo enviïs mai, des d\'aquesta sessió, missatges xifrats a sessions no verificades en aquesta sala.
-
Aquesta sala no té adreces localsAdreça nova (p.e. #foo:matrix.org)Aquesta sala no mostra insígnies per a cap comunitat
@@ -823,12 +759,9 @@
El xifrat en aquesta sala està desactivat.Activa el xifrat
\n(avís: no es podrà desactivar!)
-
DirectoriTema
-
%s ha intentat carregar un moment concret de la cronologia d\'aquesta sala però no l\'ha trobat.
-
Informació de l\'encriptació d\'extrem a extremInformació d\'esdevenimentID d\'usuari
@@ -872,23 +805,19 @@
Verifica comparant el següent amb la configuració d\'usuari de la teva altra sessió:Si no coincideixen pot ser que la seguretat de la comunicació estigui compromesa.Verifica que les claus coincideixen
-
La sala conté sessions desconegudesAquesta sala conté sessions desconegudes que no han estat verificades.
\nAixò vol dir que no hi ha garanties de que aquestes sessions pertanyin als usuaris que diuen ser.
\nRecomanem que, abans de continuar, duguis a terme el procés de verificació de cadascuna de les sessions. Però, si ho prefereixes, pots reenviar el missatge sense la verificació.
\n
\nSessions desconegudes:
-
Tria un directori de salesÉs possible que el servidor no estigui disponible o que estigui sobrecarregatIntrodueix un servidor base per veure les seves sales públiquesURL del servidor baseTotes les sales del servidor %sTotes les sales natives de %s
-
Busca a l\'historial
-
Mida de la fontMolt petitaPetita
@@ -897,12 +826,10 @@
Molt granMés granEnorme
-
Necessites permisos per gestionar ginys en aquesta salaHa fallat la creació del ginyFes conferències amb jitsiConfirmes que vols eliminar el giny d\'aquesta sala\?
-
No s\'ha pogut crear el giny.No s\'ha pogut enviar la sol·licitud.El nivell d\'autoritat ha de ser un enter positiu.
@@ -913,30 +840,24 @@
La sala %s no és visible.Afegeix aplicacions de MatrixUtilitza la càmera nativa
-
Has afegit una nova sessió \'%s\' que està sol·licitant les claus de xifrat.La teva sessió no verificada \'%s\' està sol·licitant les claus de xifrat.Inicia la verificacióComparteix sense verificarIgnora la sol·licitut
-
Avís!Les conferències estan en desenvolupament i pot ser que no funcionin bé.
-
Error de comandamentOrdre no reconegut: %s
-
ApagatAmb soMissatge xifrat
-
CreaCrea una comunitatNom de la comunitatExempleID de la comunitatexemple
-
IniciUsuarisSales
@@ -1007,13 +928,12 @@
%d giny actiu%d ginys actius
-
Envia un adhesiuEnvia un adhesiuLlicències de tercers
- Baixa
- Parla
- Esborra
+ Baixa
+ Parla
+ EsborraEnvia veuseguir amb…Ho sento, no s\'ha trobat cap aplicació externa per completar l\'acció.
@@ -1138,7 +1058,7 @@
Ho sentim, s\'ha produït un errordesplegaplega
- Accepta
+ AcceptaTrucadaUtilitza el to de trucada d\'${app_name} predeterminat per trucades entrantsTo de trucada entrant
@@ -1204,7 +1124,7 @@
No s\'ha trobat cap APK de Google Play Services vàlid. Les notificacions poden no funcionar correctament.Còpia de seguretat de les clausUtilitza la còpia de seguretat de les claus
- Omet
+ OmetFetConfiguració de notificacions avançadaImportància de les notificacions per esdeveniment
@@ -1340,8 +1260,8 @@
Utilitza la còpia de seguretat de les clausN\'estàs segur\?Còpia de seguretat
- Queda\'t
- Avorta
+ Queda\'t
+ AvortaEstàs segur que vols tancar la sessió\?Recuperació de missatges xifratsIntroduïu un nom d\'usuari.
@@ -1390,7 +1310,7 @@
\n
\nSi no has configurat el nou mètode de recuperació, un atacant podria estar intentant accedir al teu compte. Canvia la contrasenya del teu compte i configura un nou mètode de recuperació a la configuració immediatament.Inicialitzant servei
- Ignora
+ IgnoraInicia sessió amb la inscripció única (SSO)Aquesta URL no està disponible , si us plau verifiqueu-laEl teu dispositiu està utilitzant una versió obsoleta del protocol de seguretat TLS, vulnerable a atacs. Per a la teva pròpia seguretat, no et pots connectar
@@ -1501,8 +1421,8 @@
SalesLes teves sales es mostraran aquí. Clica el + de la part inferior dreta per buscar-ne d\'existents o per crear-ne una.Reaccions
- Confirmar
- M\'agrada
+ Confirmar
+ M\'agradaAfegir reaccióVeure reaccionsReaccions
@@ -1593,7 +1513,7 @@
PenjaRebutjaAccepta
- Rebutja
+ RebutjaNo s\'ha pogut eliminar el ginyNo s\'ha pogut afegir el ginyNo pots iniciar una trucada amb tu mateix, espera que els participants acceptin la invitació
@@ -1606,19 +1526,19 @@
No tens permís per iniciar una trucada en aquesta salaNo tens permís per iniciar una conferènciaNo tens permís per iniciar una videoconferència en aquesta sala
- Reinicia
- Omet
- Atura
- Desconnecta
- Revoca
+ Reinicia
+ Omet
+ Atura
+ Desconnecta
+ RevocaCapTrucada activa (%s)Demana confirmació abans d\'iniciar una trucadaEvita trucada accidentalLa descripció és massa curtaEnvia l\'historial de sol·licituds de compartició de claus
- Revisa
- Reprodueix
+ Revisa
+ ReprodueixActiva l\'HDDesactiva l\'HDPosterior
@@ -2025,7 +1945,7 @@
Obre el xatSilencia el micròfonEl codi PIN és l\'única manera de desbloquejar ${app_name}.
- o un altre client Matrix compatible amb la signatura creuada
+ o un altre client Matrix compatible amb la signatura creuadaLa signatura creuada no està activadaLa signatura creuada està activada
\nClaus no fiables
@@ -2252,15 +2172,6 @@
Si no pots accedir a una sessió existentUtilitza una frase de recuperació o una clauCrea una votació simple
- Opció seleccionada
-
- %d vot - Resultat final
- %d vots - Resultat final
-
-
- %d vot
- %d vots
- Vols eliminar les dades del compte de tipus %1$s\?
\n
\nVés en compte, pot ser que provoqui comportaments inesperats.
@@ -2522,7 +2433,6 @@
Esperant…Conclusió de la verificacióHa reaccionat amb: %s
- Botons de botVotacióAdhesiuImatge.
diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml
index 92ffbe0b468..d02b80c78ad 100644
--- a/vector/src/main/res/values-cs/strings.xml
+++ b/vector/src/main/res/values-cs/strings.xml
@@ -40,7 +40,7 @@
%1$s do této místnosti pozvali %2$s%1$s přijali pozvání pro %2$s** Nelze dešifrovat: %s **
- Odesílatelovo zařízení nám neposlalo klíče pro tuto zprávu.
+ Odesílatelovo zařízení nám neposlalo klíče pro tuto zprávu.Nelze vymazatZprávu nelze odeslatObrázek nelze nahrát
@@ -280,18 +280,18 @@
MístnostNastaveníOK
- Uložit
+ UložitNačítám…
- Zrušit
- Odeslat
- Opustit
- Sdílet
- Předat
+ Zrušit
+ Odeslat
+ Opustit
+ Sdílet
+ PředatZobrazit zdroj
- Odstranit
- Přejmenovat
+ Odstranit
+ Přejmenovatnebo
- Pozvat
+ PozvatOfflineZapomenout místnostProbíhá synchronizace…
@@ -302,9 +302,9 @@
HistorickýPodrobnosti o komunitěNaslouchám událostem
- Poslat znovu
- Odstranit
- Citovat
+ Poslat znovu
+ Odstranit
+ CitovatPozdějiTrvalý odkazZobrazit dešifrovaný zdroj
@@ -333,7 +333,7 @@
OtevřítZavřítZkopírovat do schránky
- Vyřadit
+ VyřaditPotvrzeníVarováníÚvod
@@ -452,12 +452,12 @@
Toto uživatelské jméno je již použitoOdeslat nálepkuLicenční smlouvy třetích stran
- Stáhnout
- Hovořit
- Vymazat
+ Stáhnout
+ Hovořit
+ VymazatZ důvodu chybějících práv není tato akce možná.Přesto volat
- Přijmout
+ PřijmoutChybaSystémová upozorněníProsím, popište chybu. Co jste provedli\? Jaké bylo očekávané chování\? Co se ve skutečnosti stalo\?
@@ -537,16 +537,16 @@
ANONEPokračovat
- Odstranit
- Vstoupit
- Náhled
+ Odstranit
+ Vstoupit
+ NáhledByli jste pozváni od %s ke vstupu do místnostiŽádost odeslánaProsím, spusťte ${app_name} na jiném zařízení, které může dešifrovat zprávu, aby poslalo klíče této relaci.Seznam doručenekSeznam skupinOmlouváme se, ale akce nebyla provedena z důvodu chybějících oprávnění
- Odmítnout
+ OdmítnoutZobrazit členyOtevřít záhlavíSynchronizuji…
@@ -673,10 +673,10 @@
Opravdu\?ZálohaPokud nezazálohujete své klíče před odhlášením, přijdete o přístup ke svým zašifrovaným zprávám.
- Zůstat
- Přeskočit
+ Zůstat
+ PřeskočitHotovo
- Zrušit
+ ZrušitOpravdu 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.
@@ -714,17 +714,6 @@
ZPRÁVYLIDÉSOUBORY
- VSTOUPIT
- ADRESÁŘ
- OBLÍBENÉ
- MÍSTNOSTI
- NÍZKÁ PRIORITA
- POZVÁNKY
- Začít konverzaci
- Vytvořit místnost
- Vstoupit do místnosti
- Vstoupit do místnosti
- Zadejte ID nebo přezdívku místnostiProcházet adresář%d místnost
@@ -767,13 +756,13 @@
Důležitost oznámení na základě událostiSpouštím službyOvěřit relaci
- Odpojit
- Ignorovat
- Odmítnout
+ Odpojit
+ Ignorovat
+ OdmítnoutOznačit za přečtenéŽádný
- Zrušit
- Přehled
+ Zrušit
+ PřehledNení konfigurován žádný ověřovací server.Volání se nezdařilo kvůli chybné konfiguraci serveruProsím, požádejte administrátora domovského serveru (%1$s) o konfiguraci TURN serveru, aby hovory fungovaly spolehlivě.
@@ -925,8 +914,8 @@
OstatníPokročiléIntegrace
- Použijte správce integrací ke správě botů, můstků, widgetů a nálepkových sad.
-\nSprávci integrací obdrží konfigurační data a mohou změnit widgety, poslat pozvánky do místností a nastavit power levels Vaším jménem.
+ Pomocí správce integrace můžete spravovat boty, propojení, widgety a balíčky nálepek.
+\nSprávci integrací přijímají konfigurační data a mohou vaším jménem upravovat widgety, odesílat pozvánky do místností a nastavovat úrovně oprávnění.KryptografieSpráva kryprografických klíčůCíle oznámení
@@ -1542,8 +1531,8 @@
MístnostiTady budou zobrazeny Vaše místnosti. K vyhledání existujících místností nebo založení nové klepněte na + vpravo dole.Reakce
- Souhlasit
- Líbí se
+ Souhlasit
+ Líbí sePřidat reakciUkázat reakceReakce
@@ -1625,7 +1614,7 @@
Všeobecné podmínkyPročíst všeobecné podmínkyNechte se najít druhými
- Použijte boty, můstky, widgety a nálepkové sady
+ Použijte boty, propojení, widgety a balíčky nálepekČtěte naServer pro identityOdpojit server pro identity
@@ -1944,7 +1933,7 @@
Zapnout koncové šifrování…Jakmile zapnuto, šifrování nelze vypnout.Zapnout šifrování\?
- Jakmile zapnuto, šifrování místnosti nelze vypnout. Zprávy odeslané v zašifrované místnosti nemohou být čteny serverem, ale pouze účastníky místnosti. Zapnutím šifrování mohou boty a můstky přestat správně pracovat.
+ Jakmile je šifrování místnosti zapnuto, nelze jej vypnout. Zprávy odeslané v zašifrované místnosti nemohou být čteny serverem, ale pouze účastníky místnosti. Zapnutí šifrování může zabránit správnému fungování mnoha botů a propojení.Zapnout šifrováníZa účelem bezpečnosti ověřte %s kontrolou jednorázového kódu.Za účelem bezpečnosti to proveďte osobně nebo použijte jiný způsob komunikace.
@@ -1990,23 +1979,12 @@
Spustit křížové podepsáníResetovat klíčeQR kód
- Téměř hotovo! Ukazuje %s úspěšné dokončení\?
+ Už to skoro je! Ukazuje %s úspěšné dokončení\?AnoNeSpojení k serveru bylo ztracenoVývojářské nástrojeÚdaje účtu
-
- %d hlas
- %d hlasy
- %d hlasů
-
-
- %d hlas - Konečné výsledky
- %d hlasy - Konečné výsledky
- %d hlasů - Konečné výsledky
-
- Zvolená možnostVytvoří jednoduché hlasováníPoužijte metodu obnovyPokud se nemůžete dostat do existující relace
@@ -2091,8 +2069,8 @@
Šifrování není zapnutoŠifrování použité v této místnosti není podporováno%s založil a nastavil tuto místnost.
- Téměř hotovo! Ukazuje druhé zařízení úspěšné dokončení\?
- Téměř hotovo! Čekám na potvrzení…
+ Už to skoro je! Ukazuje druhé zařízení úspěšné dokončení\?
+ Už to skoro je! Čekám na potvrzení…Čekám na %s…Import klíčů selhalKonfigurace oznámení
@@ -2155,7 +2133,7 @@
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- nebo jiný Matrix klient schopný křížového podepisování
+ nebo jiný Matrix klient schopný křížového podepisováníPoužijte na svých zařízeních nejnovější ${app_name}:Vynutí zahození probíhající skupinové relace v šifrované místnostiPodporováno jen v šifrovaných místnostech
@@ -2210,9 +2188,9 @@
Jinak můžete zadat URL jakéhokoli jiného serveru identitZadejte URL serveru identitOdeslat
- Přehrát
- Pozastavit
- Odmítnout
+ Přehrát
+ Pozastavit
+ OdmítnoutNemáte povolení zahájit konferenční hovor v této místnostiKonference již probíhá!Zahájit video schůzku
@@ -2366,7 +2344,7 @@
Nemůžete číst tuto zprávuČekám na tuto zprávu, může to chvíli trvatNelze dešifrovat
- Vzhledem ke koncovému se může stát, že budete muset počkat, než zpráva dorazí, protože vám nebyly správně odeslány šifrovací klíče.
+ Jelikož se používá koncové šifrování, může se stát, že budete muset počkat, než zpráva dorazí, protože vám nebyly správně odeslány šifrovací klíče.Nemůžete číst tuto zprávu, protože odesílatel Vás blokujeNemůžete číst tuto zprávu, protože Vaše relace není pro odesílatele důvěryhodnáNemůžete číst tuto zprávu, protože odesílatel účelově neposlal klíče
@@ -2417,7 +2395,6 @@
Zobrazit stavové události účastníků v místnostiZahrnuje události pozvat/vstoupit/opustit/vykopnout/vykázat a změny avatara/veřejného jména.Hlasování
- Tlačítka botůReagoval(a): %sVýsledek ověřeníOdkaz byl chybně zformován
@@ -2490,7 +2467,7 @@
Filtrovat vykázané uživateleNemáte oprávnění k zahájení hovoruNemáte oprávnění k zahájení konferenčního hovoru
- Resetovat
+ ResetovatOdkaz na MatrixQR kód nebyl oskenován!Neplatný QR kód (neplatné URI)!
@@ -2725,7 +2702,6 @@
Adresář místnostíZpráva odeslánaNeoznačeno
- Experimentální, prostor - omezená místnost.Prostory představují nový způsob seskupování místností a osob.Založme pro každé místnost. Později můžete přidat i další, včetně již existujících.Na jakých tématech pracujete\?
@@ -2733,7 +2709,6 @@
Doplňte nějaké podrobnosti, aby jej lidé mohli identifikovat. Můžete je kdykoli změnit.Prostory jsou nový způsob organizace místností a lidíProstory
- Varování, nutná podpora serveru a experimentální verze místnostiJste zvániVítejte v prostorech!Přidat existující místnosti a prostor
@@ -2759,7 +2734,7 @@
Budou moci %s prozkoumatPozvat do %sSdílet odkaz
- Pozvat podle uživatelského jména
+ Pozvat podle uživatelského jménaPozvat emailemV tomto okamžiku jste to jen Vy. %s bude s dalšími lepší.Pozvat lidi
@@ -3015,7 +2990,7 @@
Pozvání e-mailem, vyhledávání kontaktů a další…Dokončit nastavení objevování.V současné době nepoužíváte server identit. Chcete-li pozvat kolegy a být pro ně zjistitelní, nakonfigurujte jej níže.
- Pozvat pomocí uživatelského jména nebo e-mailu
+ Pozvat pomocí uživatelského jména nebo e-mailuZajistěte, aby měli do společnosti %s přístup ti správní lidé. Další můžete pozvat později.Kdo jsou vaši kolegové\?Přidat do daného prostoru
@@ -3089,4 +3064,57 @@
Souhlasíte se zasíláním těchto informací\?Pro nalezení existujících kontaktů, je třeba odeslat kontaktní informace (e-maily a telefonní čísla) na server identity. Před odesláním vaše údaje zaheslujeme kvůli ochraně osobních údajů.Nyní ne
+ Opravdu chcete toto hlasování odstranit\? Po odstranění ho již nebude možné obnovit.
+ Odstranit hlasování
+ Hlasování skončilo
+ Hlas odeslán
+ Povolit hlasování
+ Ukončit hlasování
+ Toto zastaví možnost hlasování a zobrazí se konečné výsledky.
+ Ukončit toto hlasování\?
+ vítězná volba
+ Ukončit hlasování
+
+ Konečný výsledek na základě %1$d hlasu
+ Konečný výsledek na základě %1$d hlasů
+ Konečný výsledek na základě %1$d hlasů
+
+
+ Nikdo nehlasoval
+ %1$d hlasů. Hlasujte pro zobrazení výsledků
+ %1$d hlasů. Hlasujte pro zobrazení výsledků
+
+
+ Na základě %1$d hlasu
+ Na základě %1$d hlasů
+ Na základě %1$d hlasů
+
+
+ %1$d hlas
+ %1$d hlasy
+ %1$d hlasů
+
+ Systémová nastavení
+ Verze
+ Získejte pomoc při používání Elementu
+ Nápověda a podpora
+ Nápověda
+ Právní dokumenty
+ Tento server neposkytuje žádné zásady.
+ Knihovny třetích stran
+ Zásady vašeho serveru identit
+ Zásady vašeho domovského serveru
+ Zásady aplikace ${app_name}
+ Tuto funkci můžete kdykoli vypnout v nastavení
+ Nesdílíme informace s třetími stranami
+ Nezaznamenáváme ani neprofilujeme žádné údaje o účtu
+ zde
+ Pomozte nám identifikovat problémy a vylepšit Element sdílením anonymních údajů o používání. Abychom pochopili, jak lidé používají více zařízení, vygenerujeme náhodný identifikátor sdílený vašimi zařízeními.
+\n
+\nMůžete si přečíst všechny naše podmínky %s.
+ Pomozte vylepšit Element
+ Povolit
+ Restartujte aplikaci, aby se změna projevila.
+ Povolit matematické výrazy LaTeXu
+ Do této místnosti vám není dovoleno vstoupit
\ No newline at end of file
diff --git a/vector/src/main/res/values-da/strings.xml b/vector/src/main/res/values-da/strings.xml
index 077bf0efdac..57d8e5c547b 100644
--- a/vector/src/main/res/values-da/strings.xml
+++ b/vector/src/main/res/values-da/strings.xml
@@ -39,7 +39,7 @@
%1$s inviterede %2$s til rummet%1$s accepterede invitationen til %2$s** Kunne ikke dekryptere: %s **
- Afsenderens enhed har ikke sendt os nøglerne til denne besked.
+ Afsenderens enhed har ikke sendt os nøglerne til denne besked.Kunne ikke hemmeligholdeKunne ikke sende beskedKunne ikke uploade billede
@@ -68,21 +68,21 @@
MedlemsdetaljerHistoriskOK
- Afbryd
- Gem
- Forlad
- Send
- Send igen
- Tilbagehold
- Citér
- Del
+ Afbryd
+ Gem
+ Forlad
+ Send
+ Send igen
+ Tilbagehold
+ Citér
+ DelSenere
- Videresend
+ VideresendPermanent linkSe KildeSe Dekrypteret Kilde
- Slet
- Omdøb
+ Slet
+ OmdøbRapporter indholdAktivt opkaldIgangværende konferenceopkald.\nForbind med %1$s eller %2$s
@@ -96,7 +96,7 @@
Konferenceopkald er ikke understøttede i krypterede rumSend Alligeveleller
- Invitér
+ InvitérOfflineLog udStemmeopkald
@@ -108,7 +108,7 @@
ÅbenLukKopieret til udklipsholder
- Slå fra
+ Slå fraBekræftigelseAdvarselHjem
@@ -282,10 +282,10 @@ Vil du give ${app_name} adgang til dine kontakter?JANEJFortsæt
- Fjern
- Forbind
- Forhåndsvisning
- Afvis
+ Fjern
+ Forbind
+ Forhåndsvisning
+ AfvisSpring til første ulæste besked.Du er blevet inviteret til at forbinde til dette rum af %sDenne invitation blev sendt til %s som ikke er tilknyttet denne konto.
@@ -407,14 +407,6 @@ Er du sikker?MEDDELELSERFOLKFILER
- OVERSIGT
- FAVORITTER
- RUM
- LAV PRIORITET
- INVITATIONER
- Start chat
- Opret rum
- Indtast ID eller alias på et rumGennemse oversigt1 rum
diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
index eadddc69cca..ec169f36d75 100644
--- a/vector/src/main/res/values-de/strings.xml
+++ b/vector/src/main/res/values-de/strings.xml
@@ -39,24 +39,16 @@
%1$s hat eine Einladung an %2$s gesendet%1$s hat die Einladung in %2$s akzeptiert** Nicht entschlüsselbar: %s **
- Das absendende Gerät hat uns keine Schlüssel für diese Nachricht übermittelt.
-
+ Das absendende Gerät hat uns keine Schlüssel für diese Nachricht übermittelt.Entfernen nicht möglichNachricht kann nicht gesendet werdenBild konnte nicht hochgeladen werden
-
Netzwerk-FehlerMatrix-Fehler
-
-
-
-
Es ist aktuell nicht möglich, einen leeren Raum erneut zu betreten.
-
E-Mail-AdresseTelefonnummer%1$s hat einen Sticker gesendet.
-
Einladung von %sRaumeinladung%1$s und %2$s
@@ -79,7 +71,8 @@
Erste Synchronisation:
\nImportiere RäumeErste Synchronisation:
-\nImportiere betretene Räume
+\nLade deine Konversationen
+\nWenn du vielen Räumen beigetreten bist, kann das eine Weile dauernErste Synchronisation:
\nImportiere eingeladene RäumeErste Synchronisation:
@@ -270,7 +263,6 @@
Du hast eine Videokonferenz beendetDu hast eine Videokonferenz gestartetVideokonferenz von %1$s gestartet
-
Nachrichten"RaumEinstellungen
@@ -279,23 +271,22 @@
AkzeptiereAblehnenAnruf beenden
-
Ok
- Abbrechen
- Speichern
- Verlassen
- Senden
- Erneut senden
- Entfernen
- Zitieren
- Teilen
+ Abbrechen
+ Speichern
+ Verlassen
+ Senden
+ Erneut senden
+ Entfernen
+ Zitieren
+ TeilenSpäter
- Weiterleiten
+ WeiterleitenPermalinkRohdaten anzeigenEntschlüsselte Rohdaten anzeigen
- Löschen
- Umbenennen
+ Löschen
+ UmbenennenInhalt meldenAktives GesprächLaufendes Konferenzgespräch
@@ -310,8 +301,7 @@
Konferenzgespräche in verschlüsselten Räumen werden nicht unterstütztTrotzdem sendenoder
- Einladen
-
+ EinladenAbmeldenSprachanrufVideoanruf
@@ -322,31 +312,25 @@
ÖffnenSchließenIn Zwischenablage kopiert
- Deaktivieren
-
+ DeaktivierenBestätigungWarnung
-
HomeFavoritenPersonenRäume
-
Raumnamen filternFavoriten filternPersonen filternRaumnamen filtern
-
EinladungenNiedrige Priorität
-
KonversationenLokales AdressbuchNur Matrix-KontakteKeine Konversationen${app_name} wurde nicht erlaubt, auf lokale Kontakte zuzugreifenKeine Ergebnisse
-
RäumeRaumverzeichnisKeine Räume
@@ -382,7 +366,6 @@
Videoanruf startenDateien sendenFoto oder Video aufnehmen
-
AnmeldenKonto erstellenAbsenden
@@ -428,7 +411,6 @@
Dein Passwort wurde zurückgesetzt.
\n
\nDu wurdest aus allen Sitzungen abgemeldet und wirst keine Push-Benachrichtigungen mehr erhalten. Um die Push-Benachrichtigungen wieder zu aktivieren, musst du dich auf jedem Gerät erneut anmelden.
-
URL muss mit \'http[s]://\' beginnenLogin unmöglich: NetzwerkfehlerLogin unmöglich
@@ -443,28 +425,20 @@
Es wurden zu viele Anfragen gesendetDieser Benutzername wird bereits verwendetDer Link in der E-Mail wurde noch nicht geöffnet
-
-
Lesebestätigungsliste
-
-
Sende alsOriginalGroßMittelKlein
-
Download abbrechen?Upload abbrechen?%d s%1$dm:%2$ds
-
GesternHeute
-
RaumnameRaumthema
-
Anruf verbundenVerbindungsaufbau…Anruf beendet
@@ -477,10 +451,8 @@
Medien-Verbindung fehlgeschlagenKann Kamera nicht initialisierenAnruf woanders entgegengenommen
-
Foto oder Video aufnehmenVideo kann nicht aufgenommen werden
-
Information${app_name} benötigt die Berechtigung, auf deine Fotos und Videos zugreifen zu können, um Anhänge zu senden und zu speichern.\n\nBitte erlaube den Zugriff im nächsten Dialog, um Dateien von deinem Gerät zu versenden.${app_name} benötigt die Berechtigung, auf deine Kamera zugreifen zu können, um Bilder aufzunehmen und Video-Anrufe durchzuführen.
@@ -499,31 +471,25 @@
\n
\nStimmst du der Nutzung deines Adressbuchs zu diesem Zweck zu\?Entschuldige. Die Aktion wurde aufgrund fehlender Berechtigungen nicht ausgeführt
-
GespeichertIn Downloads speichern?JaNeinFortsetzen
-
- Entfernen
- Betreten
- Vorschau
- Ablehnen
-
+ Entfernen
+ Betreten
+ Vorschau
+ AblehnenZur ersten ungelesenen Nachricht
-
Du wurdest von %s in diesen Raum eingeladenDiese Einladung wurde an %s gesendet, welche nicht mit diesem Konto verknüpft ist.
\nDu kannst dich mit einem anderen Konto anmelden oder diese E-Mail-Adresse zu diesem Konto hinzufügen.Du möchtest auf %s zugreifen. Möchtest du den Raum betreten, um an der Diskussion teilzunehmen?einen RaumDas ist die Vorschau des Raums. Interaktionen mit dem Raum sind deaktiviert.
-
Neuer ChatMitglied hinzufügen1 Mitglied
-
Raum verlassenRaum wirklich verlassen\?%s wirklich aus diesem Chat entfernen möchtest\?
@@ -551,14 +517,12 @@
Du wirst diese Änderung nicht rückgängig machen können, da die Person dieselbe Berechtigungsstufe wie du erhalten wird.
\nBist du sicher\?"Bist du sicher, dass du %s in diesen Chat einladen willst?"
-
Mit ID einladenLOKALE KONTAKTE (%d)Nur Matrix-BenutzerBenutzer per ID einladenBitte gib eine oder mehrere E-Mail-Adressen oder eine Matrix-ID einE-Mail oder Matrix-ID
-
Suchen%s schreibt…%1$s & %2$s schreiben…
@@ -574,7 +538,6 @@
Nicht gesendete Nachrichten löschenDatei nicht gefundenDu bist nicht berechtigt, in diesen Raum zu schreiben.
-
VertrauenNicht vertrauenAbmelden
@@ -586,7 +549,6 @@
Das Zertifikat unterscheidet sich von dem Zertifikat, dem dein Gerät ursprünglich vertraut hat. Dies ist SEHR UNGEWÖHNLICH. Es wird empfohlen, dass du dieses neue Zertifikat NICHT AKZEPTIERST.Das Zertifikat hat sich von einem ursprünglich vertrauenswürdigem Zertifikat in ein nicht vertrauenswürdiges Zertifikat geändert. Eventuell wurde das Zertifikat des Servers erneuert. Bitte erkundige dich beim Server-Administrator, welcher Fingerprint als vertrauenswürdig gilt.Akzeptiere das Zertifikat nur dann, wenn der Server-Administrator einen Fingerprint veröffentlicht hat, der mit dem obigen übereinstimmt.
-
RaumdetailsPersonenDateien
@@ -594,14 +556,12 @@
Ungültige ID. Eine E-Mail-Adresse oder eine Matrix-ID (\'@localpart:domain\') ist erforderlichEINGELADENTEILNEHMER
-
Grund für das Melden dieses InhaltsMöchtest du alle Nachrichten dieses Nutzers verbergen\?
\n
\nBeachte: Diese Aktion wird die App neu starten und einige Zeit brauchen.Hochladen abbrechenHerunterladen abbrechen
-
SuchenRaummitglieder filternKeine Suchergebnisse
@@ -609,28 +569,13 @@
NACHRICHTENPERSONENDATEIEN
-
- BEITRETEN
- VERZEICHNIS
- FAVORITEN
- RÄUME
- NIEDRIGE PRIORITÄT
- EINLADUNGEN
- Gespräch beginnen
- Raum erstellen
- Raum beitreten
- Einem Raum beitreten
- Raum-ID oder Raum-Alias eingeben
-
Verzeichnis durchsuchenVerzeichnis wird durchsucht…
-
FavoritNiedrige PrioritätDirekter ChatKonversation verlassenVergessen
-
NachrichtenEinstellungenVersion
@@ -638,7 +583,6 @@
Nutzungshinweise von DrittanbieternUrheberrechtserklärungDatenschutzerklärung
-
ProfilbildAnzeigenameE-Mail-Adresse
@@ -666,7 +610,6 @@
UrheberrechtserklärungDatenschutzerklärungCache leeren
-
NutzereinstellungenBenachrichtigungenIgnorierte Benutzer
@@ -722,37 +665,29 @@
Hier Aktivierungscode eintragenFehler beim Verifizieren der TelefonnummerCode
-
-
RaumbildRaumnameThemaRaummarkierungMarkiert als:
-
FavoritNiedrige PrioritätKeine
-
Zugriff und SichtbarkeitDiesen Raum im Raumverzeichnis anzeigenRaumzugriffLesbarkeit des ChatverlaufsWer kann den Chatverlauf lesen?Wer kann auf diesen Raum zugreifen?
-
AlleNur MitgliederNur Mitglieder (ab Einladung)Nur Mitglieder (ab Beitreten)
-
Um einen Link zu einem Raum erstellen zu können, muss dieser eine Adresse haben.Nur eingeladene PersonenAlle, die den Raumlink kennen (ausgenommen Gäste)Alle, die den Raumlink kennen (auch Gäste)
-
Verbannte Benutzer
-
ErweitertInterne ID dieses RaumesAdressen
@@ -763,7 +698,6 @@
Du musst dich abmelden, um die Verschlüsselung aktivieren zu können.Nur für verifizierte Sitzungen verschlüsselnNiemals verschlüsselte Nachrichten an unverifizierte Sitzungen in diesem Raum von dieser Sitzung senden.
-
Dieser Raum hat keine lokalen AdressenNeue Adresse (z. B. #foo:matrix.org)Ungültiges Adressformat
@@ -777,11 +711,8 @@
Verschlüsselung ist in diesem Raum aktiviert.Verschlüsselung ist in diesem Raum deaktiviert.Verschlüsselung aktivieren \n(Warnung: Kann nicht wieder deaktiviert werden!)
-
Verzeichnis
-
%s versuchte einen bestimmten Punkt in diesem Chatverlauf zu laden, konnte ihn aber nicht finden.
-
Ende-zu-Ende-Verschlüsselungs-InformationenEreignisinformationNutzer-ID
@@ -825,21 +756,18 @@
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.Ich bestätige, dass die Schlüssel übereinstimmen
-
Raum enthält unbekannte SitzungenDieser Raum enthält unbekannte Sitzungen, die noch nicht verifiziert wurden.
\nEs gibt also keine Garantie, dass diese Sitzung wirklich der angegebenen Person gehören.
\nWir empfehlen, den Verifizierungsprozess für jedes Gerät zu durchlaufen, bevor du fortfährst. Du kannst die Nachricht aber auch ohne Verifizierung senden, wenn du das vorziehst.
\n
\nUnbekannte Sitzungen:
-
Raumverzeichnis auswählenDer Server kann nicht verfügbar oder überlastet seinGib einen Home-Server ein, um seine öffentlichen Räume aufzulistenServer-NameAlle Räume auf dem %s-ServerAlle nativen %s-Räume
-
Suche nach historischenBedienoberflächeSprache
@@ -870,7 +798,6 @@
Widget konnte nicht erstellt werdenKonferenzgespräche mit Jitsi durchführenSoll das Widget wirklich aus diesem Raum gelöscht werden?
-
Widget konnte nicht erstellt werden.Berechtigungslevel muss eine positive ganze Zahl sein.Du bist nicht Mitglied in diesem Raum.
@@ -897,17 +824,14 @@
Foto aufnehmenVideo aufnehmenSystemeigene Kamera verwenden
-
Ohne Verifizierung teilenAnfrage ignorierenAnonymisierte AnalysedatenFehlerberichtWarnung!Konferenzgespräche werden noch entwickelt und sind vielleicht nicht zuverlässig.
-
BefehlsfehlerUnbekanntes Kommando: %s
-
AusLautVerschlüsselte Nachricht
@@ -941,7 +865,6 @@
BeispielCommunity-IDBeispiel
-
StartseitePersonenRäume
@@ -999,7 +922,6 @@
%d aktives Widget%d aktive Widgets
-
Profilbild%d Mitgliedsänderung
@@ -1047,9 +969,9 @@
Um fortzufahren, bitte Passwort eingeben:Account deaktivierenDrittanbieter-Lizenzen
- Download
- Sprechen
- Leeren
+ Download
+ Sprechen
+ LeerenSchlüssel von deinen anderen Sitzungen erneut anfordern.Schlüsselanfrage gesendet.Anfrage gesendet
@@ -1156,7 +1078,7 @@
Formatiere Nachrichten mittels Markdown-Syntax, bevor sie gesendet werden. Dies erlaubt erweiterte Formatierungen wie Sternchen (*), um kursiven Text anzuzeigen.Lesebestätigungen zeigenKlicke auf die Lesebestätigungen für eine detailliertere Liste.
- Einladungen, Kicks und Banns bleiben unberührt.
+ Einladungen, Kicks und Banns werden weiterhin angezeigt.PasswortStarte die System-Kamera anstelle der angepassten Kamera.Diese Option erfordert eine externe Anwendung um Sprachnachrichten aufzuzeichnen.
@@ -1170,7 +1092,7 @@
Nutze den Standard-Klingelton von ${app_name} für eingehende AnrufeKlingelton für eingehende AnrufeWähle Klingelton für Anrufe:
- Akzeptieren
+ AkzeptierenBitte lese und akzeptiere die Richtlinien dieses Home-Servers:Tests ausführenLäuft… (%1$d von %2$d)
@@ -1243,7 +1165,7 @@
SchlüsselsicherungSchlüsselsicherung verwendenSchlüsselsicherung ist nicht abgeschlossen. Bitte warten…
- Überspringen
+ ÜberspringenFertigErweiterte BenachrichtigungseinstellungenAngepasste Einstellungen.
@@ -1341,8 +1263,8 @@
Sicher\?SicherungAlle verschlüsselten Nachrichten gehen verloren, wenn Du dich abmeldest ohne die Schlüssel gesichert zu haben.
- Bleiben
- Abbrechen
+ Bleiben
+ AbbrechenWirklich abmelden\?Wiederherstellung verschlüsselter NachrichtenBitte gib einen Benutzernamen ein.
@@ -1387,7 +1309,7 @@
Berechne Wiederherstellungsschlüssel…Lade Schlüssel herunter…Importiere Schlüssel…
- Ignorieren
+ IgnorierenMit Single-Sign-On anmeldenDiese URL ist nicht erreichbar, bitte prüfenDein Gerät nutzt eine veraltetes TLS-Sicherheitsprotokoll, das anfällig für Angriffe ist. Zu deiner Sicherheit wirst du nicht in der Lage sein, dich zu verbinden
@@ -1478,8 +1400,8 @@
RäumeDeine Räume werden hier angezeigt. Drück auf das + unten rechts, um bestehende zu durchstöbern oder neue zu eröffnen.Reaktionen
- Zustimmen
- Mag ich
+ Zustimmen
+ Mag ichReaktion hinzufügenReaktionen ansehenReaktionen
@@ -1574,12 +1496,12 @@
Beginne mit der Eingabe, um Ergebnisse zu erhaltenFiltern nach Benutzername oder ID…Raum betreten…
- Ablehnen
+ AblehnenApp-ID:
- Überprüfung
+ ÜberprüfungKeine
- Widerrufen
- Trennen
+ Widerrufen
+ TrennenKein Identitätsserver konfiguriert.Anruf aufgrund eines Serverfehlers fehlgeschlagenVersuche es mit %s
@@ -2016,21 +1938,12 @@
Initialisiere Cross-SigningSchlüssel zurücksetzenQR-Code
- Fast geschafft! Zeigt %s dasselbe Schild an\?
+ Fast geschafft! Zeigt %s ein Häkchen\?JaNeinVerbindung zum Server wurde unterbrochenEntwicklerwerkzeugeKontodaten
-
- %d Stimme
- %d Stimmen
-
-
- %d Stimme - Endergebnis
- %d Stimmen - Endergebnis
-
- Ausgewählte OptionErstellt eine einfache UmfrageNutze eine WiederherstellungsmethodeWenn du auf keine existierende Sitzung zugreifen kannst
@@ -2121,7 +2034,7 @@
%s setzenFehlerbehebung%s hat den Raum erstellt und konfiguriert.
- Fast geschafft! Zeigt das andere Gerät das gleiche Schild an\?
+ Fast geschafft! Zeigt das andere Gerät ein Häkchen an\?Fast geschafft! Warte auf Bestätigung…Verschlüsselte DirektnachrichtenNachricht…
@@ -2160,7 +2073,7 @@
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- oder einen anderen cross-signing-fähigen Matrix Client
+ oder einen anderen cross-signing-fähigen Matrix ClientNutze die neueste Version von ${app_name} auf deinen anderen Geräten:Erzwingt das Verwerfen der aktuell ausgehende Gruppensitzung in einem verschlüsseltem RaumWird nur in verschlüsselten Räumen unterstützt
@@ -2199,12 +2112,12 @@
Einladungen gesendet an %1$s und %2$d weitere BenutzerWir konnten den Benutzer nicht einladen. Bitte überprüfe den Benutzernamen, welchen du einladen möchtest und versuche es erneut.
- Pause
+ PauseKopierenBenachrichtigungen${app_name}-Anruf fehlgeschlagen
- Abspielen
- Ablehnen
+ Abspielen
+ AblehnenErfolgEchtzeitverbindung konnte nicht hergestellt werden.
\nBitte den Administrator deines Home-Servers, einen TURN-Server zu konfigurieren, dass Anrufe zuverlässig funktionieren.
@@ -2433,7 +2346,6 @@
Status-Ereignisse der Raummitglieder zeigenBezieht Einladungs-/Beitritts-/Verlassen-/Entfernen-/Verbannen-Ereignisse und Avatar-/Anzeigenamen-Wechsel mit ein.Umfrage
- Bot-SchaltflächenReagierte mit: %sDer Link war fehlerhaftDu bist nicht berechtigt, einen Anruf in diesem Raum zu starten
@@ -2441,7 +2353,7 @@
Kontodaten vom Typ %1$s löschen\?
\n
\nVorsicht! Es kann zu unerwartetem Verhalten führen.
- Zurücksetzen
+ ZurücksetzenPushempfang fehlgeschlagen. Lösung könnte eine Neuinstallation der Applikation sein.Die Applikation empfängt den PUSHDie Applikation wartet auf den PUSH
@@ -2658,7 +2570,7 @@
ZurückrufenDieser Anruf wurde beendet%1$s hat diesen Anruf abgelehnt
- Du hast diesen Anruf %s abgelehnt
+ Du hast diesen Anruf abgelehnt %sDu nimmst zur Zeit an diesem Anruf teil%1$s hat einen Anruf gestartetDu hast einen Anruf gestartet
@@ -2754,8 +2666,6 @@
Diese werden kein Teil von %s seinTritt meinem Space %1$s %2$s beiWillkommen zu %1$s, %2$s.
- Warnung: benötigt Server-Unterstützung und eine experimentelle Raumversion
- Experimenteller Space - Zugangsbeschränkter Raum.Mit Spaces kannst du Personen und Räume gruppieren.Sag hallo zu Spaces!Füge bereits existierende Räume und Spaces hinzu
@@ -2779,7 +2689,7 @@
Nur zu diesem RaumIn Space \"%s\" einladenLink teilen
- Mithilfe eines Benutzernamens einladen
+ Mithilfe eines Benutzernamens einladenMithilfe einer E-Mail-Adresse einladenPersonen einladenLade Personen in deinen Space ein
@@ -3002,7 +2912,7 @@
Du wirst alle Räume und Spaces in %s verlassen.Alle Räume und Spaces verlassenWillst du %s wirklich verlassen\?
- Mit Benutzername oder E-Mail einladen
+ Mit Benutzername oder E-Mail einladenZum ausgewählten Space hinzufügenErstelle Space…Hilfreiche Informationen zur Fehlersuche anzeigen
@@ -3066,9 +2976,31 @@
Raum verlassen!Heimserver auswählenEs konnte kein Heimserver mit der Adresse %s gefunden werden. Bitte überprüfe die Adresse oder wähle den Heimserver manuell.
- Untergeordneten Space hinzufügen
+ Untergeordneten Space hinzufügen.Bist du dir wirklich sicher, dass du diese Informationen senden willst\?E-Mail-Adressen und Telefonnummern an %s sendenNicht jetztAuf Benachrichtigungen warten
+ Externe Bibliotheken
+ Du kannst dies jederzeit in den Einstellungen deaktivieren
+ Wir teilen keine Informationen mit Drittpersonen
+ Wir erfassen und analysieren keine Accountdaten
+ Hilf uns dabei Probleme zu identifizieren und Element 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
+\nDu kannst alle unsere Bedingungen lesen %s.
+ Stelle sicher, dass die richtigen Personen Zugriff auf %s haben. Du kannst jederzeit weitere Personen einladen.
+ Wer ist Mitglied deines Teams\?
+ Der Identitätsserver gibt keine Bedingungen an
+ Bedingungen des Identitätsservers ausblenden
+ Bedingungen des Identitätsservers anzeigen
+ Systemeinstellungen
+ Versionen
+ Erhalte Hilfe bei der Bedienung von Element
+ Hilfe und Unterstützung
+ Hilfe
+ Rechtliches
+ Entscheide, welche Spaces Zugriff auf den Raum haben sollen. Die Mitglieder der Spaces können diesen Räumen beitreten.
+ hier
+ Hilf mit, Element zu verbessern
+ Aktivieren
\ No newline at end of file
diff --git a/vector/src/main/res/values-el/strings.xml b/vector/src/main/res/values-el/strings.xml
index 1ae7629feff..da46dab8e6c 100644
--- a/vector/src/main/res/values-el/strings.xml
+++ b/vector/src/main/res/values-el/strings.xml
@@ -38,7 +38,7 @@
Ο/Η %1$s δέχτηκε την πρόσκληση για το %2$s** Αδυναμία αποκρυπτογράφησης: %s **
- Η συσκευή του/της αποστολέα δεν μας έχει στείλει τα κλειδιά για αυτό το μήνυμα.
+ Η συσκευή του/της αποστολέα δεν μας έχει στείλει τα κλειδιά για αυτό το μήνυμα.Αποτυχία αποστολής μηνύματος
@@ -70,7 +70,7 @@
Ο/Η %1$s έστειλε μία πρόσκληση στον/στην %2$s για να εισέλθει στο δωμάτιοΔεν είναι δυνατή ακόμα η επανείσοδος σε ένα άδειο δωμάτιο.
- Ακύρωση
+ ΑκύρωσηΚλείσιμοΑπευθείας συνομιλίαΕυρετήριο
@@ -78,18 +78,17 @@
ΑρχείαΠαράλειψηΠροκειμένου να διαγνωστούν προβλήματα, τα αρχεία καταγραφής από αυτόν τον πελάτη θα σταλούν με αυτήν την αναφορά σφάλματος. Αν προτιμάτε να στείλετε μόνο το παραπάνω κείμενο, απενεργοποιήστε:
- Αποχώρηση
+ ΑποχώρησηΜηνύματα από botsΜόνιμος σύνδεσμοςΠαρακαλούμε περιγράψτε το σφάλμα. Τι κάνατε; Τι περιμένατε να συμβεί; Τι έγινε τελικά;
- Παράθεση
- Απόρριψη
- Αφαίρεση
- Αποστολή ξανά
+ Παράθεση
+ Απόρριψη
+ Αφαίρεση
+ Αποστολή ξανάΕυρετήριο
- Αποστολή
+ ΑποστολήΑποστολή πληροφοριών
- Έναρξη συνομιλίαςΟ διακομιστής είναι μη διαθέσιμος ή υπερφορτωμένοςΠροβολή αποκρυπτογραφημένου κώδικαΠροβολή κώδικα
@@ -109,7 +108,7 @@
Αναφορά σφάλματοςΠληροφορίες κοινότηταςΦόρτωση…
- Αποθήκευση
+ ΑποθήκευσηΚρυπτογραφημένο μήνυμαΑνοιχτόχρωμο θέμαΣκουρόχρωμο θέμα
@@ -117,9 +116,9 @@
Αποστολή αυτοκόλλητουΆδειες τρίτωνΑργότερα
- Μπροστά
- Διαγραφή
- Μετονομασία
+ Μπροστά
+ Διαγραφή
+ ΜετονομασίαΑναφορά περιεχομένουΕνεργή κλήσηΒίντεο
@@ -127,9 +126,9 @@
Αυτή η ενέργεια δεν είναι δυνατή λόγω ελλιπών δικαιωμάτων.Πληροφορίες συσκευήςή
- Πρόσκληση
+ ΠρόσκλησηΕκτός σύνδεσης
- Αποδοχή
+ ΑποδοχήΈξοδοςΕνέργειεςΑποσύνδεση
@@ -139,7 +138,7 @@
Σημείωση όλων ως αναγνωσμένωνΓρήγορη απάντησηΆνοιγμα
- Απενεργοποίηση
+ ΑπενεργοποίησηΕπιβεβαίωσηΣφάλμαΑγαπημένα
@@ -359,22 +358,22 @@
Είστε σίγουρος;Δημιουργία αντίγραφου ασφαλείαςΘα χάσετε την πρόσβαση στα κρυπτογραφημένα μηνύματά σας, εκτός εάν δημιουργήσετε αντίγραφα ασφαλείας των κλειδιών σας πριν αποσυνδεθείτε.
- Αφαίρεση
- Κατεβάστε
- Διαμοιρασμός
- Καθαρισμός
- Ανάκληση
- Αποσύνδεση
- Παύση
+ Αφαίρεση
+ Κατεβάστε
+ Διαμοιρασμός
+ Καθαρισμός
+ Ανάκληση
+ Αποσύνδεση
+ ΠαύσηПрямі повідомлення
- Απόρριψη
+ ΑπόρριψηΑπόρριψηΑποδοχή
- Ανασκόπηση
- Αγνοείστε
- Διακόψτε
+ Ανασκόπηση
+ Αγνοείστε
+ ΔιακόψτεΟλοκληρώθηκε
- Παραλείψτε
+ ΠαραλείψτεΣτείλτε ούτως ή άλλωςΚαλέστε ούτως ή άλλωςΟι κλήσεις συνδιάσκεψης δεν υποστηρίζονται σε κρυπτογραφημένες αίθουσες
@@ -391,11 +390,11 @@
Δεν έχετε άδεια να ξεκινήσετε μια κλήση συνδιάσκεψηςΔεν έχετε άδεια να ξεκινήσετε μια κλήση συνδιάσκεψης σε αυτήν την αίθουσαΧρειάζεστε άδεια για να προσκαλέσετε να ξεκινήσει μια διάσκεψη σε αυτήν την αίθουσα
- Επαναφορά
- Απόρριψη
- Παίξε
+ Επαναφορά
+ Απόρριψη
+ ΠαίξεΚανένα
- Παραμείνατε
+ ΠαραμείνατεH δημιουργία αντιγράφων κλειδιού ασφαλείας θα πρέπει να είναι ενεργή σε όλες τις συνεδρίες σας για να αποφύγετε την απώλεια πρόσβασης στα κρυπτογραφημένα μηνύματά σας.Επαναφόρτωση γραφικού στοιχείουΑποτυχία φόρτωσης γραφικού στοιχείου
@@ -561,7 +560,7 @@
\nΗ ορατότητα μηνυμάτων δουλεύει σαν το ηλεκτρονικό ταχυδρομείο. Το να ξεχαστούν τα μηνύματα σημαίνει οτι μηνύματα τα οποία έχετε στείλει δεν θα σταλούν σε νέους ή μη-εγγεγραμμένους χρήστες, αλλα εγγεγραμμένοι χρήστες οι οποίοι έχουν ήδη πρόσβαση σε αυτά τα μηνύματα θα μπορούν ακόμα να τα δούν.Λησμόνηση δωματίουΑυτό το δωμάτιο έχει αντικατασταθεί και δεν είναι πια ενεργό
- Μιλήστε
+ ΜιλήστεΠαράβλεψηΑποσύνδεσηΔεν εμπιστεύομαι
@@ -594,13 +593,6 @@
ΡυθμίσειςΛεπτομέρειες ΔωματίουΚΑΛΕΣΜΕΝΟΣ/Η
- Πληκτρολογείστε ταυτότητα (ID) δωματίου ή ψευδώνυμο δωματίου
- Ένταξη στο δωμάτιο
- Δημιουργία δωματίου
- ΠΡΟΣΚΛΗΣΕΙΣ
- ΧΑΜΗΛΗ ΠΡΟΤΕΡΑΙΟΤΗΤΑ
- ΔΩΜΑΤΙΑ
- ΣΥΜΜΕΤΟΧΗΗ αναζήτηση σε κρυπτογραφημένα δωμάτια δεν υποστηρίζεται ακόμα.ΑΡΧΕΙΑΜΗΝΥΜΑΤΑ
diff --git a/vector/src/main/res/values-en-rGB/strings.xml b/vector/src/main/res/values-en-rGB/strings.xml
index 76003bbc698..eaa0d1f8ec3 100644
--- a/vector/src/main/res/values-en-rGB/strings.xml
+++ b/vector/src/main/res/values-en-rGB/strings.xml
@@ -4,7 +4,6 @@
Filter favouritesRemove from favouritesAdd to favourites
- FAVOURITESSynchronising Self Signing keySynchronising User keySynchronising Master key
diff --git a/vector/src/main/res/values-eo/strings.xml b/vector/src/main/res/values-eo/strings.xml
index c8f0f5fd029..e9dd8ea0878 100644
--- a/vector/src/main/res/values-eo/strings.xml
+++ b/vector/src/main/res/values-eo/strings.xml
@@ -14,7 +14,7 @@
%1$s nuligis inviton por %2$s%1$s ŝanĝis sian profilbildon** Ne eblas malĉifri: %s **
- La aparato de la sendinto ne sendis al ni la ŝlosilojn por tiu mesaĝo.
+ La aparato de la sendinto ne sendis al ni la ŝlosilojn por tiu mesaĝo.%1$s: %2$s%1$s ŝanĝis sian prezentan nomon al %2$s%1$s ŝanĝis sian prezentan nomon de %2$s al %3$s
@@ -227,24 +227,24 @@
Permesiloj de eksteraj liverantojEnlegante…Bone
- Nuligi
- Konservi
- Eliri
- Sendi
- Resendi
- Forigi
- Citi
- Elŝuti
- Kunhavigi
- Paroli
- Forviŝi
+ Nuligi
+ Konservi
+ Eliri
+ Sendi
+ Resendi
+ Forigi
+ Citi
+ Elŝuti
+ Kunhavigi
+ Paroli
+ ForviŝiPoste
- Plusendi
+ PlusendiFiksligiloVidi fontonVidi malĉifritan fonton
- Forigi
- Alinomi
+ Forigi
+ AlinomiDetaloj pri anoHistoriaRaporti enhavon
@@ -261,7 +261,7 @@
Informoj pri salutaĵoTamen sendiaŭ
- Inviti
+ InvitiEksterreteEliriAgoj
@@ -285,7 +285,6 @@
AgordojPERSONOJDOSIEROJ
- ALIĜIPersonojĈambrojNeniuj uzantoj
@@ -305,26 +304,26 @@
Ĉu vi certas\?SavkopiiVi perdos aliron al viaj ĉifritaj mesaĝoj, se vi ne savkopios viajn ŝlosilojn antaŭ adiaŭo.
- Resti
+ RestiNeniu
- Senvalidigi
- Malkonekti
+ Senvalidigi
+ MalkonektiVi bezonas permeson inviti por komenci grupan vokon en ĉi tiu ĉambroGrupaj vokoj ne estas subtenataj de ĉifrataj ĉambroj
- Akcepti
- Preterpasi
+ Akcepti
+ PreterpasiFinite
- Ĉesigi
- Malatenti
- Kontroli
- Rifuzi
+ Ĉesigi
+ Malatenti
+ Kontroli
+ RifuziAdiaŭiĈu vi certe volas adiaŭi\?Marki ĉion legitaHistoriaMarki legitaKopiiĝis al tondujo
- Malŝalti
+ MalŝaltiKonfirmoAvertoEraro
@@ -482,13 +481,6 @@
Neniuj rezultojĈAMBROJMESAĜOJ
- ELSTARIGITAJ
- ĈAMBROJ
- INVITOJ
- Komenci babilon
- Krei ĉambron
- Aliĝi al ĉambro
- Aliĝi al ĉambro%d ĉambro%d ĉambroj
@@ -638,10 +630,10 @@
JESNEDaŭrigi
- Forigi
- Aliĝi
- Antaŭrigardi
- Rifuzi
+ Forigi
+ Aliĝi
+ Antaŭrigardi
+ RifuziListigi ĉambranojnSpegulante…Vi estis invitita al ĉi tiu ĉambro de %s
@@ -725,9 +717,9 @@
Malfermi agordojnAgordoj de konto.Sciigoj estas ŝaltitaj por via konto.
- Ludi
- Paŭzigi
- Eksigi
+ Ludi
+ Paŭzigi
+ EksigiVi ne havas permeson ekigi grupan vokon en ĉi tiu ĉambroGrupa voko jam daŭras!Komenci grupan vidvokon
@@ -803,7 +795,6 @@
Atendante…Rezulto de kontroloReagis per: %s
- Butonoj de robotojEnketoGlumarkoDosiero
@@ -1139,8 +1130,8 @@
ReagojVidi reagojnAldoni reagon
- Ŝati
- Konsenti
+ Ŝati
+ KonsentiReagojViaj ĉambroj montriĝos ĉi tie. Tuŝetu al la «+» dekstre sube por trovi jam ekzistantajn, aŭ fari viajn proprajn.Ĉambroj
@@ -1878,8 +1869,6 @@
%1$s ĉambro trovita por %2$s%1$s ĉambroj trovitaj por %2$s
- Entajpu identigilon de ĉambro aŭ kromnomon de ĉambro
- MALALTA PRIORITATOSerĉado en ĉifritaj ĉambroj ankoraŭ en estas subtenata.Filtri forbaritajn uzantojnAkceptu la atestilon nur se administranto de la servilo publikigis fingrospuron akordan kun tiu ĉi-supre.
@@ -1986,7 +1975,7 @@
Vi ne havas permeson komenci vokonVi ne havas permeson komenci vokon en ĉi tiu ĉambroVi ne havas permeson komenci grupan vokon
- Restarigi
+ RestarigiListo de ĉambrojReplenigu per via %s por konfirmi ĝin.Pretigi delegajn subskribojn
@@ -2140,7 +2129,7 @@
Por daŭrigi, necesas via %1$s aŭ via %2$s.Subtenata nur en ĉifritaj ĉambrojUzu la plej freŝan version de ${app_name} per aliaj viaj aparatoj:
- aŭ alian klienton de Matrix kapablan je delegaj subskriboj
+ aŭ alian klienton de Matrix kapablan je delegaj subskriboj${app_name} iOS
\n${app_name} Android${app_name} Web (por TTT)
@@ -2232,15 +2221,6 @@
Se vi ne povas aliri jaman salutaĵonUzi rehavan pasfrazon aŭ ŝlosilonFaras simplan enketon
- Elektita elekteblo
-
- %d voĉo – finaj rezultoj
- %d voĉoj – finaj rezultoj
-
-
- %d voĉo
- %d voĉoj
- Ĉu forigi la datumojn de konto de la speco «%1$s»\?
\n
\nForu tion zorge, ĝi povus kaŭzi neatenditan konduton.
@@ -2361,7 +2341,6 @@
Inkluzivigi la ĉambron en katalogo de ĉambrojSerĉante tra katalogo…Foliumi katalogon
- KATALOGOKATALOGO DE UZANTOJ (%s)Katalogo de uzantojLa ĉambro ankoraŭ ne kreiĝis. Ĉu nuligi kreadon de la ĉambro\?
@@ -2663,8 +2642,6 @@
Administri ĉambrojnĈu vi serĉas iun, kiu ne estas en %s\?%s invitas vin
- Averto: bezonas subtenon de servilo kaj eksperimentan version de ĉambro
- Eksperimenta aro – limigita ĉambro.Vi estas invititaAroj prezentas novan manieron grupigi ĉambrojn kaj personojn.Bonvenu al aroj!
@@ -2694,7 +2671,7 @@
Oni povos esplori en %sInviti al %sHavigi ligilon
- Inviti per uzantonomo
+ Inviti per uzantonomoInviti per retpoŝtoNun ĉeestas nur vi. %s eĉ pli bonos kun aliuloj.Inviti al %s
@@ -2877,7 +2854,7 @@
Foriri de ĉiuj ĉambroj kaj arojĈu vi certe volas foriri de %s\?Trovado (%s)
- Inviti laŭ uzantonomo aŭ retpoŝtadreso
+ Inviti laŭ uzantonomo aŭ retpoŝtadresoAldoni al la aroAktiva voko (%1$s) ·
diff --git a/vector/src/main/res/values-es-rMX/strings.xml b/vector/src/main/res/values-es-rMX/strings.xml
index b96e90fbe2a..44d3704a532 100644
--- a/vector/src/main/res/values-es-rMX/strings.xml
+++ b/vector/src/main/res/values-es-rMX/strings.xml
@@ -43,34 +43,26 @@
%1$s aceptó la invitación de %2$s** No se puede descifrar: %s **
- El dispositivo del remitente no nos ha enviado las claves de este mensaje.
+ El dispositivo del remitente no nos ha enviado las claves de este mensaje.
-
No se pudo redactarNo se puede enviar el mensajeLa subida de la imagen falló
-
Error de la redError de Matrix
-
-
-
-
No es posible volver a unirse a una sala vacía.
-
Correo electrónicoNúmero telefónico%1$s envió una calcomanía.
-
Invitación de %sInvitación de Sala%1$s y %2$s
@@ -86,29 +78,27 @@
Mensaje eliminado por %1$sMensaje eliminado [motivo: %1$s]Mensaje eliminado por %1$s [motivo: %2$s]
-
MensajesSalaConfiguracionesDetalles de los miembrosHistorial
-
OK
- Cancelar
- Guardar
- Salir
- Enviar
- Reenviar
- Borrar
- Citar
- Compartir
+ Cancelar
+ Guardar
+ Salir
+ Enviar
+ Reenviar
+ Borrar
+ Citar
+ CompartirLuego
- Reenviar
+ ReenviarEnlace PermanenteVer FuenteVer Fuente Descifrada
- Borrar
- Renombrar
+ Borrar
+ RenombrarReportar contenidoLlamada activaLlamada de conferencia en proceso.\nUnirse con %1$s o %2$s.
@@ -122,8 +112,7 @@
Las llamadas de conferencia no se pueden realizar en salas cifradasEnviar de todos modoso
- Invitar
-
+ InvitarCerrar la sesiónLlamada de VozLlamada de Video
@@ -134,31 +123,25 @@
AbrirCerrarCopiado
- Desactivar
-
+ DesactivarConfirmaciónAdvertencia
-
HomeFavoritosPersonasSalas
-
Filtrar salasFiltrar favoritosFiltrar personasFiltrar salas
-
InvitacionesPrioridad baja
-
ConversacionesLibreta local de direccionesSolamente contactos MatrixSin conversacionesNo ha permitido a ${app_name} acceder a sus contactos localesSin resultados
-
SalasDirectorio de salasSin salas
@@ -194,7 +177,6 @@
Comenzar Llamada de videoEnviar archivosTomar foto o video
-
Iniciar sesiónCrear cuentaEntregar
@@ -238,7 +220,6 @@
Un correo fue enviado a %s. Una vez que sigas el enlace, seleccione abajo.Falló la verificación de correo electrónico: asegúrese de haber hecho clic en el correoSu contraseña fue actualizada.\n\nHaz sido desconectado de todos tus dispositivos y las notificaciones están apagadas. Para encender las notificaciones, entre su cuenta en cada dispositivo.
-
El enlace sólo puede comenzar con http[s]://Sesión falló: Error con la redSesión falló
@@ -253,28 +234,20 @@
Demasiadas peticiones enviadasEste nombre de usuario ya está reservado para otra personaEl enlace que no siguió
-
-
Lista de Recibos de Lectura
-
-
Enviar como OriginalGrandeMedianoChico
-
"¿Cancelar la descarga?¿Cancelar la subida?%d s%1$dm %2$ds
-
AyerHoy
-
Nombre de la SalaTema de la Sala
-
Llamada conectadaLa llamada se está conectando…Llamada finalizada
@@ -287,10 +260,8 @@
Conexión de media fallóLa cámara no se pudo encenderllamada fue contestada en otra parte
-
Tomar una foto o grabar un video"No pudo grabar video"
-
Información${app_name} necesita tu permiso para entrar en tu almacenaje de fotos y videos para enviar y guardar archivos.\n\nPor favor permite el acceso en el siguiente mensaje para poder enviar archivos desde su dispostivo.${app_name} necesita tu permiso para usar tu cámara para tomar fotos y hacer llamadas de video.
@@ -303,30 +274,24 @@
¿Permitir el acceso a ${app_name} para leer tus contactos ?Perdón. Operación no realizada debido a permisos faltantes
-
Guardado¿Guardar en Descargas\?SÍNOContinuar
-
- Retirar
- Entrar
- Preestreno
- Rechazar
-
+ Retirar
+ Entrar
+ Preestreno
+ RechazarSaltar al primer mensaje no leído.
-
Has sido invitado por %s a entrar a esta salaEsta invitación fue enviado a %s, que no esta asociado con esta cuenta.\nTal vez desea entrar con otra cuenta, o añadir este correo electrónico a esta cuenta.Estás intentando entrar a %s. ¿Desea entrar para participar en la conversación?una salaEsto es un preestreno de esta sala. Los interacciones están impedidos.
-
Chat NuevoAñadir miembro1 miembro
-
Salir de la sala¿Estás seguro que quieres salir de la sala?¿Estás seguro que quieres quitar a %s de este chat?
@@ -353,14 +318,12 @@
Mostrar lista de dispositivosNo podrás deshacer este cambio porque estás provocando que el usuario tenga el mismo poder que el tuyo.\n¿Estás seguro?"¿Estás seguro que quieres invitar a %s que entre en este chat?"
-
Invitado por IDCONTACTOS LOCALES (%d)Solmente usuarios de MatrixInvitar usuario por IDIngrese una o varias direcciones de correo o ID MatrixCorreo o ID Matrix
-
Buscar%s está escribiendo…%1$s & %2$s están escribiendo…
@@ -376,7 +339,6 @@
Borrar mensajes no enviadosNo se pudo encontrar el archivoNo tienes permiso para enviar en esta sala
-
ConfiarNo confiarSalir
@@ -388,7 +350,6 @@
El certificado cambio de el que confiaba tu dispositivo. Esto es MUY RARO. Se recomienda que no aceptes el certificado nuevo.El certificado cambio de uno que confiaba tu dispositivo a un certificado desconfiado. El servidor posiblemente actualizo su certificado. Pongase en contacto con el administrador de el servidor para la huella esperada.SOLAMENTE acepta el certificado de arriba si coincide con el certificado que publicó el administrador de el servidor.
-
Detalles de la SalaPersonasArchivos
@@ -396,13 +357,11 @@
Identificación malformada. Debe ser correo electrónico o identificación de Matrix como \'@localpart:domain\'INVITADOENTRO
-
Razón por reportar este contenido¿Desea ocultar todos los mensajes de este usuario\?
\nConsidere que esta acción reiniciará la aplicación y tardar un tiempo.Cancelar SubidaCancelar Descarga
-
BuscarBuscar miembrosNo hay resultados
@@ -410,28 +369,13 @@
MENSAJESPERSONASARCHIVOS
-
- ENTRAR
- DIRECTORIO
- FAVORITOS
- SALAS
- BAJA PRIORIDAD
- INVITACIONES
- Comenzar chat
- Crear sala
- Unirse a la sala
- Unirse a una sala
- Type a room id or a room alias
-
Buscar directorioBuscando directorio…
-
DestacarDespriorizarChat DirectoSalir de la ConversacionForget
-
MensajesConfiguracionesVersión
@@ -439,7 +383,6 @@
Avisos de partidos tercerosDerechos de autorPolíticas de privacidad
-
Foto de PerfilNombre VisibleCorreo Electrónico
@@ -467,7 +410,6 @@
Derechos de autorPolíticas de privacidadBorrar memoria cache
-
Configuraciones de UsuarioNotificacionesUsuarios ignorados
@@ -520,37 +462,29 @@
Escribe un código de activaciónError en la validación de tu número telefónicoCódigo
-
-
Foto de la SalaNombre de la SalaTemaEtiqueta de la SalaEtiquetado como:
-
DestacarBaja prioridadNinguno
-
Acceso y VisibilidadInscribir esta sala en el directorio de salasAcceso a la SalaHistorial y Legibilidad de la Sala¿Quien puede leer el historial?¿Quien puede entrar a la sala?
-
TodosSolamente miembros (desde seleccionar esta opción)Solamente miembros (desde su invitación)Solamente miembros (desde entrar a la sala)
-
Para hacer enlace a una sala debe tener una dirección.Solamente los invitadosLos que saben el enlace de esta sala, excepto húespedesLos que saben el enlace de la sala, incluso húespedes
-
Usuarios prohibidos
-
AvanzadoLa identificación interna de esta salaDirecciones
@@ -561,7 +495,6 @@
Necesitas salir de tu cuenta para encender el cifrado.Cifrar solamente para dispositivos verificadosNunca enviar mensajes cifrados a dispositivos no verificados en esta sala de este dispositivo.
-
Esta sala no tiene direcciones localesDirección nueva (e.g #foo:matrix.org")Formato de alias no válido
@@ -575,11 +508,8 @@
La cifración está encendida en esta sala.La cifración está apagada en esta sala.Encender cifración \n(¡Aviso: no se puede apagar!)
-
Directorio
-
%s estuvo intentando cargar un punto especifico en el historial de esta sala pero no lo pudo encontrar.
-
Información de la cifración de Persona-a-PersonaInformación de eventosIdentificación de usuario
@@ -621,26 +551,23 @@
Para verificar que este dispositivo es confiable, por favor contacte el dueño de este dispositivo por otro medio (e.g. cara-a-cara o por llamada) y verifique que la clave de este dispositivo que ellos ven en su página de configuraciones coincide con el de abajo:Si coinciden, seleccione Verificar. Si no, otro esta interceptando este dispositivo y vas a querer bloquearlo.\nEn el futuro, este procceso será mas sofisticado.Verifico que las claves coinciden
-
Esta sala contiene dispositivos desconocidosEsta sala contiene dispositivos desconocidos que no se han verificado.
Esto significa que no se garantiza que los dispositivos pertenezcan a las personas que dicen de que son.
Recomendamos que los verifiques todos antes de continuar. Sin embargo, puedes reenviar el mensaje sin verificarlos si prefieres.
Dispositivos desconocidos:
-
Select a room directoryThe server may be unavailable or overloadedType a homeserver to list public rooms fromHomeserver URLAll rooms on %s serverAll native %s rooms
-
Search for historicalSincronizando…Cargando…
- Descargar
- Hablar
+ Descargar
+ HablarDesconectadoSalirAcciones
@@ -705,7 +632,7 @@ Dispositivos desconocidos:Detectar eventosNotificaciones ruidosasNotificaciones silenciosas
- Borrar
+ BorrarDebido a que faltan permisos, esta acción no es posible.Informe de errorDetalles sobre la comunidad
diff --git a/vector/src/main/res/values-es/strings.xml b/vector/src/main/res/values-es/strings.xml
index bf41e3c6d12..b04b2c472c5 100644
--- a/vector/src/main/res/values-es/strings.xml
+++ b/vector/src/main/res/values-es/strings.xml
@@ -39,24 +39,16 @@
%1$s invitó a %2$s a unirse a la sala%1$s aceptó la invitación para %2$s** No es posible descifrar: %s **
- El dispositivo emisor no nos ha enviado las claves para este mensaje.
-
+ El dispositivo emisor no nos ha enviado las claves para este mensaje.No se pudo redactarNo es posible enviar el mensajeNo se pudo cargar la imagen
-
Error de redError de Matrix
-
-
-
-
Actualmente no es posible volver a unirse a una sala vacía.
-
Dirección de correo electrónicoNúmero telefónico%1$s envió una pegatina.
-
Invitación de %sInvitación a Sala%1$s y %2$s
@@ -270,29 +262,27 @@
Videoconferencia terminada por %1$sHas empezado una videoconferenciaVideoconferencia empezada por %1$s
-
MensajesSalaAjustesDetalles de MiembroHistórico
-
Correcto
- Cancelar
- Guardar
- Salir
- Enviar
- Reenviar
- Eliminar
- Citar
- Compartir
+ Cancelar
+ Guardar
+ Salir
+ Enviar
+ Reenviar
+ Eliminar
+ Citar
+ CompartirMás Tarde
- Reenviar
+ ReenviarEnlace PermanenteVer FuenteVer Fuente Descifrada
- Eliminar
- Renombrar
+ Eliminar
+ RenombrarReportar contenidoLlamada activaLlamada de conferencia en curso.
@@ -307,8 +297,7 @@
No se admiten llamadas de conferencia en salas cifradasEnviar de Todos Modoso
- Invitar
-
+ InvitarCerrar sesiónLlamada de VozLlamada de Vídeo
@@ -319,31 +308,25 @@
AbrirCerrarCopiado al portapapeles
- Deshabilitar
-
+ DeshabilitarConfirmaciónAdvertencia
-
InicioFavoritosPersonasSalas y Grupos
-
Filtrar salasFiltrar favoritosFiltrar personasFiltrar salas
-
InvitacionesPrioridad baja
-
ConversacionesAgenda de contactos localSolo contactos de MatrixNo hay conversacionesNo permitiste que ${app_name} acceda a tus contactos localesNo hay resultados
-
SalasDirectorio de salasNo hay salas
@@ -379,7 +362,6 @@
Iniciar Llamada de VídeoEnviar archivosTomar foto o vídeo
-
Iniciar sesiónCrear cuentaEnviar
@@ -427,7 +409,6 @@
Tu contraseña fue restablecida.
\n
\nSe ha cerrado sesión en todas tus sesiones y ya no recibirás notificaciones push. Para volver a habilitar las notificaciones, vuelve a iniciar sesión en cada dispositivo.
-
La URL debe comenzar con http[s]://No es posible iniciar sesión: Error de redNo es posible iniciar sesión
@@ -442,28 +423,20 @@
Se enviaron demasiadas solicitudesEste nombre de usuario ya está en usoEl enlace del correo electrónico que aún no se ha seguido
-
-
Lista de Recibos de Lectura
-
-
Enviar como OriginalGrandeMedianoPequeño
-
"¿Cancelar la descarga?¿Cancelar la subida?%d s%1$dmin %2$dseg
-
AyerHoy
-
Nombre de la salaTema de la sala
-
Llamada conectadaConectando llamada…Llamada finalizada
@@ -476,10 +449,8 @@
Falló la Conexión de MediosNo se puede iniciar la cámarallamada contestada en otra parte
-
Tomar una foto o un vídeoNo se puede grabar vídeo
-
Información${app_name} necesita permiso para acceder a tu biblioteca de fotos y vídeos para enviar y guardar archivos adjuntos.
\n
@@ -502,31 +473,25 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
\n
\n¿Permitir que ${app_name} acceda a tus contactos \?Lo sentimos. Acción no realizada, debido a que faltan permisos
-
Guardado¿Guardar en descargas?SÍNOContinuar
-
- Eliminar
- Unirse
- Vista Previa
- Rechazar
-
+ Eliminar
+ Unirse
+ Vista Previa
+ RechazarMensajes no leídos.
-
Has sido invitado por %s a unirte a esta salaEsta invitación fue enviada a %s, que no esta asociado a esta cuenta.
\nQuizás quieras iniciar sesión con otra cuenta, o añadir este correo electrónico a esta cuenta.Estás intentando acceder a %s. ¿Quieres unirte para participar en la discusión?una salaEsta es una vista previa de esta sala. Las interacciones dentro de la sala se han deshabilitado.
-
Nueva ConversaciónAñadir miembro1 miembro
-
Salir de la sala¿Seguro que quieres salir de la sala?¿Seguro que quieres eliminar a %s de esta conversación?
@@ -554,14 +519,12 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
No podrás deshacer este cambio porque estás ascendiendo al usuario al mismo nivel de autoridad que tú.
\n¿Estás seguro\?¿Seguro que quieres invitar a %s a esta conversación?
-
Invitar por IDCONTACTOS LOCALES (%d)Solo usuarios de MatrixInvitar usuario por IDPor favor, ingresa una o más direcciones de correo electrónico o ID de MatrixCorreo electrónico o ID de Matrix
-
Buscar%s está escribiendo…%1$s y %2$s están escribiendo…
@@ -577,7 +540,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Eliminar mensajes no enviadosArchivo no encontradoNo tienes permiso para publicar en esta sala
-
ConfiarNo confiarCerrar Sesión
@@ -589,7 +551,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
El certificado cambió de uno que era confiable para tu teléfono. Esto es MUY INUSUAL. Se recomienda NO ACEPTAR este nuevo certificado.El certificado cambió de uno que era confiable a uno que no es confiable. El servidor puede haber renovado su certificado. Contacta al administrador del servidor para obtener la huella digital.Solo acepta el certificado si el administrador del servidor ha publicado una huella digital que coincide con la anterior.
-
Detalles de SalaPersonasArchivos
@@ -597,14 +558,12 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
ID mal formada. Debería ser una dirección de correo electrónico o una ID de Matrix como \'@partelocal:dominio\'INVITADOSSE UNIERON
-
Motivo para reportar este contenido¿Quieres ocultar todos los mensajes de este usuario\?
\n
\nTen en cuenta que esta acción reiniciará la aplicación y puede tardar algo de tiempo.Cancelar SubidaCancelar Descarga
-
BuscarFiltrar miembros de la salaNo hay resultados
@@ -612,28 +571,13 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
MENSAJESPERSONASARCHIVOS
-
- UNIRSE
- DIRECTORIO
- FAVORITOS
- SALAS
- PRIORIDAD BAJA
- INVITACIONES
- Iniciar conversación
- Crear sala
- Unirse a la sala
- Unirse a una sala
- Escribe una ID o alias de sala
-
Explorar directorioBuscando directorio…
-
Agregar a FavoritosDejar de priorizarConversación DirectaSalir de la ConversaciónOlvidar
-
MensajesAjustesVersión
@@ -641,7 +585,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Avisos de tercerosDerechos de autorPolítica de privacidad
-
Imagen de PerfilNombre PúblicoCorreo Electrónico
@@ -669,7 +612,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Derechos de autorPolítica de privacidadBorrar caché
-
Ajustes de usuarioNotificacionesUsuarios ignorados
@@ -725,37 +667,29 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Ingresa un código de activaciónError en la validación de tu número telefónicoCódigo
-
-
Imagen de SalaNombre de SalaTemaEtiqueta de SalaEtiquetado como:
-
Agregar a FavoritosPrioridad bajaNinguno
-
Acceso y visibilidadListar esta sala en el directorio de salasAcceso a SalaLegibilidad del Historial de la Sala¿Quién puede leer el historial?¿Quién puede acceder a esta sala?
-
TodosSolo miembros (desde el momento en que se selecciona esta opción)Solo miembros (desde que fueron invitados)Solo miembros (desde que se unieron)
-
Para crear un enlace a una sala, debe tener una dirección.Solo personas que han sido invitadasCualquier persona que conozca el enlace a esta sala, excepto invitadosCualquier persona que conozca el enlace a esta sala, incluyendo invitados
-
Usuarios vetados
-
AvanzadoLa ID interna de esta salaDirecciones
@@ -766,7 +700,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Necesitas cerrar sesión para poder habilitar el cifrado.Cifrar solo a sesiones verificadasNunca enviar mensajes cifrados a sesiones sin verificar en esta sala desde esta sesión.
-
Esta sala no tiene direcciones localesDirección nueva (ej. #foo:matrix.org)Formato de alias inválido
@@ -781,11 +714,8 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
El cifrado está deshabilitado en esta sala.Habilitar cifrado
\n(advertencia: ¡no se puede volver a deshabilitar!)
-
Directorio
-
%s estaba intentando cargar un momento específico en la línea de tiempo de esta sala pero no pudo encontrarlo.
-
Información de cifrado Extremo-a-ExtremoInformación de eventosID de Usuario
@@ -829,21 +759,18 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Para verificar que esta sesión es confiable, por favor contacta a su dueño por algún otro medio (ej. cara a cara o por teléfono) y pregúntale si la clave que ve en sus Ajustes de Usuario para esta sesión coincide con la clave a continuación:Si coincide, presione el botón de verificar a continuación. Si no coincide, entonces alguien está interceptando esta sesión y probablemente debería prohibirlo. En el futuro, este proceso de verificación será más sofisticado.Verifico que las claves coinciden
-
La sala contiene sesiones desconocidasEsta sala contiene sesiones desconocidas que no han sido verificadas.
\nEsto significa que no hay garantía de que las sesiones pertenezcan a los usuarios a los que dicen pertenecer.
\nRecomendamos que hagas el proceso de verificación por cada sesión antes de continuar. Pero puedes reenviar el mensaje sin verificarlas si prefieres.
\n
\nSesiones desconocidas:
-
Selecciona un directorio de salasEl servidor puede estar no disponible o sobrecargadoEscribe un servidor doméstico desde donde listar las salas públicasNombre del servidorTodas las salas en el servidor %sTodas las salas nativas de %s
-
Buscar en el historialInterfaz de usuarioIdioma
@@ -889,7 +816,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
La creación del componente fallóCrear llamadas de conferencia con jitsi¿Seguro que quieres eliminar el widget de esta sala\?
-
No es posible crear el componente.El envío de la solicitud falló.El nivel de autoridad debe ser un número entero positivo.
@@ -900,19 +826,15 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
La sala %s no está visible.Añadir aplicaciones de MatrixUtilizar cámara nativa
-
Has añadido una nueva sesión \'%s\', que está solicitando claves de cifrado.Tu sesión sin verificar \'%s\' está solicitando claves de cifrado.Iniciar verificaciónCompartir sin verificarIgnorar solicitud
-
¡Advertencia!Las llamadas de conferencia están en desarrollo y pueden no ser confiables.
-
Error de comandoComando no reconocido: %s
-
DesactivadoRuidosoMensaje cifrado
@@ -950,7 +872,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
EjemploID de Comunidadejemplo
-
InicioPersonasSalas
@@ -1010,7 +931,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
%d componente activo%d componentes activos
-
Enviar una pegatinaActualmente no tienes ningún paquete de stickers habilitado.
\n
@@ -1040,7 +960,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
• Las notificaciones no mostrarán el contenido del mensajeDesactivar cuentaDesactivar mi cuenta
- Descargar
+ DescargarSí, ¡quiero ayudar!Conceder permisoEnviar audio
@@ -1051,10 +971,10 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Elige otra opciónFalta un parámetro requerido.Solicitud enviada
- Conversar
+ ConversarPor favor, inicia ${app_name} en otro dispositivo que pueda descifrar el mensaje para que pueda enviar las claves a esta sesión.Licencias de terceros
- Borrar
+ Borrarcontinuar con…Lo sentimos, no se encontró ninguna aplicación externa para completar esta acción.Volver a solicitar las claves de cifrado de tus otras sesiones.
@@ -1144,7 +1064,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
expandircolapsarLlamar de todos modos
- Aceptar
+ AceptarPor favor revisa y acepta las reglas de este servidor doméstico:LlamadasUsar el tono de llamada normal de ${app_name} para llamadas entrantes
@@ -1167,11 +1087,11 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
¿Estás seguro\?Copia de seguridadPerderá el acceso a sus mensajes cifrados si cierra sesión sin hacer una copia de seguridad de sus claves.
- Quedarse
- Saltar
+ Quedarse
+ SaltarHecho
- Cancelar
- Ignorar
+ Cancelar
+ IgnorarMarcar como leídoIniciar sesión con un solo registroTu dispositivo usa una versión anticuada e insegura del protocolo de seguridad TLS. Por tu seguridad no puedes conectarte
@@ -1492,8 +1412,8 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
SalasTus salas se mostrarán aquí. Pulsa el botón + abajo a la derecha para buscar o crear salas propias.Reacciones
- De acuerdo
- Me gusta
+ De acuerdo
+ Me gustaAñadir reacciónVer reaccionesReacciones
@@ -1528,10 +1448,10 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Por favor escriba su sugerencia a continuación.Describa su sugerencia aquíNinguno
- Revocar
- Desconectar
- Revisar
- Declinar
+ Revocar
+ Desconectar
+ Revisar
+ DeclinarNo se ha configurado un servidor de identidad.La llamada ha fallado por un servidor mal configuradoIntente usar %s
@@ -1777,9 +1697,9 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
La dirección de coreo electrónico no está asociada a ninguna cuenta.Reiniciar contraseña en %1$s¡Las claves ya están al día!
- Reproducir
- Pausar
- Descartar
+ Reproducir
+ Pausar
+ DescartarCopiarCorrectoNotificaciones
@@ -1966,7 +1886,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Modo Avión ActivadoHerramientas de desarrolloDatos de cuenta
- Seleccionar OpcionNuevo inicio de sesiónAdvertencia:Eliminar…
@@ -2226,14 +2145,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
%1$s (%2$s) iniciado sesión con una nueva sesión:Hasta que este usuario confíe en esta sesión, los mensajes enviados hacia y desde ella se etiquetan con advertencias. Alternativamente, puede verificarlo manualmente.¡Casi ahí! ¿Es %s muestra el mismo escudo\?
-
- %d voto
- %d votos
-
-
- %d voto - Resultados finales
- %d votos - Resultados finales
- Crea una encuesta simpleUse una contraseña o clave de recuperaciónSi no puede acceder a una sesión existente
@@ -2342,7 +2253,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
\n${app_name} de escritorio${app_name} iOS
\n${app_name} Android
- u otro cliente Matrix con capacidad de firma cruzada
+ u otro cliente Matrix con capacidad de firma cruzadaUtilice la última versión de ${app_name} en sus otros dispositivos:Obliga a descartar la sesión de grupo saliente actual en una sala cifradaSolo se admite en salas cifradas
@@ -2438,7 +2349,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
\n
\nTus mensajes están asegurados con un candado. Solo tú y tú destinatario tenéis las llaves especiales para descifrarlos.Los mensajes aquí no están cifrados Extremo-a-Extremo.
- Botones de BotEncuestaEliminar de baja prioridadAñadir a Baja prioridad
@@ -2461,7 +2371,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
No posee permisos para iniciar una llamadaNo posee permisos para iniciar una llamada en esta salaNo posee permisos para iniciar una conferencia
- Resetear
+ ResetearDescartar cambiosHay cambios sin salvar. ¿Descartar los cambios\?La sala todavía no ha sido creada. ¿Cancelar la creación\?
@@ -2615,7 +2525,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
SugeridoHacer este espacio publico%s te invita
- Espacio Experimental - Sala Restringida.Estas invitadoAñadir salasSalir de este espacio
@@ -2626,7 +2535,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Sólo a esta salaInvitar a %sCompartir enlace
- Invitar por nombre de usuario
+ Invitar por nombre de usuarioInvitar por correo electrónicoInvitar a %sInvitar gente a tu espacio
@@ -2854,7 +2763,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Gestionar salas y espaciosGestionar salas¿Buscas a alguien que no está en %s\?
- Los avisos requieren soporte del servidor y una versión de sala experimentalAñade salas y espacios existentesEres el único administrador de este espacio. Dejarlo significará que nadie tiene control sobre él.No podrás volver a unirte a menos que te vuelvan a invitar.
@@ -2930,7 +2838,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua
Invitar por correo electrónico, buscar contactos y más…Terminé de configurar el descubrimiento.Actualmente no está utilizando un servidor de identidad. Para invitar a compañeros de equipo y ser detectado por ellos, configure uno a continuación.
- Invitar por nombre de usuario o correo
+ Invitar por nombre de usuario o correoAsegúrate que las personas adecuadas tengan acceso a %s. Puede invitar a más persona más tarde.¿Quiénes son tus compañeros de equipo\?Agregar al espacio dado
diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml
index 894eec751bb..2863162ac13 100644
--- a/vector/src/main/res/values-et/strings.xml
+++ b/vector/src/main/res/values-et/strings.xml
@@ -44,7 +44,7 @@
%1$s võttis tagasi jututoaga liitumise kutse kasutajalt %2$s%1$s võttis vastu kutse %2$s nimel** Ei õnnestu dekrüptida: %s **
- Sõnumi saatja seade ei ole selle sõnumi jaoks saatnud dekrüptimisvõtmeid.
+ Sõnumi saatja seade ei ole selle sõnumi jaoks saatnud dekrüptimisvõtmeid.Ei saanud muuta sõnumitSõnumi saatmine ei õnnestunudPildi üleslaadimine ei õnnestunud
@@ -296,28 +296,28 @@
Kolmandate osapoolte litsentsidLaeme…Sobib
- Tühista
- Salvesta
- Lahku
- Jää
- Saada
- Saada uuesti
- Eemalda
- Tsiteeri
- Laadi alla
- Jaga
- Räägi
- Eemalda
+ Tühista
+ Salvesta
+ Lahku
+ Jää
+ Saada
+ Saada uuesti
+ Eemalda
+ Tsiteeri
+ Laadi alla
+ Jaga
+ Räägi
+ EemaldaHiljem
- Edasta
+ EdastaPüsiviideLähtekoodNäita dekrüptitud lähtekoodi
- Kustuta
- Muuda nime
+ Kustuta
+ Muuda nimeEi midagi
- Tunnista kehtetuks
- Katkesta ühendus
+ Tunnista kehtetuks
+ Katkesta ühendusTeata kahtlasest sisustKõne on käsilKonverentsikõne on käsil.
@@ -334,15 +334,15 @@
Helista siiskiSaada ikkagivõi
- Kutsu
+ KutsuVõrgust väljas
- Võta vastu
- Jäta vahele
+ Võta vastu
+ Jäta vaheleValmis
- Katkesta
- Eira
- Vaata üle
- Keeldu
+ Katkesta
+ Eira
+ Vaata üle
+ KeelduVäljuTegevusedLogi välja
@@ -357,7 +357,7 @@
AvaSulgeKopeeritud lõikelauale
- Lülita välja
+ Lülita väljaKinnitusHoiatusViga
@@ -508,9 +508,9 @@
Ei sisaldanud korrektset JSON\'itLiiga palju samaaegseid sisselogimispäringuidSee kasutajanimi on juba kasutusel
- Esita
- Peata
- Loobu
+ Esita
+ Peata
+ LoobuKopeeriÕnnestusTeavitused
@@ -597,10 +597,10 @@
JAHEIJätka
- Eemalda
- Liitu
- Eelvaade
- Hülga
+ Eemalda
+ Liitu
+ Eelvaade
+ HülgaSünkroniseerin…Mine lugemata sõnumite juurdeSa oled kutsutud siia jututuppa %s poolt
@@ -636,16 +636,6 @@
SÕNUMIDINIMESEDFAILID
- LIITU
- LEMMIKUD
- JUTUTOAD
- VÄHETÄHTIS
- KUTSED
- Alusta vestlust
- Loo jututuba
- Liitu jututoaga
- Liitu jututoaga
- Sisesta jututoa tunnus, nimi või aliasSirvi kataloogiOtsevestlusVAATA
@@ -787,8 +777,8 @@
Verifitseerimisprotsess aegusSinu jututoad kuvatakse siin. Olemasolevate jututubade leidmiseks või uute tegemiseks klõpsi all paremal nurgas asuvat + nuppu.Reageerimised
- Nõus
- Meeldib
+ Nõus
+ MeeldibLisa reaktsioonReageerimisedSõnum on kustutatud
@@ -1209,7 +1199,6 @@
EiraSõrmejälg (%s):Serveri õigsust ei olnud võimalik kontrollida.
- LOENDLahenda teavitustega seotud viguVigade tuvastamineKäivita testid
@@ -2243,15 +2232,6 @@
Lennurežiim on kasutuselArendaja töövahendidKasutajakonto andmed
-
- %d hääl
- %d häält
-
-
- %d hääl - lõplikud tulemused
- %d häält - lõplikud tulemused
-
- Tehtud valikLoob lihtsa hääletuseKasuta taastamiseks mõeldud paroolifraasi või võtitKui sa ei pääse ligi olemasolevale sessioonile
@@ -2336,7 +2316,7 @@
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- või mõnda teist Matrix\'i klienti, mis oskab risttunnustamist
+ või mõnda teist Matrix\'i klienti, mis oskab risttunnustamistKasuta oma muus seadmes kõige uuemat ${app_name}\'i versiooni:Sunnib loobuma praeguse krüptitud jututoa rühmavestluse seansistFunktsionaalsus on toetatud ainult krüptitud jututubades
@@ -2371,7 +2351,6 @@
Näita jututoa liikmete olekusündmusiSealhulgas kutsumisi, liitumisi, lahkumisi, müksamisi, keelamisi ning tunnuspildi ja kuvatava nime muutusi.Küsitlus
- RobotinupudReageeris: %sVerifitseerimise tulemusLink oli vigane
@@ -2431,7 +2410,7 @@
Otsi suhtluskeelu saanud kasutajaidSul ei ole õigusi siin jututoas helistamiseksSul ei ole piisavalt õigusi, et selles jututoas alustada konverentsikõnet
- Taasta algolek
+ Taasta algolekLoobu muudatustestSa oled teinud muudatusi, mis on veel salvestamata. Kas soovid muudatustest loobuda\?See jututuba on veel loomata. Kas katkestame selle tegevuse\?
@@ -2673,8 +2652,6 @@
SaadanJututubade kataloogSõnum on saadetud
- Hoiatus: eeldab serveripoolset tuge ning katselise jututoa versiooni kasutamist
- Katseline kogukonnakeskus - ligipääs on piiratud.Sa oled saanud kutseKogukonnakeskused on uus võimalus siduda jututubasid ja inimesi.Tere tulemast kasutama kogukonnakeskuseid!
@@ -2700,7 +2677,7 @@
Nad saavad tutvuda %s kogukonnakeskusegaKutse kasutajale %sJaga linki
- Kutsu kasutajanime alusel
+ Kutsu kasutajanime aluselSaada kutse e-kirjagaHetkel oled siin vaid sina. Aga %s läheb aina paremaks, kui teised liituvad.Kutsu teisi kasutajaid
@@ -2959,7 +2936,7 @@
Kutsu e-posti aadressi alusel, leia tuttavaid, jne…Lõpeta leitavuse seadistamine.Hetkel sa ei kasuta isikutuvastusserverit. Kaaslastele kutse saatmiseks ning end teistele leitavaks tegemiseks palun seadista ta alljärgnevalt.
- Kutsu kasutajanime või e-posti aadressi alusel
+ Kutsu kasutajanime või e-posti aadressi aluselKontrolli, et vajalikel inimestel oleks ligipääs %s kogukonda. Teistele võid kutse saata ka hiljem.Kes on su kaasteelised\?Lisa näidatud kogukonnakeskusesse
@@ -3032,4 +3009,52 @@
Selleks et leida tuttavaid, sa peaksid saatma oma kontaktteavet (telefoninumbreid ja/või e-posti aadresse) siin rakenduses seadistatud isikutuvastusserverile. Parema andmeturvalisuse nimel me ei saada teavet mitte loetava tekstina, vaid räsina.Kas sa oled nõus selle teabe edastamisega\?Mitte praegu
+ Hääletatud
+ Kas sa oled kindel, et soovid küsitlust kustutada\? Seda tegevust sa ei saa hiljem tagasi pöörata.
+ Kustuta küsitlus
+ Küsitlus on lõppenud
+ Võta küsitlused kasutusele
+ Lõpeta küsitlus
+ Sellega ei saa enam keegi oma arvamust avaldada ning kuvame lõplikud tulemused.
+ Kas lõpetame selle küsitluse\?
+ Lõpeta küsitlus
+
+ %1$d\'l häälel põhinev lõpptulemus
+ %1$d\'l häälel põhinev lõpptulemus
+
+
+ Juba on %1$d hääletanu. Tulemuste nägemiseks pead hääletama
+ Juba on %1$d hääletanut. Tulemuste nägemiseks pead hääletama
+
+
+ Põhineb %1$d\'l häälel
+ Põhineb %1$d\'l häälel
+
+
+ %1$d hääl
+ %1$d häält
+
+ Süsteemiseadistused
+ Versioonid
+ Element\'i kasutamiseks vajalik abiteave
+ Abiteave ja kasutajatugi
+ Abiteave
+ Juriidiline teave
+ Sellel serveril puuduvad kasutustingimused.
+ Sinu isikutuvastusserveri kasutustingimused
+ Kolmandate osapoolte litsentsid
+ Sinu koduserveri kasutustingimused
+ ${app_name} kasutustingimused
+ Seadistustest saad alati määrata, et see funktsionaalsus pole kasutusel
+ Meie ei jaga teavet kolmandate osapooltega
+ Meie ei salvesta ega profileeri sinu kasutajakonto andmeid
+ siit
+ Võimalike vigade leidmiseks ja Element\'i arendamiseks jaga meiega anonüümseid andmeid. Selleks, et mõistaksime, kuidas kasutajad erinevaid seadmeid pruugivad me loome sinu seadmetele ühise juhusliku tunnuse.
+\n
+\nMeie kasutustingimused leiad siit - %s.
+ Aita Element\'i arendamisel
+ Võta kasutusele
+ Muudatuste jõustamiseks käivita rakendus uuesti.
+ Kasuta LaTeX-vorminduses matemaatika märgistust
+ Sul pole luba selle jututoaga liitumiseks
\ No newline at end of file
diff --git a/vector/src/main/res/values-eu/strings.xml b/vector/src/main/res/values-eu/strings.xml
index 8963d3e40c5..21777ffe6cd 100644
--- a/vector/src/main/res/values-eu/strings.xml
+++ b/vector/src/main/res/values-eu/strings.xml
@@ -43,7 +43,7 @@
%1$s erabiltzaileak %2$s gelarako gonbidapena onartu du** Ezin izan da deszifratu: %s **
- Igorlearen gailuak ez dizkigu mezu honetarako gakoak bidali.
+ Igorlearen gailuak ez dizkigu mezu honetarako gakoak bidali.Ezin izan da kenduEzin izan da mezua bidali
@@ -142,21 +142,21 @@
HistorialaAdos
- Utzi
- Gorde
- Atera
- Bidali
- Birbidali
- Kendu
- Aipua
- Partekatu
+ Utzi
+ Gorde
+ Atera
+ Bidali
+ Birbidali
+ Kendu
+ Aipua
+ PartekatuGeroago
- Birbidali
+ BirbidaliEsteka iraunkorraIkusi iturburuaIkusi deszifratutako iturburua
- Ezabatu
- Aldatu izena
+ Ezabatu
+ Aldatu izenaSalatu edukiaDei aktiboaKonferentzia deia abian.
@@ -171,7 +171,7 @@
Konferentzia deiak ez daude onartuta zifratutako geletanBidali hala ereedo
- Gonbidatu
+ GonbidatuAmaitu saioaAhots deia
@@ -183,7 +183,7 @@
IrekiItxiArbelera kopiatuta
- Desgaitu
+ DesgaituBerrespenaAbisua
@@ -368,10 +368,10 @@ Baimendu sarbidea hurrengo laster-leihoan deia egin ahal izateko.EZJarraitu
- Kendu
- Elkartu
- Aurreikusi
- Baztertu
+ Kendu
+ Elkartu
+ Aurreikusi
+ BaztertuJauzi irakurri gabeko lehen mezura.
@@ -489,18 +489,6 @@ Kontuan izan ekintza honek aplikazioa berrabiaraziko duela eta denbora bat behar
JENDEAFITXATEGIAK
- ELKARTU
- DIREKTORIOA
- GOGOKOAK
- GELAK
- LEHENTASUN BAXUA
- GONBIDAPENAK
- Hasi txata
- Sortu gela
- Elkartu gelara
- Elkartu gela batetara
- Idatzi gelaren IDa edo ezizena
-
Arakatu direktorioaDirektorioa bilatzen…
@@ -784,7 +772,6 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.Sortu konferentzia deiak Jitsi bidezZiur trepeta ezabatu nahi duzula gela honetatik?
-
Ezin izan da trepeta sortu.Eskariaren bidalketak huts egin du.Botere maila osoko zenbaki positibo bat izan behar da.
@@ -803,22 +790,18 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.Erabili kamera natiboa
-
\'%s\' saio berria gehitu duzu, eta zifratze-gakoak eskatzen ari da.Egiaztatu gabeko zure \'%s\' saioa zifratze-gakoak eskatzen ari da.Hasi egiaztaketaPartekatu egiaztatu gabeEzikusi eskaria
-
Abisua!Konferentzia deiak garapenean daude eta agian ez dabiltza behar bezala.
-
Komandoaren erroreaKomando ezezaguna: %s
-
EzZaratatsua
@@ -873,7 +856,6 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.Komunitatearen IDaadibidea
-
HasieraJendeaGelak
@@ -946,7 +928,6 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.%d trepeta aktibo
-
Hartzailearen abatarraJakinarazpen abatarraAbatarra
@@ -998,9 +979,9 @@ Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ah
Jarraitzeko, sartu zure pasahitza:Hirugarrengoen lizentziak
- Deskargatu
- Hitz egin
- Garbitu
+ Deskargatu
+ Hitz egin
+ GarbituEskatu berriro zifratze-gakoak zure beste saioetatik.Gako eskaria bidalita.
@@ -1153,7 +1134,7 @@ Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ah
Markdown aktibatu da.Markdown desaktibatu da.
- Onartu
+ OnartuIrakurri eta onartu hasiera-zerbitzari honen baldintzak:
@@ -1246,7 +1227,7 @@ Hurrengo pantailan ${app_name}-i bigarren planoan aritzeko baimena eskatuko zaiz
Erabili gakoen babes-kopiaGakoen babes-kopia ez da amaitu, itxaron mesedez…
- Saltatu
+ SaltatuEginaJakinarazpenen ezarpen aurreratuak
@@ -1373,9 +1354,9 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.Zerbitzua hasieratzenZure mezu zifratuetara sarbidea galduko duzu ez baduzu gakoen babes-kopia egiten saioa amaitu aurretik.
- Geratu
- Abortatu
- Ezikusi
+ Geratu
+ Abortatu
+ EzikusiZiur saioa amaitu nahi duzula\?Hasi saioa Single sign-on bidez
@@ -1560,8 +1541,8 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.Zure gelak hemen bistaratuko diraErreakzioak
- Ados
- Gogokoa
+ Ados
+ GogokoaGehitu erreakzioaIkusi errekzioakErreakzioak
@@ -1676,10 +1657,10 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.Ikusi edizioen historialaBat ere ez
- Indargabetu
- Deskonektatu
- Berrikusi
- Ukatu
+ Indargabetu
+ Deskonektatu
+ Berrikusi
+ UkatuEz da identitate-zerbitzaririk konfiguratu.
@@ -2233,15 +2214,6 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.Erabiltzaile-izenaGarapen tresnakKontuaren datuak
-
- boto %d
- %d boto
-
-
- boto %d - Azken emaitza
- %d boto - Azken emaitza
-
- Hautatutako aukeraInkesta sinplea sortzen duErabili berreskuratze metodo batEzin baduzu badagoen saio bat erabili
@@ -2417,7 +2389,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- edo zeharka sinatzeko gaitasuna duen beste Matrix bezero bat
+ edo zeharka sinatzeko gaitasuna duen beste Matrix bezero batErabili azken ${app_name} bertsioa zure beste gailuetan:Uneko irteerako talde saioa zifratutako gela batean baztertzera behartzen duZifratutako gelatan onartzen da soilik
diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml
index 353db01f32a..b3d5c00f2f5 100644
--- a/vector/src/main/res/values-fa/strings.xml
+++ b/vector/src/main/res/values-fa/strings.xml
@@ -45,7 +45,7 @@
%1$s دعوت پیوستن به اتاق %2$s را باطل کرد%1$s دعوت برای %2$s را پذیرفت** ناتوان در رمزگشایی: %s **
- دستگاه فرستنده، کلیدهای این پیام را برایمان نفرستاده است.
+ دستگاه فرستنده، کلیدهای این پیام را برایمان نفرستاده است.ناتوان در فرستادن پیامشکست در بارگذاری تصویرخطای شبکه
@@ -229,17 +229,17 @@
گزارش اشکالدر حال بارگذاری…باشه
- لغو
- ذخیره
- ترک کردن
- ارسال
- ارسال دوباره
- نقل قول
- همرسانی
+ لغو
+ ذخیره
+ ترک کردن
+ ارسال
+ ارسال دوباره
+ نقل قول
+ همرسانیبعداًمشاهده منبع
- حذف
- تغییر نام
+ حذف
+ تغییر نامگزارش محتواتماس فعالصوتی
@@ -247,7 +247,7 @@
اطّلاعات نشستبه هر حال ارسال کنیا
- دعوت
+ دعوتآفلاینخروجخروج از حساب
@@ -259,7 +259,7 @@
گشودنبستندر کلیپبورد کپی شد
- غیرفعال
+ غیرفعالهشدارخانهاتاقها
@@ -330,7 +330,7 @@
به هر حال تماس بگیرنمیتوان تماس را آغاز کردنمیتوان تماس را شروع کرد، لطفاً بعداً تلاش نمایید
- پذیرفتن
+ پذیرفتنکنشهاتاییدخطا
@@ -399,10 +399,10 @@
نهدر دانلودها ذخیره شود؟ادامه
- برداشتن
- پیوستن
- پیشنمایش
- رد کردن
+ برداشتن
+ پیوستن
+ پیشنمایش
+ رد کردنفهرست اعضاتماس برقرار شددر حال برقراری تماس…
@@ -454,19 +454,19 @@
دعوتترک این اتاقحذف از این اتاق
- ماندن
- برداشتن
- بارگیری
+ ماندن
+ برداشتن
+ بارگیریکنفرانس در حال برگذاری است.
\nبه صورت %1$s یا %2$s به آن بپیوندیدبه خاطر نداشتن مجوز دسترسی، برخی امکانات ممکن است در دسترس نباشند…به خاطر نداشتن مجوز دسترسی، این اقدام ممکن نیست.برای آغاز کنفرانس نیاز به دسترسی دعوت اعضا داریدتماس گروهی در اتاقهای رمزنگاری شده پشتیبانی نمیشود
- رد شدن
+ رد شدنانجام شد
- انصراف
- نادیدهگرفتن
+ انصراف
+ نادیدهگرفتنمطمئنید که میخواهید از حسابتان خارج شوید؟علامتگذاری به عنوان خوانده شدهورود با سامانههای احراز هویت مرکزی
@@ -489,9 +489,9 @@
پشتیبانگیریدر صورت عدم پشتیبانگیری از کلیدهای خود پیش از خروج، دسترسی شما به پیامهای رمزنگاری شده از بین میرود.گواهینامههای شخص ثالث
- صحبت
- پاک کردن
- هدایت
+ صحبت
+ پاک کردن
+ هدایتپیوند دائمیمشاهده منبع رمزگشایی شدهتاریخی
@@ -507,9 +507,9 @@
لطفاً المنت را روی افزارهای دیگر که میتواند پیام را رمزگشایی کند، اجرا کنید تا بتواند کلیدها را به این نشست بفرستد.فهرست رسیدهای خواندنآیا مطمئن هستید؟
- قطع اتصال
- بررسی
- نپذیرفتن
+ قطع اتصال
+ بررسی
+ نپذیرفتندوباره از من نپرسرایانامهای برای بازیابی تنظیم کرده تا بتوانید در صورت نیاز، از طریقش به دست افرادی که میشناسید، قابل کشف باشید.ثبت شماره تلفن (بعدا در صورت دلخواه می توانید از آن برای شناسایی دوستان خود استفاده کنید).
@@ -519,7 +519,6 @@
فرستادن یک پاسخ (رمزنشده)…پالایش اعضای اتاقاتاقها
- اتاقها%d اتاق%d اتاق
@@ -674,8 +673,8 @@
اتاقهااتاقهایتان اینجا نشان داده خواهند شد. برای یافتن موارد موجود یا ایجاد خودتان روی + در پایین سمت راست بزنید.بازخودها
- موافقت
- پسند
+ موافقت
+ پسندافزودن بازخورددیدن بازخوردهابازخوردها
@@ -766,7 +765,7 @@
ابزارهای توسعهتأیید نشستهیچ
- ابطال
+ ابطالهیچ کارساز هویتی پیکربندی نشده.تماس به دلیل پیکربندی بد کارساز، شکست خورداز %s استفاده کنید
@@ -849,12 +848,12 @@
گذرواژهتنظیماتگذرواژهٔ حساب
- پخش
- توقف
+ پخش
+ توقفرونوشتموفقیتآگاهیها
- خاتمه
+ خاتمهاجازهٔ شروع تماس کنفرانسی در این اتاق را نداریداجازهٔ شروع تماس در این اتاق را نداریدکنفرانسی در حال اجراست!
@@ -940,16 +939,6 @@
جستوجوافرادپروندهها
- پیوستن
- شاخه
- محبوبها
- کماهمیت
- دعوتها
- شروع گپ
- ایجاد اتاق
- پیوستن به اتاق
- پیوستن به یک اتاق
- شناسهٔ اتاق یا نام مستعارش را بنویسیدمرور شاخهجستوجو کردن شاخه…تمام پیامها (پرصدا)
@@ -1367,7 +1356,6 @@
پروندهبرچسبنظرسنجی
- دکمههای باتواکنش داده با: %sنتیجهگیری تأییددر حال انتظار…
@@ -1448,15 +1436,6 @@
اتّصال به کارساز از دست رفتحالت هواپیما روشن استدادههای حساب
-
- %d رأی
- %d رأی
-
-
- %d رأی - نتایج نهایی
- %d رأی - نتایج نهایی
-
- انتخاب گزیدهایجاد نظرسنجیای سادهاستفاده از یک کلید یا عبارت بازیابیاگر به نشستهای موجود دسترسی ندارید
@@ -1606,7 +1585,7 @@
برای ادامه از %1$s یا %2$sتان استفاده کنید.پشتیبانیشده فقط در اتاقهای رمزشدهاز آخرین نگارش المنت روی دیگر افزارهتان استفاده کنید:
- یا دیگر کارههای ماتریکس دادای قابلیت ورود چندگانه
+ یا دیگر کارههای ماتریکس دادای قابلیت ورود چندگانهتأیید دستی با متنتأیید ورود جدیدی که به حسابتان دسترسی دارد: %1$sتأیید همهٔ نشستهایتان برای اطمینان از این که حساب و پیامهایتان امنند
@@ -1690,7 +1669,7 @@
پیکربندی آگاهیهااجازهٔ آغاز یک تماس را نداریداجازهٔ آغاز یک تماس کنفرانسی را ندارید
- بازنشانی
+ بازنشانیانتخاب گزینهی دیگرمجوز دادنالمنت می تواند در پسزمینه اجرا شده تا آگاهیهایتان را به صورت ایمن و محرمانه مدیریت کند. ممکن است بر مصرف باتری تأثیر بگذارد.
@@ -2673,8 +2652,6 @@
نمایشها همهی اتاقهافهرست اتاقهاپیام فرستاده شد
- هشدار: نیاز به پشتیبانی کارساز و نگارش اتاق آزمایشی
- فضای آزمایشی - اتاق محدود.دعوت شدهایدفضاها شیوهای جدید برای گروهبندی اتاقها و افراد است.به فضاها خوش آمدید!
@@ -2700,7 +2677,7 @@
آنها قادر به کاوش در %s خواهند بوددعوت به %sبه اشتراکگذاری لینک
- دعوت با شناسهکاربری
+ دعوت با شناسهکاربریدعوت با ایمیلدر حال حاضر فقط شما هستید. %s با دیگران حتی بهتر خواهد بود.دعوت افراد
@@ -2960,7 +2937,7 @@
پایان برپا سازی کشف.همگروهیهایتان کیند؟در حال حاضر از کارساز هویتی استفاده نمیکنید. برای دعوت همگروهیها و قابل کشف بودن به دستشان، در پایین یکی پیکربندی کنید.
- دعوت با نام کاربری یا نامه
+ دعوت با نام کاربری یا نامهمطمئن شوید افراد درستی به %s دسترسی دارند. بعداً میتوانید تفراد بیشتری را دعوتکنید.افزودن به فضای داده شدهایجاد کردن فضا…
@@ -3032,4 +3009,53 @@
با فرستادن این اطّلاعات موافقید؟اکنون نهبرای کشف آشنایان موجود، لازم است اطلاعات آشنایان (رایانامهها و شماره تلفنها) را به کارساز هویتتان بفرستید. برای محرمانگیتان، دادههایتان را پیش از فرستادن، در هم میریزیم.
+ با همرسانی دادهّای استفادهٔ ناشناس، در تشخیص مشکلها و بهبود المنت یاریمان کنید. برای درک چگونگی استفادهٔ مردم از چندین افزاره، شناسهای کاتورهای بین افزارههایتان همرسانی خواهیم کرد.
+\n
+\nمیتوانید از %s قوانینمان را بخوانید.
+ مطمئنید که می خواهید این نظرسنجی را بردارید؟ پس از این کار، قادر به بازگردانیش نیستید.
+ برداشتن نظرسنجی
+ نظرسنجی پایان یافت
+ رأی داده شد
+ به کار انداختن نظرسنجیها
+ پایان نظرسنجی
+ این کار اجازهٔ رأی دادن افراد را پایان داده و نتیجهٔ نهایی نظرسنجی را نمایش خواهد داد.
+ پایان این نظرسنجی؟
+ گزینهٔ غالب
+ پایان نظرسنجی
+
+ نتیجهٔ نهایی بر مبنای %1$d رأی
+ نتیجهٔ نهایی بر مبنای %1$d رأی
+
+
+ رأیی داده نشده
+ %1$d رأی داده شده. برای دیدن نتیجه، رأی دهید
+
+
+ بر مبنای %1$d رأی
+ بر مبنای %1$d رأی
+
+
+ %1$d رأی
+ %1$d رأی
+
+ تنظیمات سامانه
+ نگارشها
+ کمک در استفاده از المنت
+ کمک و پشتیانی
+ کمک
+ موارد حقوقی
+ این کارساز هیچ سیاستی فراهم نکرده.
+ کتابخانههای سوم شخص
+ سیاست کارساز هویتتان
+ سیاست کارساز خانگیتان
+ سیاست ${app_name}
+ میتوانید هر زمان، در تنظیمات خاموشش کنید
+ ما اطّلاعات را با سومشخصها همرسانی نمیکنیم
+ ما هیچ دادهٔ حسابی را ذخیره یا نمایه نمیکنیم
+ اینجا
+ کمک به بهبود المنت
+ به کار انداختن
+ برای اثربخشی تغییر، برنامه را دوباره اجرا کنید.
+ به کار انداختن ریاضیات لاتک
+ مجاز به پیوستن به این گروه نیستید
\ No newline at end of file
diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml
index 2137cfff602..5b02d9244a7 100644
--- a/vector/src/main/res/values-fi/strings.xml
+++ b/vector/src/main/res/values-fi/strings.xml
@@ -38,7 +38,7 @@
%1$s lähetti liittymiskutsun huoneeseen käyttäjälle %2$s%1$s hyväksyi kutsun käyttäjän %2$s puolesta** Salauksen purku epäonnistui: %s **
- Lähettäjän laite ei ole lähettänyt avaimia tähän viestiin.
+ Lähettäjän laite ei ole lähettänyt avaimia tähän viestiin.Viestin lähetys epäonnistuiKuvan lataaminen epäonnistuiVerkkovirhe
@@ -48,9 +48,7 @@
PuhelinnumeroTakaisinveto epäonnistui%1$s: %2$s
-
Kutsu käyttäjältä %s
-
Huonekutsu%1$s ja %2$sTyhjä huone
@@ -208,32 +206,27 @@
%1$s loi huoneenLähetit tarran.Lähetit kuvan.
-
ViestitHuoneAsetuksetJäsenen tiedotHistoriallinen
-
OK
- Peruuta
- Tallenna
- Poistu
- Lähetä
- Lähetä uudelleen
- Poista
-
- Lainaa
- Jaa
+ Peruuta
+ Tallenna
+ Poistu
+ Lähetä
+ Lähetä uudelleen
+ Poista
+ Lainaa
+ JaaMyöhemmin
- Lähetä edelleen
+ Lähetä edelleenPysyvä linkkiLähdekoodiNäytä salaamaton lähde
-
-
- Poista
- Nimeä uudelleen
+ Poista
+ Nimeä uudelleenIlmoita epäilyttävästä sisällöstäPuhelu meneilläänRyhmäpuhelu meneillään.
@@ -248,8 +241,7 @@
Ryhmäpuhelut eivät ole tuettuja salatuissa huoneissaLähetä siltitai
- Kutsu
-
+ KutsuKirjaudu ulosÄänipuheluVideopuhelu
@@ -260,31 +252,25 @@
AvaaSuljeKopioitu leikepöydälle
- Poista käytöstä
-
+ Poista käytöstäVahvistusVaroitus
-
KotiSuosikitIhmisetHuoneet
-
Suodata huoneistaSuodata suosikeistaSuodata henkilöistäSuodata huoneista
-
KutsutMatala prioriteetti
-
KeskustelutPaikalliset yhteystiedotAinoastaan Matrix-yhteyshenkilötEi keskusteluitaEt ole sallinut ${app_name}ille pääsyä paikallisiin yhteystietoihisiEi tuloksia
-
HuoneetHuoneluetteloEi huoneita
@@ -314,17 +300,12 @@
Kirjaudu ulosKotipalvelimen URL-osoiteIdentiteettipalvelimen URL-osoite
-
Etsi
-
-
Aloita uusi keskusteluAloita puheluAloita videopuhelu
-
Lähetä tiedostojaOta kuva tai video
-
Kirjaudu sisäänLuo tiliLähetä
@@ -361,23 +342,19 @@
Käyttäjätunnus on jo käytössäKotipalvelin:Identiteettipalvelin:
-
Olen varmistanut sähköpostiosoitteeniPalauttaaksesi salasanasi, anna tiliisi liitetty sähköpostiosoite:Anna tiliisi liitetty sähköpostiosoite.Anna uusi salasana.Osoitteeseen %s on lähetetty sähköposti. Kun olet avannut siinä olevan linkin, paina alla olevaa nappia.
-
Sähköpostiosoitteesi vahvistaminen epäonnistui. Varmista, että klikkasit sähköpostissa olevaa linkkiäSalasanasi on vaihdettu.\n\nSinut on kirjauduttu ulos kaikista laitteistasi, etkä enää saa viesti-ilmoituksia. Ottaaksesi käyttöön ilmoitukset uudelleen, kirjaudu sisään uudelleen kaikilla laitteillasi.
-
URL-osoitteen on alettava seuraavasti: http[s]://Kirjautuminen epäonnistui: VerkkovirheKirjautuminen epäonnistuiRekisteröityminen epäonnistui: VerkkovirheRekisteröityminen epäonnistuiRekisteröityminen epäonnistui: sähköpostin varmistaminen epäonnistui
-
Syötäthän toimivan osoitteenVäärä käyttäjätunnus tai salasanaAnnettua tunnistetta ei hyväksytty
@@ -386,29 +363,20 @@
Liian monta pyyntöäKäyttäjänimi on jo käytössäSähköpostiisi lähetetty linkki, jota ei ole vielä klikattu
-
-
-
Lukukuittaukset
-
-
Valitse kokoAlkuperäinenIsoKeskikokoinenPieni
-
Peru lataus?Peru lähetys?%d s%1$d min %2$d s
-
EilenTänään
-
Huoneen nimiHuoneen aihe
-
YhdistettyYhdistetään…Puhelu loppui
@@ -418,17 +386,11 @@
Saapuva puheluPuhelu käynnissä…Toinen puoli ei vastannut.
-
Mediayhteys epäonnistuiKameran alustus epäonnistuipuheluun vastattiin muualta
-
-
Ota kuva tai video"
-
Videointi epäonnistui
-
-
Huomio${app_name} tarvitsee käyttöluvan mediagalleriaasi lähettäkseen liitteitä.\n\nSalli tiedostojen käyttö seuraavalla näytöllä liittääksesi kuvia ja muita tiedostoja viesteihin.${app_name} tarvitsee käyttöluvan kameraan ottaakseen kuvia ja suorittakseen videopuheluita.
@@ -447,32 +409,25 @@
\n
\nSaako ${app_name} käyttää yhteystietojasi tätä varten\?Toimenpide epäonnistui puuttuvien käyttölupien takia
-
TallennettuTallenna latauskansioon\?KYLLÄEIJatka
-
- Poista
- Liity
- Esikatsele
- Hylkää
-
+ Poista
+ Liity
+ Esikatsele
+ HylkääSiirry ensimmäiseen lukemattomaan viestiin.
-
%s on kutsunut sinut huoneeseenTämä kutsu lähetettiin osoitteeseen %s, jota ei ole liitetty tiliisi.
\nVoit kirjautua sisään toisella tilillä tai lisätä tämän sähköpostiosoitteen tiliisi.Olet avaamassa huonetta %s. Haluatko liittyä huoneeseen osallistuaksesi keskusteluun?huone
-
Tämä on huoneen esikatselu. Liity huoneeseen osallistuaksesi keskusteluun.
-
Uusi keskusteluLisää jäsenyksi jäsen
-
Poistu huoneestaHaluatko varmasti poistua huoneesta?Haluatko varmasti poistaa käyttäjän %s tästä keskustelusta\?
@@ -499,19 +454,16 @@
Näytä istuntolistaOlet ylentämässä käyttäjää samalle tasolle kuin oma käyttäjätasosi. Et voi perua tätä toimintoa.\nOletko varma?Haluatko kutsua käyttäjän %s tähän keskusteluun\?
-
Kutsu tunnisteellaPAIKALLISET YHTEYSTIEDOT (%d)Vain Matrix-käyttäjätKutsu käyttäjä tunnisteellaSyötä yksi tai useampi sähköpostiosoite tai Matrix-tunnisteSähköposti tai Matrix-tunniste
-
Etsi%s kirjoittaa…%1$s ja %2$s kirjoittavat…%1$s, %2$s ja muita kirjoittaa…
-
Lähetä salattu viesti…Lähetä viesti (salaamaton)…Yhteys palvelimeen katkesi.
@@ -523,21 +475,17 @@
Poista lähettämättömät viestitTiedostoa ei löydySinulla ei ole oikeutta lähettää viestejä tähän huoneeseen.
-
LuotaÄlä luotaKirjaudu ulosJätä huomiotta
-
Sormenjälki (%s):Palvelimen identiteettiä ei voitu vahvistaa.
-
Tämä voi tarkoittaa että joku yrittää kaapata sinun viestintääsi tai että laitteesi ei luota palvelimen varmenteeseen.Jos palvelimen ylläpitäjä on ilmoittanut, että tämä on odotettua, varmista että alla oleva sormenjälki on sama kuin hänen antamansa.Sertifikaatti johon laitteesi luotti aikaisemmin on vaihtunut. Tämä on HYVIN EPÄTAVALLISTA. On suositeltavaa, että ET hyväksy tätä uutta sertifikaattia.Sertifikaatti on vaihtunut ennestään luotetusta ei-luotettuun. Palvelin on voinut uusia sertifikaattinsa. Kysy palvelimen ylläpitäjältä, mikä sormenjäljen pitäisi olla.Hyväksy sertifikaatti vain, jos palvelimen ylläpitäjä on julkaissut sormenjäljen, joka täsmää yllä olevan kanssa.
-
Huoneen tiedotHenkilötTiedostot
@@ -545,14 +493,12 @@
Epämuotoinen tunnus. Anna sähköpostiosoite tai Matrix-tunnus (esim. \'@tunnus:verkkotunnus\')KUTSUTUTJÄSENET
-
Syy sisällön ilmoittamiseenHaluatko piilottaa kaikki tämän käyttäjän viestit\?
\n
\nHuomaa, että tämä toiminto käynnistää sovelluksen uudelleen ja siinä saattaa kestää jonkin aikaa.Peru lähetysPeru lataus
-
EtsiEtsi huoneen jäsenistäEi tuloksia
@@ -560,29 +506,13 @@
VIESTITHENKILÖTTIEDOSTOT
-
- LIITY
- LUETTELO
- SUOSIKIT
- HUONEET
- MATALA TÄRKEYS
-
- KUTSUT
- Aloita keskustelu
- Luo huone
- Liity huoneeseen
- Liity huoneeseen
- Syötä huonetunniste tai -alias
-
Selaa luetteloaHaetaan luettelosta…
-
SuosikkiMatala tärkeysYksityiskeskusteluPoistu keskustelustaUnohda
-
ViestitAsetuksetVersio
@@ -590,7 +520,6 @@
Kolmannen osapuolen tiedotTekijänoikeustiedotTietosuojakäytäntö
-
ProfiilikuvaNimiSähköposti
@@ -618,7 +547,6 @@
TekijänoikeusTietosuojakäytäntöTyhjennä välimuisti
-
KäyttäjäasetuksetIlmoituksetPiilotetut henkilöt
@@ -647,7 +575,6 @@
Kirjautuneena nimelläKotipalvelinIdentiteettipalvelin
-
Odotetaan vahvistustaTarkista sähköpostisi ja klikkaa sinne saamaasi linkkiä. Kun olet tehnyt tämän, paina jatka.Sähköpostin vahvistaminen epäonnistui. Tarkista sähköpostisi ja avaa lähettämässämme viestissä oleva linkki. Tämän jälkeen paina painiketta ”jatka”.
@@ -665,7 +592,6 @@
\nHuomaa, että tämä toiminto käynnistää sovelluksen uudelleen ja siinä saattaa kestää jonkin aikaa.Haluatko poistaa tämän ilmoituskohteen?Haluatko varmasti poistaa kohteen %1$s %2$s\?
-
Valitse maaMaaValitse maa
@@ -676,37 +602,29 @@
Anna aktivointikoodiPuhelinnumeron validointi epäonnistuiAktivointikoodi
-
-
Huoneen kuvaHuoneen nimiAiheHuoneen luokitteluLuokiteltu:
-
SuosikkiMatala tärkeysEi mikään
-
Näkyvyys ja pääsyListaa tämä huone huoneluettelossaHuoneen pääsyHuoneen historian näkyvyysKetkä saavat nähdä huoneen historian\?Ketkä pääsevät tähän huoneeseen\?
-
Kuka tahansaVain jäsenet (tämän asetuksen valitsemisesta alkaen)Vain jäsenet (heidän kutsumisestaan alkaen)Vain jäsenet (heidän liittymisestään alkaen)
-
Linkittääksesi huoneeseen, sillä pitää olla osoite.Vain kutsututKaikki, jotka tietävät huoneen osoitteen (paitsi vieraat)Kaikki jotka tietävät huoneen osoitteen, mukaanlukien vieraat
-
Porttikiellon saaneet käyttäjät
-
LisäasetuksetTämän huoneen sisäinen IDOsoitteet
@@ -717,7 +635,6 @@
Kirjaudu ulos salauksen aktivoimiseksi.Lähetä salatut viestit vain vahvistetuille laitteilleÄlä lähetä tältä laitteelta salattuja viestejä tämän huoneen vahvistamattomille laitteille.
-
Huoneella ei ole paikallisia osoitteitaUusi osoite (esim. #foo:matrix.org")Virheellinen aliaksen muoto
@@ -732,14 +649,9 @@
Tämä huone ei käytä salausta.Ota salaus käyttöön
\n(varoitus: salausta ei voi poistaa käytöstä!)
-
Luettelo
-
%s yritti ladata tietyn kohdan huoneen historiassa, mutta sitä ei löytynyt.
-
-
Päästä päähän -salauksen lisätiedot
-
Tapahtuman tiedotKäyttäjän Matrix-IDCurve25519-ID-avain
@@ -780,20 +692,16 @@
Poista kieltoVahvista laiteVahvistaaksesi, että tähän laitteeseen voi luottaa, ota yhteyttä sen omistajaan jollain muulla tavalla (esimerkiksi soittamalla tai tapaamalla) ja varmista että hänen laitteensa avain on sama kuin alla oleva:
-
Jos avaimet eivät täsmää, keskustelusi eivät luultavasti ole turvassa.Vahvistan, että avaimet täsmäävät
-
Huoneessa on tuntemattomia istuntojaHuoneessa on tuntemattomia laitteita joita ei ole vahvistettu.\nLaitteet eivät välttämättä kuulu väitetyille omistajilleen.\nJokainen uusi laite kannattaa vahvistaa ennen kuin jatkat, mutta voit myös lähettää viestit vahvistamattomille laitteille.\n\nTuntemattomat laitteet:
-
Valitse huoneluetteloPalvelin saattaa olla tavoittamattomissa tai ylikuormitettuSyötä kotipalvelin, jolta julkiset huoneet listataanPalvelimen nimiKaikki huoneet palvelimella %sKaikki alkuperäiset %s huoneet
-
Etsi historiastaKäyttäjäluetteloKÄYTTÄJÄHAKEMISTO (%s)
@@ -839,7 +747,6 @@
Pienoissovelluksen luonti epäonnistuiLuo konferenssipuheluita jitsin avullaHaluatko varmasti poistaa pienoissovelluksen tästä huoneesta\?
-
Sovelmaa ei voitu luoda.Pyynnön lähetys epäonnistui.Oikeustason täytyy olla positiivinen luku.
@@ -850,19 +757,15 @@
Huone %s ei ole näkyvillä.Lisää integraatioitaKäytä järjestelmän kamerasovellusta
-
Lisäsit uuden istunnon \'%s\', joka pyytää salausavaimia.Vahvistamaton laitteesi \'%s\' pyytää salausavaimia.Aloita varmennusJaa ilman varmennustaHylkää pyyntö
-
Varoitus!Konferenssipuhelut ovat kehitysvaiheessa eivätkä välttämättä luotettavia.
-
KomentovirheTuntematon komento: %s
-
PoisÄänekäsSalattu viesti
@@ -897,7 +800,6 @@
EsimerkkiYhteisön IDesimerkki
-
KotiIhmisetHuoneet
@@ -938,9 +840,9 @@
Lähetä tarraOletko varma?Kolmannen osapuolen lisenssit
- Lataa
- Hyväksy
- Ohita
+ Lataa
+ Hyväksy
+ OhitaOletko varma, että haluat kirjautua ulos?VirheJos mahdollista, kirjoita kuvaus englanniksi.
@@ -960,13 +862,13 @@
Käytä avainten varmuuskopiointiaVarmuuskopioiMenetät pääsyn salattuihin viesteihisi, ellet varmuuskopioi avaimiasi ennen uloskirjautumista.
- Pysy
- Puhu
- Tyhjennä
+ Pysy
+ Puhu
+ TyhjennäTätä toimintoa ei voi tehdä puuttuvien oikeuksien takia.Soita siltiValmis
- Keskeytä
+ KeskeytäToiminnotJärjestelmähälytyksetLähetä ääntä
@@ -1337,7 +1239,7 @@
VersioAlgoritmiAllekirjoitus
- Jätä huomiotta
+ Jätä huomiottaKirjaudu sisään kertakirjautumisellaTämä osoite ei ole saavutettavissa. Tarkistathan osoitteenLaitteesi käyttää vanhentunutta, haavoittuvaista TLS-protokollan versiota. Turvallisuutesi tähden et voi muodostaa yhteyttä
@@ -1416,8 +1318,8 @@
HuoneetHuoneesi näytetään tässä. Napsauta + oikeasta alakulmasta aloittaaksesi.Reaktiot
- Samaa mieltä
- Tykkää
+ Samaa mieltä
+ TykkääLisää reaktioNäytä reaktiotReaktiot
@@ -1500,8 +1402,8 @@
HuoneluetteloJulkaise tämä huone huoneluettelossaViesti-ilmoitusten säännöt
- Katkaise yhteys
- Kieltäydy
+ Katkaise yhteys
+ KieltäydyIdentiteettipalvelinta ei ole määritetty.Puhelu epäonnistui väärin määritetyn palvelimen takiaÄlä kysy uudestaan
@@ -1584,8 +1486,8 @@
Tekstiviesti on lähetetty numeroon %s. Syötä sen sisältämä varmistuskoodi.Viesti-ilmoitusten sääntöjä ei ole määritettyLuo uusi yksityiskeskustelu
- Kumoa
- Tarkasta
+ Kumoa
+ TarkastaAseta puhelinnumerosi, ja voit myöhemmin antaa muiden löytää sinut puhelinnumerosi perusteella.Aseta sähköpostisi tunnuksen palautusta varten. Myöhemmin voit asettaa sähköpostisi tai puhelinnumerosi löydettäviksi, jotta sinut voi löytää näillä tiedoilla.Aseta sähköpostisi tunnuksen palautusta varten. Myöhemmin voit asettaa sähköpostisi tai puhelinnumerosi löydettäviksi, jotta sinut voi löytää näillä tiedoilla.
@@ -1954,14 +1856,6 @@
EiYhteys kotipalvelimeen on poikkiKehittäjätyökalut
-
- %d ääni
- %d ääntä
-
-
- %d ääni - lopulliset tulokset
- %d ääntä - lopulliset tulokset
- Luo yksinkertaisen äänestyksenJos et pääse käsiksi olemassaolevaan istuntoonUusi sisäänkirjautuminen
@@ -2030,10 +1924,10 @@
Sinulla ei ole oikeuksia puhelun aloittamiseen tässä huoneessaSinulla ei ole oikeuksia ryhmäpuhelun aloittamiseenSinulla ei ole oikeuksia ryhmäpuhelun aloittamiseen tässä huoneessa
- Nollaa
- Jätä huomiotta
- Tauko
- Toista
+ Nollaa
+ Jätä huomiotta
+ Tauko
+ ToistaKäyttäjän huomiotta jättäminen piilottaa kyseisen käyttäjän viestit sinulta.
\n
\nVoit perua tämän milloin tahansa yleisissä asetuksissa.
@@ -2299,7 +2193,6 @@
Tee tästä avaruudesta julkinenHallitse huoneita%s kutsuu sinut
- Kokeellinen avaruus - Rajattu huone.Sinut on kutsuttuAvaruudet ovat uusi tapa ryhmitellä huoneita ja ihmisiä.Tervetuloa avaruuksien pariin!
@@ -2326,8 +2219,8 @@
He voivat selata avaruutta %sKutsu avaruuteen %sJaa linkki
- Kutsu käyttäjänimellä tai sähköpostilla
- Kutsu käyttäjänimellä
+ Kutsu käyttäjänimellä tai sähköpostilla
+ Kutsu käyttäjänimelläKutsu sähköpostitseKutsu avaruuteen %sKutsu ihmisiä
diff --git a/vector/src/main/res/values-fr-rCA/strings.xml b/vector/src/main/res/values-fr-rCA/strings.xml
index cf9c07efb6f..ba852f40082 100644
--- a/vector/src/main/res/values-fr-rCA/strings.xml
+++ b/vector/src/main/res/values-fr-rCA/strings.xml
@@ -62,7 +62,6 @@
Si vous n’avez pas accès à une session existanteUtiliser une phrase secrète ou une clé de récupérationCrée un sondage simple
- Option sélectionnéeSupprimer les données du compte de type %1$s \?
\n
\nÀ utiliser avec précaution, ceci peut entraîner des comportements inattendus.
@@ -190,7 +189,6 @@
En attente…Conclusion de la vérificationA réagi avec : %s
- Boutons de robotSondageAutocollantsFichier
@@ -427,8 +425,8 @@
RéactionsVoir les réactionsAjouter une réaction
- J’aime
- D’accord
+ J’aime
+ D’accordRéactionsVos salons seront affichés ici. Appuyez sur le « + » en bas à droite pour trouver ceux existant ou en créer de nouveaux.Salons
@@ -518,14 +516,6 @@
Envoyer l’image en taille originaleEnvoyer les images en taille originale
-
- %d vote − Résultats finaux
- %d votes − Résultats finaux
-
-
- %d vote
- %d votes
- %d session active%d sessions actives
@@ -818,7 +808,7 @@
Seulement pris en charge dans les salons chiffrésForce la session de groupe sortante actuelle dans un salon chiffré à être abandonnéeUtilisez la dernière version de ${app_name} sur vos autres appareils :
- ou un autre client Matrix qui prend en charge la signature croisée
+ ou un autre client Matrix qui prend en charge la signature croisée${app_name} iOS
\n${app_name} Android${app_name} Web
@@ -1458,17 +1448,6 @@
Notification sonore pour chaque messageRecherche dans le répertoire…Parcourir le répertoire
- Saisissez un identifiant ou un alias de salon
- Rejoindre un salon
- Rejoindre le salon
- Créer un salon
- Nouvelle discussion
- INVITATIONS
- PRIORITÉ BASSE
- SALONS
- FAVORIS
- RÉPERTOIRE
- REJOINDRELa recherche dans les salons chiffrés n\'est pas encore prise en charge.FICHIERSPARTICIPANTS
@@ -2004,7 +1983,7 @@
AttentionConfirmationRevenir
- Désactiver
+ DésactiverCopié dans le presse-papiersDé-publierChanger
@@ -2025,15 +2004,15 @@
RaccrocherRefuserAccepter
- Refuser
- Examiner
- Ignorer
- Annuler
+ Refuser
+ Examiner
+ Ignorer
+ AnnulerTerminé
- Passer
- Accepter
+ Passer
+ AccepterHors ligne
- Inviter
+ InviterouEnvoyer quand mêmeAppeler quand même
@@ -2058,34 +2037,34 @@
Téléconférence en cours.
\nLa rejoindre en %1$s ou en %2$sCommencer une conversation
- Réinitialiser
- Ignorer
- Pause
- Lancer
+ Réinitialiser
+ Ignorer
+ Pause
+ LancerAppel en coursSignaler le contenu
- Déconnecter
- Révoquer
+ Déconnecter
+ RévoquerAucun
- Renommer
- Supprimer
+ Renommer
+ SupprimerAfficher la source déchiffréeAfficher la sourcePermalien
- Transférer
+ TransférerPlus tard
- Effacer
- Parler
- Partager
- Télécharger
- Citer
- Effacer
- Renvoyer
- Envoyer
- Rester
- Quitter
- Enregistrer
- Annuler
+ Effacer
+ Parler
+ Partager
+ Télécharger
+ Citer
+ Effacer
+ Renvoyer
+ Envoyer
+ Rester
+ Quitter
+ Enregistrer
+ AnnulerOKChargement…Licences tierces
@@ -2375,7 +2354,7 @@
Erreur de réseauEnvoi du message impossibleEffacement impossible
- L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message.
+ L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message.** Déchiffrement impossible : %s **%1$s de %2$s à %3$s%1$s a modifié le rang de %2$s.
@@ -2524,10 +2503,10 @@
Synchronisation…Développer l’entêteListe les membres
- Rejeter
- Aperçu
- Rejoindre
- Supprimer
+ Rejeter
+ Aperçu
+ Rejoindre
+ SupprimerContinuerNONOUI
@@ -2737,8 +2716,6 @@
Gérer les salonsVous cherchez quelqu’un qui n’est pas dans %s\?%s vous invite
- Attention, nécessite la prise en charge par le serveur ainsi qu’une version de salon expérimentale
- Espace expérimental – salon restreint.Vous êtes invité·eLes espaces sont une nouvelle manière de regrouper les salons et les gens.Bienvenue dans les espaces!
@@ -2768,7 +2745,7 @@
Permettra de parcourir les salons de %sInviter dans %sPartager le lien
- Inviter par nom d’utilisateur
+ Inviter par nom d’utilisateurInviter par courrielVous êtes seul·e pour l’instant. %s sera plus agréable avec de la compagnie.Inviter à %s
diff --git a/vector/src/main/res/values-fr-rCA/strings_no_weblate.xml b/vector/src/main/res/values-fr-rCA/strings_no_weblate.xml
new file mode 100644
index 00000000000..4d2469f824f
--- /dev/null
+++ b/vector/src/main/res/values-fr-rCA/strings_no_weblate.xml
@@ -0,0 +1,8 @@
+
+
+
+ fr
+ CA
+ Latn
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
index a6ee72c98ad..2e99edd792d 100644
--- a/vector/src/main/res/values-fr/strings.xml
+++ b/vector/src/main/res/values-fr/strings.xml
@@ -39,7 +39,7 @@
%1$s a envoyé une invitation à %2$s pour rejoindre le salon%1$s a accepté l’invitation de %2$s** Déchiffrement impossible : %s **
- L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message.
+ L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message.Effacement impossibleEnvoi du message impossibleL’envoi de l’image a échoué
@@ -240,18 +240,18 @@
Informations sur ce participantHistoriqueOK
- Annuler
- Enregistrer
- Envoyer
- Renvoyer
- Partager
+ Annuler
+ Enregistrer
+ Envoyer
+ Renvoyer
+ PartagerPlus tard
- Transférer
+ TransférerPermalienAfficher la sourceAfficher la source déchiffrée
- Supprimer
- Renommer
+ Supprimer
+ RenommerSignaler le contenuAppel en coursTéléconférence en cours.
@@ -265,7 +265,7 @@
Informations sur la sessionLes téléconférences ne sont pas prises en charge dans les salons chiffrésou
- Inviter
+ InviterSe déconnecterAppel audioAppel vidéo
@@ -276,7 +276,7 @@
OuvrirFermerCopié dans le presse-papiers
- Désactiver
+ DésactiverConfirmationAttentionAccueil
@@ -300,7 +300,7 @@
Aucun salonAucun salon public disponibleSalon
- Effacer
+ EffacerEnvoyer quand mêmeEnvoyer les journauxEnvoyer les journaux d’erreur
@@ -386,10 +386,10 @@
OUINONContinuer
- Supprimer
- Rejoindre
- Aperçu
- Rejeter
+ Supprimer
+ Rejoindre
+ Aperçu
+ Rejeterun salonNouvelle discussionAjouter un membre
@@ -444,16 +444,6 @@
MESSAGESPARTICIPANTSFICHIERS
- REJOINDRE
- RÉPERTOIRE
- FAVORIS
- SALONS
- PRIORITÉ BASSE
- INVITATIONS
- Nouvelle discussion
- Créer un salon
- Rejoindre le salon
- Rejoindre un salonParcourir le répertoireRecherche dans le répertoire…Favori
@@ -635,8 +625,8 @@
Annuler l’envoi \?%d s%1$d min %2$d s
- Quitter
- Citer
+ Quitter
+ CiterLe correspondant n’a pas décroché.Prendre une photo ou une vidéoInformation
@@ -694,7 +684,6 @@
Voulez-vous cacher tous les messages de cet utilisateur \?
\n
\nVeuillez noter que cette action redémarrera l’application et pourra prendre un certain temps.
- Saisissez un identifiant ou un alias de salonAllumer l’écran pendant 3 secondesQuand je suis invité sur un salonParamètres utilisateur
@@ -789,7 +778,6 @@
La création du widget a échouéCréer des appels en téléconférence avec jitsiVoulez-vous vraiment supprimer le widget de ce salon ?
-
Impossible de créer le widget.Échec de l’envoi de la requête.Le rang doit être un entier positif.
@@ -813,14 +801,11 @@
Prendre une vidéoStatistiques d’utilisationUtiliser la caméra de l’appareil
-
Rapport d’anomalieAttention !L’appel en téléconférence est en cours de développement et peut ne pas être fiable.
-
Erreur de commandeCommande non reconnue : %s
-
DésactivéNotification sonoreMessage chiffré
@@ -855,7 +840,6 @@
ExempleIdentifiant de communautéExemple
-
AccueilPersonnesSalons
@@ -913,7 +897,6 @@
%d widgets actif%d widgets actifs
-
Avatar%d changement de statut
@@ -960,9 +943,9 @@
Pour poursuivre, veuillez renseigner votre mot de passe :Désactiver le compteLicences tierces
- Télécharger
- Parler
- Effacer
+ Télécharger
+ Parler
+ EffacerRedemander les clés de chiffrement à vos autres sessions.Demande de clé envoyée.Demande envoyée
@@ -1083,7 +1066,7 @@
Utiliser la sonnerie par défaut de ${app_name} pour les appels entrantsSonnerie d’appel entrantSélectionner la sonnerie pour les appels :
- Accepter
+ AccepterVeuillez lire et accepter les politiques de ce serveur d’accueil :Résoudre les problèmes de notificationDiagnostics de résolution de problème
@@ -1156,7 +1139,7 @@
Sauvegarde de cléUtiliser la sauvegarde de cléLa sauvegarde des clés n’est pas terminée, veuillez patienter…
- Passer
+ PasserTerminéParamètres de notification avancésImportance des notifications par évènement
@@ -1253,8 +1236,8 @@
En êtes-vous sûr \?SauvegarderVous n’aurez plus accès à vos messages chiffrés, sauf si vous sauvegardez vos clés avant de vous déconnecter.
- Rester
- Annuler
+ Rester
+ AnnulerVoulez-vous vraiment vous déconnecter ?Le mode d’économie de données utilise un filtre spécifique qui ignore les notifications de présence et de saisie.Récupération des messages chiffrés
@@ -1300,7 +1283,7 @@
Traitement de la clé de récupération…Téléchargement des clés…Importation des clés…
- Ignorer
+ IgnorerSe connecter avec l’authentification uniqueCette URL est injoignable, veuillez la vérifierVotre appareil utilise une version obsolète du protocole de sécurité TLS, vulnérable aux attaques. Pour votre sécurité vous ne pourrez pas vous connecter
@@ -1412,8 +1395,8 @@
SalonsVos salons seront affichés ici. Appuyez sur le « + » en bas à droite pour trouver ceux existant ou en créer de nouveaux.Réactions
- D’accord
- J’aime
+ D’accord
+ J’aimeAjouter une réactionVoir les réactionsRéactions
@@ -1493,8 +1476,8 @@
Filtrer par nom d’utilisateur ou identifiant…En train de rejoindre le salon…Voir l’historique des éditions
- Examiner
- Refuser
+ Examiner
+ RefuserPour continuer, vous devez accepter les conditions de ce service.Conditions de serviceExaminer les conditions
@@ -1502,8 +1485,8 @@
Utiliser des robots, passerelles, widgets et jeux d’autocollantsLu àAucun
- Révoquer
- Déconnecter
+ Révoquer
+ DéconnecterAucun serveur d’identité configuré.L’appel a échoué en raison d’un serveur mal configuréDemandez à l’administrateur de votre serveur d’accueil (%1$s) de configurer un serveur TURN afin que les appels fonctionnent de manière fiable.
@@ -1937,15 +1920,6 @@
Nom d’utilisateurOutils de développementDonnées du compte
-
- %d vote
- %d votes
-
-
- %d vote − Résultats finaux
- %d votes − Résultats finaux
-
- Option sélectionnéeCrée un sondage simpleUtiliser une phrase secrète ou une clé de récupérationSi vous n’avez pas accès à une session existante
@@ -2073,7 +2047,7 @@
\n${app_name} pour Bureau${app_name} iOS
\n${app_name} Android
- ou un autre client Matrix qui prend en charge la signature croisée
+ ou un autre client Matrix qui prend en charge la signature croiséeUtilisez la dernière version de ${app_name} sur vos autres appareils :Force la session de groupe sortante actuelle dans un salon chiffré à être abandonnéeSeulement pris en charge dans les salons chiffrés
@@ -2147,9 +2121,9 @@
Sinon, vous pouvez renseigner n’importe quelle autre URL de serveur d’identitéRenseignez l’URL d’un serveur d’identitéValider
- Lancer
- Pause
- Ignorer
+ Lancer
+ Pause
+ IgnorerVous n’avez pas la permission de lancer une téléconférence dans ce salonVous n\'avez pas la permission de lancer un appel dans ce salonUne téléconférence est déjà en cours !
@@ -2252,7 +2226,6 @@
Les messages ici sont chiffrés de bout en bout.
\n
\nVos messages sont sécurisés avec des verrous et seuls vous et le destinataire en possédez la clé unique pour les déverrouiller.
- Boutons de robotAutocollantsCe serveur d\'accueil utilise une version obsolète. Demandez à l’administrateur de votre serveur d\'accueil de le mettre à jour. Vous pouvez continuer, mais certaines fonctionnalités peuvent ne pas fonctionner correctement.Entrez l’adresse du serveur que vous voulez utiliser
@@ -2388,7 +2361,7 @@
FrontaleVous n’avez pas la permission de lancer un appelVous n’avez pas la permission de lancer une téléconférence
- Réinitialiser
+ RéinitialiserÉchec de la révocation du bannissement de l’utilisateurVérifiez vos paramètres pour activer les notifications pushStockez votre clé de sécurité en lieu sûr comme un gestionnaire de mots de passe ou un coffre-fort.
@@ -2703,7 +2676,6 @@
EspacesInvitationsSalons recommandés
- Espace expérimental – salon restreint.Vous êtes invitéLes espaces sont une nouvelle manière de regrouper les salons et les gens.Bienvenue dans les espaces !
@@ -2729,7 +2701,7 @@
Permettra de parcourir les salons de %sInviter dans %sPartager le lien
- Inviter par nom d’utilisateur
+ Inviter par nom d’utilisateurInviter par e-mailVous êtes seul pour l’instant. %s sera plus agréable avec de la compagnie.Invitez des personnes dans votre espace
@@ -2762,7 +2734,6 @@
Compression de l’image…Utiliser par défaut et ne plus demanderToujours demander
- Attention, nécessite la prise en charge par le serveur ainsi qu’une version de salon expérimentaleGérer les salons et les espacesMarquer comme non recommandéMarquer comme recommandé
@@ -2968,7 +2939,7 @@
Terminer le réglage de la découverte.Vous n’utilisez actuellement pas de serveur d’identité. Pour inviter des proches et qu’ils puissent vous trouver, configurez-en un ci-dessous.Qui sont vos proches \?
- Inviter par nom d’utilisateur ou courriel
+ Inviter par nom d’utilisateur ou courrielAssurez-vous que l’accès à la société %s est accordé aux bonnes personnes. Vous pourrez en inviter d’autres plus tard.Ajouter à l’espace mentionnéCréation de l’espace…
@@ -3039,4 +3010,50 @@
Êtes vous d’accord d’envoyer ces informations \?Pour découvrir des contacts existants, il vous faut envoyer les informations de contact (adresses de courriel et numéros de téléphone) à votre serveur d’identité. Les données seront condensées avant l’envoi pour respecter la vie privée.Pas maintenant
+ Êtes-vous sûr de vouloir retirer ce sondage \? Vous ne pourrez plus le récupérer une fois supprimé.
+ Supprimer le sondage
+ Sondage terminé
+ Vote exprimé
+ Activer les sondages
+ Terminer le sondage
+ Cela empêchera les gens de voter et affichera le résultat final du sondage.
+ Terminer ce sondage \?
+ option gagnante
+ Terminer le sondage
+
+ Résultat final sur la base de %1$d vote
+ Résultat final sur la base de %1$d votes
+
+
+ Aucun vote exprimé
+ %1$d votes exprimés. Votez pour voir les résultats
+
+
+ Sur la base de %1$d vote
+ Sur la base de %1$d votes
+
+
+ %1$d vote
+ %1$d votes
+
+ Paramètres système
+ Versions
+ Obtenir de l’aide pour utiliser Element
+ Aide et support
+ Aide
+ Mentions légales
+ Ce serveur ne fournit aucune politique.
+ Bibliothèques tierces
+ La politique de votre serveur d’identité
+ La politique de votre serveur d’accueil
+ Politique de ${app_name}
+ Vous pouvez désactiver ceci à tout moment dans les paramètres
+ Nous ne partageons pas d’information avec des tierces parties
+ Nous n’enregistrons ou ne profilons aucune donnée du compte
+ ici
+ Aidez nous à identifier les problèmes et améliorer Element en envoyant des rapports d’usage anonymes. Pour comprendre de quelle manière les gens utilisent Element sur plusieurs appareils, nous créeront un identifiant aléatoire commun à tous vos appareils.
+\n
+\nVous pouvez lire toutes les conditions %s.
+ Aider à améliorer Element
+ Activer
\ No newline at end of file
diff --git a/vector/src/main/res/values-fy/strings.xml b/vector/src/main/res/values-fy/strings.xml
index e2817c87d14..a17fa4cecbf 100644
--- a/vector/src/main/res/values-fy/strings.xml
+++ b/vector/src/main/res/values-fy/strings.xml
@@ -32,28 +32,28 @@
Lisinsjes fan tredde partijenLade…OK
- Annulearje
- Bewarje
- Ferlitte
- Bliuwe
- Ferstjoere
- Opnij ferstjoere
- Fuortsmite
- Sitearje
- Downloade
- Diele
- Ynsprekke
- Wiskje
+ Annulearje
+ Bewarje
+ Ferlitte
+ Bliuwe
+ Ferstjoere
+ Opnij ferstjoere
+ Fuortsmite
+ Sitearje
+ Downloade
+ Diele
+ Ynsprekke
+ WiskjeLetter
- Trochstjoere
+ TrochstjoerePermalinkBoarne werjaanUntskoattele boarne werjaan
- Fuortsmite
- Omneame
+ Fuortsmite
+ OmneameGjin
- Ynlûke
- Ferbining ferbrekke
+ Ynlûke
+ Ferbining ferbrekkeYnhâld meldeAktive opropRinnend gearkomstpetear.
@@ -70,15 +70,15 @@
Dochs beljeDochs ferstjoereof
- Utnûgje
+ UtnûgjeOffline
- Akseptearje
- Oerslaan
+ Akseptearje
+ OerslaanKlear
- Ofbrekke
- Negearje
- Beoardielje
- Wegerje
+ Ofbrekke
+ Negearje
+ Beoardielje
+ WegerjeOfsluteAksjesOfmelde
@@ -93,7 +93,7 @@
IepenjeSluteNei klamboerd kopiearre
- Utskeakelje
+ UtskeakeljeBefêstigingWarskôgingFlater
@@ -295,9 +295,9 @@
Suggestje dwaanin keamerNije chat
- Ynsjen
- Meidwaan
- Fuortsmite
+ Ynsjen
+ Meidwaan
+ FuortsmiteTrochgeanNEEJA
@@ -393,8 +393,6 @@
NetwurkflaterKin it berjocht net ferstjoereBerjocht fuortsmiten
- Warskôging hat serverstipe en in eksperimintele keamer nedich
- Eksperimintele romte - Beheinde keamer.Jo binne útnûgeelkenien.Jo hawwe takomstige berjochten foar %1$s sichtber makke
@@ -548,8 +546,8 @@
UntwikkelersmodusKontakt opnimme mei behearderDit is ûnfoech
- Skoftsje
- Ofspylje
+ Skoftsje
+ OfspyljeFerstjoereJo brûke gjin identiteitsserverUnbekende flater
@@ -859,11 +857,6 @@
ProfylôfbyldingFerzje %sFerzje
- ÚTNÛGINGEN
- LEGE PRIORITEIT
- KEAMERS
- FAVORITEN
- MAPKEAMERSGjin resultatenDownload annulearje
@@ -1064,8 +1057,8 @@
Missende tastimmingenRomtenMear ynfo
- Opnij ynstelle
- Slute
+ Opnij ynstelle
+ SluteJo binne op dit stuit yn dit petearJo aktuele pinkoade wizigjeAktuele taal
@@ -1163,7 +1156,7 @@
%1$s hat de útnûging wegere. Reden: %2$sInisjele syngronisaasje:
\nKryptografy ymportearje
- It apparaat fan de ôfstjoerder hat gjin kaaien foar dit berjocht stjoerd.
+ It apparaat fan de ôfstjoerder hat gjin kaaien foar dit berjocht stjoerd.%1$s fan %2$s nei %3$s%1$s hat it machtigingsnivo fan %2$s oanpast.Jo hawwe it machtigingsnivo fan %1$s oanpast.
@@ -1278,7 +1271,7 @@
Gean nei net-lêzenOpskrift iepenjeLedelist
- Ofwize
+ OfwizeTagong jaan ta jo kontaktpersoanen.Om de QR-koade te scannen moatte jo tagong ta de kamera jaan.Sorry. De aksje is net tapast fanwegen ûntbrekkende rjochten
@@ -1416,12 +1409,6 @@
%d keamersKatalogus trochblêdzje
- Fier in petear(by)namme yn
- In keamer yngean
- De keamer yngean
- Petear oanmeitsje
- Petear starte
- LID WURDESykjen yn fersifere keamers wurdt op dit stuit net stipe.BESTANNENPERSOANEN
diff --git a/vector/src/main/res/values-ga/strings.xml b/vector/src/main/res/values-ga/strings.xml
index c5df827ee64..8638ebec5a9 100644
--- a/vector/src/main/res/values-ga/strings.xml
+++ b/vector/src/main/res/values-ga/strings.xml
@@ -54,10 +54,10 @@
Ag sioncronú…
- Diúltaigh
- Réamhamharc
- Téigh isteach
- Bain
+ Diúltaigh
+ Réamhamharc
+ Téigh isteach
+ BainLean ar aghaidhNÍLTÁ
@@ -101,7 +101,7 @@
RabhadhDeimhniúFill
- Cuir as feidhm
+ Cuir as feidhmNeamhfoilsighAthraighCuir
@@ -113,42 +113,42 @@
FágDiúltaighGlac
- Diúltaigh
- Athbhreithnigh
- Déan neamhaird de
- Tobscoir
+ Diúltaigh
+ Athbhreithnigh
+ Déan neamhaird de
+ TobscoirCríochnaithe
- Léim
- Glac
+ Léim
+ GlacAs líne
- Tabhair cuireadh
+ Tabhair cuireadhnóFísGuth
- Athshocraigh
- Cuir uait
- Cuir ar sos
- Cuir ar siúl
- Dícheangail
- Cúlghair
+ Athshocraigh
+ Cuir uait
+ Cuir ar sos
+ Cuir ar siúl
+ Dícheangail
+ CúlghairNíl aon cheann
- Athainmnigh
- Bain amach
+ Athainmnigh
+ Bain amachNasc buan
- Seol ar aghaidh
+ Seol ar aghaidhNíos deireanaí
- Glan
- Labhair
- Roinn le
- Íoslódáil
- Luaigh
- Bain
- Athsheol
- Seol
- Fan
- Fág
- Sábháil
- Cealaigh
+ Glan
+ Labhair
+ Roinn le
+ Íoslódáil
+ Luaigh
+ Bain
+ Athsheol
+ Seol
+ Fan
+ Fág
+ Sábháil
+ CealaighCeart go leorAg lódáil…Stairiúil
diff --git a/vector/src/main/res/values-gl/strings.xml b/vector/src/main/res/values-gl/strings.xml
index 4af99561614..087871dba90 100644
--- a/vector/src/main/res/values-gl/strings.xml
+++ b/vector/src/main/res/values-gl/strings.xml
@@ -42,7 +42,7 @@
%1$s envioulle un convite a %2$s para que entre na sala%1$s aceptou o convite para %2$s** Imposíbel descifrar: %s **
- O dispositivo do que envía non enviou as chaves desta mensaxe.
+ O dispositivo do que envía non enviou as chaves desta mensaxe.Non se puido redactarNon foi posíbel enviar a mensaxeErro da conexión
@@ -277,23 +277,23 @@
Detalles da comunidadeCargando…Aceptar
- Cancelar
- Gardar
- Saír
- Enviar
- Enviar de novo
- Redactar
- Citar
- Compartir
+ Cancelar
+ Gardar
+ Saír
+ Enviar
+ Enviar de novo
+ Redactar
+ Citar
+ CompartirDespoisLigazón permanenteVer a fonteVer a fonte descifrada
- Borrar
- Renomear
+ Borrar
+ RenomearChamada en cursoA escoita de eventos
- Adiante
+ AdianteInformar sobre contidoConferencia en curso.
\nÚnete con %1$s ou %2$s
@@ -307,7 +307,7 @@
As chamadas de conferencia non están soportadas en salas cifradasEnviar igualmenteou
- Convidar
+ ConvidarFóra de liñaSaírAccións
@@ -321,7 +321,7 @@
AbrirPecharCopiado ao portaretallos
- Desactivar
+ DesactivarConfirmaciónAvisoInicio
@@ -349,9 +349,9 @@
Sen salas públicas accesiblesEnviar unha iconaLicenzas de terceiras partes
- Descargar
- Falar
- Limpar
+ Descargar
+ Falar
+ Limpar1 usuaria%d usuarias
@@ -443,8 +443,8 @@
HoxeChamarContinuar
- Eliminar
- Rexeitar
+ Eliminar
+ RexeitarIr á primeira mensaxe non lida.Deixar a salaCrear
@@ -482,11 +482,6 @@
MENSAXESXENTEFICHEIROS
- Convites
- Iniciar conversa
- Crear sala
- Unirse á sala
- Unirse á salaBuscando cartafol…Todas as mensaxes (alto)Todas as mensaxes
@@ -751,8 +746,8 @@
Gardar nas descargas?SINON
- Unirse
- Vista previa
+ Unirse
+ Vista previaEste convite enviouse a %s, que non está asociada a esta conta.
\nPodes conectarte cunha conta diferente, ou engadir este email á túa conta.unha sala
@@ -779,11 +774,6 @@
UNIUSECancelar a subidaCancelar a descarga
- UNIRSE
- DIRECTORIO
- FAVORITOS
- SALAS
- BAIXA PRIORIDADE1 sala%d salas
@@ -832,14 +822,14 @@
Por defecto no sistemaDebido á falta de permisos, esta acción non é posible.Iniciar Chat
- Restablecer
- Desbotar
- Deter
- Reproducir
- Desconectar
- Revogar
+ Restablecer
+ Desbotar
+ Deter
+ Reproducir
+ Desconectar
+ RevogarNada
- Permanecer
+ PermanecerVas perder o acceso ás túas mensaxes cifradas a non ser que fagas unha copia de apoio das chaves antes de desconectar.CopiarTes a certeza\?
diff --git a/vector/src/main/res/values-hr/strings.xml b/vector/src/main/res/values-hr/strings.xml
index ae1e86433dd..9a2c71a5228 100644
--- a/vector/src/main/res/values-hr/strings.xml
+++ b/vector/src/main/res/values-hr/strings.xml
@@ -32,28 +32,28 @@
Licence trećih stranaUčitavanje…U redu
- Odustani
- Spremi
- Napusti
- Ostani
- Pošalji
- Pošalji ponovno
- Ukloni
- Citiraj
- Preuzmi
- Podijeli
- Izgovori
- Obriši
+ Odustani
+ Spremi
+ Napusti
+ Ostani
+ Pošalji
+ Pošalji ponovno
+ Ukloni
+ Citiraj
+ Preuzmi
+ Podijeli
+ Izgovori
+ ObrišiKasnije
- Proslijedi
+ ProslijediStalna poveznicaVidi izvorVidi dešifrirani izvor
- Izbriši
- Preimenuj
+ Izbriši
+ PreimenujNije podešeno
- Opozovi
- Odspoji se
+ Opozovi
+ Odspoji sePrijavi sadržajAktivni pozivKonferencijski poziv u tijeku.
@@ -70,15 +70,15 @@
Svejedno zoviSvejedno pošaljiili
- Pozovi
+ PozoviOdspojen
- Prihvati
- Preskoči
+ Prihvati
+ PreskočiDovršeno
- Obustavi
- Zanemari
- Pregledaj
- Odbij
+ Obustavi
+ Zanemari
+ Pregledaj
+ OdbijIzađiRadnjeOdjavi se
@@ -93,7 +93,7 @@
OtvoriZatvoriKopirano u spremnik
- Onemogući
+ OnemogućiPotvrdaUpozorenjeGreška
@@ -315,10 +315,10 @@
DANENastavi
- Ukloni
- Pridruži se
- Pregledaj
- Odbij
+ Ukloni
+ Pridruži se
+ Pregledaj
+ OdbijNabroji članoveOtvori zaglavljeSinkroniziranje…
@@ -454,17 +454,6 @@
PORUKEOSOBEDATOTEKE
- PRIDRUŽILI SE
- POPIS
- OMILJENO
- SOBE
- NISKI PRIORITET
- POZIVNICE
- Započni ćaskanje
- Izradi sobu
- Pridruži se sobi
- Pridruži se sobi
- Unesite identitet ili alternativni naziv sobePregledaj popis%d soba
@@ -934,8 +923,8 @@
SobeOvdje će biti prikazane Vaše sobeReakcije
- Složi se
- Sviđa mi se
+ Složi se
+ Sviđa mi seDodaj reakcijuPogledaj reakcijeReakcije
diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
index 3ed5e62486e..e8bb1c464e5 100644
--- a/vector/src/main/res/values-hu/strings.xml
+++ b/vector/src/main/res/values-hu/strings.xml
@@ -39,7 +39,7 @@
%1$s meghívót küldött %2$s számára, hogy csatlakozzon a szobához%1$s elfogadta a meghívót ebbe: %2$s** Visszafejtés sikertelen: %s **
- A küldő eszköze nem küldte el a kulcsokat ehhez az üzenethez.
+ A küldő eszköze nem küldte el a kulcsokat ehhez az üzenethez.Kitakarás sikertelenÜzenet küldése sikertelenKép feltöltése sikertelen
@@ -198,20 +198,20 @@
BeállításokElőzményekOK
- Mégse
- Mentés
- Elhagyás
- Küldés
- Újraküldés
- Törlés
- Idézés
- Megosztás
+ Mégse
+ Mentés
+ Elhagyás
+ Küldés
+ Újraküldés
+ Törlés
+ Idézés
+ MegosztásKésőbbÁllandó hivatkozásForrás megtekintéseVisszafejtett forrás megtekintése
- Törlés
- Átnevezés
+ Törlés
+ ÁtnevezésTartalom BejelentéseAktív hívásFolyamatban lévő konferenciahívás.
@@ -226,7 +226,7 @@
A titkosított szobákban nem támogatott a konferenciahívásKüldés mindenképpenvagy
- Meghívás
+ MeghívásKijelentkezésHanghívásVideohívás
@@ -239,7 +239,7 @@
Vágólapra másolvaMegerősítésFigyelmeztetés
- Tiltás
+ TiltásKezdőképernyőKedvencekEmberek
@@ -405,14 +405,14 @@
IGENNEMFolytatás
- Eltávolítás
- Csatlakozás
- Előnézet
- Elutasítás
+ Eltávolítás
+ Csatlakozás
+ Előnézet
+ ElutasításUgrás az olvasatlanraMeg lettél hívva, hogy csatlakozz ehhez a szobához %s általTagok adatai
- Továbbítás
+ TovábbításEz a meghívó erre a címre lett küldve: %s, ami nincs összekötve a felhasználóddal.
\nHa gondolod jelentkezz be egy másik felhasználóval, vagy add hozzá ezt az e-mail címet a felhasználódhoz."%s szobához próbálsz hozzáférni. Szeretnél csatlakozni, hogy részt tudj venni a beszélgetésben?"
@@ -500,17 +500,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."<
ÜZENETEKEMBEREKFÁJLOK
- BELÉPÉS
- KÖNYVTÁR
- KEDVENCEK
- SZOBÁK
- ALACSONY PRIORITÁSÚ
- MEGHÍVÁSOK
- Csevegés indítása
- Szoba létrehozása
- Csatlakozás szobához
- Csatlakozás egy szobához
- Írd be a szoba azonosítóját vagy nevétKönyvtár böngészéseKönyvtár keresése…Kedvenc
@@ -745,7 +734,6 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.Kisalkalmazás létrehozása sikertelenHozz létre konferencia hívást a jitsi segítségévelBiztos vagy benne hogy törölni akarod ezt a kisalkalmazást ebből a szobából?
-
Kisalkalmazás létrehozása sikertelen.Felkérés elküldése sikertelen.Az erősségi szintnek egy pozitív egész számnak kell lennie.
@@ -771,14 +759,11 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.VideofelvételElemzésBeépített kamera használata
-
HibajelentésFigyelmeztetés!A konferenciabeszélgetés fejlesztés alatt van, elképzelhető, hogy nem működik még megfelelően.
-
Utasítás hibaIsmeretlen utasítás: %s
-
KiHangosTitkosított üzenet
@@ -811,7 +796,6 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.PéldaKözösség azonosítópélda
-
SzobákEmberekNincsenek felhasználók
@@ -876,7 +860,6 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.%d aktív kisalkalmazás
%d aktív kisalkalmazás
-
ProfilképCímzett profilképeÉszlelési profilkép
@@ -918,9 +901,9 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés
A folytatáshoz add meg a jelszavadat:Fiók felfüggesztéseHarmadik felektől származó licencek
- Letöltés
- Beszéd
- Törlés
+ Letöltés
+ Beszéd
+ TörlésVégpontok közötti titkosításhoz használt kulcsok újrakérése a többi munkamenetedtől.Kulcs újrakérve.Kérés elküldve
@@ -1041,7 +1024,7 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés
Az alapértelmezett ${app_name} csengőhang használata bejövő hívásokhozBejövő hívás csengőhangjaCsengőhang kiválasztása a hívásokhoz:
- Elfogadás
+ ElfogadásNézd át és fogadd el a Matrix-kiszolgáló házirendjét:Értesítéshibák felderítéseHibakereső diagnosztika
@@ -1112,7 +1095,7 @@ Bármi amit a ${app_name} el akar végezni amíg a háttérben fut, agresszívan
KulcsmentésKulcsmentés használataA kulcsok biztonsági mentése még tart, kis türelmet…
- Kihagyás
+ KihagyásKészHaladó Értesítés beállításokÉrtesítés fontosságának beállítása eseménynél
@@ -1209,15 +1192,15 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törlik.Biztos vagy benne?
MentésElveszted a hozzáférésedet a titkosított üzeneteidhez, ha nem mented el a titkosítási kulcsaidat kilépés előtt.
- Maradás
- Megszakítás
+ Maradás
+ MegszakításBiztos, hogy ki akarsz lépni?Az adatkímélő mód kiszűri az állapotjelentéseket és a gépelés jelentést az adatfolyamból.Titkosított Üzenetek VisszaállításaKérlek add meg a felhasználói nevedet.Kulcs Mentés használatának megkezdése(Haladó)
- Kulcsok kimentése kézzel
+ Kulcsok exportálása kézzelVédd a mentésedet jelmondattal.A kulcsaid másolatait titkosítva a Matrix szervereden fogjuk tárolni. Védd jelszóval a mentést, a biztonság érdekében.
\n
@@ -1256,7 +1239,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Visszaállítási kulcs kiszámítása…Kulcsok letöltése…Kulcsok betöltése…
- Figyelmen kívül hagyás
+ Figyelmen kívül hagyásBelépés egyszeri bejelelentkezésselEz az URL nem érhető el, ellenőrizdAz eszközöd elavult TLS biztonsági protokollt használ, amely támadható, a biztonságod érdekében nem csatlakozhatsz
@@ -1366,8 +1349,8 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
SzobákA szobáidat itt láthatod. Koppints a + -ra jobbra lent a meglévők kereséséhez vagy egy saját indításához.Reakciók
- Egyetértek
- Kedvelem
+ Egyetértek
+ KedvelemReakció hozzáadásaReakciók megjelenítéseReakciók
@@ -1449,8 +1432,8 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Szűrés felhasználói névre vagy azonosítóra…Szobába belépés…Szerkesztési napló megtekintése
- Átnézés
- Elutasítás
+ Átnézés
+ ElutasításA továbblépéshez el kell fogadnod a Felhasználási feltételeket.Felhasználási feltételekFeltételek átnézése
@@ -1458,8 +1441,8 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Használj botokat, hidakat (bridges), kisalkalmazásokat és matrica csomagokatOlvasd ittNincs
- Visszavonás
- Bontás
+ Visszavonás
+ BontásNincs beállítva azonosítási kiszolgáló.A hívás a hibásan beállított kiszolgáló miatt sikertelenKérd meg a Matrix-kiszolgálód (%1$s) rendszergazdáját, hogy állítson be egy TURN-kiszolgálót, hogy a hívások megbízhatóan működjenek.
@@ -1798,7 +1781,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
QR kód képEllenőrzés: %sEllenőrizve: %s
- Várakozás erre: %s…
+ Várakozás %s felhasználóra…A nagyobb biztonsághoz ellenőrizd ezt: %s az egyszeri kód összehasonlításával mindkét eszközön.
\n
\nA legnagyobb biztonság érdekében ezt tedd meg személyesen.
@@ -1885,7 +1868,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
%1$s (%2$s) új munkamenetet használva jelentkezett be:Amíg a felhasználó nem jelöli megbízhatónak ezt a munkamenetet addig a munkamenetből küldött és a munkamenetbe érkező üzenetek figyelmeztetéssel lesznek ellátva. Vagy te is ellenőrizheted a munkamenetet.Eszközök közötti hitelesítés inicializálása
- Visszaállítási Kulcsok
+ Kulcsok alaphelyzetbe állításaQR kódMajdnem kész! %s is ugyanazt a pipát mutatja\?Igen
@@ -1894,15 +1877,6 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
FelhasználónévFejlesztői EszközökFiók Adatok
-
- %d szavazat
- %d szavazat
-
-
- %d szavazat – Végeredmény
- %d szavazat – Végeredmény
-
- Kiválasztott BeállításokEgyszerű szavazás készítéseHasználd a visszaállítási eljárástHa nem érsz el létező munkamenetet
@@ -1988,7 +1962,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
%s elkészítette és beállította a szobát.Majdnem kész! A másik eszközöd is ugyanazt a pipát mutatja\?Majdnem kész! Várakozás a megerősítésre…
- Várakozás erre: %s…
+ Várakozás %s felhasználóra…A kulcsok betöltése sikertelenÉrtesítések beállításaAz üzenetek „@room”-ot tartalmaznak
@@ -2029,7 +2003,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- "vagy más eszközök közötti hitelesítést támogató Matrix-klienst"
+ "vagy más eszközök közötti hitelesítést támogató Matrix-klienst"Az ${app_name} legújabb kliensét használd a többi eszközödön:A jelenlegi csoport munkamenet törlését kikényszeríti a titkosított szobábanCsak a titkosított szobákban támogatott
@@ -2104,7 +2078,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
%1$s használataVagy beírhatsz más azonosítási szerver URL-tAdd meg az azonosítási szerver URL-jét
- Szünet
+ SzünetMásolásSikerÉrtesítések
@@ -2137,8 +2111,8 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Új Biztonsági Kulcs generálása, vagy a jelenlegi mentésedhez új Biztonsági Jelmondat megadása.A jelenlegi Kulcsod vagy Jelmondatod ki lesz cserélve erre.Az integrációk ki vannak kapcsolva
- Lejátszás
- Eltüntetés
+ Lejátszás
+ EltüntetésNincs engedélyed konferenciahívást indítani ebben a szobábanMár folyamatban van egy konferencia!Videomegbeszélés indítása
@@ -2333,7 +2307,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
FogadásNincsen jogosultságod konferenciahívás indításáhozCsevegés indítása
- Visszaállítás
+ VisszaállításEngedélyezd a névjegyek elérését.Ez a telefonszám már meg van adva.Kulcs megosztási kérések naplójának küldése
@@ -2480,10 +2454,8 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Szobák kezeléseOlyant keresel aki még nincs itt: %s\?%s meghívott
- Figyelmeztetés szerver oldali támogatás és kísérleti szoba verzió szükséges
- Kísérleti Tér - Korlátozott szobák.Meghívtak
- Szobák és emberek csoportosításának új lehetősége a Terek használata.
+ A Terek használata egy új lehetőség a szobák és felhasználók csoportosítására.Üdv a Terekben!Szobák hozzáadásaLétező szobák és tér hozzáadása
@@ -2511,7 +2483,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Felfedezhetik ezt: %sMeghívó ide: %sMegosztás hivatkozás
- Meghívás felhasználónévvel
+ Meghívás felhasználónévvelMeghívás e-maillelEgyelőre csak te vagy itt, %s még jobb lehet másokkal együtt.Meghívó ide: %s
@@ -2526,12 +2498,12 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Készítünk szobákat számukra. Később még adhatsz hozzájuk.Milyen beszélgetéseket szeretnél itt: %s\?A folytatáshoz adj neki nevet.
- Adj hozzá információkat amik segítenek az embereknek beazonosítani. Bármikor megváltoztathatod.
+ Adj hozzá információkat amik segítenek felismerni ezt a teret. Bármikor megváltoztathatod.Adj hozzá pár információt, hogy tűnjön ki. Bármikor megváltoztathatod.Tér készítéseCsak meghívóval, saját célra és csoportoknak ideálisPrivát
- Nyílt tér mindenkinek, a legjobb a közösségeknek
+ Mindenki számára szabadon hozzáférhető, a közösségeknek ajánlottNyilvánosPrivát tér neked és a csoporttársaidnakÉn és a csoporttársaim
@@ -2543,7 +2515,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Létező térbe való belépéshez meghívó szükséges.Ezt később meg lehet változtatniMilyen típusú teret szeretnél készíteni\?
- Szobák és emberek csoportosításának új lehetősége a Terek használata
+ A Terek használata egy új lehetőség a szobák és felhasználók csoportosításáraPrivát térNyilvános térTér hozzáadása
@@ -2643,7 +2615,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Jelenlegi PIN kód megváltoztatásaPIN megváltoztatása${app_name} megnyitásához mindig PIN kód szükséges.
- Ha nem használsz ilyent: ${app_name} akkor 2 perc elteltével PIN kód megadása szükséges.
+ Ha 2 percnél hosszabb ideig nem használod az ${app_name} Element alkalmazást, PIN kódot fog kérni.2 perc elteltével PIN szükségesEszköz specifikus biometrikus azonosítás engedélyezése, mint ujjlenyomat vagy arcfelismerés.
@@ -2692,7 +2664,6 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
\nAz üzeneteidet zárolással vannak biztosítva és csak neked és a címzetteknek van meg a kulcs hozzá.Itt az üzenetek nincsenek végponttól végpontig titkosítva.Azonosítás eredménye
- Bot GombSzavazásSzoba létrehozása…Néhány karakter nem engedélyezett
@@ -2707,7 +2678,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Folytatás ezzel: %sVagyÁllíts be címet ehhez a szobához, hogy a felhasználók a matrix szervereden megtalálhassák (%1$s)
- Meghívásossá tetted.
+ Meghívásossá tetted ezt a beszélgetést.%1$s meghívásossá tette.Szoba beállításaiAlacsony prioritásúak közül kivesz
@@ -2730,7 +2701,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Videó tömörítése (%d%%)Kép tömörítése…Teljes tartalom megmutatása titkosított szobákban
- Visszajelzés adása
+ Visszajelzés küldéseA visszajelzésed nem sikerült elküldeni (%s)Köszönjük, a visszajelzésed sikeresen elküldésre kerültHa további kérdés merülne fel, kapcsolatba léphetnek velem
@@ -2922,7 +2893,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Videóhívás elutasítvaHanghívás elutasítvaVideóhívás befejeződött • %1$s
- Videóhívás befejeződött • %1$s
+ Hívás befejeződött • %1$sVideó hívás folyamatbanHanghívás folyamatbanBejövő videó hívás
@@ -2964,7 +2935,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
E-mail alapú meghívás, kapcsolatok megtalálása és sok más…Felderíthetőségi beállítás befejezése.Jelenleg nem használsz azonosítási szolgáltatást. Ahhoz, hogy a csoporttársaidat meghívd vagy megtaláljanak állíts be egyet alább.
- Meghívás felhasználói névvel vagy e-mail címmel
+ Meghívás felhasználói névvel vagy e-mail címmelEllenőrizd, hogy a megfelelő személyeknek van hozzáférése ehhez a céghez: %s. Később meghívhatsz másokat is.Kik a csoporttársaid\?A megadott térhez adás
@@ -3037,4 +3008,53 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
A meglévő kapcsolatok felderítéséhez információkat (e-mail cím és telefonszám) kell elküldeni az azonosítási szolgáltatónak. Az adatok az adatvédelem miatt hashelve lesznek elküldve.Beleegyezel az információk elküldésébe\?Nem most
+ Engedélyezés
+ Biztosan törlöd ezt a szavazást\? Ezt a műveletet később nem lehet visszavonni.
+ Szavazás törlése
+ Szavazás lezárva
+ Szavazat leadva
+ Szavazások bekapcsolása
+ Szavazás lezárása
+ Ez megszünteti az új szavazatok leadásának lehetőségét, és kijelzi a végleges eredményt.
+ Lezárod a szavazást\?
+ Szavazás lezárása
+
+ Eredmény %1$d szavazat alapján
+ Eredmény %1$d szavazat alapján
+
+
+ Nem szavazott senki
+ %1$d leadott szavazat. Szavazz az eredmények megtekintéséhez
+
+
+ %1$d szavazat alapján
+ %1$d szavazat alapján
+
+
+ %1$d szavazat
+ %1$d szavazat
+
+ Rendszerbeállítások
+ Verziók
+ Segítség az Element használatában
+ Segítség és támogatás
+ Segítség
+ Ez a szerver nem adott meg szabályzatot.
+ Harmadik féltől származó programkönyvtárak
+ Az azonosítási szervered szabályzata
+ A Matrix szervered szabályzata
+ ${app_name} szabályzat
+ Később akármikor kikapcsolhatod a beállításokban
+ Nem osztjuk meg az információt harmadik féllel
+ Nem küldünk és nem profilozunk semmilyen fiók adatot
+ itt
+ Segíts észrevennünk a hibákat, és jobbá tenni az Element-et a névtelen használati adatok küldése által. Ahhoz, hogy megértsük, hogyan használnak a felhasználók egyszerre több eszközt, egy véletlenszerű azonosítót generálunk, ami az eszközeid között meg lesz osztva.
+\n
+\nElolvashatod a feltételeinket %s.
+ Segíts az Element-et jobbá tenni
+ nyerő válasz
+ Jogi dolgok
+ A változások életbelépéséhez indítsd újra az alkalmazást.
+ LaTeX matematikai szintaxis engedélyezése
+ Nem léphetsz be ebbe a szobába
\ No newline at end of file
diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml
index b0a8d4f07c3..4f774bac76a 100644
--- a/vector/src/main/res/values-in/strings.xml
+++ b/vector/src/main/res/values-in/strings.xml
@@ -12,18 +12,18 @@
PengaturanDetail AnggotaOK
- Batal
- Simpan
- Tinggalkan
- Kirim
- Kutip
- Bagikan
- Hapus
- Ubah Nama
+ Batal
+ Simpan
+ Tinggalkan
+ Kirim
+ Kutip
+ Bagikan
+ Hapus
+ Ubah NamaLaporkan KontenInformasi Perangkatatau
- Undang
+ UndangPanggilan SuaraPanggilan VideoBalasan Cepat
@@ -31,7 +31,7 @@
KonfirmasiBukaTutup
- Nonaktifkan
+ NonaktifkanFavoritCari ruangCari favorit
@@ -66,8 +66,8 @@
Nomor Telpon (piihan)Ulangi kata sandiKonfirmasi kata sandi baru
- Kirim Ulang
- Teruskan
+ Kirim Ulang
+ TeruskanTampilkan SumberBuat TautanTampilkan Sumber Terdekripsi
@@ -129,10 +129,10 @@
YATIDAKLanjut
- Hapus
- Gabung
- Pratinjau
- Tolak
+ Hapus
+ Gabung
+ Pratinjau
+ TolakNantiKirim Saja${app_name} belum diizinkan untuk mengakses kontak lokal
@@ -152,7 +152,7 @@
perangkat tidak diketahuiTerverifikasiJejak Percakapan
- Hapus
+ HapusPanggilan massal sedang berlangsung.
\nBergabung sebagai %1$s atau %2$ssuara
@@ -245,9 +245,9 @@
Kirimkan StickerLisensi Pihak KetigaMemuat…
- Unduh
- Bicaralah
- Bersihkan
+ Unduh
+ Bicaralah
+ BersihkanIni tidak dapat dilakukan karena belum mendapat permisi.KeluarTindakan
@@ -290,7 +290,7 @@ Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna ${app_name} yan
Daftar AnggotaBuka kopMenyinkronkan…
- Arahkan ke yang belum terbaca
+ Arahkan ke pesan yang belum dibacaAnda telah diundang untuk bergabung ke ruang ini oleh %sUndangan ini dikirim oleh %s, yang tidak terhubung dengan akun ini.
\nAnda mungkin ingin masuk dengan akun lain, atau tambahkan email ini ke akun Anda.
@@ -413,17 +413,6 @@ Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna ${app_name} yan
PESANORANGBERKAS
- GABUNG
- DIREKTORI
- FAVORIT
- RUANG
- PRIORITAS RENDAH
- UNDANGAN
- Mulai percakapan
- Buat ruang
- Gabung ke ruang
- Gabung ke ruang
- Ketik id atau alias ruangJelajahi direktori%d ruangan
@@ -617,10 +606,10 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Semua ruang bawaan %sKetik di sini…
- %d pesan pemberitahuan yang belum terbaca
+ %d pesan pemberitahuan yang belum dibaca
- %d pesan pemberitahuan yang belum terbaca
+ %d pesan pemberitahuan yang belum dibacaPrioritas rendahTidak Ada
@@ -714,7 +703,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Negara Nomor TeleponTampilan halaman awalSemat ruang yang pemberitahuannya terlewatkan
- Semat ruang yang pesannya belum terbaca
+ Pin ruangan dengan pesan yang belum dibacaPerangkatPratinjau URL dalam obrolanTampilkan waktu kirim untuk seluruh pesan
@@ -793,7 +782,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Avatar penerimaDemosi pengguna dengan id berikutTetap Panggil
- Terima
+ TerimaErrorMohon telaah dan terima kebijakan homeserver ini:Panggilan
@@ -873,9 +862,9 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Yakin\?CadangkanAkses ke pesan terenkripsi akan hilang apabila Anda tidak mencadangkan kunci sebelum mencopot akun.
- Lewatkan
+ LewatkanSelesai
- Hentikan
+ HentikanAnda yakin ingin mencopot akun\?Pengaturan Pemberitahuan LanjutanUrgensi pemberitahuan lewat kejadian
@@ -1122,13 +1111,13 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.GantiTambahSalin
- Tandai sebagai terbaca
+ Tandai sebagai dibacaTutup TeleponTolakTerima
- Tolak
- Tinjauan
- Abaikan
+ Tolak
+ Tinjauan
+ AbaikanGagal menghapus widgetGagal menambahkan widgetAnda tidak dapat melakukan panggilan dengan diri sendiri, tunggu untuk peserta untuk menerima undangan
@@ -1146,14 +1135,14 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Untuk melakukan tindakan ini, silakan berikan izin Kamera dari pengaturan sistem.Beberapa izin hilang untuk melakukan tindakan ini, mohon berikan izin dari pengaturan sistem.Mulai Mengobrol
- Atur Ulang
- Hilangkan
- Jeda
- Mainkan
- Putuskan
- Batalkan
+ Atur Ulang
+ Hilangkan
+ Jeda
+ Mainkan
+ Putuskan
+ BatalkanTidak Ada
- Tetap
+ TetapVerifikasi sesiInisialisasi layananStandar Sistem
@@ -1273,7 +1262,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Tidak dapat mengunggah gambarTidak dapat dihapusTidak dapat mengirim pesan
- Perangkat pengirim belum mengirimi kami kunci untuk pesan ini.
+ Perangkat pengirim belum mengirimi kami kunci untuk pesan ini.** Tidak dapat mendekripsi: %s **%1$s dari %2$s ke %3$sAnda mengubah tingkat daya %1$s.
@@ -1393,7 +1382,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Widget aktifLIHAT%1$s: %2$s
- ** Gagal mengirim - mohon buka ruangan
+ ** Gagal mengirim — mohon buka ruanganSayaUndangan BaruPesan Baru
@@ -1626,7 +1615,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Ini adalah percakapan Anda. Miliki percakapan Anda.Jaga percakapan tetap pribadi dengan enkripsiChat dengan orang-orang secara langsung atau dalam grup
- Pesan belum terbaca
+ Pesan yang belum dibacaAnda membuatnya khusus undangan.%1$s membuatnya khusus undangan.Anda membuat akses ruangan khusus undangan.
@@ -2029,8 +2018,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.ReaksiTampilkan ReaksiTambah Reaksi
- Suka
- Setuju
+ Suka
+ SetujuReaksiRuangan Anda akan ditampilkan di sini. Ketuk tombol + untuk memulai yang baru.Ruangan
@@ -2173,7 +2162,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Menunggu…Kesimpulan VerifikasiBereaksi dengan: %s
- Tombol BotPollStikerFile
@@ -2323,8 +2311,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Bantu orang-orang di space untuk menemukan dan bergabung ruangan privat sendiri, tidak perlu mengundang semua secara manual.Baru: Izinkan orang-orang di space untuk menemukan dan bergabung ruangan privatDicatat bahwa meningkatkan akan membuat versi baru dari ruangannya. Semua pesan saat ini akan tetap di ruangan yang diarsip.
- Siapa saja di induk ruangan dapat menemukan dan bergabung ke ruangan ini - tidak perlu mengundang semua secara manual. Anda dapat mengubahnya di pengaturan ruangan kapan saja.
- Siapa saja di %s dapat menemukan dan bergabung ke ruangan ini - tidak perlu mengundang semua secara manual. Anda dapat mengubahnya di pengaturan ruangan kapan saja.
+ Siapa saja di induk ruangan dapat menemukan dan bergabung ke ruangan ini — tidak perlu mengundang semua secara manual. Anda dapat mengubahnya di pengaturan ruangan kapan saja.
+ Siapa saja di %s dapat menemukan dan bergabung ke ruangan ini — tidak perlu mengundang semua secara manual. Anda dapat mengubahnya di pengaturan ruangan kapan saja.Pesan Suara (%1$s)Tidak dapat membalas atau mengedit saat pesan suara aktifTidak dapat merekam sebuah pesan suara
@@ -2380,7 +2368,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Kelola ruanganMencari seseorang yang tidak ada di %s\?%s mengundang Anda
- Peringatan membutuhkan dukungan server dan versi ruangan yang eksperimentalAnda telah diundangSpace adalah cara baru untuk mengelompokkan ruangan dan pengguna.Selamat Datang ke Space!
@@ -2422,8 +2409,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Mereka akan dapat menjelajahi %sUndang ke %sBagikan tautan
- Undang dari nama pengguna atau email
- Undang dari nama pengguna
+ Undang dari nama pengguna atau email
+ Undang dari nama penggunaUndang dari emailHanya Anda saja saat ini. %s akan lebih baik dengan orang lain.Undang ke %s
@@ -2641,7 +2628,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Tautan ini %1$s akan membawa Anda ke situs lain: %2$s.
\n
\nApakah Anda yakin untuk melanjutkan\?
- Space Eksperimental - Ruangan yang Dibatasi.Tambahkan sebuah space ke space apa saja yang Anda bisa kelola.Beri nama untuk melanjutkan.Gagal untuk memvalidasi PIN, mohon ketuk yang baru.
@@ -2684,7 +2670,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Memaksa sesi kelompok outbound saat ini di ruang terenkripsi untuk dihapusGunakan ${app_name} di perangkat Anda yang lain:Gunakan ${app_name} di perangkat Anda yang lain, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} untuk Android, atau client Matrix lainnya yang mendukung tanda tangan silang
- atau client Matrix lainnya yang mendukung tanda tangan silang
+ atau client Matrix lainnya yang mendukung tanda tangan silang${app_name} iOS
\n${app_name} Android${app_name} Web
@@ -2888,13 +2874,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Sign In BaruGunakan Frasa Sandi Pemulihan atau KunciMembuat poll sederhana
- Opsi yang Dipilih
-
- %d suara - Hasil akhir
-
-
- %d suara
- Hapus data akun dengan tipe %1$s\?
\n
\nHati-hati menggunakannya, ini dapat menyebabkan perilaku yang tidak terduga.
@@ -2979,4 +2958,49 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Apakah Anda setuju untuk mengirimkan info ini\?Untuk menemukan kontak yang sudah ada, Anda harus mengirim info kontak (email dan nomor telepon) ke server identitas Anda. Kami meng-hash data Anda sebelum mengirim untuk privasi.Nanti
+ Apakah Anda yakin untuk menghapus poll ini\? Anda tidak akan dapat memulihkannya setelah dihapus.
+ Hapus poll
+ Poll berakhir
+ Suara diberikan
+ Aktifkan Poll
+ Akhiri poll
+ Ini akan menghentikan orang-orang untuk dapat memberikan suara dan akan menampilkan hasil akhir poll.
+ Akhiri poll ini\?
+ opsi pemenang
+ Akhiri poll
+
+ Hasil akhir berdasarkan oleh %1$d suara
+
+
+ %1$d suara diberikan. Berikan suara untuk melihat hasilnya
+
+
+ Berdasarkan oleh %1$d suara
+
+
+ %1$d suara
+
+ Pengaturan sistem
+ Versi
+ Dapatkan bantuan dalam menggunakan Element
+ Bantuan dan dukungan
+ Bantuan
+ Hukum
+ Server ini tidak memiliki sebuah kebijakan.
+ Perpustakaan pihak ketiga
+ Kebijakan server identitas Anda
+ Kebijakan homeserver Anda
+ Kebijakan ${app_name}
+ Anda dapat mematikannya kapan saja di pengaturan
+ Kami tidak membagikan informasi ini dengan pihak ketiga
+ Kami tidak merekam atau memprofil data akun apapun
+ di sini
+ Bantu kami mengidentifikasi masalah-masalah dan membuat Element lebih baik dengan membagikan data penggunaan anonim. Untuk memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda.
+\n
+\nAnda dapat membaca semua kebijakan kami %s.
+ Bantu buat Element lebih baik
+ Aktifkan
+ Mulai ulang aplikasi ini untuk menerapkan perubahan.
+ Aktifkan matematika LaTeX
+ Anda tidak diperbolehkan untuk bergabung ke ruangan ini
\ No newline at end of file
diff --git a/vector/src/main/res/values-is/strings.xml b/vector/src/main/res/values-is/strings.xml
index 6512cc3b7d3..c1a97bb605e 100644
--- a/vector/src/main/res/values-is/strings.xml
+++ b/vector/src/main/res/values-is/strings.xml
@@ -46,7 +46,7 @@
%1$s uppfærði notandasniðið sitt %2$s%1$s sendi boð til %2$s um þátttöku í spjallrásinni%1$s samþykkti boð um að taka þátt í %2$s
- Tæki sendandans hefur ekki sent okkur dulritunarlyklana fyrir þessi skilaboð.
+ Tæki sendandans hefur ekki sent okkur dulritunarlyklana fyrir þessi skilaboð.Gat ekki ritstýrtEkki er í augnablikinu hægt að taka aftur þátt í spjallrás sem er tóm.Boð á spjallrás
@@ -73,24 +73,24 @@
Nánar um samfélagHleð inn…Í lagi
- Hætta við
- Vista
- Fara út
- Senda
- Endursenda
- Ritstýra
- Tilvitnun
- Deila
+ Hætta við
+ Vista
+ Fara út
+ Senda
+ Endursenda
+ Ritstýra
+ Tilvitnun
+ DeilaSeinna
- Áframsenda
+ ÁframsendaVaranlegur tengillSkoða frumkóða
- Eyða
- Endurnefna
+ Eyða
+ EndurnefnaUpplýsingar um tækiSenda samteða
- Bjóða
+ BjóðaÓnettengtFara útAðgerðir
@@ -103,7 +103,7 @@
OpnaLokaAfritað á klippispjald
- Gera óvirkt
+ Gera óvirktStaðfestingAðvörunHeim
@@ -199,10 +199,10 @@
JÁNEIHalda áfram
- Fjarlægja
- Taka þátt
- Forskoðun
- Hafna
+ Fjarlægja
+ Taka þátt
+ Forskoðun
+ HafnaListi yfir meðlimiOpna hausSamstilli…
@@ -259,16 +259,6 @@
SKILABOÐFÓLKSKRÁR
- TAKA ÞÁTT
- MAPPA
- EFTIRLÆTI
- SPJALLRÁSIR
- LÍTILL FORGANGUR
- BOÐSGESTIR
- Hefja spjall
- Búa til spjallrás
- Taka þátt í spjallrás
- Taka þátt í spjallrásVafra í möppu%d spjallrás
@@ -402,22 +392,18 @@
%d virkur viðmótshluti%d virkir viðmótshlutar
-
Þú ert ekki á þessari spjallrás.Þú hefur ekki réttindi til þess að gera þetta á þessari spjallrás.Spjallrásin %s er ekki sýnileg.Aðvörun!SkipanavillaÓþekkt skipun: %s
-
SlökktHáværtDulrituð skilaboð
-
Búa tilDæmidæmi
-
HeimFólkSpjallrásir
@@ -465,7 +451,6 @@
samtali svarað annars staðarBoð um samtalNota innbyggða myndavél
-
Búa til samfélagHeiti samfélagsAuðkenni samfélags
@@ -502,7 +487,6 @@
Hefja sannvottunDeila án sannvottunarHunsa beiðni
-
Þér hefur verið sparkað úr %1$s af %2$sÞú hefur verið settur í bann á %1$s af %2$sTilraunir
@@ -626,7 +610,6 @@
Bjóða miðað við auðkenniTENGILIÐIR Á TÆKI (%d)Bjóða notendum miðað við auðkenni
- Settu inn auðkenni eða samheiti spjallrásar%1$s spjallrás fannst fyrir %2$s%1$s spjallrásir fundust fyrir %2$s
@@ -681,7 +664,6 @@
Þú bættir við nýju tæki \'%s\', sem er að krefjast dulritunarlykla.ósannvottaða tækið þitt \'%s\' er að krefjast dulritunarlykla.Símafundir eru í þróun og gætu verið óáreiðanlegir.
-
Kerfisstjóri samfélagsins hefur ekki gefið upp ítarlega lýsingu fyrir þetta samfélag.Skrifaðu heimanetþjón til að telja upp opinberar spjallrásir áVantar spjallrásarauðkenni í beiðni.
diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml
index 72dbd52011c..ec88bbe89d4 100644
--- a/vector/src/main/res/values-it/strings.xml
+++ b/vector/src/main/res/values-it/strings.xml
@@ -39,7 +39,7 @@
%1$s ha mandato un invito a %2$s per entrare alla stanza%1$s ha accettato l\'invito a %2$s** Impossibile decriptare: %s **
- Il dispositivo del mittente non ha inviato le chiavi per questo messaggio.
+ Il dispositivo del mittente non ha inviato le chiavi per questo messaggio.Impossibile riscrivereImpossibile inviare il messaggioInvio dell\'immagine fallito
@@ -49,7 +49,6 @@
Indirizzo emailNumero di telefono%1$s ha inviato uno sticker.
-
Invito da %sInvito nella stanza%1$s e %2$s
@@ -264,29 +263,27 @@
Hai terminato la videoconferenzaVideoconferenza terminata da %1$sVideoconferenza iniziata da %1$s
-
MessaggiStanzaImpostazioniDettagli sui membriCronologia
-
OK
- Annulla
- Salva
- Esci
- Invia
- Rispedisci
- Rimuovi
- Cita
- Condividi
+ Annulla
+ Salva
+ Esci
+ Invia
+ Rispedisci
+ Rimuovi
+ Cita
+ CondividiUltimi
- Inoltra
+ InoltraURL LinkVedi il codice sorgenteVedi il codice sorgente decifrato
- Elimina
- Rinomina
+ Elimina
+ RinominaSegnala contenutoChiamata in corsoAvvio conferenza.
@@ -301,9 +298,8 @@
Le stanze criptate non supportano le conferenzeInvia comunqueo
- Invita
+ InvitaDisconnesso
-
DisconnettiChiamata audioChiamata video
@@ -314,24 +310,19 @@
ApriChiudiCopiato negli appunti
- Disabilita
-
+ DisabilitaConfermaAttenzione
-
HomePreferitiChat diretteStanze
-
CercaCerca tra i preferitiCerca tra le chat diretteCerca tra le stanze
-
InvitiBassa priorità
-
ConversazioniRubrica localeElenco utenti
@@ -339,7 +330,6 @@
Nessuna conversazione${app_name} non ha avuto l\'autorizzazione ad accedere alla tua Rubrica localeNessun risultato
-
StanzeElenco stanzeNessuna stanza
@@ -378,7 +368,6 @@
AccettaRifiutaRiaggancia
-
AccediCrea accountInvia
@@ -426,7 +415,6 @@
La tua password è stata reimpostata.
\n
\nSei stato disconnesso da tutte le sessioni e non riceverai più alcuna notifica. Per ripristinare le notifiche, riconnettiti su ciascun dispositivo.
-
L\'URL deve iniziare con http[s]://Impossibile accedere: errore di reteImpossibile accedere
@@ -441,28 +429,20 @@
Sono state inviate troppe richiesteQuesto nome utente è già in usoIl link nella mail non è ancora stato cliccato
-
-
Elenco ricevute lette
-
-
Invia come OriginarioGrandeMedioPiccolo
-
"Annullare il download?Annullare l\'upload?%d s%1$dm %2$ds
-
IeriOggi
-
Nome stanzaArgomento stanza
-
Chiamata in corsoChiamata in connessione…Chiamata terminata
@@ -475,10 +455,8 @@
La connessione al supporto multimediale è fallitaImpossibile avviare la fotocamerachiamata risposta altrove
-
Fai una foto o un videoImpossibile registrare video
-
Informazione${app_name} deve essere autorizzato ad accedere alla tua Galleria di foto e video per poter inviare e salvare allegati.
\n
@@ -499,31 +477,25 @@
\n
\nTi sta bene comunicare i dati di tutti i tuoi contatti per questo scopo\?Purtroppo l\'azione non è stata eseguita a causa di autorizzazioni mancanti
-
SalvatoSalvare nei download?SÌNOContinua
-
- Rimuovi
- Entra
- Anteprima
- Rifiuta
-
+ Rimuovi
+ Entra
+ Anteprima
+ RifiutaVai ai non letti
-
Sei stato invitato da %s a entrare in questa stanzaQuesto invito è stato spedito a %s, che non è associato a questo account.
\nPuoi aggiungere questa email al tuo account o provare ad accedere con un account differente.Stai provando ad accedere a %s. Vuoi entrare e partecipare alla discussione\?una stanzaQuesta è l\'anteprima della stanza. Le interazioni sono disabilitate.
-
Nuova chatAggiungi utente1 utente
-
Esci dalla stanzaSei sicuro di voler uscire dalla stanza?Sei sicuro di voler rimuovere %s da questa chat?
@@ -551,7 +523,6 @@
La nomina non potrà essere annullata perché darai a questo utente i tuoi stessi poteri.
\nSicuro di voler procedere\?Sicuro di voler invitare %s\?
-
Invita tramite ID utente CONTATTI LOCALI (%d)ELENCO UTENTI (%s)
@@ -559,7 +530,6 @@
Invita tramite ID utentePer favore inserisci uno o più indirizzi email o ID utenteEmail o ID utente
-
Cerca%s sta scrivendo…%1$s & %2$s stanno scrivendo…
@@ -575,7 +545,6 @@
Elimina i messaggi non inviatiFile non trovatoNon hai il permesso di pubblicare in questa stanza.
-
FidatiNon fidartiDisconnetti
@@ -587,7 +556,6 @@
Il certificato è diverso da quello precedentemente contrassegnato sul tuo telefono come \"affidabile\". Questa cosa è MOLTO INSOLITA. Si raccomanda di NON ACCETTARE questo nuovo certificato.Il certificato del server è cambiato: quello precedente era stato contrassegnato come affidabile ma quello attuale no. Può darsi che il certificato precedente sia scaduto e sia stato semplicemente sostituito con uno nuovo. Contatta l\'amministratore del server per verificare l\'impronta digitale in uso.Contrassegna il certificato come affidabile solo se l\'mpronta digitale comunicata dall\'amministratore del server corrisponde a quella qua sopra.
-
Dettagli stanzaUtentiFile
@@ -595,14 +563,12 @@
ID malformato. Dovrebbe essere un indirizzo email o un ID utente Matrix come \'@localpart:domain\'INVITATIMEMBRI
-
Motivo per cui segnali questo contenutoDesideri nascondere tutti i messaggi di questo utente\?
\n
\nTieni presente che questa azione riavvierà l\'app e ciò potrebbe richiedere molto tempo.Annulla l\'UploadAnnulla il Download
-
CercaCerca tra i membri della stanzaNessun risultato
@@ -610,28 +576,13 @@
MESSAGGIUTENTIFILE
-
- ENTRA
- ELENCO
- PREFERITI
- STANZE
- BASSA PRIORITÀ
- INVITI
- Avvia chat
- Crea stanza
- Entra nella stanza
- Entra in una stanza
- Digita l\'ID stanza o il suo nome
-
Esplora l\'elencoRicerca negli elenchi…
-
PreferitoBassa prioritàChat direttaEsci dalla conversazioneDimentica
-
MessaggiImpostazioniVersione
@@ -639,7 +590,6 @@
Avvisi di terze partiCopyrightPolitica sulla privacy
-
Immagine del profiloNome visualizzatoEmail
@@ -729,42 +679,33 @@
Inserisci un codice di attivazioneErrore durante la verifica del numero di telefonoCodice
-
3 giorni1 settimana1 mesePer sempre
-
-
Icona della stanzaNome della stanzaArgomentoEtichetta dela stanzaEtichetta come:
-
PreferitoBassa prioritàNessuna etichetta
-
Accesso e visibilitàMostra questa stanza nell\'elenco delle stanze pubblicheAccesso alla stanzaAccesso alla TimelineChi può leggere la Timeline\?Chi può entrare in questa stanza?
-
ChiunqueSolo i membri (dal momento in cui questa opzione è stata selezionata)Solo i membri (dal momento in cui vengono invitati)Solo i membri (dal momento in cui entrano nella stanza)
-
Una stanza deve avere un indirizzo per poter essere linkata.Solo le persone che sono state invitateChiunque conosca il link della stanza, eccetto gli ospitiChiunque conosca il link della stanza, compresi gli ospiti
-
Utenti bannati
-
AvanzateID interno della stanzaIndirizzi
@@ -775,7 +716,6 @@
Per abilitare la crittografia devi disconnetterti.Cripta solo per le sessioni verificateDa questa sessione non inviare mai messaggi cifrati alle sessioni non verificate presenti in questa stanza.
-
Questa stanza non ha indirizzi localiNuovo indirizzo stanza (es. #foo:matrix.org)Il formato del nome della stanza non è corretto
@@ -790,12 +730,9 @@
La Crittografia in questa stanza non è attiva.Attiva crittografia
\n(attenzione: non potrà più essere disattivata!)
-
ElencoTema
-
%s stava cercando di caricare un punto specifico nella cronologia di questa stanza ma non è stato in grado di trovarlo.
-
Informazioni sulla crittografia E2EInformazioni sull\'eventoID utente
@@ -839,23 +776,19 @@
Conferma confrontando la seguente con le impostazioni utente della tua altra sessione:Se non corrispondono, la sicurezza delle tue comunicazioni potrebbe essere compromessa.Ho verificato che le chiavi corrispondono
-
La stanza contiene sessioni sconosciuteQuesta stanza contiene sessioni sconosciute che non sono state verificate.
\nNon v\'è alcuna garanzia che le sessioni appartengano agli utenti dichiarati.
\nTi consigliamo di verificare ogni sessione prima di continuare, ma se lo preferisci, è comunque possibile inviare il messaggio anche senza la verifica.
\n
\nSessioni sconosciute:
-
Scegli un elenco di stanzeIl server potrebbe essere non disponibile o sovraccaricoInserisci un Home Server per vedere le sue stanze pubblicheNome del serverTutte le stanze sull\'Home Server %sTutte le stanze native %s
-
Cerca tra i messaggi passati
-
Dimensione fontMinuscoloPiccolo
@@ -873,7 +806,6 @@
Devi avere il permesso per poter gestire i widget in questa stanzaAvvia una conferenza usando JitsiVuoi davvero eliminare questo widget dalla stanza\?
-
Impossibile creare il widget.L\'invio della richiesta è fallito.Non sei in questa stanza.
@@ -959,22 +891,17 @@
%d widget attivo%d widget attivi
-
La stanza %s non è visibile.Usa la fotocamera di sistema
-
Hai aggiunto una nuova sessione \'%s\' che sta richiedendo le chiavi crittografiche.La tua sessione non verificata \'%s\' sta chiedendo le chiavi crittografiche.Avvia la verificaCondividi senza verificareIgnora la richiesta
-
Attenzione!Le conferenze sono in fase di sviluppo e potrebbero non essere affidabili.
-
Errore di comandoComando non riconosciuto: %s
-
SpentoRumorosoCrea
@@ -983,7 +910,6 @@
EsempioID comunitàesempio
-
HomeStanzeNessun utente
@@ -1046,9 +972,9 @@
Per continuare, inserisci la tua password:Disattiva l\'accountLicenze di terze parti
- Scarica
- Parla
- Svuota
+ Scarica
+ Parla
+ SvuotaRichiedi di nuovo le chiavi di crittografia dalle tue altre sessioni.La richiesta della chiave è stata inviata.Richiesta inviata
@@ -1170,7 +1096,7 @@
Usa la suoneria predefinita di ${app_name} per le chiamate in arrivoSuoneria delle chiamate in arrivoScegli la suoneria per le chiamate:
- Accetta
+ AccettaPer favore, leggi e accetta i termini di servizio di questo Home Server:Diagnostica delle notificheDiagnosi dei problemi
@@ -1242,7 +1168,7 @@
Backup delle chiaviUsa il Backup delle chiaviIl Backup delle chiavi non è concluso, attendere prego…
- Salta
+ SaltaFattoImpostazioni di notifica avanzateSe ti disconnetti adesso perderai i tuoi messaggi cifrati
@@ -1254,9 +1180,9 @@
Sei sicuro\?BackupPerderai l\'accesso ai tuoi messaggi criptati a meno che tu non faccia il Backup delle chiavi prima di disconnetterti.
- Rimani
- Interrompi
- Ignora
+ Rimani
+ Interrompi
+ IgnoraSei sicuro di volerti disconnettere\?Accedi con single sign-onQuesto URL è irraggiungibile. Per favore controllalo
@@ -1492,8 +1418,8 @@
StanzeLe tue stanze verranno mostrate qui. Tocca il pulsante + per trovare quelle esistenti o crearne di nuove.Reazioni
- D\'accordo
- Piace
+ D\'accordo
+ PiaceAggiungi reazioneVedi le reazioniReazioni
@@ -1576,8 +1502,8 @@
Cerca per nome o ID utente …Sto entrando nella stanza …Visualizza Modifica Timeline
- Leggi
- Rifiuta
+ Leggi
+ RifiutaPer continuare devi accettare i termini di servizio.Termini di servizioLeggi i termini di servizio
@@ -1585,8 +1511,8 @@
Usa bot, bridge, widget e pacchetti di stickerLeggi suNessuno
- Revoca
- Disconnetti
+ Revoca
+ DisconnettiNon è stato configurato alcun server d\'identità.Chiamata fallita a causa di un\'errata configurazione del serverChiedi all\'amministratore del tuo Home Server (%1$s) di configurare un server TURN affinché le chiamate funzionino in modo affidabile.
@@ -2015,15 +1941,6 @@
Nome utenteStrumenti per sviluppatoriDati account
-
- %d voto
- %d voti
-
-
- %d voto - Risultato finale
- %d voti - Risultato finale
-
- Opzione selezionataCrea un semplice sondaggioUsa una Passphrase o un codice di recuperoSe non puoi accedere a una sessione esistente
@@ -2085,7 +2002,7 @@
FineUsa questa %1$s come una rete di salvataggio in caso dimenticassi la tua %2$s.Pubblicazione delle chiavi di identità create
- Generazione di una chiave sicura basata sulla Passphrase
+ Generazione chiave sicura dalla frase di sicurezzaDefinizione della chiave predefinita SSSSSincronizzazione della chiave principaleSincronizzazione della chiave utente
@@ -2098,9 +2015,9 @@
Salvala in una penna USB o disco di backupCopiala sul CloudNon puoi farlo dallo smartphone
- Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche.
+ Impostare una frase di sicurezza di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche.
\n
-\nSe non vuoi impostare una Password dei messaggi puoi generare una chiave dei messaggi.
+\nSe non vuoi impostare una Password dei Messaggi, puoi generare una Chiave dei Messaggi.Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche.Crittografia attivaI messaggi in questa stanza sono crittografati E2E. Maggiori info e verifica degli utenti nel loro profilo.
@@ -2139,7 +2056,7 @@
%1$s (%2$s)Per continuare inserisci la Passphrase del backup delle chiavi.usare la chiave di ripristino del backup chiavi
- Non conosci la Passphrase del backup delle chiavi, puoi %s.
+ Non conosci la frase di sicurezza del backup delle chiavi, puoi %s.Chiave di ripristino del backup chiaviImpedisci la cattura di schermate dell\'appAttivandolo verrà aggiunto FLAG_SECURE a tutte le attività. Riavvia l\'applicazione per applicare le modifiche.
@@ -2151,7 +2068,7 @@
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- o un altro client Matrix che supporti la firma incrociata
+ o un altro client Matrix che supporti la firma incrociataUsa l\'ultima versione di ${app_name} anche sui tuoi altri dispositivi:Forza l\'attuale sessione di gruppo in uscita in una stanza cifrata ad essere scartataSupportato solo nelle stanze criptate
@@ -2225,9 +2142,9 @@
In alternativa, puoi inserire l\'URL di un qualsiasi altro server d\'identitàInserisci l\'URL di un server d\'identitàInvia
- Avvia
- Pausa
- Annulla
+ Avvia
+ Pausa
+ AnnullaCopiaCompletatoNotifiche
@@ -2425,7 +2342,6 @@
Mostra eventi di stato dei membri della stanzaIncludi eventi di invito/entrata/uscita/kick/ban e modifiche di avatar/nome.Sondaggio
- Pulsanti botReagito con: %sVerifica conclusaVuoi eliminare i dati dell\'account di tipo %1$s\?
@@ -2479,7 +2395,7 @@
Filtra utenti banditiNon hai il permesso di avviare una chiamataNon hai il permesso di avviare una chiamata di gruppo
- Reimposta
+ ReimpostaIl codice PIN è richiesto ogni volta che apri ${app_name}.Il codice PIN è richiesto dopo 2 minuti di inattività su ${app_name}.Richiedi il PIN dopo 2 minuti
@@ -2726,8 +2642,6 @@
Sincronizzazione iniziale:
\nIn attesa di risposta dal server…Messaggio inviato
- L\'avviso richiede il supporto del server e una versione di stanza sperimentale
- Spazio sperimentale - stanza riservata.Sei stato invitatoGli Spazi sono un nuovo modo per raggruppare stanze e contatti.Benvenuto negli Spazi!
@@ -2753,7 +2667,7 @@
Potranno esplorare %sInvita in %sCondividi link
- Invita per nome utente
+ Invita per nome utenteInvita per emailAl momento ci sei solo tu. Con più persone %s sarà ancora migliore.Invita persone
@@ -3013,7 +2927,7 @@
Termina configurazioneInvita per email, trova contatti e altro…Attualmente non stai usando un server d\'identità. Per poter invitare compagni ed essere individuabile da loro, configurane uno sotto.
- Invita per nome utente o email
+ Invita per nome utente o emailAssicurati che le persone giuste abbiano accesso a %s. Puoi invitarne altre dopo.Chi sono i tuoi compagni di squadra\?Aggiungi allo spazio scelto
@@ -3085,4 +2999,53 @@
Sei d\'accordo con l\'invio di queste informazioni\?Per trovare i contatti esistenti, devi inviare le informazioni dei contatti (email e numeri di telefono) al tuo server d\'identità. Facciamo un hash dei dati prima di inviarli per privacy.Non ora
+ Vuoi davvero rimuovere questo sondaggio\? Non potrai recuperarlo una volta rimosso.
+ Rimuovi sondaggio
+ Sondaggio terminato
+ Voto inviato
+ Attiva sondaggi
+ Termina sondaggio
+ Ciò impedirà alle persone di poter votare e mostrerà i risultati finali del sondaggio.
+ Terminare questo sondaggio\?
+ opzione vincente
+ Termina sondaggio
+
+ Risultato finale basato su %1$d voto
+ Risultato finale basato su %1$d voti
+
+
+ Nessun voto
+ %1$d voti. Vota per vedere i risultati
+
+
+ Basato su %1$d voto
+ Basato su %1$d voti
+
+
+ %1$d voto
+ %1$d voti
+
+ Impostazioni di sistema
+ Versioni
+ Ricevi aiuto nell\'uso di Element
+ Aiuto e supporto
+ Aiuto
+ Informazioni legali
+ Questo server non presenta alcuna informativa.
+ Librerie di terze parti
+ L\'informativa del tuo server d\'identità
+ L\'informativa del tuo homeserver
+ Informativa di ${app_name}
+ Puoi disattivarlo in qualsiasi momento nelle impostazioni
+ Non condividiamo informazioni con terze parti
+ Non registriamo o profiliamo alcun dato dell\'account
+ qui
+ Aiutaci a identificare problemi e a migliorare Element condividendo dati di utilizzo anonimi. Per capire come le persone usano diversi dispositivi, genereremo un identificativo casuale, condiviso dai tuoi dispositivi.
+\n
+\nPuoi leggere i nostri termini di servizio %s.
+ Aiuta a migliorare Element
+ Attiva
+ Riavvia l\'applicazione per applicare le modifiche.
+ Attiva la matematica LaTeX
+ Non ti è permesso entrare in questa stanza
\ No newline at end of file
diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
index ffda58abe6f..5b06f0f7428 100644
--- a/vector/src/main/res/values-iw/strings.xml
+++ b/vector/src/main/res/values-iw/strings.xml
@@ -6,7 +6,7 @@
שגיאהאזהרהאישור
- השבת
+ השבתהעתק ללוח הגזיריםהסר פרסוםהוסף
@@ -26,15 +26,15 @@
נתקלהסירלקבל
- יְרִידָה
- סקירה
- להתעלם
- לְהַפִּיל
+ יְרִידָה
+ סקירה
+ להתעלם
+ לְהַפִּילבוצע
- לדלג
- לְקַבֵּל
+ לדלג
+ לְקַבֵּללא מקוון
- להזמין
+ להזמיןלשלוח בכל מקרהתתקשר בכל מקרהשיחות ועידה אינן נתמכות בחדרים מוצפנים
@@ -59,33 +59,33 @@
וידאוקולהתחל לצ\'וטט
- אתחול
- השהה
- לנגן
+ אתחול
+ השהה
+ לנגןשיחה פעילהדווח על תוכן
- התנתק
- לבטל
+ התנתק
+ לבטלאין
- שנה שם
- מחק
+ שנה שם
+ מחקצפה במקור המפוענחצפה במקור הדףקישור קבוע
- העבר
+ העברמאוחר יותר
- ניקוי
- דבר
- שתף
- הורדה
- צטט
- הסר
- שלח שוב
- שלח
- הישאר
- עזיבה
- שמירה
- ביטול
+ ניקוי
+ דבר
+ שתף
+ הורדה
+ צטט
+ הסר
+ שלח שוב
+ שלח
+ הישאר
+ עזיבה
+ שמירה
+ ביטולאוקייטוען…רישיונות צד ג \'
@@ -102,7 +102,7 @@
אופתיחהכניסה
- שחרר
+ שחררגיבוי המפתחות לא הסתיים, אנא המתן …אמת מושבהשתמש במפתח גיבוי
@@ -297,10 +297,10 @@
מסנכרן…פתח כותרתחברי רשימה
- דחייה
- תצוגה מקדימה
- הצטרף
- הסר
+ דחייה
+ תצוגה מקדימה
+ הצטרף
+ הסרהמשךלאכן
@@ -684,17 +684,6 @@
%d חדריםחפש בתיקיות
- הקלד מזהה חדר או כינוי לחדר
- הצטרף לחדר
- הצטרף לחדר
- צור חדר
- התחלת שיחת צ\'אט
- הזמנות
- עדיפות נמוכה
- חדרים
- מועדפים
- תיקייה ראשית
- הצטרףעדיין אין תמיכה בחיפוש בחדרים מוצפנים.קבציםאנשים
@@ -825,10 +814,10 @@
%1$s ב %2$s ו %3$s%1$s ב %2$s
- d%
- d%
- d%
- d%
+ %d
+ %d
+ %d
+ %dהודעה %1$s: %2$d
@@ -1283,7 +1272,6 @@
הכנתי עותקמסקנת אימותהגיב עם: %s
- כפתורי בוטמשאלמדבקהקובץ
@@ -1730,8 +1718,8 @@
תגובותצפה בתגובותהוסף תגובה
- אהבתי
- מסכים
+ אהבתי
+ מסכיםתגובותהחדרים שלך יוצגו כאן. הקש על + שמאל למטה כדי למצוא את הקיים או התחל כמה משלך.חדרים
@@ -2021,7 +2009,6 @@
אם אינך יכול לגשת להפעלה קיימתהשתמש בביטוי סיסמה או מפתח שחזוריוצר סקר פשוט
- אפשרות נבחרתלמחוק את נתוני החשבון מסוג %1$s\?
\n
\nהשתמש בזהירות, זה עלול להוביל להתנהגות בלתי צפויה.
@@ -2042,12 +2029,6 @@
השתמש במפתח אבטחההתקןהגן מפני אובדן גישה להודעות ונתונים מוצפנים על ידי גיבוי של מפתחות הצפנה בשרת שלך.
-
- %d הצבעה
- %d הצבעות
- %d הצבעות
- %d הצבעות
- כלי מפתחיםמצב טיסה פועלהקישוריות לשרת אבדה
@@ -2131,7 +2112,7 @@
נתמך רק בחדרים מוצפניםמכריח את ההפעלה הקבוצתית החוצה הנוכחית בחדר מוצפן להיזרקהשתמש באלמנט האחרון במכשירים האחרים שלך:
- או לקוח מטריקס אחר עם יכולת חתימה צולבת
+ או לקוח מטריקס אחר עם יכולת חתימה צולבתאלמנט iOS
\nאלמנט אנדרואידרשת האינטרנט
@@ -2250,12 +2231,6 @@
שלח תמונות בגודל המקורישלח תמונות בגודל המקורי
-
- %d הצבעה - תוצאות סופיות
- %d הצבעות - תוצאות סופיות
- %d הצבעעות - תוצאות סופיות
- %d הצבעות - תוצאות סופיות
- בחר PIN לאבטחהשגיאות רבות מדי, יצאת מהחשבוןאַזהָרָה! ניסיון אחרון שנותר לפני היציאה!
diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
index abfe5d6ef98..8826c6ccea0 100644
--- a/vector/src/main/res/values-ja/strings.xml
+++ b/vector/src/main/res/values-ja/strings.xml
@@ -47,7 +47,7 @@
%1$s は %2$s にルームに参加するよう招待状を送りました%1$sは%2$sの招待を受け入れました** 解読できません: %s **
- 送信者の端末からこのメッセージのキーが送信されていません。
+ 送信者の端末からこのメッセージのキーが送信されていません。修正できませんでしたメッセージを送信できません画像のアップロードに失敗しました
@@ -86,17 +86,17 @@
設定履歴OK
- キャンセル
- 保存
- 退室
- 送信
- 再送信
- 削除
- 共有
- 削除
+ キャンセル
+ 保存
+ 退室
+ 送信
+ 再送信
+ 削除
+ 共有
+ 削除端末情報暗号化された部屋での多人数通話はサポートされていません
- 招待
+ 招待全ての発言を既読にする履歴すぐに返信
@@ -193,18 +193,18 @@
同期中…メッセージメンバー詳細
- 引用
+ 引用後で
- 転送
+ 転送直リンクソースコードを表示または確認
- 無効にする
+ 無効にする送信中 (%s%%)このユーザ名はすでに使用されています
- 削除
- 参加
+ 削除
+ 参加あなたは %s さんに呼ばれてこの部屋へ参加しました新しい会話参加者を追加
@@ -347,7 +347,7 @@
巨大発言更新を確認暗号解除されたソースコードを表示
- 名前変更
+ 名前変更切断中会話を開始音声通話を開始
@@ -424,8 +424,8 @@
写真または動画の撮影動画を記録できません保存
- 試写
- 拒否
+ 試写
+ 拒否管理者権限操作通話ダイレクトメッセージ
@@ -450,14 +450,6 @@
参加者ファイル部屋
- お気に入り
- 部屋
- 低優先度
- 会話を開始
- 部屋を作成
- 部屋へ参加
- 部屋へ参加
- 参加部屋一覧を見る退室会話
@@ -602,9 +594,6 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
ダウンロードをキャンセルする検索メッセージ
- ディレクトリ
- 招待
- 部屋のIDまたは部屋のエイリアスを入力してくださいディレクトリを検索中…サードパーティの通知このアプリのシステムの情報を見る。
@@ -651,15 +640,11 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
不明なデバイスが存在しているため、メッセージを送ることができませんでした。今 %1$s または %2$s しますか?要求されたフィンガープリントキー Ed25519jitsiを用いて会議通話を始める
-
端末のカメラを使う
-
警告!ビデオ会議は開発中であり、確実でない可能性があります。
-
コマンドエラー認識されないコマンド: %s
-
切音量大暗号化されたメッセージ
@@ -698,7 +683,6 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
例コミュニティID例
-
ホーム参加者部屋
@@ -745,9 +729,9 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
• 通知はメタデータのみを含みますスタンプを送るサードパーティーライセンス
- ダウンロード
- 話す
- 消去
+ ダウンロード
+ 話す
+ 消去許可がないため、この操作を実行できません。実行システムアラート
@@ -886,7 +870,7 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
畳むメッセージとエラーの場合とにかく通話する
- 了承
+ 了承このホームサーバーの方針を閲覧し承認してください:通話設定画面着信に${app_name}の既定の着信音を使う
@@ -956,7 +940,7 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
カスタム設定。起動時の実行バックグラウンド制限の確認
- とどまる
+ とどまる編集返信削除済みのメッセージ
@@ -1053,21 +1037,21 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
この部屋内でのメッセージはエンドツーエンド暗号化されます。詳細の確認や検証はユーザーのプロフィールをご確認ください。暗号化が有効化されていません通知設定
- 切断
+ 切断ログアウトしますか?既読にするコピー成功通知サーバーの設定ミスにより通話に失敗しました
- 破棄
- 再生
- 一時停止
- 消去
- スキップ
+ 破棄
+ 再生
+ 一時停止
+ 消去
+ スキップ完了
- 無視
- レビュー
+ 無視
+ レビュー待機中…サムネイル暗号化中…サムネイル送信中 (%1$s / %2$s)
@@ -1138,7 +1122,7 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
相手ユーザーのデバイスのコードをスキャンし、相互に安全性を検証します相手のコードをスキャンスキャンできません
- 断る
+ 断る検証リクエスト通話の開始前に確認する意図しない通話を阻止する
@@ -1168,7 +1152,7 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
終了拒否承諾
- 中止
+ 中止ウィジェットを削除できませんでしたウィジェットを追加できませんでしたビデオ通話を開始
@@ -1176,7 +1160,7 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
通話を開始する権限がありませんこのルームで通話を開始する権限がありませんグループ通話を開始する権限がありません
- リセット
+ リセットなしトピックルーム名
@@ -1811,7 +1795,7 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
次に次に次に
- ユーザー名で招待
+ ユーザー名で招待ユーザー名を選択してください。ユーザー名やパスワードが正しくありません。 入力したパスワードは、スペースで開始または終了しますので、ご確認ください。そのユーザー名は既に使用されています
@@ -1893,8 +1877,8 @@ ${app_name}からあなた個人の電話帳への検索要求を許可する場
リアクションリアクションを見るリアクションを追加する
- いいね
- 同意
+ いいね
+ 同意リアクションルームがここに表示されます。右下の[+]をタップして、既存のルームを検索するか、独自のルームを開始します。ダイレクトメッセージの会話がここに表示されます。右下の[+]をタップして開始します。
diff --git a/vector/src/main/res/values-kab/strings.xml b/vector/src/main/res/values-kab/strings.xml
index 53e883baf68..e169b491c1d 100644
--- a/vector/src/main/res/values-kab/strings.xml
+++ b/vector/src/main/res/values-kab/strings.xml
@@ -97,7 +97,7 @@
Tbeddleḍ aswir n tezmert n %1$s.%1$s ibeddel aswir n tezmert n %2$s.** Awgelhen d awezɣi: %s **
- Ibenk n umazan ur aɣ-d-yuzin ara tisura i yizen-a.
+ Ibenk n umazan ur aɣ-d-yuzin ara tisura i yizen-a.Tuzna n yizen d tawezɣitTuccḍa deg uẓeṭṭaTuccḍa deg Matrix
@@ -201,37 +201,37 @@
Tebɣiḍ s tidet\?Asali…IH
- Sefsex
- Sekles
- Ffeɣ
- Azen
- Ɛawed azen
- Sfeḍ
- Tanebdurt
- Sader
- Bḍu
+ Sefsex
+ Sekles
+ Ffeɣ
+ Azen
+ Ɛawed azen
+ Sfeḍ
+ Tanebdurt
+ Sader
+ BḍuTickiWali aɣbalu
- Kkes
- Beddel isem
+ Kkes
+ Beddel isemUla yiwen
- Ḥwi
- Ffeɣ seg tuqqna
+ Ḥwi
+ Ffeɣ seg tuqqnaAsiwel urmid
- Ɣeṛ
- Agi
+ Ɣeṛ
+ AgiUr tesεiḍ ara tisirag ad tebduḍ asireg s usiwel deg texxamt-aTukksa n uwiǧit ur teddi araneɣ
- Nced
+ NcedBeṛṛa n tuqqna
- Qbel
- Zgel
+ Qbel
+ ZgelImmed
- Sefsex
- Ttu
- Senqed
- Agwi
+ Sefsex
+ Ttu
+ Senqed
+ AgwiFfeɣTigawinFfeɣ seg tuqqna
@@ -240,7 +240,7 @@
LdiMdelNɣel
- Sens
+ SensAsentemAsmigelTuccḍa
@@ -291,10 +291,10 @@
TalɣutIHKemmel
- Sfeḍ
- Rnu
- Taskant
- Agi
+ Sfeḍ
+ Rnu
+ Taskant
+ AgiFfeɣ seg texxamtSnulfu-dSrid
@@ -323,8 +323,6 @@
NadiSizdeg iɛeggalen n texxamtUlac igmad
- Bdu adiwenni
- Rnu taxxamtIznan i meṛṛa (sɛan ṣṣut)Iznan i meṛṛaSens imesli
@@ -620,10 +618,10 @@
Aḥraz n tsarut n useqdacAḥrazAd tesruḥeḍ anekcum ɣer yiznan-ik•im yettwawgelhen anagar ma tkelseḍ tisura-inek•inem send tuffɣa.
- Qqim
- Mmeslay
- Sfeḍ
- Ɣer sdat
+ Qqim
+ Mmeslay
+ Sfeḍ
+ Ɣer sdatAseɣwen imezgiSenqed taɣbalut tawgelhentAgbur n uneqqis
@@ -656,7 +654,7 @@
Sizdeg ismawen n texxaminIlɣa s ṣṣutTuragin n wis tlata
- Sgunfu
+ SgunfuAsarag s usiwel iteddu
\nRnu-d ɣer-s s %1$s neɣ s %2$sSizdeg ismenyifen
@@ -866,15 +864,6 @@
IZNANIMDANENIFUYLA
- RNU
- AKARAM
- INURIFEN
- TIXXAMIN
- TAZWART TADDAYT
- INEBGAWEN
- Rnu ɣer texxamt
- Rnu ɣer texxamt
- Aru asulay n texxamt neɣ isem yettunefken i texxamt1 texxamt%d texxamin
@@ -939,7 +928,7 @@
Anedbal-ik·im n uqeddac issens awgelhen seg yixef ɣer yixef s wudem amezwer deg texxamin tusligin & yiznan usriden.TiɣimiyinS tidet tebɣiḍ ad tekkseḍ aneḍru-a\? Err deg uqerru-k·m ma yella tekkseḍ asnifel n yisem neɣ asentel n texxamt, yemzer asnifel-a ad yettusefsex.
- neɣ amsaɣ-nniḍen n Matrix yemṣadan d uzmul amdigan
+ neɣ amsaɣ-nniḍen n Matrix yemṣadan d uzmul amdiganḤettem tiɣimit n ugraw ara d-yeffɣen akka tura deg texxamt tawgelhant ad tettwakkesSentem timagit-ik·im s usenqed n yinekcam-a seg yiwet gar tɣimiyin-inek·inem-nniḍen, serreḥ-as ad tekcem ɣer yiznan yettwawgelhen.D awezɣi ad ternuḍ izen-inek·inem uslig. Ttxil-k·m senqed iseqdacen i tebɣiḍ ad d-tnecdeḍ syen ɛreḍ tikkelt-nniḍen.
@@ -1062,8 +1051,8 @@
Asuter yettwasefsexTuccḍa tarussintYettwanced-d sɣur %s
- Qbel
- Ḥemmel
+ Qbel
+ ḤemmelRnu taxxamt tamaynutSnifel azeṭṭaMeṛṛa timɣiwnin
@@ -1453,7 +1442,6 @@
Ittraju %s…Isuli-dIsefka n umiḍan
- Taxtirit yettefernenAnekcum amaynutSekcem tasarut tuffirt n uḥraz uffirƔur-k·m:
@@ -2112,14 +2100,6 @@
Tuqqna ɣer uqeddac truḥAskar n usafag yermedIfecka n tneflit
-
- %d tafrant
- %d tifranin
-
-
- %d tafrant - Igmaḍ n taggara
- %d tifranin - Igmaḍ n taggara
- Yerna assenqed afessasSeqdec tafyirt tuffirt n tririt neɣ tasarutMa yella ur tezmireḍ ara ad tkecmeḍ ɣer tɣimit i yellan
@@ -2295,7 +2275,6 @@
%d n tsintinSken tidyanin n waddad n uɛeggal n texxamt
- Tiqeffalin n uṛubutTaggrayt n usenqedAseɣwen ur yemsil ara akken iwataUr tesɛiḍ ara tasiregt ad tebduḍ asiwel deg texxamt-a
@@ -2312,7 +2291,7 @@
Ur tesεiḍ ara azref ad tesiwleḍUr tesεiḍ ara azref ad tebduḍ asarag s tilifunBdu asqerdec
- Wennez
+ WennezRmed abyumitriSwel ammestenMmesten anekcum s useqdec n PIN d ubyumtri.
diff --git a/vector/src/main/res/values-ko/strings.xml b/vector/src/main/res/values-ko/strings.xml
index fdc94d48211..d1a11f794a5 100644
--- a/vector/src/main/res/values-ko/strings.xml
+++ b/vector/src/main/res/values-ko/strings.xml
@@ -45,7 +45,7 @@
%1$s님이 %2$s님에게 방 초대를 보냈습니다%1$s님이 %2$s의 초대를 수락했습니다** 암호를 복호화할 수 없음: %s **
- 발신인의 기기에서 이 메시지의 키를 보내지 않았습니다.
+ 발신인의 기기에서 이 메시지의 키를 보내지 않았습니다.검열할 수 없습니다메시지를 보낼 수 없습니다사진 업로드에 실패했습니다
@@ -93,20 +93,20 @@
제 3자 라이선스불러오는 중…네
- 취소
- 저장
- 떠나기
- 보내기
- 다시 보내기
- 감추기
- 인용
- 다운로드
- 공유
+ 취소
+ 저장
+ 떠나기
+ 보내기
+ 다시 보내기
+ 감추기
+ 인용
+ 다운로드
+ 공유고유 주소소스 보기복호화된 소스 보기
- 삭제
- 다시 이름 짓기
+ 삭제
+ 다시 이름 짓기내용 신고하기음성영상
@@ -117,7 +117,7 @@
기기 정보무시하고 보내기또는
- 초대
+ 초대오프라인나가기활동
@@ -130,7 +130,7 @@
열기닫기클립보드에 복사되었습니다
- 비활성화
+ 비활성화확인경고오류
@@ -190,8 +190,8 @@
키 백업하기확신합니까\?백업
- 머물기
- 넘기기
+ 머물기
+ 넘기기완료정말 로그아웃하시겠습니까\?읽음으로 표시
@@ -234,19 +234,19 @@
암호화된 메시지를 원하지 않습니다키 백업 중…로그아웃하기 전에 키를 백업하지 않으면 암호화된 메시지에 접근할 수 없습니다.
- 말하기
- 지우기
+ 말하기
+ 지우기후
- 가져오기
+ 가져오기현재 전화회의 전화가 진행 중입니다.
\n%1$s 또는 %2$s로 참가하세요이 방에서 회의를 시작하려면 초대할 권한이 필요합니다회의 전화는 암호화된 방에서 지원하지 않습니다무시하고 통화
- 수락하기
- 중단
- 차단
+ 수락하기
+ 중단
+ 차단세계 검색즐겨찾기 필터사람 필터
@@ -375,10 +375,10 @@
네아니오계속
- 제거
- 참가
- 미리보기
- 받지 않기
+ 제거
+ 참가
+ 미리보기
+ 받지 않기구성원 목록헤더 열기동기화 중…
@@ -506,17 +506,6 @@
메시지사람파일
- 참가
- 목록
- 즐겨찾기
- 방
- 중요하지 않음
- 초대
- 대화 시작
- 방 만들기
- 방 참가하기
- 방 참가하기
- 방 ID나 방 별칭을 입력목록 찾기%d개의 방
@@ -1228,8 +1217,8 @@
방방이 여기 표시됩니다리액션
- 동의
- 좋아요
+ 동의
+ 좋아요리액션 추가리액션 보기리액션
@@ -1309,8 +1298,8 @@
사용자 이름 또는 ID로 필터…방에 참가하는 중…편집 기록 보기
- 검토
- 끊기
+ 검토
+ 끊기계속 하려면 이 서비스 약관에 동의해야 합니다.서비스 약관조건 검토
@@ -1318,8 +1307,8 @@
봇, 브릿지, 위젯과 스티커 팩을 사용하세요읽은 시간없음
- 취소
- 연결 해제
+ 취소
+ 연결 해제설정된 ID 서버가 없습니다.잘놋 설정된 서버로 인해 전화에 실패함전화가 정상적으로 작동하도록 TURN 서버를 설정하려면 홈서버 (%1$s)의 관리자에게 연락해주세요.
@@ -1480,8 +1469,8 @@
권한 없음이 작업을 수행하려면 시스템 설정에서 카메라 권한을 허용해주세요.이 작업을 수행할 수 있는 일부 권한이 없습니다. 시스템 설정에서 권한을 허용해주세요.
- 일시 정지
- 재생
+ 일시 정지
+ 재생음성 메시지를 보내려면 마이크 권한을 허용해주세요.삭제된 메시지복사
diff --git a/vector/src/main/res/values-lt/strings.xml b/vector/src/main/res/values-lt/strings.xml
index b18595388c9..1a189047a75 100644
--- a/vector/src/main/res/values-lt/strings.xml
+++ b/vector/src/main/res/values-lt/strings.xml
@@ -53,10 +53,10 @@
AtsijungęSukurtiSinchronizuojama…
- Atmesti
- Peržiūra
- Prisijungti
- Pašalinti
+ Atmesti
+ Peržiūra
+ Prisijungti
+ PašalintiTęstiNETAIP
@@ -99,7 +99,7 @@
Jūs pradėjote vaizdo skambutį.%s pradėjo vaizdo skambutį.%1$s pakeitė kambario pavadinimą į %2$s
- Jūs pakeitėte kambario nuotrauka
+ Jūs pakeitėte kambario nuotraukąJūs pakeitėte temą į %1$s%1$s pakeitė temą į: %2$sJūs pakeitėte savo vardą iš %1$s į %2$s
@@ -108,4 +108,22 @@
%1$s pakeitė savo vardą į %2$sJūs pakeitėte savo profilio nuotrauką%1$s pakeitė savo profilio nuotrauką
+ arba
+ Daugiau rezultatų nėra
+ Rezultatų nėra
+ %s išsiuntė duomenis pokalbio nustatymui.
+ Jūs pakeitėte kambario pavadinimą į: %1$s
+ Jūs pakvietėte %1$s. Priežastis: %2$s
+ %1$s pakvietė %2$s. Priežastis: %3$s
+ Jūsų pakvietimas. Priežastis: %1$s
+ %1$s\'s pakvietimas. Priežastis: %2$s
+ %1$s pakvietė jus. Priežastis: %2$s
+ (profilio nuotrauka taip pat buvo pakeista)
+ Jūs pašalinote savo vardą (buvo %1$s)
+ %1$s pašalino savo vardą (buvo %2$s)
+ Visi kambario dalyviai, nuo tada, kai jie prisijungė prie kambario.
+ Jūs baigėte skambutį.
+ Jūs pradėjote balso skambutį.
+ %1$s pakeitė kambario nuotrauką
+ Nėra prieinamų viešųjų kambarių
\ No newline at end of file
diff --git a/vector/src/main/res/values-lv/strings.xml b/vector/src/main/res/values-lv/strings.xml
index 7def9079529..e5e61b78078 100644
--- a/vector/src/main/res/values-lv/strings.xml
+++ b/vector/src/main/res/values-lv/strings.xml
@@ -39,7 +39,7 @@
%1$s nosūtīja %2$s uzaicinājumu pievienoties istabai%1$s pieņēma uzaicinājumu %2$s** Neizdodas atšifrēt: %s **
- Sūtītāja ierīce mums nav nenosūtījusi atslēgas priekš šīs ziņas.
+ Sūtītāja ierīce mums nav nenosūtījusi atslēgas priekš šīs ziņas.Nevarēja rediģētNeizdodas nosūtīt ziņuNeizdevās augšuplādēt attēlu
@@ -247,21 +247,21 @@
Dalībnieka informācijaBijušieLabi
- Atcelt
- Saglabāt
- Pamest
- Nosūtīt
- Sūtīt atkārtoti
- Rediģēt
- Citēt
- Dalīties
+ Atcelt
+ Saglabāt
+ Pamest
+ Nosūtīt
+ Sūtīt atkārtoti
+ Rediģēt
+ Citēt
+ DalītiesVēlāk
- Pārsūtīt
+ PārsūtītIekšējā saiteSkatīt pirmkoduSkatīt atšifrētu pirmkodu
- Dzēst
- Pārdēvēt
+ Dzēst
+ PārdēvētZiņot par saturuAktīvs zvansTurpinās konferences zvans.
@@ -276,7 +276,7 @@
Konferences zvani netiek atbalstīti šifrētās istabāsNosūtīt jebkurā gadījumāvai
- Uzaicināt
+ UzaicinātIzrakstītiesBalss zvansVideo zvans
@@ -287,7 +287,7 @@
AtvērtAizvērtNokopēts starpliktuvē
- Atslēgt
+ AtslēgtApstiprinājumsBrīdinājumsUz sākumu
@@ -483,10 +483,10 @@ Lūdzu dod piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespē
JĀNĒTurpināt
- Dzēst
- Pievienoties
- Piekšskatījums
- Noraidīt
+ Dzēst
+ Pievienoties
+ Piekšskatījums
+ NoraidītPāriet uz pirmo neizlasīto ziņu%s jūs uzaicināja pievienoties šai istabaiUzaicinājums tika nosūtīts uz %s, kura nav piesaistīta šim kontam.
@@ -578,17 +578,6 @@ Lūdzu dod piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespē
ZIŅASCILVĒKIFAILI
- PIEVIENOTIES
- KATALOGS
- IZLASE
- ISTABAS
- ZEMA PRIORITĀTE
- UZAICINĀJUMI
- Sākt saraksti
- Izveidot istabu
- Ieiet istabā
- Ieiet istabā
- Ievadiet istabas ID vai aliasuPārlūkot kataloguMeklē katalogā…Visas ziņas (ar skaņu)
@@ -890,7 +879,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.%d aktīvi vidžeti%d aktīvu vidžetu
-
Neizdevās uzstādīt vidžetu.Neizdevās nosūtīt pieprasījumu.Pieejas līmenim jābūt lielākam par 0.
@@ -901,30 +889,24 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.Istaba %s ir neredzama.Pievienot Matrix lietotnesLietot iebūvēto kameru
-
Tu pievienoji jaunu ierīci \'%s\', kura pieprasa šifrēšanas atslēgas.Tava neverificētā ierīce \'%s\' pieprasa šifrēšanas atslēgas.Sākt tās verifikācijuDalīties bez verificēšanasIgnorēt pieprasījumu
-
Uzmanību!Konferences zvans ir izstrādes stadijā un var nebūt uzticams.
-
Komandas kļūdaNepazīstama komanda: %s
-
IzslēgtsAr skaņuŠifrēta ziņa
-
IzveidotIzveidot kopienuKopienas nosaukumsPiemērsKopienas Idpiemērs
-
SākumsCilvēkiIstabas
@@ -960,7 +942,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.
Verificējiet visas savas sesijas, lai nodrošinātos, ka jūsu konts un ziņas ir drošībāPārskatiet savas pierakstīšanāsNešifrēts
- vai kādu citu Matrix lietotni ar cross-signing atbalstu
+ vai kādu citu Matrix lietotni ar cross-signing atbalstuŠis konts ir deaktivizēts.Šifrētas ziņas grupas čatosŠifrētas ziņas viens-pret-vienu čatos
@@ -1221,25 +1203,25 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.
Vai tiešām vēlies izrakstīties\?NoraidītPieņemt
- Noraidīt
- Pārlūkot
- Nerādīt nevienu šī dalībnieka ziņu
- Pārtraukt
+ Noraidīt
+ Pārlūkot
+ Nerādīt nevienu šī dalībnieka ziņu
+ PārtrauktGatavs
- Izlaist
- Pieņemt
+ Izlaist
+ PieņemtJums nav atļaujas sākt konferences zvanu šajā istabā
- Atiestatīt
- Aizvērt
- Pauzēt
- Atskaņot
- Atvienoties
- Atsaukt
+ Atiestatīt
+ Aizvērt
+ Pauzēt
+ Atskaņot
+ Atvienoties
+ AtsauktNav
- Notīrīt
- Runāt
- Lejupielādēt
- Palikt
+ Notīrīt
+ Runāt
+ Lejupielādēt
+ PaliktVai tiešām to vēlaties\?Verificēt ierīciSistēmas noklusējuma
@@ -1275,7 +1257,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.
Citas istabasNesenās istabasVerifikācijas slēdziens
- Bota pogasAptaujaUzlīmeKāds no uzskaitītajiem var būt kompromitēts:
@@ -1790,8 +1771,8 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.Rādīt izdzēstās ziņasApskatīt ReakcijasPievienot Reakciju
- Patīk
- Piekrist
+ Patīk
+ PiekristJūsu sarunas tiks parādītas šeit. Nospiediet + ekrāna labējā, apakšējā stūrī, lai sāktu sarunas.Apskatiet nelasītas ziņas šeitLaipni lūgti mājās!
@@ -2159,7 +2140,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.
Atslēgas jau ir atjauninātas!Pasākumu moderē telpas administrators, iemesls: %1$sLietotājs izdzēsa notikumu, iemesls: %1$s
- Izvēlētā OpcijaDzēst %1$s tipa konta datus\?
\n
\nLietojiet piesardzīgi, tas var izraisīt neparedzētu uzvedību.
@@ -2351,8 +2331,8 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.
Viņi varēs izpētīt %sUzaicināt uz %sKopīgot saiti
- Ielūgt pēc lietotājvārda vai pa e-pastu
- Ielūgt pēc lietotājvārda
+ Ielūgt pēc lietotājvārda vai pa e-pastu
+ Ielūgt pēc lietotājvārdaIelūgt pa e-pastuŠobrīd esi tikai tu. %s būs vēl labāk kopā ar citiem.Uzaicināt uz %s
@@ -2563,16 +2543,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.
Sūtīt attēlu ar oriģinālo izmēruSūtīt attēlus ar oriģinālo izmēru
-
- %d balsu - Galīgie rezultāti
- %d balss - Galīgie rezultāti
- %d balsis - Galīgie rezultāti
-
-
- %d balsu
- %d balss
- %d balsis
- nestabilastabilaNoklusējuma versija
diff --git a/vector/src/main/res/values-ml/strings.xml b/vector/src/main/res/values-ml/strings.xml
index db959072d7b..86e199ebb87 100644
--- a/vector/src/main/res/values-ml/strings.xml
+++ b/vector/src/main/res/values-ml/strings.xml
@@ -58,11 +58,11 @@
വോയ്സ് കോൾപ്രവർത്തനങ്ങൾപുറത്തുകടക്കുക
- അവഗണിക്കൂ
+ അവഗണിക്കൂചെയ്തു
- ഒഴിവാക്കൂ
+ ഒഴിവാക്കൂഓഫ്ലൈൻ
- ക്ഷണിക്കുക
+ ക്ഷണിക്കുകഅല്ലെങ്കിൽസെഷൻ വിശദാംശങ്ങൾഓഡിയോ മീറ്റിംഗ് ആരംഭിക്കുക
@@ -72,14 +72,14 @@
കോൾ ആരംഭിക്കാൻ കഴിയില്ല, ദയവായി പിന്നീട് ശ്രമിക്കുകവീഡിയോചാറ്റിംഗ് ആരംഭിക്കുക
- ഇല്ലാതാക്കൂ
- മായ്ക്കുക
- ഡൌൺലോഡ് ചെയ്യൂ
- പങ്കിടുക
- വീണ്ടും അയയ്ക്കൂ
- അയയ്ക്കൂ
- സംരക്ഷിക്കൂ
- റദ്ദാക്കൂ
+ ഇല്ലാതാക്കൂ
+ മായ്ക്കുക
+ ഡൌൺലോഡ് ചെയ്യൂ
+ പങ്കിടുക
+ വീണ്ടും അയയ്ക്കൂ
+ അയയ്ക്കൂ
+ സംരക്ഷിക്കൂ
+ റദ്ദാക്കൂശരിലഭ്യമാക്കുന്നു…നിങ്ങൾക്കു ഉറപ്പാണോ\?
@@ -114,10 +114,10 @@
നിരസിക്കുകസ്വീകരിക്കുകഒരു കോൾ ആരംഭിക്കാൻ നിങ്ങളെ അനുവദിച്ചിട്ടില്ല
- ഒഴിവാക്കൂ
- പേരുമാറ്റുക
- സംസാരിക്കൂ
- നീക്കംചെയ്യൂ
+ ഒഴിവാക്കൂ
+ പേരുമാറ്റുക
+ സംസാരിക്കൂ
+ നീക്കംചെയ്യൂബാക്കപ്പ്അംഗ വിശദാംശങ്ങൾmatrix.org തിരഞ്ഞെടുക്കൂ
@@ -174,9 +174,9 @@
പുതിയ ചാറ്റ്ഒരു മുറിസമന്വയിപ്പിക്കുന്നു…
- നിരസിക്കുക
- ചേരുക
- നീക്കംചെയ്യൂ
+ നിരസിക്കുക
+ ചേരുക
+ നീക്കംചെയ്യൂതുടരുകഇല്ലഅതെ
@@ -204,7 +204,7 @@
മുറികളില്ലമുറികൾഉറപ്പാക്കൽ
- സ്വീകരിക്കുക
+ സ്വീകരിക്കുകപിന്നീട്വോയ്സ്Matrix ഉപയോക്താക്കൾ മാത്രം
@@ -268,7 +268,6 @@
ക്രമീകരണങ്ങൾസന്ദേശങ്ങൾമറക്കൂ
- മുറികൾഫയലുകൾആളുകൾസന്ദേശങ്ങൾ
@@ -282,7 +281,7 @@
കാരണംപുറത്താക്കൂനിരോധിക്കൂ
- പുനഃസജ്ജമാക്കൂ
+ പുനഃസജ്ജമാക്കൂഒന്നുമില്ലസജീവ കോൾ (%1$s)%1$s ഈ കോൾ നിരസിച്ചു
@@ -297,8 +296,8 @@
ഹോംഎന്തായാലും വിളിക്കൂആഗോള തിരയൽ
- നിരസിക്കുക
- പ്ലേ
+ നിരസിക്കുക
+ പ്ലേപെർമാലിങ്ക്മൂന്നാം കക്ഷി ലൈസൻസുകൾമുന്നറിയിപ്പ്
@@ -382,10 +381,6 @@
%d മുറി%d മുറികൾ
- ഒരു മുറിയിൽ ചേരുക
- മുറിയിൽ ചേരുക
- മുറി സൃഷ്ടിക്കൂ
- ചാറ്റ് ആരംഭിക്കുകഫലങ്ങളൊന്നുമില്ലമുറി വിശദാംശങ്ങൾവിഷയം മാറ്റുക
@@ -607,7 +602,7 @@
ചിത്രം അപ്ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടുസന്ദേശം അയയ്ക്കാനായില്ലപുനഃക്രമീകരിക്കാൻ കഴിഞ്ഞില്ല
- അയച്ചയാളുടെ ഉപകരണം ഈ സന്ദേശത്തിനുള്ള കീകൾ ഞങ്ങൾക്ക് അയച്ചിട്ടില്ല.
+ അയച്ചയാളുടെ ഉപകരണം ഈ സന്ദേശത്തിനുള്ള കീകൾ ഞങ്ങൾക്ക് അയച്ചിട്ടില്ല.** ഡീക്രിപ്റ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല: %s **%1$s %2$s ന്റെ അധികാര നില മാറ്റി.നിങ്ങൾ %1$s ന്റെ അധികാര നില മാറ്റി.
@@ -657,7 +652,7 @@
%dസെ%dസെ
- പ്രിവ്യൂ
+ പ്രിവ്യൂഹോൾഡ്പുനരാരംഭിക്കുകചെറുത്
@@ -671,16 +666,16 @@
കമ്മ്യൂണിറ്റികൾകമ്മ്യൂണിറ്റികൾപിശക്
- അപ്രാപ്തമാക്കുക
- അവലോകനം
- ഉപേക്ഷിക്കുക
- താൽക്കാലികമായി നിർത്തുക
- വിച്ഛേദിക്കുക
- അസാധുവാക്കുക
- ഫോർവേഡ്
- ഉദ്ധരണി
- തുടരുക
- വിടുക
+ അപ്രാപ്തമാക്കുക
+ അവലോകനം
+ ഉപേക്ഷിക്കുക
+ താൽക്കാലികമായി നിർത്തുക
+ വിച്ഛേദിക്കുക
+ അസാധുവാക്കുക
+ ഫോർവേഡ്
+ ഉദ്ധരണി
+ തുടരുക
+ വിടുകഈ മുറിക്കായി %1$s എന്ന ഇതര വിലാസം നിങ്ങൾ ചേർത്തു.ഈ മുറിക്കായി %1$s എന്ന ഇതര വിലാസങ്ങൾ നിങ്ങൾ ചേർത്തു.
@@ -713,8 +708,8 @@
മുറികൾമാറ്റുകപ്രതികരണങ്ങൾ
- ലൈക്ക്
- സമ്മതിക്കുക
+ ലൈക്ക്
+ സമ്മതിക്കുകപ്രതികരണങ്ങൾമുറികൾസംഭാഷണങ്ങൾ
@@ -802,8 +797,6 @@
പ്രാപ്തമാക്കുകപകർപ്പാവകാശംനിശബ്ദമാക്കുക
- കഷണങ്ങൾ
- ചേരുകതിരയുകഅവഗണിക്കുകനിരോധനം മാറ്റുക
@@ -890,7 +883,6 @@
നേരിട്ടുള്ള ചാറ്റ്ഡയറക്ടറിയിൽ തിരയുന്നു…ഡയറക്ടറി ബ്രൗസ് ചെയ്യുക
- കുറഞ്ഞ മുൻഗണനഡൗൺലോഡ് റദ്ദാക്കുകഅപ്ലോഡ് റദ്ദാക്കുക
diff --git a/vector/src/main/res/values-ml/strings_no_weblate.xml b/vector/src/main/res/values-ml/strings_no_weblate.xml
new file mode 100644
index 00000000000..7d128b9e647
--- /dev/null
+++ b/vector/src/main/res/values-ml/strings_no_weblate.xml
@@ -0,0 +1,8 @@
+
+
+
+ ml
+ IN
+ Mlym
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-nb-rNO/strings.xml b/vector/src/main/res/values-nb-rNO/strings.xml
index 454e946f5a8..a531e78fc6d 100644
--- a/vector/src/main/res/values-nb-rNO/strings.xml
+++ b/vector/src/main/res/values-nb-rNO/strings.xml
@@ -15,44 +15,44 @@
Er du sikker\?Laster…OK
- Lukk
- Lagre
- Forlat
- Send
- Send på nytt
- Fjern
- Sitering
- Nedlastning
- Del
- Tøm
+ Lukk
+ Lagre
+ Forlat
+ Send
+ Send på nytt
+ Fjern
+ Sitering
+ Nedlastning
+ Del
+ TømSenere
- Neste
+ NestePermalenkeVis kilden
- Slett
- Endre navn
+ Slett
+ Endre navnIngen
- Tilbakekall
- Koble fra
+ Tilbakekall
+ Koble fraStemmeFilmeller
- Inviter
+ InviterFrakoblet
- Godta
- Hopp over
+ Godta
+ Hopp overFullført
- Løp vekk
- Ignorer
- Gjennomgang
- Avslå
+ Løp vekk
+ Ignorer
+ Gjennomgang
+ AvslåAvsluttHandlingerLogg utHistoriskLukkKopiert til utklippstavle
- Slå av
+ Slå avAdvarselFeilHjem
@@ -103,10 +103,10 @@
JANEIFortsett
- Fjern
- Bli med
- Forhåndsvisning
- Avvis
+ Fjern
+ Bli med
+ Forhåndsvisning
+ AvvisSynkroniserer …%ds
@@ -146,7 +146,6 @@
Avbryt nedlastingIngen treffROM
- ROMDempDirektesamtaleGlem
@@ -290,7 +289,7 @@
Prøv igjenInvitert av %sReaksjoner
- Liker
+ LikerReaksjonerEndreVennligst vent …
@@ -545,8 +544,8 @@
SikkerhetskopiDu kommer til å miste tilgang til dine enkrypterte meldinger med mindre du sikkerhetskopierer nøklene dine før du logger av.Tredjepartslinsenser
- Bli
- Snakk
+ Bli
+ SnakkSe dekryptert kildeRapporter innholdPågående konferansesamtale.
@@ -609,9 +608,9 @@
Er du sikker på du vil starte en samtale med %s\?Er du sikker på du vil starte en lydsamtale\?Er du sikker på du vil starte en videosamtale\?
- Spill av
- Pause
- Avslå
+ Spill av
+ Pause
+ AvslåDu har ikke rettigheter til å starte en konferansesamtale i dette rommetDet pågår allerede en konferanse!Start videomøte
@@ -698,9 +697,6 @@
INVITERTMELDINGERFILER
- Opprett et rom
- Bli med i rommet
- Bli med i et romBetingelser og vilkårPersonvernreglerLegg til E-postadresse
@@ -878,7 +874,7 @@
Du har ikke tillatelse til å starte en samtaleDu har ikke tillatelse til å starte en samtale i dette rommetDu har ikke tillatelse til å starte en konferansesamtale
- Tilbakestill
+ TilbakestillUgyldig brukernavn/passordDenne enheten bruker en utdatert TLS sikkerhetsprotokoll som er sårbar for angrep, for din egen sikkerhet får du ikke kople til serverenKlarte ikke registrere bruker
@@ -1023,12 +1019,6 @@
%1$s rom funnet for %2$sBla gjennom katalogen
- Skriv inn et rom-ID eller et romalias
- Start chat
- LAV PRIORITET
- FAVORITTER
- KATALOG
- BLI MEDSøking i krypterte rom støttes ikke ennå.FOLKÅrsak til å rapportere dette innholdet
@@ -1179,7 +1169,7 @@
Velkommen hjem!Dine direktemeldinger vises her. Trykk på + nederst til høyre for å starte noen.Rommene dine vises her. Trykk på + nederst til høyre for å finne eksisterende eller start din egen.
- Godta
+ GodtaSe reaksjonerArrangement slettet av brukerSist redigert av %1$s på %2$s
@@ -1613,7 +1603,6 @@
VarslingstjenestePlay Tjenester SjekkSøker i katalogen…
- INVITASJONERIkke noe innholdSenderMislyktes
@@ -1629,7 +1618,7 @@
NettverksfeilKunne ikke laste opp bildetKan ikke sende melding
- Avsenderens enhet har ikke sendt oss nøklene til denne meldingen.
+ Avsenderens enhet har ikke sendt oss nøklene til denne meldingen.** Kan ikke dekryptere: %s **TilpassetTilpasset (%1$d)
@@ -1654,7 +1643,7 @@
Du ba om en VoIP-konferanse%1$s ba om en VoIP-konferanseDu oppgraderte dette rommet.
- %s oppgradert dette rommet.
+ %s oppgraderte dette rommet.Du har slått på end-to-end-kryptering (%1$s)%1$s slo på ende-til-ende-kryptering (%2$s)Du gjorde fremtidig romhistorie synlig for %1$s
@@ -1726,7 +1715,6 @@
Velkommen til Mellomrom!Mellomrom er en ny måte å gruppere rom og mennesker på.Du er invitert
- Advarsel krever serverstøtte og eksperimentell romversjon%s inviterer degLeter du etter noen som ikke er i %s\?Administrer rom
@@ -1756,4 +1744,17 @@
Pause talemeldingTar opp talemeldingAlle i %s vil kunne finne og bli med i dette rommet - du trenger ikke å invitere alle manuelt. Du kan når som helst endre dette i rominnstillingene.
+ Du opphevet utestengingen av %1$s
+ %1$s opphevet utestengingen av %2$s
+ hvem som helst.
+ Du gjorde framtidige meldinger synlige til %1$s
+ %1$s gjorde framtidige meldinger synlige til %2$s
+ Du endret romnavnet til: %1$s
+ %1$s fjernet visningsnavnet sitt (det var %2$s)
+ Du endret visningsnavnet ditt fra %1$s til %2$s
+ %1$s endret visningsnavnet sitt fra %2$s til %3$s
+ Du endret visningsnavnet ditt til %1$s
+ %1$s endret visningsnavnet sitt til %2$s
+ %1$s utestengte %2$s
+ %ss invitasjon
\ No newline at end of file
diff --git a/vector/src/main/res/values-nl/strings.xml b/vector/src/main/res/values-nl/strings.xml
index 98ce426c8c8..e1b0481913c 100644
--- a/vector/src/main/res/values-nl/strings.xml
+++ b/vector/src/main/res/values-nl/strings.xml
@@ -39,23 +39,16 @@
%1$s heeft een uitnodiging naar %2$s gestuurd om het gesprek toe te treden%1$s heeft de uitnodiging voor %2$s aanvaard** Kan niet ontsleutelen: %s **
- Het apparaat van de afzender heeft geen sleutels voor dit bericht gestuurd.
-
+ Het apparaat van de afzender heeft geen sleutels voor dit bericht gestuurd.Kon niet verwijderd wordenKan bericht niet verzendenUploaden van de afbeelding mislukt
-
NetwerkfoutMatrix-fout
-
-
-
Het is momenteel niet mogelijk om een leeg gesprek opnieuw toe te treden.
-
E-mailadresTelefoonnummer%1$s heeft een sticker gestuurd.
-
Uitnodiging van %sGespreksuitnodiging%1$s en %2$s
@@ -75,7 +68,8 @@
Initiële synchronisatie:
\nGesprekken worden geïmporteerdInitiële synchronisatie:
-\nDeelgenomen gesprekken worden geïmporteerd
+\nDeelgenomen gesprekken worden geïmporteerd
+\nDit kan enige tijd in beslag nemen
Initiële synchronisatie:
\nUitgenodigde gesprekken worden geïmporteerdInitiële synchronisatie:
@@ -116,29 +110,27 @@
%1$s heeft gasten de toegang tot het gesprek verhinderd.%1$s heeft eind-tot-eindversleuteling ingeschakeld.%1$s heeft eind-tot-eindversleuteling ingeschakeld (onbekend algoritme %2$s).
-
BerichtenGesprekInstellingenInfo over deelnemerHistorisch
-
Oké
- Annuleren
- Opslaan
- Verlaten
- Versturen
- Opnieuw versturen
- Verwijderen
- Citeren
- Delen
+ Annuleren
+ Opslaan
+ Verlaten
+ Versturen
+ Opnieuw versturen
+ Verwijderen
+ Citeren
+ DelenLater
- Doorsturen
+ DoorsturenPermalinkBron weergevenOntsleutelde bron weergeven
- Verwijderen
- Hernoemen
+ Verwijderen
+ HernoemenInhoud meldenActieve oproepLopend vergadergesprek.
@@ -153,8 +145,7 @@
Vergadergesprekken worden niet ondersteund in versleutelde gesprekkenToch sturenof
- Uitnodigen
-
+ UitnodigenAfmeldenSpraakoproepVideo-oproep
@@ -165,31 +156,25 @@
OpenenSluitenGekopieerd naar klembord
- Uitschakelen
-
+ UitschakelenBevestigingWaarschuwing
-
ThuisFavorietenPersonenGesprekken
-
Gespreksnamen filterenFavorieten filterenPersonen filterenGespreksnamen filteren
-
UitnodigingenLage prioriteit
-
GesprekkenLokale contactenlijstAlleen Matrix-contactenGeen gesprekkenU heeft ${app_name} geen toegang tot uw lokale contacten gegevenGeen resultaten
-
GesprekkenGesprekscatalogusGeen gesprekken
@@ -225,7 +210,6 @@
Video-oproep beginnenBestanden versturenFoto of video maken
-
AanmeldenAccount aanmakenIndienen
@@ -273,7 +257,6 @@
Uw wachtwoord is opnieuw ingesteld.
\n
\nU bent op alle sessies afgemeld en zult niet langer pushmeldingen ontvangen. Om meldingen opnieuw in te schakelen, meldt u zich op elk apparaat opnieuw aan.
-
URL moet met http[s]:// beginnenAanmelden mislukt: netwerkfoutAanmelden mislukt
@@ -288,28 +271,20 @@
Er zijn te veel verzoeken verstuurdDeze gebruikersnaam is al in gebruikEr is nog niet op de koppeling in de e-mail geklikt
-
-
Leesbevestigingslijst
-
-
Versturen als OrigineelGrootMediumKlein
-
"Download annuleren?Upload annuleren?%d s%1$dm %2$ds
-
GisterenVandaag
-
GespreksnaamGespreksonderwerp
-
Oproep verbondenOproep is aan het verbinden…Oproep beëindigd
@@ -322,10 +297,8 @@
Mediaverbinding is misluktKan de camera niet initialiserenoproep elders opgenomen
-
Een afbeelding of video maken"Kan geen video opnemen"
-
Informatie${app_name} heeft toegang nodig tot uw mediabestanden om bijlagen te verzenden en op te slaan.
\n
@@ -346,31 +319,25 @@
\n
\nWilt u uw adresboek hiervoor delen\?Sorry. De actie is niet toegepast vanwege ontbrekende rechten
-
OpgeslagenIn downloads opslaan?JANEEVerdergaan
-
- Verwijderen
- Toetreden
- Voorvertoning
- Afwijzen
-
+ Verwijderen
+ Toetreden
+ Voorvertoning
+ AfwijzenGa naar ongelezen
-
%s heeft u uitgenodigd in dit gesprekDeze uitnodiging is naar %s verstuurd, maar die is niet geassocieerd met deze account.
\nMisschien wilt u zich met een andere account aanmelden, of dit e-mailadres aan deze account toevoegen.U probeert toegang te verkrijgen tot %s. Zou u het gesprek willen toetreden om eraan deel te nemen\?een gesprekDit is een voorvertoning van dit gesprek. Gespreksinteracties zijn uitgeschakeld.
-
Nieuw gesprekDeelnemer toevoegen1 deelnemer
-
Gesprek verlatenWeet u zeker dat u het gesprek wilt verlaten\?Weet u zeker dat u %s uit dit gesprek wilt verwijderen\?
@@ -398,14 +365,12 @@
U kunt deze veranderingen niet ongedaan maken aangezien u de gebruiker tot hetzelfde niveau als uzelf promoveert.
\nWeet u het zeker\?Weet u zeker dat u %s in dit gesprek wilt uitnodigen\?
-
Uitnodigen met IDLOKALE CONTACTEN (%d)Enkel Matrix-gebruikersGebruiker uitnodigen met IDVoer één of meer e-mailadressen of Matrix-ID’s inE-mailadres of Matrix-ID
-
Zoeken%s is aan het typen…%1$s en %2$s zijn aan het typen…
@@ -421,7 +386,6 @@
Onverstuurde berichten verwijderenBestand niet gevondenU heeft geen toestemming om dit naar dit gesprek te sturen.
-
VertrouwenNiet vertrouwenAfmelden
@@ -433,7 +397,6 @@
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.Aanvaard het certificaat alleen als de serverbeheerder een vingerafdruk heeft gepubliceerd die overeenkomt met degene hierboven.
-
Info over gesprekPersonenBestanden
@@ -441,14 +404,12 @@
Ongeldige ID. Het zou een e-mailadres of een Matrix-ID zoals ‘@gebruikersnaam:domein’ moeten zijnUITGENODIGDTOEGETREDEN
-
Reden voor het melden van deze inhoudWilt u alle berichten van deze gebruiker verbergen\?
\n
\nLet op: deze actie zal de app opnieuw opstarten; dit kan even duren.Upload annulerenDownload annuleren
-
ZoekenGespreksleden filterenGeen resultaten
@@ -456,28 +417,13 @@
BERICHTENPERSONENBESTANDEN
-
- TOETREDEN
- CATALOGUS
- FAVORIETEN
- GESPREKKEN
- LAGE PRIORITEIT
- UITNODIGINGEN
- Gesprek beginnen
- Gesprek aanmaken
- Gesprek toetreden
- Treed een gesprek toe
- Voer een gespreks(bij)naam in
-
Catalogus doorbladerenCatalogus wordt doorzocht…
-
FavorietLage prioriteitTweegesprekGesprek verlatenVergeten
-
BerichtenInstellingenVersie
@@ -485,7 +431,6 @@
DerdepartijvermeldingenCopyrightPrivacybeleid
-
ProfielfotoNaamE-mailadres
@@ -513,7 +458,6 @@
CopyrightPrivacybeleidCache wissen
-
GebruikersinstellingenMeldingenGenegeerde gebruikers
@@ -569,37 +513,29 @@
Voer een activeringscode inEr is een fout opgetreden bij het valideren van uw telefoonnummerCode
-
-
GespreksafbeeldingGespreksnaamOnderwerpGesprekslabelGelabeld als:
-
FavorietLage prioriteitGeen
-
Toegankelijk- en zichtbaarheidDit gesprek vermelden in de gesprekscatalogusToegang tot gesprekToegang tot de gespreksgeschiedenisWie kan er de geschiedenis lezen\?Wie heeft er toegang tot dit gesprek\?
-
IedereenAlleen deelnemers (vanaf het moment dat deze optie wordt geselecteerd)Alleen deelnemers (vanaf het moment dat ze worden uitgenodigd)Alleen deelnemers (vanaf het moment dat ze toetreden)
-
Om naar een gesprek te verwijzen moet dit een adres hebben.Alleen personen die uitgenodigd zijnIedereen die de koppeling van het gesprek kent, met uitzondering van gastenIedereen die de koppeling van het gesprek kent, inclusief gasten
-
Verbannen gebruikers
-
GeavanceerdInterne ID van dit gesprekAdressen
@@ -610,7 +546,6 @@
Eind-tot-eind-versleuteling is actiefAlleen naar geverifieerde sessies versleutelenOngeverifieerde sessies in dit gesprek nooit berichten sturen vanaf deze sessie.
-
Dit gesprek heeft geen lokale adressenNieuw adres (bv. #foo:matrix.org)Ongeldig bijnaamformaat
@@ -625,11 +560,8 @@
Versleuteling is uitgeschakeld in dit gesprek.Versleuteling inschakelen
\n(let op: dit kan niet meer uitgeschakeld worden!)
-
Catalogus
-
%s heeft geprobeerd een specifiek punt in de geschiedenis van dit gesprek te laden, maar kon het niet vinden.
-
Informatie over eind-tot-eind-versleutelingGebeurtenisinformatieGebruikers-ID
@@ -673,21 +605,18 @@
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 Gebruikersinstellingen 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.Ik verifieer dat de sleutels overeenkomen
-
Dit gesprek bevat onbekende sessiesDit gesprek bevat onbekende sessies die niet geverifieerd zijn.
\nDit betekent dat er geen garantie is dat de sessies bij de gebruikers horen waartoe ze beweren te horen.
\nWe raden u aan om bij elke sessie door het verificatieprocces heen te gaan voordat u verdergaat, maar u kunt het bericht ook zonder te verifiëren opnieuw versturen.
\n
\nOnbekende sessies:
-
Kies een gesprekscatalogusHet kan zijn dat de server niet beschikbaar of overbelast isVoer een thuisserver in om de publieke gesprekken ervan weer te gevenThuisserver-naamAlle gesprekken op server %sAlle lokale gesprekken op %s
-
Zoeken in de historiekOfflineGebruikerscatalogus
@@ -724,7 +653,6 @@
Aanmaken van widget is misluktVergadergesprekken maken met jitsiWeet u zeker dat u deze widget uit dit gesprek wilt verwijderen\?
-
Kan widget niet aanmaken.Versturen van verzoek mislukt.Het machtsniveau moet een positief geheel getal zijn.
@@ -744,19 +672,15 @@
Berichten die mijn gebruikersnaam bevattenStatistische gegevensSysteemcamera gebruiken
-
U heeft een nieuwe sessie ‘%s’ toegevoegd, die versleutelingssleutels aanvraagt.Uw ongeverifieerde sessie ‘%s’ vraagt versleutelingssleutels aan.Verificatie startenDelen zonder te verifiërenVerzoek negeren
-
Let op!Vergadergesprekken zijn in ontwikkeling en kunnen dus nog kuren vertonen.
-
OpdrachtfoutOnbekende opdracht: %s
-
UitLawaaierigVersleuteld bericht
@@ -828,14 +752,12 @@
%d actieve widget%d actieve widgets
-
AanmakenGemeenschap aanmakenGemeenschapsnaamVoorbeeldGemeenschaps-IDvoorbeeld
-
ThuisPersonenGesprekken
@@ -896,14 +818,14 @@
Voer uw wachtwoord in om verder te gaan:Account deactiverenLicenties van derde partijen
- Downloaden
- Inspreken
+ Downloaden
+ InsprekenBeveiligingssleutels van uw sessies opnieuw aanvragen.Sleutelaanvraag verstuurd.Aanvraag verstuurdStart ${app_name} op een ander apparaat dat het bericht kan ontsleutelen, zodat het de sleutels naar deze sessie kan sturen.Typ hier…
- Wissen
+ WissenSpraakbericht versturendoorgaan met…Sorry, er is geen externe toepassing gevonden om deze actie te voltooien.
@@ -921,7 +843,7 @@
Stel het machtsniveau van een gebruiker inNeemt rechten van gebruiker met gegeven ID afNodigt gebruiker met gegeven ID uit in het huidige gesprek
- Treedt toe tot gesprek met gegeven bijnaam
+ Voegt een kamer toe met het opgegeven adresGesprek verlatenOnderwerp van het gesprek instellenStuurt gebruiker met gegeven ID eruit
@@ -978,7 +900,7 @@
Gelieve %s om deze dienst te blijven gebruiken.FoutmeldingToch bellen
- Aanvaarden
+ AanvaardenGelieve het beleid van deze thuisserver te lezen en aanvaarden:OproepenGebruik de standaardbeltoon van ${app_name} voor inkomende oproepen
@@ -1011,11 +933,11 @@
Weet u het zeker\?Back-up makenU zult de toegang tot uw versleutelde berichten verliezen, tenzij u eerst een back-up van uw sleutels maakt vooraleer u zich afmeldt.
- Blijven
- Overslaan
+ Blijven
+ OverslaanKlaar
- Afbreken
- Negeren
+ Afbreken
+ NegerenWeet u zeker dat u zich wilt afmelden\?Markeren als gelezenAanmelden met unieke aanmelding
@@ -1095,7 +1017,7 @@
${app_name} wordt niet beperkt door accuoptimalisatie.Als een gebruiker een apparaat los van de oplader een tijd laat stilliggen, met het scherm uitgeschakeld, gaat het apparaat in slaapmodus. Dit verhindert apps de toegang tot het netwerk, en stelt hun taken, synchronisaties en standaardalarmen uit.Optimalisatie negeren
- De app heeft geen verbinding met de homeserver nodig in de achtergrond, dit zou het gebruik van de batterij moeten verlagen
+ De app heeft geen verbinding met de thuisserver nodig in de achtergrond, dit zou het gebruik van de batterij moeten verlagenLawaaiierige meldingen configurerenOproepmeldingen configurerenStille meldingen configureren
@@ -1326,10 +1248,10 @@
Gebruikers komen niet overeenOnbekende foutGeen
- Intrekken
- Verbinding verbreken
- Nakijken
- Weigeren
+ Intrekken
+ Verbinding verbreken
+ Nakijken
+ WeigerenGeen identiteitsserver geconfigureerd.Oproep mislukt door verkeerd geconfigureerde serverVraag de beheerder van uw thuisserver (%1$s) om een TURN-server te configureren om oproepen betrouwbaar te doen werken.
@@ -1403,24 +1325,24 @@
U bent afgemeld vanwege onjuiste of verlopen gebruikersreferenties.U gebruikt geen identiteitsserverEr is geen identiteitsserver geconfigureerd. Dit is vereist om uw wachtwoord opnieuw in te stellen.
- Het lijkt er op dat je probeert verbinding te maken met een andere thuisserver. Wil je uitloggen\?
+ Het lijkt er op dat u probeert verbinding te maken met een andere thuisserver. Wil je uitloggen\?BewerkenBeantwoordenOpnieuw proberenBetreed een kamer om de applicatie te gebruiken.
- Heeft je een uitnodiging gestuurd
+ Heeft u een uitnodiging gestuurdUitgenodigd door %s
- Je bent helemaal bij!
- Je hebt geen ongelezen berichten meer
+ U bent helemaal bij!
+ U hebt geen ongelezen berichten meerWelkom thuis!Ongelezen berichten inhalenGesprekken
- Je directe gesprekken zullen hier worden weergegeven. Gebruik de + knop om een gesprek te starten.
+ Uw directe gesprekken zullen hier worden weergegeven. Gebruik de + knop om een gesprek te starten.Kamers
- Je kamers zullen hier worden weergegeven. Gebruik de + knop rechtsonder om een bestaande kamer te openen of een nieuwe aan te maken.
+ Uw kamers zullen hier worden weergegeven. Gebruik de + knop rechtsonder om een bestaande kamer te openen of een nieuwe aan te maken.Reacties
- Bevestigen
- Leuk vinden
+ Bevestigen
+ Leuk vindenReactie ToevoegenReacties BekijkenReacties
@@ -1443,10 +1365,10 @@
GespreksnaamPubliekIedereen zal dit gesprek kunnen toetreden
- Pauzeren
- Afspelen
+ Pauzeren
+ AfspelenU heeft het hoofdadres voor dit gesprek verwijderd.
- Je hebt %1$s uitgenodigd. Reden: %2$s
+ U heeft %1$s uitgenodigd. Reden: %2$sJouw uitnodiging. Reden: %1$sBericht verstuurdInitiële synchronisatie:
@@ -1455,7 +1377,7 @@
\nAan het wachten op een antwoord van de server…Lege kamer (was %s)Moderator
- Je hebt %1$s uitgenodigd
+ U heeft %1$s uitgenodigd%1$s nodigde %2$s uitGeen verandering.U heeft eind-tot-eind-versleuteling ingeschakeld (%1$s)
@@ -1539,19 +1461,19 @@
%1$s sluit aanU heeft de kamer betredenU heeft een sticker verzonden.
- Druk op je opname om te stoppen of om te luisteren
+ Druk op uw opname om te stoppen of om te luisterenHoud ingedrukt om op te nemen, laat los om te verzenden
- Verwijder opgenomen stembericht
+ Verwijder opnameStembericht aan het opnemenPauzeer stemberichtSpeel stembericht af
- 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 ruimte-instellingen.
+ 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 ruimte-instellingen.Stembericht (%1$s)Kan niet antwoorden of aanpassen als stembericht actief isKan stembericht niet opnemenKan stembericht niet afspelen
- Je hebt je profiel geüpdatet %1$s
- Je hebt een VoIP-vergadering aangevraagd
+ U heeft uw profiel geüpdatet %1$s
+ U heeft een VoIP-vergadering aangevraagdU 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.
@@ -1584,11 +1506,10 @@
• Servers die overeenkomen met %s zijn verbannen.U heeft hier geüpgraded.%s heeft hier geüpgraded.
- Je hebt toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %1$s
+ U heeft toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %1$s%1$ds over%s is toegetreden.Conclusie Bevestiging
- BotknoppenGespreksinstellingenGespreksnaamIntegraties Beheren
@@ -1623,7 +1544,7 @@
%1$s gebruikenHuidige taalGebruikers Uitnodigen
- Gebruikers uitnodigen
+ Gebruikers uitnodigen…Leden toevoegenLogin bevestigen%1$s (%2$s)
@@ -1640,13 +1561,8 @@
Bevestiging GeannuleerdSleutelverzoekenVerwijderen Bevestigen
- Gekozen Optie
-
- %d stem
- %d stemmen
- Accountgegevens
- Dev Tools
+ Ontwikkel GereedschapQR-codeSleutels herstellenGekruist Ondertekenen Initialiseren
@@ -1676,7 +1592,7 @@
%s heeft geannuleerdJij hebt geaccepteerd%s heeft geaccepteerd
- Je hebt geannuleerd
+ U heeft geannuleerdNiet beveiligdZe komen overeenVersleuteling inschakelen
@@ -1686,14 +1602,14 @@
GevoeligheidsdrempelOntwikkelaarsmodusGeavanceerde instellingen
- Initiële synchronisatie
+ Initiële synchronisatie…Data wissenData wissenInloggenInloggenGezien doorMatrix-ID
- Verouderde homeserver
+ Verouderde thuisserverSelecteer matrix.orgOpnieuw verzendenCode invoeren
@@ -1718,7 +1634,7 @@
Gebruiker negerenInhoud gerapporteerdGEBRUIKER NEGEREN
- Aangepaste rapportage
+ Aangepast rapport…Dit is ongepastDit is spamGelezen door %s
@@ -1728,12 +1644,12 @@
IdentiteitsserverGelezen omVoorwaarden Herzien
- Gesprek binnengaan
- Gesprek aanmaken
- Gesprekken filteren
+ Kamer binnengaan…
+ Kamer aanmaken…
+ Gesprekken filteren…Berichtwijzigingen
- Bestand versleutelen
- Thumbnail versleutelen
+ Bestand versleutelen…
+ Miniatuur versleutelen…Directe BerichtenFeedbackToken registreren
@@ -1751,7 +1667,7 @@
OverigeGeenGebruiker negeren
- Jezelf degraderen\?
+ Uzelf degraderen\?Uitnodiging annulerenIn de wacht zettenSSL-fout.
@@ -1803,11 +1719,11 @@
VersturenUITNODIGENOnversleuteld
- Bericht
+ Bericht…Problemen oplossenBeëindigenVerversen
- Verwijderen
+ Verwijderen…Waarschuwing:NeeJa
@@ -1829,7 +1745,7 @@
MeerBeveiligingJij
- Wachten
+ Wachten…StickerBestandGeluid
@@ -1873,8 +1789,8 @@
Wachten…Formaat:Url:
- session_name:
- app_display_name:
+ sessie_naam:
+ app_weergave_naam:push_key:app_id:Expert
@@ -1896,33 +1812,33 @@
SpacesMeer WetenBegin met chatten
- Herstellen
- Afwijzen
+ Herstellen
+ AfwijzenSysteemstandaard
- Je hebt eind-tot-eindversleuteling ingeschakeld (onbekend algoritme %1$s).
- Je hebt eind-tot-eindversleuteling ingeschakeld.
- Je hebt gasten de toegang tot het gesprek verhinderd.
+ U heeft eind-tot-eindversleuteling ingeschakeld (onbekend algoritme %1$s).
+ U heeft eind-tot-eindversleuteling ingeschakeld.
+ U heeft gasten de toegang tot het gesprek verhinderd.%1$s heeft gasten de toegang tot het gesprek verhinderd.
- Je hebt gasten de toegang tot het gesprek verhinderd.
- Je hebt hier gasten toegelaten.
+ U heeft gasten de toegang tot het gesprek verhinderd.
+ U heeft hier gasten toegelaten.%1$s heeft hier gasten toegelaten.
- Je hebt het gespreksadres gewijzigd.
+ U heeft het gespreksadres gewijzigd.%1$s heeft het gespreksadres gewijzigd.
- Je hebt het hoofdadres en alternatieve gespreksadres gewijzigd.
+ U heeft het hoofdadres en alternatieve gespreksadres gewijzigd.%1$s heeft het hoofdadres en alternatieve gespreksadres gewijzigd.
- Je hebt het alternatieve gespreksadres gewijzigd.
+ U heeft het alternatieve gespreksadres gewijzigd.%1$s heeft het alternatieve gespreksadres gewijzigd.
- Je hebt alternatief gespreksadres %1$s verwijderd.
- Je hebt alternatieve gespreksadressen %1$s verwijderd.
+ U heeft alternatief gespreksadres %1$s verwijderd.
+ U heeft alternatieve gespreksadressen %1$s verwijderd.%1$s heeft %2$s als alternatief gespreksadres verwijderd.%1$s heeft %2$s als alternatieve gespreksadressen verwijderd.
- Je hebt %1$s als alternatief gespreksadres toegevoegd.
- Je hebt %1$s als alternatieve gespreksadressen toegevoegd.
+ U heeft %1$s als alternatief gespreksadres toegevoegd.
+ U heeft %1$s als alternatieve gespreksadressen toegevoegd.%1$s heeft %2$s als alternatief gespreksadres toegevoegd.
@@ -1937,26 +1853,26 @@
Reden voor verbanningdoor deze gebruiker de verwijderen zal hij/zij niet meer in deze space zitten.
\n
-\nOm te voorkomen dat hij/zij opnieuw toetreedt, kun je hem/haar ook verbannen.
+\nOm te voorkomen dat hij/zij opnieuw toetreedt, kunt u hem/haar ook verbannen.door deze gebruiker te verwijderen zal hij/zij niet meer in dit gesprek zitten.
\n
\nOm te voorkomen dat hij/zij opnieuw toetreedt, kun je hem/haar ook verbannen.Reden voor verwijdering
- Weet je zeker dat je uitnodiging voor deze gebruiker wilt annuleren\?
+ Weet u zeker dat u uitnodiging voor deze gebruiker wilt annuleren\?Het niet meer negeren van deze gebruiker zal al zijn/haar berichten opnieuw doen weergeven.Door deze gebruiker te negeren worden zijn/haar berichten verwijderd uit gesprekken die jullie delen.
\n
-\nJe kunt deze actie op elk moment ongedaan maken in de algemene instellingen.
- Je kunt deze wijziging niet ongedaan maken omdat je jezelf degradeert, als je de laatste gebruiker met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen.
- Dit gesprek is niet publiek. Je kunt niet opnieuw toetreden zonder uitnodiging.
+\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 gebruiker met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen.
+ Dit gesprek is niet publiek. U kunt niet opnieuw toetreden zonder uitnodiging.Toch Doorgaan
- Toegang verlenen tot je contactpersonen.
- Om de QR-code te scannen moet je toegang verlenen tot de camera.
- Oproep beëindigen
+ Toegang verlenen tot uw contactpersonen.
+ Om de QR-code te scannen moet u toegang verlenen tot de camera.
+ Oproep beëindigen…Geen antwoord
- De gebruiker die je hebt gebeld is bezig.
+ De gebruiker die u heeft gebeld is bezig.Gebruiker bezig
- Je hebt de oproep in de wacht gezet
+ U heeft de oproep in de wacht gezet%s heeft de oproep in de wacht gezetTeruggaan naar oproepActieve Oproep (%s)
@@ -1968,12 +1884,12 @@
Gemiste stemoproep
- gemiste stemoproepen
+ %d gemiste stemoproepenGaat over…Bevestiging vragen voor het starten van een oproepOnbedoelde oproep voorkomen
- Niet geautoriseerd, geldige authenticatiegegevens ontbreken.
+ Niet geautoriseerd, geldige authenticatiegegevens ontbrekenSSL-fout: de identiteit van de ander is niet bevestigd.Dit telefoonnummer is al gedefinieerd.Gebruik als standaard en niet opnieuw vragen
@@ -1981,9 +1897,10 @@
HD inschakelenHD uitschakelenGeluidsapparaat Selecteren
- Live verbinding opzetten mislukt.Vraag de administrator van je homeserver om een TURN-server te configureren zodat oproepen betrouwbaar werken.
+ Kan geen realtime verbinding tot stand brengen.
+\nVraag de beheerder van uw thuisserver om een TURN-server te configureren om gesprekken betrouwbaar te laten werken.${app_name} Oproep Mislukt
- Homeserver API URL
+ Thuisserver API URLSleutel deelverzoekgeschiedenis verzendenAlle gesprekken in de lijst tonen, waaronder gesprekken met expliciete inhoud.Gesprekken tonen met expliciete inhoud
@@ -1993,19 +1910,423 @@
Nieuwe waardeWidget verwijderen misluktWidget toevoegen mislukt
- Je kunt jezelf niet bellen, wacht totdat deelnemers de uitnodiging accepteren
- Je kunt jezelf niet bellen
- Vergaderingen gebruiken beveiligings- en toestemmingsbeleid van Jitsi. Alle huidige personen in het gesprek zullen een uitnodiging zien terwijl je vergadering bezig is.
+ 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.Geluidsvergadering startenVideoconferentie startenEr is al een vergadering aan de gang!
- Je mist het recht om een oproep te starten
- Je mist het recht om een oproep in dit gesprek te starten
- Je mist het recht om een vergadering te starten
- Je mist het recht om een vergadering in dit gesprek te 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 startenOntbrekende rechtenGeef toestemming om de microfoon te gebruiken om stemberichten te versturen.Alles herstellen
- Je bent toegetreden.
+ U bent toegetreden.Stemberichten inschakelen
+ 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-coderingssleutels 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.
+ Wachtwoord opnieuw instellen op %1$s
+ Dit e-mailadres is niet gekoppeld aan een account.
+ De applicatie kan geen account aanmaken op deze thuisserver.
+\n
+\nWilt u zich aanmelden met een webclient\?
+ Sorry, deze server accepteert geen nieuwe accounts.
+ De applicatie kan niet inloggen op deze thuisserver. 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
+ Premium hosting voor organisaties
+ Element Matrix Services-adres
+ Geschiedenis wissen
+ Doorgaan met eenmalig inloggen
+ Log in met %s
+ Log in bij %1$s
+ Verbinding maken met een aangepaste server
+ Verbinding maken met Element Matrix Services
+ Maak verbinding met %1$s
+ eenmalig inloggen
+ Meld je aan met %s
+ Ga verder met %s
+ Aangepaste en geavanceerde instellingen
+ Premium hosting voor organisaties
+ 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
+ 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.
+ %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 ruimte openbaar gemaakt voor iedereen die de link kent.
+ U negeert geen enkele gebruiker
+ %1$s heeft de ruimte 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
+ %1$s heeft geen wijzigingen aangebracht
+ Kamer instellingen
+ Verlaat de kamer
+ Verwijderen van lage prioriteit
+ Toevoegen aan lage prioriteit
+ Verwijder van favorieten
+ Toevoegen aan favorieten
+ Alle berichten (luidruchtig)
+ Er is momenteel geen netwerkverbinding
+ ${app_name} heeft toestemming nodig om uw E2E-sleutels op schijf op te slaan.
+\n
+\nGeef toegang in de volgende pop-up om uw sleutels handmatig te kunnen exporteren.
+ Deze inhoud is als ongepast gerapporteerd.
+\n
+\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen.
+ Gemeld als ongepast
+ Deze inhoud is gerapporteerd als spam.
+\n
+\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen.
+ Gerapporteerd als spam
+ Deze inhoud is gemeld.
+\n
+\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen.
+ Reden voor het rapporteren van deze inhoud
+ Deze inhoud rapporteren
+ Er zijn geen bestanden in deze kamer
+ %1$s op %2$s
+ Er zijn geen media in deze kamer
+ %1$d van %2$d
+ Kan gegevens delen niet aan
+ Roteren en bijsnijden
+ Opiniepeiling
+ Afbeelding toevoegen van
+ Er is een fout opgetreden bij het ophalen van de bijlage.
+ Het bestand \'%1$s\' (%2$s) is te groot om te uploaden. Het limiet is %3$s.
+ Het bestand is te groot om te uploaden.
+
+ %d gebruiker gelezen
+ %d gebruikers gelezen
+
+ %1$s en %2$s gelezen
+ %1$s, %2$s en %3$s gelezen
+
+ %1$s, %2$s en %3$d andere gelezen
+ %1$s, %2$s en %3$d anderen lezen
+
+ Deze functie is in bèta
+ Naar beneden springen
+ Sluit sleutels back-up banner
+ Maak een nieuwe kamer aan
+ Creëer een nieuw direct gesprek door een QR-code te scannen
+ Maak een nieuw direct gesprek aan met Matrix ID
+ Een nieuw direct gesprek maken
+ Sluit het menu ruimte maken…
+ Open het menu ruimte 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.
+ 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.
+ 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
+ Identiteitsserver heeft geen servicevoorwaarden
+ Voer de URL van de identiteitsserver in
+ Kan geen verbinding maken met identiteitsserver
+ Voer een identiteitsserver URL in
+ Beleid
+ Gaat u akkoord met het verzenden 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.
+ Om bestaande contacten te ontdekken, moet u contactgegevens naar uw identiteitsserver sturen.
+\n
+\nWe hashen uw gegevens voordat ze worden verzonden vanwege privacy. Gaat u akkoord met het verzenden van deze informatie\?
+ Accepteert u om uw contactgegevens (telefoonnummers en/of e-mailadressen) naar de geconfigureerde identiteitsserver (%1$s) te sturen om bestaande contacten die u kent te ontdekken\?
+\n
+\nVoor meer privacy worden de verzonden gegevens gehasht voordat ze worden verzonden.
+ E-mailadressen en telefoonnummers verzenden
+ Stuur e-mailadressen en telefoonnummers naar %s
+ Toestemming geven
+ Mijn toestemming intrekken
+ Uw thuisserver-beleid
+ Kan geen thuisserver bereiken op de URL %s. Controleer uw link of kies handmatig een thuisserver.
+ Uw contacten zijn privé. Om gebruikers 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\?
+ Deze kamer is op dit moment niet toegankelijk.
+\nProbeer het later opnieuw of vraag een ruimtebeheerder 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 gebruikers deze kamer kunnen vinden via uw thuisserver (%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 heeft geen toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere gebruikers van uw contacten te ontdekken.
+ U hebt uw toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere gebruikers van uw contacten te ontdekken.
+ E-mails en telefoonnummers verzenden
+ Vindbare telefoonnummers
+ Als u de verbinding met uw identiteitsserver verbreekt, betekent dit dat u niet door andere gebruikers kan worden gevonden en dat u anderen niet per e-mail of telefoon kunt uitnodigen.
+ Ontdekkingsopties verschijnen zodra u een telefoonnummer heeft 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.
+ Geen beleid geleverd door de identiteitsserver
+ Identiteitsserverbeleid verbergen
+ Identiteitsserverbeleid weergeven
+ Identiteitsserver wijzigen
+ Ontdekkingsinstellingen openen
+ Identiteitsserver configureren
+ Identiteitsserver ontkoppelen
+ Gebruik bots, bruggen, widgets en stickerpakketten
+ Vindbaar zijn voor anderen
+ Servicevoorwaarden
+ Bekijken Bewerken Geschiedenis
+ Bekende gebruikers
+ Filter op gebruikersnaam of ID…
+ Begin met typen om resultaten te krijgen
+ Geen resultaat gevonden, gebruik Toevoegen via matrix-ID om op de server te zoeken.
+ Toevoegen via matrix ID
+ QR-code
+ Toevoegen via QR-code
+ Link gekopieerd naar klembord
+ Voeg een speciaal tabblad toe voor ongelezen meldingen op het hoofdscherm.
+ Schakel vegen in om te antwoorden in de tijdlijn
+ Zoeknaam
+ Zoeken op naam, ID of e-mail
+ Naam of ID (#voorbeeld:matrix.org)
+ Bekijk de kamer directory
+ Een nieuw privébericht verzenden
+ Creëer een nieuwe kamer
+ Kunt u niet vinden wat u zoekt\?
+ Geen bewerkingen gevonden
+ Bestand %1$s is gedownload!
+ Bestand %1$s downloaden…
+ Video comprimeren %d%%
+ Afbeelding comprimeren…
+ Bestand verzenden (%1$s / %2$s)
+ Miniatuur verzenden (%1$s / %2$s)
+ Toon volledige geschiedenis in versleutelde kamers
+ Toon verborgen gebeurtenissen op de tijdlijn
+ 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 gebruikersnaam worden genoteerd om ons te helpen uw 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.
+ Doe een suggestie
+ Systeem instellingen
+ Versies
+ Hulp bij het gebruik van Element
+ Hulp en ondersteuning
+ Hulp
+ Juridisch
+ Hulp & Over
+ Spraak en video
+ Geen geregistreerde push-gateways
+ Geen push-regels gedefinieerd
+ Beveiliging en privacy
+ Andere kennisgevingen van derden
+ Matrix SDK Versie
+ Importeer e2e-sleutels uit bestand \"%1$s\".
+ Er is een fout opgetreden bij het ophalen van back-upgegevens van sleutels
+ Er is een fout opgetreden bij het ophalen van vertrouwensinformatie
+ De kamer is aangemaakt, maar sommige uitnodigingen zijn om de volgende reden niet verzonden:
+\n
+\n%s
+ Publiceer deze kamer in de kamerdirectory
+ Kameronderwerp (optioneel)
+ Creëer nieuwe Space
+ Toon een aanduiding voor verwijderde berichten
+ Toon verwijderde berichten
+ Beveiligde back-up instellen
+ Beveiliging tegen verlies van toegang tot versleutelde berichten en gegevens
+ De herstelsleutel is opgeslagen.
+ Toont informatie over een gebruiker
+ Verandert de avatar van de huidige kamer
+ Stelt de kamernaam in
+ Stopt met het negeren van een gebruiker, toon hun berichten in de toekomst
+ Negeer een gebruiker en verberg hun berichten voor jou
+ Geen actieve widgets
+ De huidige conferentie verlaten en naar de andere overschakelen\?
+ Sorry, er is een fout opgetreden bij het deelnemen aan de conferentie
+ %1$s: %2$s %3$s
+ %1$s en %2$s
+ %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.
+ Een nieuwe server toevoegen
+ Uw server
+
+ Sleutel %1$d/%2$d geïmporteerd met succes.
+ %1$d/%2$d sleutels met succes geïmporteerd.
+
+ Sleutels succesvol geëxporteerd
+ Kamer versie
+
+ %d verbannen gebruiker
+ %d verbannen gebruikers
+
+ Bepaal wie deze ruimte kan vinden en er lid van kan worden.
+ Tik om spaces te bewerken
+ Selecteer spaces
+ Bepaal welke spaces toegang hebben tot deze ruimte. Als een spaces is geselecteerd, kunnen de leden de naam van de ruimte vinden en er lid van worden.
+ Spaces die toegang hebben
+ Sta leden van de ruimte toe om te vinden en toegang te krijgen.
+ Leden van Space %s kunnen vinden, bekijken en lid worden.
+ Iedereen in een space met deze ruimte kan de ruimte vinden en eraan deelnemen. Alleen beheerders van deze ruimte kunnen deze toevoegen aan een space.
+ Alleen spaceleden
+ Iedereen kan de space vinden en meedoen
+ Iedereen kan de kamer vinden en meedoen
+ Alleen uitgenodigde mensen kunnen vinden en deelnemen
+ Privé (alleen op uitnodiging)
+ Onbekende toegangsinstelling (%s)
+ Iedereen kan bij deze kamer aankloppen, leden kunnen dan accepteren of weigeren
+ Kan de zichtbaarheid van de huidige kamerdirectory niet ophalen (%1$s).
+ Deze kamer openbaar publiceren in de kamerdirectory van %1$s\?
+ Publicatie van dit adres ongedaan maken
+ Dit adres publiceren
+ Voeg een lokaal adres toe
+ Deze kamer heeft geen lokale adressen
+ Lokale adressen
+ Nieuw gepubliceerd adres (bijv. #alias:server)
+ Nog geen andere gepubliceerde adressen.
+ Nog geen andere gepubliceerde adressen, voeg er hieronder een toe.
+ Deze kamer openbaar publiceren in de kamerdirectory van %1$s\?
+ Het adres \"%1$s\" verwijderen\?
+ De publicatie van het adres \"%1$s\" ongedaan maken\?
+ Een nieuw adres handmatig publiceren
+ Andere gepubliceerde adressen:
+ Hoofdadres
+ 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
+ Kameradressen
+ Adressen van deze ruimte bekijken en beheren.
+ Spaceadressen
+ Bekijk en beheer de adressen van deze kamer en de zichtbaarheid ervan in de kamerdirectory.
+ Kameradressen
+ Sta toe om gasten te laten deelnemen
+ Space toegang
+ Kamer toegang
+ Wie heeft toegang\?
+ Wijzigingen in wie geschiedenis kan lezen, zijn alleen van toepassing op toekomstige berichten in deze chatruimte. De zichtbaarheid van de bestaande historie blijft ongewijzigd.
+ Account instellingen
+ U kunt 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
+ E-mailadressen en telefoonnummers
+ Schakel hiervoor \'Integraties toestaan\' in bij Instellingen.
+ Integraties zijn uitgeschakeld
+ Deze server biedt geen beleid.
+ Bibliotheken van derden
+ Uw identiteitsserverbeleid
+ ${app_name} beleid
+ We delen geen informatie met derden
+ We registreren of profileren geen accountgegevens
+ hier
+ Help ons problemen te identificeren en Element 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.
+\n
+\nU kunt al onze voorwaarden %s lezen.
+ Help Element 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.
+ Instellen op dit apparaat
+ Beveiligde back-up resetten
+ Beveiligde back-up instellen
+ Voeg een knop toe aan de invoerveld om het emoji-toetsenbord te openen
+ Emoji-toetsenbord weergeven
+ Inclusief uitnodiging/deelnemen/links/kick/ban-evenementen en wijzigingen van avatar/weergavenaam.
+ Gebruik /confetti commando of stuur een bericht met ❄️ of 🎉
+ Toon chateffecten
+ Toon kamer deelnemers event status
+ Kamer upgrades
+ Berichten door bot
+ Kameruitnodigingen
+ Versleutelde groepsberichten
+ Groepsberichten
+ Versleutelde directe berichten
+ Directe berichten
+ Mijn gebruikersnaam
+ Mijn weergavenaam
+ Berichten bevatten @room
+ Wanneer kamers worden opgewaardeerd
+ 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!
+ 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
+ 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
+ E-mail notificatie
+ Er is geen e-mailadres toegevoegd aan uw account
+ Er is geen telefoonnummer toegevoegd aan uw account
+ De sessie is afgemeld!
+ De kamer is verlaten!
+ Alleen vermeldingen en trefwoorden
+ Zoeken in versleutelde kamers wordt nog niet ondersteund.
+ Filter verbannen gebruikers
+ Verander onderwerp
+ Space upgraden
+ Ruimte upgraden
+ Verstuur m.room.server_acl berichten
+ Rechten wijzigen
+ Space naam wijzigen
+ Kamer naam wijzigen
+ Zichtbaarheid van geschiedenis wijzigen
+ Spaceversleuteling inschakelen
+ Kamerversleuteling inschakelen
+ Wijzig hoofdadres van de space
+ Wijzig hoofdadres van de kamer
+ Ruimte afbeelding verwijderen
+ Kamer afbeelding veranderen
+ Widgets wijzigen
+ Iedereen informeren
+ Berichten verwijderen die door anderen zijn verzonden
+ Gebruikers verbannen
+ Kick gebruikers
+ Instellingen veranderen
+ Gebruikers uitnodigen
+ Berichten sturen
+ Standaardrol
+ U bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van deze ruimte te wijzigen
+ U bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van de ruimte te wijzigen
+ Selecteer de rollen die nodig zijn om verschillende delen van deze ruimte 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 ruimte te veranderen.
+ Bekijk en update de rollen die nodig zijn om verschillende delen van de ruimte te veranderen.
+ Kies thuisserver
+ Niet nu
+ Inschakelen
+ Luisteren naar notificaties
+ U mag niet deelnemen aan deze kamer
\ No newline at end of file
diff --git a/vector/src/main/res/values-nn/strings.xml b/vector/src/main/res/values-nn/strings.xml
index ed8afce0c94..44981bda8a3 100644
--- a/vector/src/main/res/values-nn/strings.xml
+++ b/vector/src/main/res/values-nn/strings.xml
@@ -40,7 +40,7 @@
%1$s inviterte %2$s til rommet%1$s sa ja til innbjodingi til %2$s** Fekk ikkje til å dekryptera: %s **
- Avsendareiningi hev ikkje sendt oss nyklane fyr denna meldingi.
+ Avsendareiningi hev ikkje sendt oss nyklane fyr denna meldingi.Kunde ikkje gjera umFekk ikkje til å senda meldingiFekk ikkje til å lasta biletet upp
@@ -82,24 +82,24 @@
TredjepartilisensarLastar…Greitt
- Avbryt
- Lagra
- Forlat
- Send
- Send på nytt
- Fjern
- Siter
- Last ned
- Del
- Snakk
- Tøm
+ Avbryt
+ Lagra
+ Forlat
+ Send
+ Send på nytt
+ Fjern
+ Siter
+ Last ned
+ Del
+ Snakk
+ TømSeinare
- Send vidare
+ Send vidarePermanent lenkjeVis kjeldeVis den dekrypterte kjelda
- Slett
- Gje nytt namn
+ Slett
+ Gje nytt namnRapporter innhaldetPågåande samtalePågåande konferansesamtale.
@@ -114,7 +114,7 @@
Konferansesamtalar er ikkje støtta i krypterte romSend likeveleller
- Inviter
+ InviterFråkoplaGå utHandlingar
@@ -128,7 +128,7 @@
OpnaLat attKopier til utklippstavla
- Skru av
+ Skru avStadfestingÅtvaringHeim
@@ -322,10 +322,10 @@
JANEIGå fram
- Ta vekk
- Bli med
- Førehandsvisning
- Avvis
+ Ta vekk
+ Bli med
+ Førehandsvisning
+ AvvisMedlemsoversiktOpne overskriftSynkroniserer…
@@ -436,17 +436,6 @@
MELDINGARFOLKFILER
- VERT MED
- UTVAL
- YNDLINGAR
- ROM
- LÅGRETT
- INNBJODINGAR
- Start samtale
- Laga eit rom
- Vert med i romet
- Vert med i eit rom
- Skriv inn ein rom-ID eller eit romaliasBla gjennom katalog%d rom
@@ -854,12 +843,12 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t
Ver venleg og %s for å heva grensa.Ver venleg og %s for å halda fram med å bruka tenesten.Ring likevel
- Aksepter
+ AksepterFeil
- Hopp over
+ Hopp overFerdig
- Avbryt
- Ignorer
+ Avbryt
+ IgnorerSikker på at du vil logga ut\?Merk som lestVenligast sjå over og godta retningslinjene til heimtenaren:
@@ -909,12 +898,12 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t
Er du sikker \?SikkerheitskopierDu vil miste tilgang til dine krypterte meldingar, med mindre nøklane dine er sikkerheitskopierte før utlogging.
- Bli
+ BliIngen
- Trekk tilbake
- Koble frå
- Sjå gjennom
- Avvis
+ Trekk tilbake
+ Koble frå
+ Sjå gjennom
+ AvvisIngen identitetstenar er satt opp.Samtale feila fordi tenaren er satt opp feilBe administratoren for din heimetenar (%1$s) om, å setta opp ein \"TURN-server\" for å handtera samtalar på rett måte.
@@ -993,7 +982,7 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t
Avanserte innstillingarAvanserte og tilpassa innstillingarGenerelt
- Spel av
+ Spel avDette telefonnummeret er allereie definert.Skru HD avFront
@@ -1017,8 +1006,9 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t
Du har ikkje lov til å starta ein konferansesamtaleDu har ikkje lov til å starta ein konferansesamtale i dette rommetStart samtale
- Nullstill
- Pause
+ Nullstill
+ PauseFolkFolk
+ Du sende eit bilde.
\ No newline at end of file
diff --git a/vector/src/main/res/values-pa/strings.xml b/vector/src/main/res/values-pa/strings.xml
new file mode 100644
index 00000000000..9037c25c0cb
--- /dev/null
+++ b/vector/src/main/res/values-pa/strings.xml
@@ -0,0 +1,113 @@
+
+
+ %1$s ਨੇ %2$s ਲਈ ਸੱਦਾ ਰੱਦ ਕੀਤਾ
+ %1$s ਨੇ %2$s ਲਈ ਥਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਣ ਦਾ ਸੱਦਾ ਰੱਦ ਕੀਤਾ
+ ਤੁਸੀਂ %1$s ਲਈ ਥਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਣ ਦਾ ਸੱਦਾ ਰੱਦ ਕੀਤਾ
+ ਤੁਸੀਂ %1$s ਨੂੰ ਸੱਦਾ ਘੱਲਿਆ
+ %1$s ਨੇ %2$s ਨੂੰ ਸੱਦਾ ਘੱਲਿਆ
+ ਤੁਸੀਂ %1$s ਨੂੰ ਥਾਂ ਵਿੱਚ ਜੁੜਨ ਦਾ ਸੱਦਾ ਘੱਲਿਆ
+ %1$s ਨੇ %2$s ਨੂੰ ਥਾਂ ਵਿੱਚ ਜੁੜਨ ਦਾ ਸੱਦਾ ਘੱਲਿਆ
+ ਤੁਸੀਂ ਆਪਣੀ ਪ੍ਰੋਫ਼ਾਈਲ ਅੱਪਡੇਟ ਕੀਤੀ %1$s
+ %1$s ਨੇ ਆਪਣੀ ਪ੍ਰੋਫ਼ਾਈਲ ਅੱਪਡੇਟ ਕੀਤੀ %2$s
+ %1$s ਵੱਲੋਂ ਸੁਨੇਹਾ ਹਟਾਇਆ ਗਿਆ [ਕਾਰਨ: %2$s]
+ ਸੁਨੇਹਾ ਹਟਾਇਆ ਗਿਆ [ਕਾਰਨ: %1$s]
+ %1$s ਵਲੋਂ ਸੁਨੇਹਾ ਹਟਾਇਆ ਗਿਆ
+ ਸੁਨੇਹਾ ਹਟਾਇਆ ਗਿਆ
+ ਤੁਸੀਂ ਥਾਂ ਦਾ ਅਵਤਾਰ ਹਟਾਇਆ
+ %1$s ਨੇ ਥਾਂ ਦਾ ਅਵਤਾਰ ਹਟਾਇਆ
+ ਤੁਸੀਂ ਥਾਂ ਦਾ ਵਿਸ਼ਾ ਹਟਾਇਆ
+ %1$s ਨੇ ਥਾਂ ਦਾ ਵਿਸ਼ਾ ਹਟਾਇਆ
+ ਤੁਸੀਂ ਥਾਂ ਦਾ ਨਾਮ ਹਟਾਇਆ
+ %1$s ਨੂੰ ਥਾਂ ਦੇ ਨਾਮ ਵਿੱਚੋਂ ਹਟਾਇਆ ਗਿਆ
+ (ਅਵਤਾਰ ਵੀ ਬਦਲਿਆ ਗਿਆ)
+ VoIP ਕਾਨਫ਼ਰੰਸ ਮੁਕੰਮਲ
+ VoIP ਕਾਨਫ਼ਰੰਸ ਚਾਲੂ
+ ਤੁਸੀਂ ਇੱਕ VoIP ਕਾਨਫ਼ਰੰਸ ਦੀ ਬੇਨਤੀ ਕੀਤੀ
+ %1$s ਨੇ ਇੱਕ VoIP ਕਾਨਫ਼ਰੰਸ ਦੀ ਬੇਨਤੀ ਕੀਤੀ
+ 🎉 ਸਾਰੇ ਸਰਵਰਾਂ ਦੇ ਭਾਗ ਲੈਣ ਤੇ ਪਬੰਦੀ ਲਗਾ ਦਿੱਤੀ ਹੈ। ਇਹ ਥਾਂ ਹੁਣ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।
+ ਕੋਈ ਬਦਲਾਅ ਨਹੀਂ।
+ • IP literals ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਹੁਣ ਪਬੰਦੀਸ਼ੁਦਾ ਹਨ।
+ • IP literals ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਹੁਣ ਮਨਜ਼ੂਰਸ਼ੁਦਾ ਹਨ।
+ • %s ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਮਨਜ਼ੂਰਸ਼ੁਦਾ ਸੂਚੀ ਵਿੱਚੋਂ ਹਟਾ ਦਿੱਤੇ ਗਏ ਹਨ।
+ • %s ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਹੁਣ ਮਨਜ਼ੂਰਸ਼ੁਦਾ ਹਨ।
+ • %s ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਪਬੰਦੀਸ਼ੁਦਾ ਸੂਚੀ ਵਿੱਚੋਂ ਹਟਾ ਦਿੱਤੇ ਗਏ ਸਨ।
+ • %s ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਹੁਣ ਪਬੰਦੀਸ਼ੁਦਾ ਹਨ।
+ ਤੁਸੀਂ ਇਸ ਥਾਂ ਲਈ ਸਰਵਰ ACL ਬਦਲੇ।
+ %s ਨੇ ਇਸ ਥਾਂ ਲਈ ਸਰਵਰ ACL ਬਦਲੇ।
+ • IP literals ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਪਬੰਦੀਸ਼ੁਦਾ ਹਨ।
+ • IP literals ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਮਨਜ਼ੂਰ ਹਨ।
+ • %s ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਮਨਜ਼ੂਰ ਹਨ।
+ • %s ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਸਰਵਰ ਪਬੰਦੀਸ਼ੁਦਾ ਹਨ।
+ ਤੁਸੀਂ ਇਸ ਥਾਂ ਲਈ ਸਰਵਰ ACL ਸੈੱਟ ਕੀਤੇ।
+ %s ਨੇ ਇਸ ਥਾਂ ਲਈ ਸਰਵਰ ACL ਸੈੱਟ ਕੀਤੇ।
+ ਤੁਸੀਂ ਇੱਥੇ ਅੱਪਗ੍ਰੇਡ ਹੋਏ।
+ %s ਨੇ ਇੱਥੇ ਅੱਪਗ੍ਰੇਡ ਕੀਤਾ।
+ ਤੁਸੀਂ ਇਸ ਥਾਂ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਕੀਤਾ।
+ %s ਨੇ ਇਸ ਥਾਂ ਨੂੰ ਅੱਪਗ੍ਰੇਡ ਕੀਤਾ।
+ ਤੁਸੀਂ ਅੰਤ-ਤੋਂ-ਅੰਤ ਇਨਕ੍ਰਿਪਸ਼ਨ ਚਾਲੂ ਕੀਤੀ(%1$s)
+ %1$s ਨੇ ਅੰਤ-ਤੋਂ-ਅੰਤ ਇਨਕ੍ਰਿਪਸ਼ਨ ਚਾਲੂ ਕੀਤੀ(%2$s)
+ ਅਗਿਆਤ (%s)।
+ ਕੋਈ ਵੀ।
+ ਥਾਂ ਦੇ ਸਾਰੇ ਜੀ।
+ ਥਾਂ ਦੇ ਸਾਰੇ ਜੀ, ਜਦੋਂ ਤੋਂ ਉਹ ਜੁੜੇ ਹਨ।
+ ਥਾਂ ਦੇ ਸਾਰੇ ਜੀ, ਜਦੋਂ ਤੋਂ ਉਹਨਾਂ ਨੂੰ ਸੱਦਾ ਦਿੱਤਾ ਹੈ।
+ %s ਨੇ ਕਾਲ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਡਾਟਾ ਘੱਲਿਆ।
+ ਤੁਸੀਂ ਭਵਿੱਖ ਦੇ ਸੁਨੇਹੇ %1$s ਨੂੰ ਉਪਲੱਬਧ ਕਰਵਾਏ
+ %1$s ਨੇ ਭਵਿੱਖ ਦੇ ਸੁਨੇਹੇ %2$s ਨੂੰ ਉਪਲੱਬਧ ਕਰਵਾਏ
+ ਤੁਸੀਂ %1$s ਨੂੰ ਭਵਿੱਖ ਵਿੱਚ ਥਾਂ ਦਾ ਇਤਿਹਾਸ ਉਪਲੱਬਧ ਕਰਵਾਇਆ
+ %1$s ਨੇ ਭਵਿੱਖ ਵਿੱਚ ਥਾਂ ਦਾ ਇਤਿਹਾਸ %2$s ਨੂੰ ਉਪਲੱਬਧ ਕਰਵਾਇਆ
+ ਤੁਸੀਂ ਕਾਲ ਮੁਕਾਈ।
+ %s ਨੇ ਕਾਲ ਮੁਕਾਈ।
+ ਤੁਸੀਂ ਕਾਲ ਦਾ ਜਵਾਬ ਦਿੱਤਾ।
+ %s ਨੇ ਕਾਲ ਦਾ ਜਵਾਬ ਦਿੱਤਾ।
+ ਤੁਸੀਂ ਕਾਲ ਚਾਲੂ ਕਰਨ ਲਈ ਡਾਟਾ ਘੱਲਿਆ।
+ ਤੁਸੀਂ ਇੱਕ ਅਵਾਜ਼ ਵਾਲੀ ਕਾਲ ਸ਼ੁਰੂ ਕੀਤੀ।
+ %s ਨੇ ਅਵਾਜ਼ ਵਾਲੀ ਕਾਲ ਸ਼ੁਰੂ ਕੀਤੀ।
+ ਤੁਸੀਂ ਇੱਕ ਵੀਡੀਓ ਕਾਲ ਸ਼ੁਰੂ ਕੀਤੀ।
+ %s ਨੇ ਵੀਡੀਓ ਕਾਲ ਚਾਲੂ ਕੀਤੀ।
+ ਤੁਸੀਂ ਥਾਂ ਦਾ ਨਾਮ ਇਸ ਵਿੱਚ ਬਦਲਿਆ: %1$s
+ %1$s ਨੇ ਥਾਂ ਦਾ ਨਾਮ ਇਸ ਵਿੱਚ ਬਦਲਿਆ: %2$s
+ ਤੁਸੀਂ ਥਾਂ ਦਾ ਅਵਤਾਰ ਬਦਲਿਆ
+ %1$s ਨੇ ਥਾਂ ਦਾ ਅਵਤਾਰ ਬਦਲਿਆ
+ ਤੁਸੀਂ ਵਿਸ਼ੇ ਨੂੰ ਇਸ ਵਿੱਚ ਬਦਲਿਆ: %1$s
+ %1$s ਨੇ ਵਿਸ਼ੇ ਨੂੰ ਇਸ ਵਿੱਚ ਬਦਲਿਆ: %2$s
+ ਤੁਸੀਂ ਆਪਣਾ ਦਿਸਣ ਵਾਲਾ ਨਾਮ ਹਟਾਇਆ (ਇਹ %1$s ਸੀ)
+ %1$s ਨੇ ਆਪਣਾ ਦਿਸਣ ਵਾਲਾ ਨਾਮ ਹਟਾਇਆ (ਇਹ %2$s ਸੀ)
+ ਤੁਸੀਂ ਆਪਣਾ ਦਿਸਣ ਵਾਲਾ ਨਾਮ %1$s ਤੋਂ %2$s ਵਿੱਚ ਬਦਲਿਆ
+ %1$s ਨੇ ਆਪਣਾ ਦਿਸਣ ਵਾਲਾ ਨਾਮ %2$s ਤੋਂ %3$s ਵਿੱਚ ਬਦਲਿਆ
+ ਤੁਸੀਂ ਆਪਣਾ ਦਿਸਣ ਵਾਲਾ ਨਾਮ %1$s ਵਿੱਚ ਬਦਲਿਆ
+ %1$s ਨੇ ਆਪਣਾ ਦਿਸਣ ਵਾਲਾ ਨਾਮ %2$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 ਨੇ ਥਾਂ ਛੱਡ ਦਿੱਤੀ ਹੈ
+ ਤੁਸੀਂ ਥਾਂ ਛੱਡ ਦਿੱਤੀ ਹੈ
+ %1$s ਨੇ ਥਾਂ ਛੱਡ ਦਿੱਤੀ ਹੈ
+ ਤੁਸੀਂ ਜੁੜੇ ਹੋ
+ %1$s ਜੁੜੇ ਹਨ
+ ਤੁਸੀਂ ਥਾਂ ਵਿੱਚ ਜੁੜੇ ਹੋ
+ %1$s ਥਾਂ ਵਿੱਚ ਜੁੜੇ ਹਨ
+ %1$s ਨੇ ਤਹਾਨੂੰ ਸੱਦਾ ਘੱਲਿਆ ਹੈ
+ ਤੁਸੀਂ %1$s ਨੂੰ ਸੱਦਾ ਘੱਲਿਆ ਹੈ
+ %1$s ਨੇ %2$s ਨੂੰ ਸੱਦਾ ਘੱਲਿਆ ਹੈ
+ ਤੁਸੀਂ ਚਰਚਾ ਚਾਲੂ ਕੀਤੀ ਹੈ
+ %1$s ਨੇ ਚਰਚਾ ਚਾਲੂ ਕੀਤੀ ਹੈ
+ ਤੁਸੀਂ ਇੱਕ ਥਾਂ ਬਣਾਈ ਹੈ
+ %1$s ਨੇ ਇੱਕ ਥਾਂ ਬਣਾਈ ਹੈ
+ ਤੁਹਾਡਾ ਸੱਦਾ
+ %s ਵੱਲੋਂ ਸੱਦਾ
+ ਤੁਸੀਂ ਇੱਕ ਸਟੀਕਰ ਘੱਲਿਆ ਹੈ।
+ %1$s ਨੇ ਇੱਕ ਸਟੀਕਰ ਘੱਲਿਆ ਹੈ।
+ ਤੁਸੀਂ ਇੱਕ ਤਸਵੀਰ ਘੱਲੀ ਹੈ।
+ %1$s ਨੇ ਇੱਕ ਤਸਵੀਰ ਘੱਲੀ ਹੈ।
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-pa/strings_no_weblate.xml b/vector/src/main/res/values-pa/strings_no_weblate.xml
new file mode 100644
index 00000000000..deb30879ddf
--- /dev/null
+++ b/vector/src/main/res/values-pa/strings_no_weblate.xml
@@ -0,0 +1,8 @@
+
+
+
+ pa
+ PK
+ Zyyy
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index d1ccbc8cc2a..95785275499 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -56,7 +56,7 @@
%1$s zaktualizował swój profil %2$s%1$s wysłał(a) zaproszenie do %2$s aby dołączył(a) do tego pokoju%1$s zaakceptował(a) zaproszenie dla %2$s
- Urządzenie nadawcy nie wysłało nam kluczy do tej wiadomości.
+ Urządzenie nadawcy nie wysłało nam kluczy do tej wiadomości.Nie można zredagowaćObecnie nie jest możliwe ponowne dołączenie do pustego pokoju.Wiadomość usunięta
@@ -89,21 +89,21 @@
Informacje o użytkownikuArchiwumOK
- Anuluj
- Zapisz
- Opuść
- Wyślij
- Wyślij ponownie
- Usuń
- Cytuj
- Udostępnij
+ Anuluj
+ Zapisz
+ Opuść
+ Wyślij
+ Wyślij ponownie
+ Usuń
+ Cytuj
+ UdostępnijPóźniej
- Przekaż
+ PrzekażOdnośnik bezpośredniWyświetl źródłoWyświetl odszyfrowane źródło
- Usuń
- Zmień nazwę
+ Usuń
+ Zmień nazwęZgłoś treśćAktywne połączeniePrzychodzące połączenie grupowe.
@@ -118,7 +118,7 @@
Połączenia grupowe nie są obsługiwane w szyfrowanych pokojachWyślij mimo toi
- Zaproś
+ ZaprośOfflineWyloguj sięPołączenie głosowe
@@ -130,7 +130,7 @@
OtwórzZamknijSkopiowano do schowka
- Wyłącz
+ WyłączPotwierdzenieOstrzeżenieHome
@@ -275,10 +275,10 @@
TAKNIEKontynuuj
- Usuń
- Dołącz
- Podgląd
- Odrzuć
+ Usuń
+ Dołącz
+ Podgląd
+ OdrzućPrzejdź do pierwszej nieprzeczytanej wiadomościZostałeś(-aś) zaproszony(-a) do tego pokoju przez %sPróbujesz uzyskać dostęp do %s. Czy chcesz dołączyć do pokoju, aby wziąć udział w dyskusji?
@@ -357,17 +357,6 @@
WIADOMOŚCILUDZIEPLIKI
- DOŁĄCZ
- KATALOG
- ULUBIONE
- POKÓJ
- NISKI PRIORYTET
- ZAPROSZENIA
- Rozpocznij rozmowę
- Utwórz pokój
- Dołącz do pokoju
- Dołącz do pokoju
- Wprowadź ID lub nazwę pokojuPrzeglądaj katalogPrzeszukiwanie katalogu…Dodaj do ulubionych
@@ -538,9 +527,7 @@
LudziePrzykładprzykład
-
Wiadomość zaszyfrowana
-
UtwórzWyłączoneUwaga!
@@ -698,8 +685,8 @@
Eksportuj klucze do pliku lokalnegoDołącz ponownieZapomnij pokój
- Pobierz
- Wyczyść
+ Pobierz
+ WyczyśćWyślij naklejkęPoproś ponownie o klucze szyfrujące z innych Twoich sesji.Prośba o klucz wysłana.
@@ -766,7 +753,7 @@
Pokój %s nie jest widoczny.Użyj natywnej kamery
- Mów
+ MówWyślij głosNie masz obecnie aktywnych żadnych pakietów naklejek.
\n
@@ -959,7 +946,7 @@
Kliknij na potwierdzenie odbioru, aby wyświetlić szczegółową listę.Komenda „%s” potrzebuje więcej parametrów lub niektóre parametry są niepoprawne.Pokaż obszar informacyjny
- Akceptuj
+ AkceptujPrzeczytaj i zaakceptuj zasady tego serwera domowego:Ta opcja wymaga aplikacji osoby trzeciej do nagrywania wiadomości.Uruchom Testy
@@ -998,19 +985,19 @@
Połączenie wideo trwa…Kopia Zapasowa KluczaKopia zapasowa kluczy nie jest zakończona, proszę czekać…
- Pomiń
+ PomińZaawansowane ustawienia powiadomieńSprawdź ustawieniaAlgorytmStracisz zaszyfrowane wiadomości, jeśli się teraz wylogujeszJesteś pewien?
- Przerwij
+ PrzerwijCzy na pewno chcesz się wylogować?Trwa tworzenie kopii zapasowej klucza. Jeśli wylogujesz się teraz utracisz dostęp do zaszyfrowanych wiadomości.Nie chcę moich zaszyfrowanych wiadomościUtracisz dostęp do zaszyfrowanych wiadomości, chyba że wykonasz kopię zapasową kluczy przed wylogowaniem się.
- Zostań
- Ignoruj
+ Zostań
+ IgnorujDomyślna kompresjaKonfiguruj głośne powiadomieniaKonfiguruj ciche powiadomienia
@@ -1094,8 +1081,8 @@
\nJeżeli nie ustawiałeś nowej metody odzyskiwania, atakujący mogą uzyskać dostęp do Twojego konta. Zmień hasło konta i ustaw nową metodę odzyskiwania jak najszybciej w Ustawieniach.Jesteś na bieżąco!Ten adres URL jest nieosiągalny, proszę sprawdź jego poprawność
- Unieważnij
- Rozłącz
+ Unieważnij
+ RozłączNie pytaj ponownieTo nie jest prawidłowy adres serwera MatrixPotwierdź swoje hasło
@@ -1791,17 +1778,6 @@
NieNarzędzia programistyczneDane konta
-
- %d głos
- %d głosów
-
-
-
- %d głos - wyniki końcowe
- %d głosów - wyniki końcowe
-
-
- Wybrana OpcjaTworzy prostą ankietęUżyj hasła odzyskiwania lub kluczaUżyj klucza odzyskiwania lub hasła
@@ -1824,8 +1800,8 @@
Wydarzenie usunięte przez użytkownika, przyczyna: %1$sWydarzenie moderowane przez administratora pokoju, przyczyna: %1$sKlucze są już aktualne!
- Sprawdź
- Zrezygnuj
+ Sprawdź
+ ZrezygnujNiezgodność kluczaNiezgodność użytkownikówNie korzystasz z serwera tożsamości
@@ -1836,8 +1812,8 @@
Nie masz więcej nieprzeczytanych wiadomościWitaj w domu!Reakcje
- Zgoda
- Lubię to
+ Zgoda
+ Lubię toZobacz ReakcjeZdarzenie usunięte przez użytkownikaZdarzenie moderowane przez administratora pokoju
@@ -1868,9 +1844,9 @@
OdświeżUżyj tej sesji do weryfikacji nowej, nadając jej dostęp do zaszyfrowanych wiadomości.To nie ja
- Zamknij
- Wstrzymaj
- Odtwórz
+ Zamknij
+ Wstrzymaj
+ OdtwórzNie posiadasz wymaganych uprawnień do rozpoczęcia połączenia w tym pokojuOdbierzUsuwanie widżetu nie powiodło się
@@ -1968,7 +1944,7 @@
Nie udało się zaimportować kluczyOczekiwanie na %s…Prawie gotowe! Oczekiwanie na potwierdzenie…
- Prawie gotowe! Czy drugie urządzenie pokazuje taką samą tarczę\?
+ Prawie gotowe! Czy drugie urządzenie pokazuje tarczę\?"Temat: "Dodaj temat%s aby poinformować innych czego dotyczy konwersacja w tym pokoju.
@@ -2061,9 +2037,9 @@
DodajKopiujZakończ rozmowę
- Zresetuj
+ ZresetujTryb samolotowy jest włączony
- Prawie gotowe! Czy %s pokazuje taką samą tarczę\?
+ Prawie gotowe! Czy %s pokazuje tarczę\?Twój administrator serwera zablokował domyślne szyfrowanie punkt-punkt (e2e) w pokojach prywatnych w Wiadomościach Bezpośrednich.Nie masz uprawnień żeby uaktywnić szyfrowanie w tym pokoju.Wiadomość bezpośrednia
@@ -2077,7 +2053,6 @@
Wiadomości tutaj nie są zaszyfrowane w trybie punkt-punkt (e2e).Weryfikacja wnioskówZareagowano: %s
- Przyciski botówTworzenie pokoju…Niektóre znaki nie są dozwolonePodaj adres pokoju
@@ -2480,8 +2455,8 @@
Usunąłeś(aś) alternatywny adres %1$s dla tego pokoju.Usunąłeś(aś) alternatywne adresy %1$s dla tego pokoju.
-
-
+ Usunąłeś(aś) alternatywne adresy %1$s dla tego pokoju.
+ Usunąłeś(aś) alternatywne adresy %1$s dla tego pokoju.%1$s ustawił(a) główny adres tego pokoju na %2$s.
@@ -2691,8 +2666,6 @@
Zarządzaj pokojamiSzukasz kogoś , kto nie jest w %s\?%s Cię zaprasza
- Ostrzeżenie! Wymaga wsparcia serwera oraz eksperymentalnej wersji pokoju
- Przestrzeń eksperymentalna - Pokój ograniczony.Zostałeś zaproszonyPrzestrzenie są nową metodą na zarządzanie pokojami i osobami.Witamy w Przestrzeniach!
@@ -2730,8 +2703,8 @@
Będą w stanie przeglądać %sZaproś do %sUdostępnij link
- Zaproś przez nazwę użytkownika lub email
- Zaproś przez nazwę użytkownika
+ Zaproś przez nazwę użytkownika lub email
+ Zaproś przez nazwę użytkownikaZaproś przez emailAktualnie jesteś tylko Ty. %s będzie jeszcze lepsza kiedy dołączą inni.Zaproś do %s
@@ -2871,7 +2844,7 @@
OpinieSynchronizacja klucza samopodpisującego (Self Signing key)Weryfikacja ręczna poprzez tekst
- lub innego klienta Matrix z krzyżową weryfikacją nowych sesji logowania
+ lub innego klienta Matrix z krzyżową weryfikacją nowych sesji logowaniaNie masz uprawnień do zmiany poziomu pokojuOczekiwanie na historię szyfrowaniaTen pokój pracuje na wersji pokoju %s, którą serwer domowy oznaczył jako niestabilną.
@@ -3056,4 +3029,39 @@
Powiąż ten email ze swoim kontemStwórzmy pokój dla każdego z nich. Możesz potem dodać kolejne, także te już istniejące.Nad czym pracujesz\?
+ Czy na pewno chcesz usunąć ankietę\? Nie będziesz w stanie jej odzyskać po usunięciu.
+
+ Aktywne połączenie ·
+ %1$d aktywnych połączeń ·
+ %1$d aktywnych połączeń ·
+ %1$d aktywnych połączeń ·
+
+
+ Nieaktywne połączenie
+ %1$d nieaktywnych połączeń
+ %1$d nieaktywnych połączeń
+ %1$d nieaktywnych połączeń
+
+ Zgadzasz się na wysłanie tych informacji\?
+ Ustawienia systemu
+ Wersje
+ Pomoc i wsparcie
+ Pomoc
+ Biblioteki zewnętrzne
+ Możesz to wyłączyć kiedy zechcesz w ustawieniach
+ Nie udostępniamy informacji podmiotom trzecim
+ Nie zbieramy i nie profilujemy danych użytkownika
+ tutaj
+ Pomóż nam znaleźć błędy i ulepszyć Element poprzez udostępnianie anonimowych danych użytkowania. Aby lepiej zrozumieć jak użytkownicy wykorzystują wiele urządzeń wygenerujemy losowy identyfikator dzielony pomiędzy Twoimi urządzeniami.
+\n
+\nWięcej informacji %s.
+ Pomóż usprawnić Element
+ Nie teraz
+ Włącz
+
+ Usunąłeś(aś) %1$s jako adres tego pokoju.
+ Usunąłeś(aś) %1$s jako adresy tego pokoju.
+ Usunąłeś(aś) %1$s jako adresy tego pokoju.
+ Usunąłeś(aś) %1$s jako adresy tego pokoju.
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
index de861e0e2f4..6c10294c024 100644
--- a/vector/src/main/res/values-pt-rBR/strings.xml
+++ b/vector/src/main/res/values-pt-rBR/strings.xml
@@ -39,24 +39,16 @@
%1$s enviou um convite para %2$s para se juntar à sala%1$s aceitou o convite para %2$s** Incapaz de decriptar: %s **
- O dispositivo do/da enviador(a) não nos enviou as chaves para esta mensagem.
-
+ O dispositivo do/da enviador(a) não nos enviou as chaves para esta mensagem.Não foi possível redigirNão foi possível enviar mensagemFalha para fazer upload de imagem
-
Erro de redeErro de Matrix
-
-
-
-
Não é atualmente possível se re-juntar a uma sala vazia.
-
Endereço de emailNúmero de telefone%1$s enviou um sticker.
-
Convite de %sConvite de Sala%1$s e %2$s
@@ -271,7 +263,6 @@
Conferência de vídeo terminada por %1$sVocê começou conferência de vídeoConferência de vídeo começada por %1$s
-
MensagensSalaConfigurações
@@ -280,23 +271,22 @@
AceitarDeclinarDesligar
-
OK
- Cancelar
- Salvar
- Sair
- Enviar
- Reenviar
- Remover
- Citar
- Compartilhar
+ Cancelar
+ Salvar
+ Sair
+ Enviar
+ Reenviar
+ Remover
+ Citar
+ CompartilharMais Tarde
- Encaminhar
+ EncaminharPermalinkVisualizar FonteVisualizar Fonte Decriptada
- Deletar
- Renomear
+ Deletar
+ RenomearReportar ConteúdoChamada ativaChamada de conferência em curso.
@@ -311,43 +301,36 @@
Chamadas de conferência não são suportadas em salas encriptadasEnviar Mesmo Assimou
- Convidar
-
+ ConvidarFazer signoutChamar por VozChamar por VídeoPesquisa globalMarcar tudo como lidoHistórico
- Responder rápido
+ Resposta rápidaAbrirFecharCopiado para clipboard
- Desabilitar
-
+ DesabilitarConfirmaçãoAviso
-
HomeFavoritosPessoasSalas
-
Filtrar nomes de salasFiltrar favoritosFiltrar pessoasFiltrar nomes de salas
-
ConvitesBaixa prioridade
-
ConversasAgenda de endereços localContatos de Matrix somenteNenhuma conversaVocê não permitiu que ${app_name} acesse seus contatos locaisNenhum resultado
-
SalasDiretório de salasNenhuma sala
@@ -383,7 +366,6 @@
Começar Chamada de VídeoEnviar arquivosTirar foto ou vídeo
-
Fazer loginCriar ContaSubmeter
@@ -431,7 +413,6 @@
Sua senha tem sido resettada.
\n
\nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para re-habilitar notificações, re-faça login em cada dispositivo.
-
URL deve começar com http[s]://Incapaz de fazer login: Erro de redeIncapaz de fazer login
@@ -446,28 +427,20 @@
Requisições demais tem sido enviadasEste nome de usuária(o) já é usadoO link de email que não tem sido clicado ainda
-
-
Lista de Recibos de Leitura
-
-
Enviar como OriginalGrandeMédioPequeno
-
Cancelar o download?Cancelar o upload\?%d s%1$dm %2$ds
-
OntemHoje
-
Nome de salaTópico de sala
-
Chamada conectadaChamada conectando…Chamada terminada
@@ -480,10 +453,8 @@
Conexão de Mídia FalhouNão é possível inicializar a câmerachamada atendida em algum outro lugar
-
Tirar uma foto ou um vídeoNão é possível gravar vídeo
-
Informação${app_name} precisa de permissão para acessar sua biblioteca de fotos e vídeos para enviar e salvar anexos.
\n
@@ -504,31 +475,25 @@
\n
\nVocê concorda em compartilhar seu livro de endereços para este propósito\?Desculpe. Ação não performada, devido a permissões faltando
-
SalvoSalvar em downloads\?SIMNÃOContinuar
-
- Remover
- Juntar-se
- Previsualizar
- Rejeitar
-
+ Remover
+ Juntar-se
+ Previsualizar
+ RejeitarPular para não-lida(s)
-
Você tem sido convidada(o) para se juntar a esta sala por %sEste convite foi enviado para %s, que não está associada(o) com esta conta.
\nVocê pode desejar fazer login com uma conta diferente, ou adicionar este email a sua conta.Você está tentando acessar %s. Você gostaria de se juntar a fim de participar na discussão\?uma salaEsta é uma previsualização desta sala. Interações de sala têm sido desabilitadas.
-
Novo ChatAdicionar membro1 membro
-
Sair de salaVocê tem certeza que você quer sair da sala\?Você tem certeza que você quer remover %s deste chat\?
@@ -556,14 +521,12 @@
Você não vai ser capaz de desfazer esta mudança já que você está promovendo a(o) usuária(o) para ter o mesmo nível de poder que você.
\nVocê tem certeza\?Você tem certeza você que quer convidar %s para este chat\?
-
Convidar por IDCONTATOS LOCAIS (%d)Usuárias(os) Matrix somenteConvidar usuária(o) por IDPor favor entre um ou mais endereços de email ou ID MatrixEmail ou ID Matrix
-
Pesquisar%s está digitando…%1$s & %2$s estão digitando…
@@ -579,7 +542,6 @@
Deletar mensagens não-enviadasArquivo não encontradoVocê não tem permissão para postar nesta sala.
-
ConfiarNão confiarFazer logout
@@ -591,7 +553,6 @@
O certificado tem mudado de um que era confiado por seu telefone. Isto é ALTAMENTE INCOMUM. É recomendado que você NÃO ACEITE este novo certificado.O certificado tem mudado de um previamente confiado para um que não é confiado. O servidor pode ter renovado seu certificado. Contacte o/a administrador(a) de servidor para a impressão digital esperada.Somente aceite o certificado se o/a administrador(a) de servidor tem publicado uma impressão digital que corresponde com a acima.
-
Detalhes de SalaPessoasArquivos
@@ -599,14 +560,12 @@
ID malformada. Devia ser um endereço de email ou uma ID Matrix como \'@partlocal:dominio\'CONVIDADAS(OS)SE JUNTARAM
-
Razão por reportar este conteúdoVocê quer esconder todas as mensagens desta(e) usuária(o)\?
\n
\nNote que esta ação vai recomeçar o app e pode levar algum tempo.Cancelar UploadCancelar Download
-
PesquisarFiltrar membros de salaNenhum resultado
@@ -614,28 +573,13 @@
MENSAGENSPESSOASARQUIVOS
-
- JUNTAR-SE
- DIRETÓRIO
- FAVORITOS
- SALAS
- BAIXA PRIORIDADE
- CONVITES
- Começar chat
- Criar sala
- Juntar-se a sala
- Juntar-se a uma sala
- Digite uma id de sala ou um alias de sala
-
Navegar diretórioPesquisando diretório…
-
FavoritarDes-prioritizarChat DiretoSair de ConversaEsquecer
-
MensagensConfiguraçõesVersão
@@ -643,7 +587,6 @@
Notas de terceirosCopyrightPolítica de privacidade
-
Imagem de PerfilNome de ExibiçãoEmail
@@ -665,13 +608,12 @@
Timeout de requisição de sincDelay entre casa SincVersão
- versão de olm
+ Versão de olmTermos & condiçõesNotas de terceirosCopyrightPolítica de privacidadeLimpar cache
-
Configurações de usuária(o)NotificaçõesUsuárias(os) ignoradas(os)
@@ -727,37 +669,29 @@
Entre um código de ativaçãoErro enquanto validando seu número de telefoneCódigo
-
-
Foto da SalaNome de SalaTópicoEtiqueta da SalaEtiquetada como:
-
FavoritarBaixa prioridadeNenhuma
-
Acesso e visibilidadeListar esta sala em diretório de salasAcesso a SalaLegibilidade de Histórico de SalaQuem pode ler o histórico\?Quem pode acessar esta sala?
-
Qualquer pessoaMembros somente (desde o ponto no tempo de seleção desta opção)Membros somente (desde que eles foram convidados)Membros somente (desde que eles se juntaram)
-
Para linkar a uma sala ela deve ter um endereço.Somente pessoas que têm sido convidadasQualquer pessoa que sabe o link da sala, a parte de visitantesQualquer pessoa que sabe o link da sala, incluindo visitantes
-
Usuárias(os) banidas(os)
-
AvançadasID interno desta salaEndereços
@@ -768,7 +702,6 @@
Você precisa fazer logout para ser capaz de habilitar a encriptação.Encriptar para sessões verificadas somenteNunca enviar mensagens encriptadas para sessões não-confirmadas nesta sala desta sessão.
-
Esta sala não tem nenhum endereço localNovo endereço (e.g. #foo:matrix.org)Formato de alias inválido
@@ -783,11 +716,8 @@
Encriptação está desabilitada nesta sala.Habilitar encriptação
\n(aviso: não pode ser desabilitada de novo!)
-
Diretório
-
%s estava tentando carregar um ponto específico na timeline desta sala mas foi incapaz de encontrá-lo.
-
Informação de encriptação ponta-a-pontaInformação de eventoId de usuária(o)
@@ -831,21 +761,18 @@
Confirme ao comparar o seguinte com as Configurações de Usuária(o) em sua outra sessão:Se não corresponderem, a segurança de sua comunicação pode estar comprometida.Eu verifico que as chaves correspondem
-
Sala contém sessões desconhecidasEsta sala contém sessões desconhecidas que não têm sido verificadas.
\nIsto significa que não há nenhuma garantia que as sessões pertencem às/aos usuárias(os) às/aos quais elas clamam pertencer.
\nNós recomendamos que você passe pelo processo de verificação para cada sessão antes de continuar, mas você pode reenviar a mensagem sem verificar se você preferir.
\n
\nSessões desconhecidas:
-
Selecionar um diretório de salasO servidor pode estar indisponível ou sobrecarregadoDigite um servidorcasa para de onde listar salas públicasNome de servidorTodas as salas em servidor %sTodas as salas nativas de %s
-
Pesquisar por históricoOfflineDiretório de usuárias(os)
@@ -917,7 +844,6 @@
Criação de widget tem falhadoCriar chamadas de conferência com jitsiVocê tem certeza que você quer deletar o widget desta sala\?
-
Incapaz de criar widget.Falha para enviar requisição.Nível de poder deve ser um inteiro positivo.
@@ -928,30 +854,24 @@
Sala %s não está visível.Adicionar apps MatrixUsar câmera nativa
-
Você adicionou uma nova sessão \'%s\', que está requisitando chaves de encriptação.Sua sessão não-verificada \'%s\' está requisitando chaves de encriptação.Começar verificaçãoCompartilhar sem verificarIgnorar requisição
-
Aviso!Chamamento de conferência está em desenvolvimento e pode não ser estável.
-
Erro de comandoComando irreconhecido: %s
-
DesativadaBarulhentaMensagem encriptada
-
CriarCriar ComunidadeNome da comunidadeExemploID de comunidadeexemplo
-
HomePessoasSalas
@@ -1012,7 +932,6 @@
%d widget ativo%d widgets ativos
-
Avatar de reciboAvatar de notaAvatar
@@ -1022,9 +941,9 @@
O app precisa de permissão para rodar no backgroundEnviar um stickerLicenças de terceiros
- Fazer Download
- Falar
- Limpar
+ Fazer Download
+ Falar
+ LimparDevido a permissões faltando, esta ação não é possível.Alertas de SistemaSe possível, por favor escreva a descrição em Inglês.
@@ -1136,7 +1055,7 @@
Por favor %s para ter este limite aumentado.Por favor %s para continuar usando este serviço.Por favor crie uma frasepasse para encriptar as chaves exportadas. Você vai precisar entrar a mesma frasepasse para ser capaz de importar as chaves.
- Aceitar
+ AceitarErroPor favor revise e aceite as políticas deste servidorcasa:Chamadas
@@ -1261,10 +1180,10 @@
Fazer backupVocê vai perder acesso a suas mensagens encriptadas a menos que faça backup de suas chaves antes de fazer signout.Assinatura
- Ficar
- Pular
+ Ficar
+ PularFeito
- Abortar
+ AbortarVocê tem certeza que você quer fazer sign out\?Configurações de Notificações AvançadasImportância de notificação por evento
@@ -1275,7 +1194,7 @@
Checar Configurações[%1$s]
\nEste erro está fora de controle de ${app_name} e de acordo com Google, este erro indica que o dispositivo tem apps demais registrados com FCM. O erro somente ocorre em casos onde há números extremos de apps, então isso não devia afetar a/o usuária(o) média(o).
- Ignorar
+ IgnorarFazer sign-in com sign-on únicoEste URL não é alcançável, por favor cheque-oSeu dispositivo está usando um protocolo de segurança TLS desatualizado, vulnerável a ataque, para sua segurança você não vai ser capaz de se conectar
@@ -1293,16 +1212,16 @@
Enviar mensagem com enterVerificar sessãoNenhum
- Revogar
- Desconectar
- Revisar
- Declinar
+ Revogar
+ Desconectar
+ Revisar
+ DeclinarMarcar como lidaNenhum servidor de identidade configurado.Chamada falhou devido a servidor malconfigurado
- Tocar
- Pausar
- Descartar
+ Tocar
+ Pausar
+ DescartarCopiarSucessoNotificações
@@ -1645,8 +1564,8 @@
SalasSuas salas vão ser exibidas aqui. Toque no + à direita fundo para encontrar umas existentes ou começar algumas propriamente suas.Reações
- Concordo
- Curtir
+ Concordo
+ CurtirAdicionar ReaçãoVisualizar ReaçõesReações
@@ -2129,15 +2048,6 @@
Modo avião está ligadoFerramentas DevDados de Conta
-
- %d voto
- %d votos
-
-
- %d voto - Resultados finais
- %d votos - Resultados finais
-
- Opção SelecionadaCria uma sondagem simplesUse uma Chave ou a Frasepasse de RecuperaçãoSe você não pode acessar uma sessão existente
@@ -2273,7 +2183,7 @@
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- ou um outro cliente Matrix capaz de assinatura cruzada
+ ou um outro cliente Matrix capaz de assinatura cruzadaUse o ${app_name} mais recente em seus outros dispositivos:Força a atual sessão de grupo de saída em uma sala encriptada a ser descartadaSomente suportado em salas encriptadas
@@ -2443,7 +2353,6 @@
Este número de telefone já está definido.Mostrar eventos de estado de membros de salaSondagem
- Botões de BotReagiu com: %sConclusão de VerificaçãoDeletar os dados de conta de tipo %1$s\?
@@ -2492,7 +2401,7 @@
Pesquisar em salas encriptadas não é suportado ainda.Você não tem permissão para começar uma chamadaVocê não tem permissão para começar uma chamada de conferência
- Resettar
+ Resettar%1$s fez isto somente convite.Você fez isto somente convite.%s juntou-se.
@@ -2787,12 +2696,11 @@
Elas não vão fazer parte de %sSó a esta salaCompartilhar link
- Convidar por nome de usuária(o)
+ Convidar por nome de usuária(o)Convidar por emailConvidar pessoasBoas-vindas a %1$s, %2$s.Você está convidada(o)
- Aviso requer suporte de servidor e versão de sala experimental%s convida vocêSala Não-NomeadaAlgumas salas podem estar escondidas porque elas são privadas e você precisa de um convite.
@@ -2807,7 +2715,6 @@
Fazer este espaço públicoGerenciar salasProcurando por alguém que não está em %s\?
- Espaço Experimental - Sala Restringida.Espaços são uma nova forma de agrupar salas e pessoas.Boas-vindas a Espaços!Adicionar salas
@@ -3029,7 +2936,7 @@
Convidar por email, encontrar contatos e mais…Termine de configurar descoberta.Você não está atualmente usando um servidor de identidade. A fim de convidar colegas e ser descobertável por elas(es), configure um abaixo.
- Convidar por nome de usuária(o) ou mail
+ Convidar por nome de usuária(o) ou mailAssegure que as pessoas certas têm acesso a companhia %s. Você pode convidar outras mais tarde.Quem são suas/seus colegas\?Adicionar ao dado Espaço
@@ -3102,4 +3009,53 @@
Você concorda em enviar esta info\?Para descobrir contatos existentes, você precisa enviar info de contato (emails e números de telefone) para seu servidor de identidade. Nós hashamos seus dados antes de enviar por privacidade.Não agora
+ Você tem certeza que você quer remover esta sondagem\? Você não vai ser capaz de recuperá-la uma vez removida.
+ Remover sondagem
+ Sondagem terminada
+ Voto lançado
+ Habilitar Sondagens
+ Terminar sondagem
+ Isto vai parar pessoas de serem capazes de votar e vai exibir os resultados finais da sondagem.
+ Terminar esta sondagem\?
+ opção vencedora
+ Terminar sondagem
+
+ Resultado final baseado em %1$d voto
+ Resultado final baseado em %1$d votos
+
+
+ %1$d voto lançado. Vote para ver os resultados
+ %1$d votos lançados. Vote para ver os resultados
+
+
+ Baseado em %1$d voto
+ Baseado em %1$d votos
+
+
+ %1$d voto
+ %1$d votos
+
+ Versões
+ Conseguir ajuda com uso de Element
+ Jurídicos
+ Este servidor não provê nenhuma política.
+ Bibliotecas de terceiros
+ A política de seu servidor de identidade
+ A política de seu servidorcasa
+ Política de ${app_name}
+ Nós não gravamos ou perfilamos quaisquer dados de conta
+ Ajude-nos a identificar problemas e melhorar Element ao compartilhar dados de uso anônimos. Para entender como pessoas usam seus múltiplos dispositivos, nós vamos gerar um identificador aleatório, compartilhado por seus dispositivos.
+\n
+\nVocê pode ler todos os nossos termos %s.
+ Ajudar a melhorar Element
+ Configurações de sistema
+ Ajuda e suporte
+ Ajuda
+ Você pode desativar isto a qualquer hora em configurações
+ Nós não compartilhamos informação com terceiros
+ aqui
+ Habilitar
+ Recomece o aplicativo para a mudançar tomar efeito.
+ Habilitar matemática LaTeX
+ Você não é permitida(o) a juntar-se a esta sala
\ No newline at end of file
diff --git a/vector/src/main/res/values-pt/strings.xml b/vector/src/main/res/values-pt/strings.xml
index b4aa314cba0..76d5aa1ebed 100644
--- a/vector/src/main/res/values-pt/strings.xml
+++ b/vector/src/main/res/values-pt/strings.xml
@@ -39,23 +39,15 @@
%1$s enviou um convite para que %2$s se junte à sala%1$s aceitou o convite para %2$s** Impossível decifrar: %s **
- O dispositivo de quem enviou a mensagem não nos enviou as chaves para esta mensagem.
-
+ O dispositivo de quem enviou a mensagem não nos enviou as chaves para esta mensagem.Não foi possível apagarNão foi possível enviar a mensagemO envio da imagem falhou
-
Erro de conexão à InternetErro do Matrix
-
-
-
-
Ainda não é possível voltar a entrar numa sala vazia.
-
Endereço de e-mailNúmero de telefone
-
Convite de %sConvite para sala%1$s e %2$s
@@ -64,29 +56,27 @@
%s fez o upgrade da sala.Mensagem removidaMensagem removida por %1$s
-
MensagensSalaDefiniçõesDetalhes dos MembrosHistórico
-
OK
- Cancelar
- Guardar
- Sair
- Enviar
- Reenviar
- Apagar
- Citar
- Partilhar
+ Cancelar
+ Guardar
+ Sair
+ Enviar
+ Reenviar
+ Apagar
+ Citar
+ PartilharDepois
- Encaminhar
+ EncaminharLink permanenteVer fonteVer o original decifrado
- Apagar
- Renomear
+ Apagar
+ RenomearDenunciar conteúdoChamada ativaChamada de grupo em curso.\nJunte-se por %1$s ou %2$s.
@@ -100,8 +90,7 @@
Chamadas de conferência não são suportadas em salas cifradasEnviar na mesmaou
- Convidar
-
+ ConvidarSairChamada de vozChamada de vídeo
@@ -112,31 +101,25 @@
AbrirFecharCopiado para a área de transferência
- Desativar
-
+ DesativarConfirmaçãoAviso
-
InícioFavoritosPessoasSalas
-
Pesquisar salasPesquisar favoritosPesquisar pessoasPesquisar salas
-
ConvitesPrioridade baixa
-
ConversasLista de endereços localApenas contactos do MatrixNão há conversasNão permitiu ao ${app_name} aceder aos seus contactos locaisSem resultados
-
SalasLista de salasSem salas
@@ -172,7 +155,6 @@
Iniciar chamada de vídeoEnviar ficheirosCapturar foto ou vídeo
-
Iniciar sessãoRegistarEnviar
@@ -220,7 +202,6 @@ Poderá adicionar o seu email ao seu perfil nas definições.A sua senha foi redefinida.
A sessão foi terminada em todos os dispositivos e não receberá mais notificações. Para reactivar as notificações, inicie sessão novamente em cada um dos dispositivos.
-
URL tem que começar com http[s]://Não foi possível iniciar sessão: Erro de redeNão foi possível iniciar sessão
@@ -235,28 +216,20 @@ A sessão foi terminada em todos os dispositivos e não receberá mais notifica
Foram enviados demasiados pedidosEste nome de utilizador já está a ser usadoO link no email ainda não foi clicado
-
-
Ler lista de recibos de leitura
-
-
Enviar como OriginalGrandeMédiaPequena
-
Cancelar a transferência?Cancelar o envio?%d s%1$dm %2$ds
-
OntemHoje
-
Nome da salaTópico da sala
-
Chamada estabelecidaA estabelecer a chamada…Chamada terminada
@@ -269,10 +242,8 @@ A sessão foi terminada em todos os dispositivos e não receberá mais notifica
A ligação multimédia falhouNão foi possível iniciar a câmarachamada respondida noutro sítio
-
Tirar fotografia ou gravar um vídeoNão foi possível gravar vídeo
-
InformaçãoO ${app_name} necessita de permissão para aceder ao seu armazenamento de fotos e vídeos para poder enviar e guardar anexos.
@@ -295,31 +266,25 @@ Por favor, permita o acesso na próxima janela para poder encontrar utilizadores
Permitir ao ${app_name} aceder aos seus contactos?Desculpe… A ação não foi realizada, por falta de permissões
-
GuardadoGuardar nas transferências?SIMNÃOContinuar
-
- Remover
- Entrar
- Visualizar
- Rejeitar
-
+ Remover
+ Entrar
+ Visualizar
+ RejeitarIr para a primeira mensagem não lida.
-
Foi convidado para entrar nesta sala por %sEste convite foi enviado para %s, que não está associado com esta conta.
Pode querer iniciar sessão com uma conta diferente, ou adicionar este email à sua conta.Está a tentar aceder a %s. Quer entrar na sala para poder participar na conversa?uma salaIsto é uma pré-visualização desta sala. As interações com a sala foram desativadas.
-
Nova conversaAdicionar membro1 membro
-
Sair da salaTem a certeza que quer sair da sala?Tem certeza que quer remover %s desta conversa?
@@ -347,14 +312,12 @@ Pode querer iniciar sessão com uma conta diferente, ou adicionar este email à
Não poderá reverter esta alteração visto que está a promover este utilizador para ter o mesmo nível de permissões que você.
Tem a certeza?Tem a certeza que quer convidar %s para esta conversa?
-
Invite by IDCONTACTOS LOCAIS (%d)Apenas utilizadores MatrixConvidar utilizador por IDInsira um ou mais endereços de e-mail ou IDs MatrixE-mail ou ID Matrix
-
Pesquisar%s está a escrever…%1$s e %2$s estão a escrever…
@@ -370,7 +333,6 @@ Tem a certeza?
Apagar mensagens não enviadasFicheiro não encontradoNão tem permissão para enviar mensagens nesta sala
-
ConfiarNão confiarSair
@@ -382,7 +344,6 @@ Tem a certeza?
O certificado mudou de um que era confiado pelo seu telefone. Isto é ALTAMENTE INVULGAR. Recomendamos que NÃO ACEITE este novo certificado.O certificado mudou de um que era anteriormente confiável para um que não é confiável. O servidor pode ter renovado o seu certificado. Contacte o administrador do servidor para obter a impressão digital expectável.Apenas aceite o certificado se o administrador do servidor publicou uma impressão digital que corresponde à impressão digital acima.
-
Detalhes da salaPessoasFicheiros
@@ -390,14 +351,12 @@ Tem a certeza?
ID mal formatado. Tem que ser um endereço de e-mail ou um ID Matrix como por exemplo \'@utilizador:domínio\'CONVIDADOSENTRARAM
-
Motivos para denunciar este conteúdoDeseja ocultar todas as mensagens deste utilizador?
Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.Cancelar envioCancelar transferência
-
PesquisarFiltrar membros da salaNenhum resultado
@@ -405,28 +364,13 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.<
MENSAGENSPESSOASFICHEIROS
-
- ENTRAR
- LISTAGEM
- FAVORITOS
- SALAS
- BAIXA PRIORIDADE
- CONVITES
- Iniciar conversa
- Criar sala
- Entrar na sala
- Entrar numa sala
- Insira o id ou o pseudónimo da sala
-
Navegar diretórioA pesquisar o directório…
-
Adicionar aos favoritosBaixa prioridadeConversa diretaDeixar a conversaEsquecer
-
MensagensDefiniçõesVersão
@@ -434,7 +378,6 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.<
Licenças de terceirosDireitos de autorPolítica de privacidade
-
Imagem do perfilNome a apresentarE-mail
@@ -462,7 +405,6 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.<
Direitos de autorPolítica de privacidadeLimpar cache
-
Definições de utilizadorNotificaçõesUtilizadores ignorados
@@ -518,37 +460,29 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.<
Insira o código de ativaçãoErro ao validar o seu número de telefoneCódigo
-
-
Foto da salaNome da salaTópicoEtiqueta da salaEtiquetada como:
-
Adicionar aos favoritosBaixa prioridadeNenhum
-
Acesso e visibilidadeListar esta sala no diretório público de salasAcesso à salaAcesso ao histórico da salaQuem pode ler o histórico?Quem pode aceder a esta sala?
-
Qualquer pessoaApenas membros (a partir do momento em que esta opção foi escolhida)Apenas membros (desde que foram convidados)Apenas membros (desde que entraram)
-
Para referenciar uma sala, ela necessita de ter um endereço.Apenas as pessoas que foram convidadasQualquer pessoa que saiba o endereço da sala, exceto visitantesQualquer pessoa que saiba o endereço da sala, incluindo visitantes
-
Utilizadores banidos
-
AvançadasID interno desta salaEndereços
@@ -559,7 +493,6 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.<
Precisa sair da sua conta para poder ativar a criptografia.Cifrar apenas para dispositivos verificadosNunca enviar mensagens cifradas para dispositivos não verificados nesta sala a partir deste dispositivo.
-
Esta sala não tem endereços locaisNovo endereço (por exemplo: #foo:matrix.org)Formato inválido de endereço (alias)
@@ -574,11 +507,8 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.<
Criptografia está desativada nesta sala.Ativar criptografia
(atenção: não é possível desativar novamente!)
-
Diretório
-
%s estava a tentar carregar um ponto específico do histórico da sala mas não foi possível encontrá-lo.
-
Informação sobre criptografia ponta-a-pontaInformação do eventoID do utilizador
@@ -622,21 +552,18 @@ Atenção: este ficheiro poderá ser apagado se a aplicação for desinstalada.<
Para confirmar que este dispositivo pode ser considerado confiável, entre em contacto com o seu dono usando outros meios (p. ex. pessoalmente ou através de uma chamada telefónica) e pergunte-lhe se a chave que ele vê nas suas Definições de Utilizador para este dispositivo é igual à chave abaixo:Se é igual, clique no botão verificar, abaixo. Se não é igual, então alguém está a interceptar este dispositivo e você poderá querer colocá-lo na lista negra. No futuro, este processo de verificação irá ser mais sofisticado.Eu confirmo que as chaves são iguais
-
A sala contém dispositivos desconhecidosEsta sala contém dispositivos desconhecidos que não foram verificados.
Isso significa que não existe a garantia de que estes dispositivos pertencem a quem dizem pertencer.
Recomendamos que faça o processo de verificação para cada dispositivo antes de continuar, mas você pode reenviar a mensagem sem efetuar a verificação se preferir.
Dispositivos desconhecidos:
-
Selecione um diretório de salasO servidor pode estar indisponível ou sobrecarregadoInsira um servidor a partir do qual listar as suas salas públicasURL do servidor (Homeserver)Todas as salas no servidor %sTodas as nativas de %s
-
Procurar históricoManter ficheiros multimédiaMostrar sempre a hora das mensagens
@@ -671,7 +598,6 @@ Dispositivos desconhecidos:
Criação de widget falhouCriar chamadas de conferência com o jitsiTem a certeza que quer remover o widget?
-
Não foi possível criar o widget.O envio do pedido falhou.Nível de utilizador tem que ser um inteiro positivo.
@@ -690,9 +616,9 @@ Dispositivos desconhecidos:
Enviar um autocolanteLicenças de terceirosA carregar…
- Descarregar
- Falar
- Limpar
+ Descarregar
+ Falar
+ LimparEsta acção não é possível por falta de permissões.SairAcções
@@ -946,7 +872,7 @@ A visibilidade das mensagens no Matrix é parecida com a dos emails. O nosso esq
Tem a certeza?Fazer BackupIrá perder acesso as suas mensagens encriptadas, se não fizer backup de suas chaves, antes de abandonar esta página.
- Ficar
+ FicarUtilize Backup de chavesSe sair desta página, irá perder as suas mensagens encriptadasNão quero as minhas mensagens encriptadas
@@ -968,10 +894,10 @@ A visibilidade das mensagens no Matrix é parecida com a dos emails. O nosso esq
Novo Backup de ChavesApagando Backup …Ligar na mesma
- Passar
+ PassarTerminado
- Abortar
- Aceitar
+ Abortar
+ AceitarTem a certeza que quer Sair?Apagar BackupPor favor veja e aceite, apolice para este servidor
diff --git a/vector/src/main/res/values-ro/strings.xml b/vector/src/main/res/values-ro/strings.xml
index 464a590f621..963cd405c04 100644
--- a/vector/src/main/res/values-ro/strings.xml
+++ b/vector/src/main/res/values-ro/strings.xml
@@ -183,12 +183,10 @@
%d camere%d de camere
- CAMERECAMERECamereCamere sugerateCamere
- FAVORITEFavoritePreferințeAdresă de e-mail
@@ -335,10 +333,10 @@
Administrează camereleRevocați ignorarea utilizatoruluiVideo
- Șterge
- Părăsește
- Salvează
- Anulează
+ Șterge
+ Părăsește
+ Salvează
+ AnuleazăVerificați sesiuneaInvitația ta. Motivul: %1$sInvitația trimisă de %1$s. Motivul: %2$s
@@ -389,7 +387,7 @@
A apărut o eroare în timpul incărcării imaginiiNu s-a putut trimite mesajulNu se poate redacta
- Dispozitivul expeditorului nu a trimis cheile de decriptare pentru acest mesaj.
+ Dispozitivul expeditorului nu a trimis cheile de decriptare pentru acest mesaj.Acum sunt blocate serverele ce au adrese IP ce se potrivesc.Acum sunt permise serverele ce au adrese IP ce se potrivesc.Sunt blocate serverele ce au adrese IP ce se potrivesc.
diff --git a/vector/src/main/res/values-ru/strings.xml b/vector/src/main/res/values-ru/strings.xml
index ad395de6863..4080508e4dd 100644
--- a/vector/src/main/res/values-ru/strings.xml
+++ b/vector/src/main/res/values-ru/strings.xml
@@ -39,24 +39,16 @@
%1$s отправил(а) приглашение %2$s присоединиться к комнате%1$s принял(а) приглашение от %2$s** Невозможно расшифровать: %s **
- Устройство отправителя не предоставило нам ключ для расшифровки этого сообщения.
-
+ Устройство отправителя не предоставило нам ключ для расшифровки этого сообщения.Не удалось изменитьНе удалось отправить сообщениеНе удалось загрузить изображение
-
Сетевая ошибкаОшибка Matrix
-
-
-
-
В настоящее время невозможно вновь присоединиться к пустой комнате.
-
Адрес электронной почтыНомер телефона%1$s отправил стикер.
-
Приглашение от %sПриглашение в комнату%1$s и %2$s
@@ -286,7 +278,6 @@
%1$s завершил(а) видеоконференциюВы начали видеоконференцию%1$s начал(а) видеоконференцию
-
СообщенияКомнатаНастройки
@@ -295,23 +286,22 @@
ПринятьОтклонитьЗавершить звонок
-
OK
- Отмена
- Сохранить
- Покинуть
- Отправить
- Повторить отправку
- Удалить
- Цитировать
- Поделиться
+ Отмена
+ Сохранить
+ Покинуть
+ Отправить
+ Повторить отправку
+ Удалить
+ Цитировать
+ ПоделитьсяПозже
- Переслать
+ ПереслатьКопировать ссылкуПросмотр исходного кодаПросмотр расшифрованного исходного кода
- Удалить
- Переименовать
+ Удалить
+ ПереименоватьПожаловаться на содержимоеАктивный вызовOngoing conference call.
@@ -326,8 +316,7 @@
Конференц звонки не поддерживаются в зашифрованных комнатахВсе равно отправитьили
- Приглашение
-
+ ПриглашениеВыйти из учётной записиГолосовой вызовВидео вызов
@@ -338,31 +327,25 @@
ОткрытьЗакрытьСкопировано в буфер
- Отключить
-
+ ОтключитьПодтверждениеПредупреждение
-
НачалоИзбранныеЛюдиКомнаты
-
Фильтр названия комнатыФильтр избранногоФильтр людейФильтр названия комнаты
-
ПриглашенияМаловажные
-
БеседыЛокальные контактыТолько Matrix контактыНет диалоговВы не дали доступ ${app_name} к внутренним контактамНет результатов
-
КомнатыСписок комнатНет комнат
@@ -400,7 +383,6 @@
Начать видеовызовОтправить файлыКамера
-
ВходСоздать аккаунтОтправить
@@ -448,7 +430,6 @@
Ваш пароль сброшен.
\n
\nОсуществлен выход на всех сессиях - вы не будете получать push уведомления. Для включения push уведомлений заново войдите на каждом из ваших устройств.
-
URL должен начинаться с http[s]://Сбой входа: сетевая ошибкаСбой входа
@@ -463,28 +444,20 @@
Отправлено слишком много запросовЛогин уже используетсяВы не перешли по высланной в email ссылке
-
-
Чтение списка вступивших
-
-
Отправить какОригиналКрупныйСреднийМелкий
-
"Отменить загрузку?Отменить загрузку?%d с%1$dм %2$dс
-
ВчераСегодня
-
Название комнатыТема комнаты
-
Вызов соединёнУстанавливается соединение…Вызов закончен
@@ -497,10 +470,8 @@
Медиавызов не удалсяНевозможно инициализировать камеруЗвонок принят на другом устройстве
-
Снять фото или видео"Не удалось записать видео"
-
Element Информация${app_name} нуждается в разрешении на доступ к вашей фото-и видеотеке для отправки и сохранения вложений.
\n
@@ -517,31 +488,25 @@
\n
\nСогласны ли вы поделиться своей адресной книгой для этой цели\?Извините. Действие не выполнено из-за недостаточных разрешений
-
СохраненоСохранить в загрузки?ДАНЕТПродолжить
-
- Удалить
- Присоединиться
- Просмотр
- Отклонить
-
+ Удалить
+ Присоединиться
+ Просмотр
+ ОтклонитьПерейти к непрочитанному
-
%s пригласил вас присоединиться к этой комнатеПриглашение пришло на адрес %s, который не связан с этим аккаунтом.
\nВозможно, вы захотите войти в систему с другим аккаунтом или добавить этот email в свою учетную запись.Вы пытаетесь получить доступ к %s. Хотите присоединиться к обсуждению?комнатаЭто пред. просмотр комнаты. Вы в режиме только чтения.
-
Новый чатДобавить участника1 пользователь
-
Покинуть комнатуВы уверены, что хотите выйти из комнаты\?Вы уверены, что хотите исключить %s из чата?
@@ -569,14 +534,12 @@
Вы не сможете отменить это действие, поскольку пользователь получит такой же уровень доступа, как и у вас.
\nВы уверены\?"Вы уверены что хотите пригласить %s в этот чат?"
-
Пригласить по IDЛокальные Контакты (%d)Только зарегистрированныеПригласить пользователя по IDПожалуйста, введите один или несколько адресов email или Matrix IDEmail или Matrix ID
-
Поиск%s печатает…%1$s & %2$s печатают…
@@ -592,7 +555,6 @@
Удалить неотправленные сообщенияФайл не найденУ вас нет прав писать сообщения в этом чате.
-
ДоверятьНе доверятьВыйти
@@ -604,7 +566,6 @@
Сертификат сервера изменился и ваш телефон теперь ему не доверяет. Это ОЧЕНЬ ПОДОЗРИТЕЛЬНО. Рекомендуется, НЕ ДОВЕРЯТЬ этому новому сертификату.Сертификат изменился с ранее доверенного на недействительный. Возможно, сервер обновил свой сертификат. Свяжитесь с администратором сервера для получения ожидаемого отпечатка сертификата.Примите сертификат только если администратор сервера опубликовал отпечаток сертификата, который соответствует указанному выше.
-
Подробности комнатыЛюдиФайлы
@@ -612,14 +573,12 @@
Некорректный ID. Используйте email или Matrix ID вида \'@localpart:domain\'ПРИГЛАШЕНЫПРИСОЕДИНИЛИСЬ
-
Причина отчета о контентеВы хотите скрыть все сообщения этого пользователя\?
\n
\nУчтите, что это действие перезапустит приложение и может занять некоторое время.Отменить загрузкуОтменить загрузку
-
ПоискФильтр списка пользователейНет результатов
@@ -627,28 +586,13 @@
СООБЩЕНИЯЛЮДИФАЙЛЫ
-
- ПРИСОЕДИНИЛИСЬ
- КАТАЛОГ
- ИЗБРАННОЕ
- КОМНАТЫ
- МАЛОВАЖНЫЕ
- ПРИГЛАШЕНИЯ
- Начать чат
- Создать комнату
- Войти в комнату
- Войти в комнату
- Введите ID комнаты или псевдоним
-
Просмотр каталогаПоиск в каталоге…
-
ИзбранноеУменьшить приоритетПрямой чатПокинуть обсуждениеЗабыть
-
СообщенияНастройкиВерсия
@@ -656,7 +600,6 @@
Прочие уведомленияАвторские праваПолитика конфиденциальности
-
АватарОтображаемое имяEmail
@@ -684,7 +627,6 @@
Авторские праваПолитика конфиденциальностиОчистить весь кэш
-
Параметры пользователяУведомленияИгнорируемые
@@ -740,37 +682,29 @@
Введите код активацииОшибка проверки телефонаКод
-
-
Аватар комнатыНазвание комнатыТемаМетки комнатыОтмечено как:
-
ИзбранноеМаловажныеНет
-
Доступность и видимостьОтображать комнату в каталогеДоступ к комнатеДоступ к истории комнатыКто может читать историю?Кто имеет доступ к комнате?
-
ВсеТолько участники (с момента выбора этой опции)Только участники (с момента приглашения)Только участники (с момента присоединения)
-
Для генерации ссылки команда должна иметь адрес.Только приглашенныеВсе у кого есть ссылка на комнату, кроме гостейВсе у кого есть ссылка на комнату, включая гостей
-
Забаненные пользователи
-
ДополнительноВнутренний ID комнатыАдреса
@@ -781,7 +715,6 @@
Вам необходимо выйти, чтобы включить шифрование.Шифровать сообщения только для проверенных сессийНикогда не отправлять шифрованное сообщение на непроверенные сессии в этой комнате с этой сессии.
-
У этой комнаты еще нет локального адресаНовый адрес (например #foo:matrix.org")Неверный формат псевдонима
@@ -796,11 +729,8 @@
В этой комнате выключено шифрование.Включить шифрование
\n(внимание: не может быть снова отключено!)
-
Каталог
-
%s пытается загрузить историю комнаты, но не может ее найти.
-
Информация о сквозном шифрованииИнформация о событииID пользователя
@@ -844,21 +774,18 @@
Чтобы убедиться, что этой сессии можно доверять, обратитесь к его владельцу, используя другие способы (например, лично или по телефону), и спросите, соответствует ли ключ, который он видит в настройках для этой сессии:Если совпадает, то нажмите кнопку подтвердить ниже. Если не совпадает, возможно кто-то пытается перехватить сессию и вы захотите добавить его в черный список. В будущем данный процесс будет улучшен.Я проверил, что ключи совпадают
-
Комната содержит неизвестные сессииЭта комната содержит неизвестные сессии, которые не были подтверждены.
\nЭто означает, что эти сессии могут не принадлежать тем пользователям, на которых они претендуют.
\nПеред продолжением рекомендуем вам пройти процесс проверки для каждой сессии, но вы можете отправить сообщение повторно, не проверяя.
\n
\nНеизвестные сессии:
-
Выбор списка комнатСервер возможно недоступен или перегруженВведите домашний сервер для отображения списка публичных комнатИмя сервераВсе комнаты на сервере %sВсе местные комнаты %s
-
Поиск в историиПользовательский интерфейсЯзык
@@ -893,7 +820,6 @@
Создание виджета не удалосьОсуществлять конференц звонки через JitsiВы уверены, что хотите удалить виджет из этой комнаты?
-
Не удалось создать виджет.Не удалось отправить запрос.Уровень доступа должен быть числом больше 0.
@@ -919,14 +845,11 @@
Снять видеоАналитикаИспользовать встроенную камеру
-
Сообщить об ошибкеВнимание!Конференц-связь находится в разработке и может быть ненадежной.
-
Ошибка командыНераспознанная команда: %s
-
ВыклГромкоЗашифрованное сообщение
@@ -960,7 +883,6 @@
ПримерID сообществапример
-
НачалоЛюдиКомнаты
@@ -1000,7 +922,6 @@
%d активных виджетов
-
Аватар%d активный участник
@@ -1086,9 +1007,9 @@
\n
\nВидимость сообщений в Matrix похожа на электронную почту. Удаление ваших сообщений означает, что отправленные вами сообщения не будут показаны новым или не зарегистрированным пользователям, но те пользователи, которые уже получили эти сообщения - по прежнему будут их видеть.Лицензии сторонних производителей
- Скачать
- Говорить
- Очистить
+ Скачать
+ Говорить
+ ОчиститьПерезапросить ключи шифрования у других ваших сессий.Отправлен запрос ключа.Запрос отправлен
@@ -1216,7 +1137,7 @@
ВсегдаДля сообщений и ошибокТолько для ошибок
- Принимаю
+ ПринимаюРезультаты диагностикиЗапустить тестыВыполняется… (%1$d из %2$d)
@@ -1296,7 +1217,7 @@
Резервное копирование ключейИспользуйте резервную копию ключаРезервное копирование ключей не завершено, пожалуйста, подождите…
- Пропустить
+ ПропуститьГотовоРасширенные настройки уведомленийЗначение уведомления по событию
@@ -1396,8 +1317,8 @@
Уверены?Создание резервной копииСделайте резервную копию ваших ключей или потеряете доступ к вашим зашифрованным сообщениям.
- Остаться
- Прервать
+ Остаться
+ ПрерватьУверены, что хотите выйти?Пожалуйста, введите имя пользователя.(Расширенный)
@@ -1445,7 +1366,7 @@
Импортирование ключей…Скачивание ключей…Вычисление ключа восстановления…
- Игнорировать
+ ИгнорироватьИнициализация сервисаОтметить как прочитанноеВойти с помощью единого входа
@@ -1558,8 +1479,8 @@
КомнатыЗдесь будут отображаться ваши комнаты. Коснитесь + внизу справа, чтобы найти существующие или создать свои.Реакции
- Принять
- Нравиться
+ Принять
+ НравитьсяДобавить реакциюПросмотреть реакцииМенеджер интеграции
@@ -1639,8 +1560,8 @@
Фильтр по имени пользователя или ID…Присоединение к комнате…История изменений
- Обзор
- Отклонить
+ Обзор
+ ОтклонитьДля продолжения Вам необходимо принять Условия данного сервиса.Правила push-уведомлений не определеныНет зарегистрированных push-шлюзов
@@ -1650,8 +1571,8 @@
Используйте ботов, мосты, виджеты и стикерыЧитать вНикто
- Отмена
- Отключить
+ Отмена
+ ОтключитьСервер идентификации не настроен.Звонок не состоялся из-за неправильно настроенного сервераПопросите администратора вашего домашнего сервера (%1$s) настроить TURN сервер, чтобы звонки работали надежно.
@@ -1996,8 +1917,8 @@
\n
\nПожалуйста, разрешите доступ в следующем всплывающем окне, чтобы экспортировать ключи вручную.Нет подключения к сети
- Воспроизвести
- Приостановить
+ Воспроизвести
+ ПриостановитьКопироватьВыполненоУведомления
@@ -2020,7 +1941,7 @@
Вернуться к звонкуОтменить приглашениеСнизить собственные полномочия\?
- Отклонить
+ ОтклонитьВы не сможете отменить это изменение, поскольку вы понижаете себя в должности, а если вы последний привилегированный пользователь в комнате, то восстановить привилегии будет невозможно.ПонизитьИгнорировать пользователя
@@ -2232,17 +2153,6 @@
НедоверенныеЭта сессия является доверенной для безопасного обмена сообщениями, так как %1$s (%2$s) проверил(а) его:%1$s (%2$s) вошел(ла), используя новую сессию:
-
- %d голос
- %d голоса
- %d голосов
-
-
- %d голос - финальные результаты
- %d голоса - финальные результаты
- %d голосов - финальные результаты
-
- Выберите вариантСоздать простой опросНовый входПока этот пользователь не доверяет этой сессии, сообщения, отправленные в обе стороны, помечаются предупреждениями. Кроме того, вы можете подтвердить сессию вручную.
@@ -2346,7 +2256,7 @@
\n${app_name} для ПК
${app_name} для iOS
\n${app_name} для Android
- или другой, поддерживаемый кросс-подпись Matrix клиент
+ или другой, поддерживаемый кросс-подпись Matrix клиентПринудительно отбрасывает текущую групповую сессию для отправки сообщений в зашифрованную комнатуЧтобы продолжить, используйте ваш %1$s или используйте ваш %2$s.Используйте ключ восстановления
@@ -2508,7 +2418,6 @@
Показать события статуса участников комнатыВключает в себя события приглашения/ присоединения/выхода/исключения/бана и изменение аватара/отображаемого имени.Голосование
- Кнопки ботаОтреагировал: %sРезультат проверкиСсылка была искажена
@@ -2558,7 +2467,7 @@
Фильтр заблокированных пользователейУ вас нет разрешения на запуск звонкаУ вас нет разрешения на запуск конференции
- Сброс
+ СбросПоказать устройство, которое вы можете проверить сейчасПоказать %d устройства, которые вы можете проверить сейчас
@@ -2857,8 +2766,6 @@
Управление комнатамиИщете кого-то не в %s\?%s приглашает вас
- Предупреждение: требует поддержки сервера и экспериментальной версии комнаты
- Экспериментальное пространство - Ограниченная комната.Вы приглашеныПространства - это новый способ группировки комнат и людей.Добро пожаловать в Пространства!
@@ -2890,7 +2797,7 @@
Они смогут изучить %sПригласить в %sПоделиться ссылкой
- Пригласить по имени пользователя
+ Пригласить по имени пользователяПригласить по электронной почтеНа данный момент здесь только вы. С другими в %s будет ещё лучше.Пригласить в %s
@@ -3116,7 +3023,7 @@
Приглашение по электронной почте, поиск контактов и многое другое…Завершите настройку обнаружения.В настоящее время вы не используете сервер идентификации. Чтобы приглашать членов команды и быть доступным для них, настройте один из них ниже.
- Приглашение по имени пользователя или по почте
+ Приглашение по имени пользователя или по почтеУбедитесь, что нужные люди имеют доступ к %s. Вы можете пригласить больше людей позже.Кто ваши члены команды\?Добавить в данное пространство
diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
index 4570de7f9f5..0b5bd00e15d 100644
--- a/vector/src/main/res/values-sk/strings.xml
+++ b/vector/src/main/res/values-sk/strings.xml
@@ -39,7 +39,7 @@
%1$s pozval/a %2$s vstúpiť do miestnosti%1$s prijal/a pozvanie pre %2$s** Nie je možné dešifrovať: %s **
- Zo zariadenia odosieľateľa nebolo možné získať kľúče potrebné na dešifrovanie tejto správy.
+ Zo zariadenia odosieľateľa nebolo možné získať kľúče potrebné na dešifrovanie tejto správy.Nie je možné vymazaťNie je možné odoslať správuNepodarilo sa nahrať obrázok
@@ -72,8 +72,8 @@
Úvodná synchronizácia:
\nNačítanie konverzácií
\nAk ste sa pripojili k mnohým miestnostiam, môže to chvíľu trvať
- Úvodná synchronizácia:
-\nPrebieha import pozvaní
+ Počiatočná synchronizácia:
+\nImport pozvaných miestnostíÚvodná synchronizácia:
\nPrebieha import opustených miestnostíÚvodná synchronizácia:
@@ -102,9 +102,9 @@
%1$s pridal/a adresy %2$s pre túto miestnosť.
- %1$s odstránil/a adresu %2$s pre túto miestnosť.
- %1$s odstránil/a adresy %3$s pre túto miestnosť.
- %1$s odstránil/a adresy %3$s pre túto miestnosť.
+ %1$s odstránil/a %2$s adresu pre túto miestnosť.
+ %1$s odstránil/a %2$s adries pre túto miestnosť.
+ %1$s odstránil/a %2$s adresy pre túto miestnosť.%1$s pridal/a adresy %2$s a odstránil/a adresy %3$s pre túto miestnosť.%1$s nastavil/a hlavnú adresu tejto miestnosti %2$s.
@@ -221,22 +221,22 @@
Podrobnosti o členoviHistorickéOK
- Zrušiť
- Uložiť
- Opustiť
- Odoslať
- Odoslať znovu
- Vymazať
- Citovať
- Zdieľať
+ Zrušiť
+ Uložiť
+ Opustiť
+ Odoslať
+ Odoslať znovu
+ Vymazať
+ Citovať
+ ZdieľaťNeskôr
- Preposlať
+ PreposlaťTrvalý odkazZobraziť zdrojZobraziť dešifrovaný zdroj
- Vymazať
- Premenovať
- Ohlásiť obsah
+ Vymazať
+ Premenovať
+ Nahlásiť obsahAktívny hovorPrebiehajúci konferenčný hovor.
\nPripojte sa ako %1$s alebo %2$s
@@ -250,7 +250,7 @@
Konferenčné hovory nie sú podporované v šifrovaných miestnostiachNapriek tomu odoslaťalebo
- Pozvanie
+ PozvanieNedostupnýOdhlásiť saAudio hovor
@@ -262,7 +262,7 @@
OtvoriťZavrieťSkopírované do schránky
- Zakázať
+ ZakázaťPotvrdenieUpozornenieDomov
@@ -310,8 +310,8 @@
Vytvoriť účetPrihlásiť saOdhlásiť sa
- Adresa domovského servera
- Adresa servera totožností
+ URL adresa domovského servera
+ URL adresa servera totožnostíHľadaťZačať novú konverzáciuUskutočniť audio hovor
@@ -433,10 +433,10 @@
ÁNONIEPokračovať
- Odstrániť
- Vstúpiť
- Zobraziť náhľad
- Odmietnuť
+ Odstrániť
+ Vstúpiť
+ Zobraziť náhľad
+ OdmietnuťPreskočiť na neprečítanú správuPoužívateľ %s vás pozval vstúpiť do tejto miestnostiToto pozvanie bolo odoslané na emailovú adresu %s, ktorá nie je priradená k tomuto účtu.
@@ -527,17 +527,6 @@
SPRÁVYĽUDIASÚBORY
- VSTÚPIŤ
- ADRESÁR
- OBĽÚBENÉ
- MIESTNOSTI
- NÍZKA PRIORITA
- POZVANIA
- Začať konverzáciu
- Vytvoriť miestnosť
- Vstúpiť do miestnosti
- Vstúpiť do miestnosti
- Zadajte alias alebo ID miestnostiPrezrieť adresárVyhľadávanie v adresári…Do obľúbených
@@ -608,8 +597,8 @@
Aktualizovať verejné menoNaposledy videné%1$s @ %2$s
- Táto operácia si vyžaduje dodatočné overenie.
-Ak chcete pokračovať, prosím zadajte vaše heslo.
+ Táto operácia si vyžaduje dodatočné overenie.
+\nAk chcete pokračovať, zadajte prosím vaše heslo.OverenieHeslo:Odoslať
@@ -631,9 +620,9 @@ Ak chcete pokračovať, prosím zadajte vaše heslo.Potvrdiť nové hesloNepodarilo sa zmeniť hesloÚspešne ste si zmenili heslo
- Zobraziť všetky správy od používateľa %s?
-
-Pozor! Vykonaním tejto akcie reštartujete aplikáciu a opätovné načítanie môže chvíľu trvať.
+ Zobraziť všetky správy od %s\?
+\n
+\nUpozorňujeme, že táto akcia spôsobí reštart aplikácie a môže chvíľu trvať.Ste si istí, že chcete odstrániť tento cieľ oznámení?Ste si istí, že chcete odstrániť %1$s %2$s?Vyberte krajnu
@@ -690,13 +679,13 @@ Pozor! Vykonaním tejto akcie reštartujete aplikáciu a opätovné načítanie
Nebude určená hlavná adresa tejto miestnosti.Upozornenie - Hlavná adresaNastaviť ako hlavnú adresu
- Zrušiť nastavenie ako hlavná adresa
+ Zrušiť nastavenie ako hlavnej adresyKopírovať ID miestnostiKopírovať adresu miestnostiV tejto miestnosti je povolené šifrovanie.V tejto miestnosti nie je povolené šifrovanie.Povoliť šifrovanie
-(Pozor: Nie je viac možné zakázať!)
+\n(Pozor: nie je možné ho znova vypnúť!)
AdresárVzhľad%s sa pokúšal zobraziť konkrétny bod v histórii tejto miestnosti, no zodpovedajúcu udalosť sa nepodarilo nájsť.
@@ -721,9 +710,9 @@ Pozor! Vykonaním tejto akcie reštartujete aplikáciu a opätovné načítanie
ExportovaťZadajte hesloPotvrďte heslo
- Šifrovacie kľúče miestností boli uložené do %s
-
-Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikácii Element.
+ Kľúče od miestnosti E2E boli uložené do \'%s\'.
+\n
+\nUpozornenie: Tento súbor sa môže vymazať, ak sa aplikácia odinštaluje.Importovať E2E kľúče miestnostíImportovať kľúče miestnostíImportovať kľúče z lokálneho súboru
@@ -752,7 +741,7 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
Vyberte adresár miestnostíServer môže byť nedostupný alebo preťaženýZadajte adresu domovského servera, z ktorého sa načíta zoznam verejných miestností
- URL adresa domovského servera
+ Názov serveraVšetky miestnosti na serveri %sVšetky Matrix miestnosti na serveri %sHľadať historické
@@ -768,7 +757,6 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
Nie je možné vytvoriť widgetKonferenčné hovory uskutočňovať použitím jitsiSte si istí, že chcete odstrániť widget z tejto miestnosti?
-
Nie je možné vytvoriť widget.Nepodarilo sa odoslať požiadavku.Úroveň moci musí byť kladné celé číslo.
@@ -778,28 +766,24 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
V požiadavke chýba user_id.Miestnosť %s nie je viditeľná.Pridať Matrix aplikácie
-
Pridali ste novú reláciu \'%s\', ktorá požaduje šifrovacie kľúče.Vaša neoverená relácia \'%s\' požaduje šifrovacie kľúče.Spustiť overenieZdieľať bez overeniaIgnorovať žiadosť
- Hlučné oznámenia
+ Hlasné oznámeniaTiché oznámeniaHlásenie o chybePoslať fotkuPoslať videoŠtatistikaPoužívať vstavaný fotoaparát a kameru
-
Upozornenie!Konferenčné hovory sú stále vo vývoji a nemusia byť úplne spoľahlivé.
-
Chybný príkazNerozpoznaný príkaz: %s
-
Vypnuté
- Hlučné
+ HlasnéŠifrovaná správaPodrobnosti o komuniteNačítavanie…
@@ -814,11 +798,11 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
Ste si istí, že chcete začať video hovor?Zoznam komunítZakázanie používateľa ho vylúči z tejto miestnosti a zabráni mu v ďalšom vstupe.
- Všetky správy (hlučné)
+ Všetky správy (hlasné)Všetky správyLen zmienkyUmlčať
- Pridať odkaz na domovskú obrazovku
+ Pridať na domovskú obrazovkuNáhľady URL adriesVibrovať keď spomeniete iného používateľaPríslušnosť ku komunitám
@@ -833,7 +817,6 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
PríkladID komunitypríklad
-
DomovĽudiaMiestnosti
@@ -852,9 +835,9 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
AkcieOznámiť chybu zatrasením zariadenia
- 1 zmena stavu
- %d zmeny stavu
- %d zmien stavu
+ 1 zmena členstva
+ %d zmeny členstva
+ %d zmien členstvaZobraziť členovOtvoriť záhlavie
@@ -890,9 +873,9 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
%d neprečítaných správ
- 1 neprečítaná správa
- %d neprečítané správy
- %d neprečítaných správ
+ 1 neprečítaná oznámená správa
+ %d neprečítané oznámené správy
+ %d neprečítaných oznámených správ1 miestnosť
@@ -905,7 +888,6 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
%d aktívne widgety%d aktívnych widgetov
-
Potvrdenie o prečítaníObrázok oznámeniaObrázok
@@ -938,18 +920,18 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác
Ak chcete aj naďalej používať domovský server %1$s , mali by ste si prečítať a odsúhlasiť naše zmluvné podmienky.Prečítať terazDeaktivovať účet
- Toto spôsobí, že váš účet nebude viac použiteľný. Nebudete sa môcť opätovne prihlásiť a nikto sa nebude môcť znovu zaregistrovať s rovnakým používateľským ID. Deaktiváciou účtu opustíte všetky miestnosti, do ktorých ste kedy vstúpili a vaše kontaktné údaje budú odstránené zo servera totožností. Túto akciu nie je možné vrátiť späť..
-
-Pri deaktivácii účtu predvolene neodstraňujeme vami odoslané správy. Ak si želáte uplatniť právo zabudnutia, zaškrtnite prosím zodpovedajúce pole nižšie.
-
-Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť správ elektronickej pošty. To, že zabudneme vaše správy v skutočnosti znamená, že správy ktoré ste už odoslali nebudú čitateľné pre nových alebo neregistrovaných používateľov, no registrovaní používatelia, ktorí už prístup k vašim správam majú, budú aj naďalej bez zmeny môcť pristupovať k ich vlastným kópiám vašich správ.
+ Tým sa vaše konto stane trvalo nepoužiteľným. Nebudete sa môcť prihlásiť a nikto nebude môcť opätovne zaregistrovať rovnaké ID používateľa. To spôsobí, že váš účet opustí všetky miestnosti, ktorých sa zúčastňuje, a odstráni údaje o vašom účte zo servera identity. Táto akcia je nezvratná.
+\n
+\nDeaktivácia vášho účtu nezapríčiní štandardne, že zabudneme na správy, ktoré ste odoslali. Ak chcete, aby sme vaše správy zabudli, označte nižšie uvedené políčko.
+\n
+\nViditeľnosť správ v Matrixe je podobná ako v prípade e-mailu. Naše zabudnutie vašich správ znamená, že správy, ktoré ste poslali, nebudú sprístupnené žiadnym novým alebo neregistrovaným používateľom, ale registrovaní používatelia, ktorí už majú prístup k týmto správam, budú mať stále prístup k ich kópii.Spolu s deaktivovaním účtu si želám odstrániť všetky mnou odoslané správy (Pozor: Môže sa stať, že noví používatelia uvidia neúplnú históriu konverzácií)Aby ste mohli pokračovať, prosím zadajte svoje heslo:Deaktivovať účetLicencie tretích strán
- Stiahnuť
- Hovoriť
- Vymazať
+ Stiahnuť
+ Hovoriť
+ VymazaťŽiadosť o šifrovacie kľúče bola odoslaná.Žiadosť odoslanáPíšte sem…
@@ -963,9 +945,9 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp
Túto akciu nie je možné vykonať, pretože neboli udelené všetky potrebné oprávnenia.Ak je to možné, prosím popis napíšte v angličtine.
- 1 sekunda
- %d sekundy
- %d sekúnd
+ %ds
+ %ds
+ %ds1 minúta
@@ -1020,7 +1002,7 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp
%d miestnosti%d miestností
- Táto miestnosť bola nahradená inou a nie je viac aktívna
+ Táto miestnosť bola nahradená inou a nie je viac aktívna.Konverzácia pokračuje tuTáto miestnosť je pokračovaním predchádzajúcej konverzáciiStaršie správy zobrazíte kliknutím sem
@@ -1054,7 +1036,7 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp
+%d%d+Napriek tomu zavolať
- Prijať
+ PrijaťProsím prečítajte si a odsúhlaste zmluvné podmienky tohoto domovského servera:HovoryPoužiť predvolené zvonenie ${app_name} pre prichádzajúce hovory
@@ -1096,9 +1078,9 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp
Token FCM sa nepodarilo získať:
\n%1$sRegistrácia tokenu
- Token FCM úspešne zaregistrovaný na domovskom servery.
- FCM token sa nepodarilo zaregistrovať na domoskom servery:
-%1$s
+ Token FCM úspešne zaregistrovaný na domovskom serveri.
+ FCM token sa nepodarilo zaregistrovať na domovskom serveri:
+\n %1$sSlužba oznámeníSlužba oznámení je spustená.Služba oznámení nie je spustená.
@@ -1112,11 +1094,11 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp
Služba sa automaticky nespustí po reštarte zariadenia a nedostanete po reštarte žiadne oznámenia, kým nespustíte ${app_name} aspoň raz.Povoliť spustenie služby po reštarteKontrola obmedzenia spustenia na pozadí
- Obmedzenie spustenia na pozadí nie je aktívne pre ${app_name}. Tento test je potrebné spustiť cez mobilné dáta (nie cez wifi).
-%1$s
- Obmedzenie spustenia na pozadí je aktívne pre ${app_name}.
-Činnosť aplikácii bude agresívne obmedzovaná operačným systémom, keď je ${app_name} na pozadí. Môže to mať negatívny vplyv na doručovanie oznámení.
-%1$s
+ Obmedzenie spustenia na pozadí nie je aktívne pre ${app_name}. Tento test je potrebné spustiť cez mobilné dáta (nie cez wifi).
+\n%1$s
+ Pre ${app_name} sú povolené obmedzenia na pozadí.
+\nPráca, ktorú sa aplikácia pokúsi vykonať, bude agresívne obmedzená, keď je na pozadí, čo môže ovplyvniť oznámenia.
+\n%1$sDeaktivovať obmedzeniaOptimalizácia batérieChod ${app_name} nie je ovplyvnený nastavením optimalizácie batérie.
@@ -1134,8 +1116,8 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp
Zobrazovať udalosti účtuZahŕňa zmeny zobrazovaného mena a obrázka v profile.Pripojenie na pozadí
- ${app_name} potrebuje na pozadí udržovať aktívne nenáročné spojenie, aby spoľahlivo fungovali oznámenia.
-Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí pre ${app_name}. Prosím povoľte ho.
+ ${app_name} potrebuje na pozadí udržovať aktívne nenáročné spojenie, aby spoľahlivo fungovali oznámenia.
+\nNa ďalšej obrazovke budete vyzvaní, aby ste povolili aplikácii ${názov_aplikácie}, aby sa vždy spúšťala na pozadí, prosím, prijmite.Udeliť oprávneniePri pokuse overiť vašu emailovú adresu sa vyskytla chyba.Heslo
@@ -1160,11 +1142,11 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Ste si istí\?ZálohovaťSkôr než sa odhlásite, zálohujte si šifrovacie kľúče, inak prídete o prístup k zašifrovaným správam.
- Zostať
- Vynechať
+ Zostať
+ VynechaťHotovo
- Prerušiť
- Ignorovať
+ Prerušiť
+ IgnorovaťSte si istí, že sa chcete odhlásiť\?Označiť ako prečítanéPrihlásiť sa použitím jediného prihlásenia
@@ -1184,8 +1166,8 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
[%1$s]
\nV zariadení nemáte nastavený účet Google. Prosím, pridajte si účet cez správcu účtov. Konfigurácia ${app_name} nemá vplyv na zobrazenie tejto chyby.Pridať účet
- Aplikácia sa nepotrebuje pripájať k domovskému serveru, keď beží na pozadí, čo môže predĺžiť výdrž batérie
- Nastaviť hlučné oznámenia
+ Aplikácia sa nemusí pripájať k domovskému serveru, keď beží na pozadí, čo môže predĺžiť výdrž batérie
+ Nastaviť hlasné oznámeniaNastaviť oznámenia prichádzajúceho hovoruNastaviť tiché oznámeniaVybrať farbu upozornení LED, vibrácie, zvuky…
@@ -1224,10 +1206,10 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Prosím zadajte meno používateľa.Overiť reláciuŽiadny
- Zrušiť
- Odpojiť sa
- Náhlad
- Odmietnuť
+ Zrušiť
+ Odpojiť sa
+ Náhlad
+ OdmietnuťNebol nakonfigurovaný server totožnosti.Hovor zlyhal kvôli zle nakonfigurovanému serveruProsím, požiadajte administrátora vášho domovského serveru (%1$s) o konfiguráciu TURN serveru, aby hovory fungovali spoľahlivo.
@@ -1242,9 +1224,9 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Toto nie je platná adresa Matrix serveruDomovský server je nedostupný na tejto URL adrese, preverte to prosímRelácie
- Prehrať
- Pozastaviť
- Odmietnuť
+ Prehrať
+ Pozastaviť
+ OdmietnuťNemáte právo začať konferenčný hovor v tejto miestnostiKonferenčný hovor práve prebieha!Začať video schôdzu
@@ -1275,7 +1257,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Zabrániť neúmyselnému telefonovaniuŽiadať potvrdenie pred uskutočnením hovoruPovoliť záložný server pre nadviazanie hovoru
- Ak váš domovský server neponúka adresu servera turn, na nadviazanie hovorov sa použije %s (počas hovoru zdieľate svoju adresu IP)
+ Použije sa %s ako asistencia, keď ju váš domovský server neponúka (vaša IP adresa bude zdieľaná počas hovoru)Prebiehajúci hovor (%s)Návrat k hovoruNa uskutočnenie tejto akcie si prosím v nastaveniach pridajte server totožností.
@@ -1303,7 +1285,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Potvrdiť vaše hesloToto nie je možné urobiť cez mobilnú aplikáciu ${app_name}Je požadované overenie
- Režim synchronizácie na pozadí (Experimentálne)
+ Režim synchronizácie na pozadíOptimalizovaný na využívanie batérie${app_name} sa bude synchronizovať na pozadí s cieľom ušetriť limitované zdroje (batériu).
\nV závislosti od kapacity prostriedkov zariadenia môže byť synchronizácia odložená operačným systémom na neskôr.
@@ -1317,8 +1299,8 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
%s
\nSynchronizácia môže byť odložená vzávislosti od kapacity zariadenia (batéria a režim spánku).Integrácie
- Použite správcu integrácií na nastavenie botov, mostov, widgetov a balíčkov s nálepkami.
-\nSprávci integrácií zbierajú údaje konfigurácie, môžu meniť widgety, posielať pozvania vstúpiť do miestnosti a nastavovať úroveň moci vo vašom mene.
+ Použite správcu integrácií na nastavenie botov, premostení, widgetov a balíčkov s nálepkami.
+\nSprávcovia integrácie dostávajú konfiguračné údaje a môžu vo vašom mene upravovať widgety, posielať pozvánky do miestnosti a nastavovať úrovne oprávnení.Bezpečné zálohovanieSpravovaťNastaviť bezpečné zálohovanie
@@ -1423,7 +1405,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
\n
\nPozor: Keď odinštalujete aplikáciu Element, môže dôjsť k zmazaniu tohoto súboru.Kľúč obnovenia bol uložený.
- Záloha už existuje na domovskom servery
+ Záloha už existuje na vašom domovskom serveriZdá sa, že ste si už zálohovanie kľúčov nastavili z inej relácie. Chcete ho nahradiť zálohou, ktorú vytvárate teraz\?NahradiťZastaviť
@@ -1565,12 +1547,12 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Vitajte doma!Tu nájdete neprečítané správyKonverzácie
- Tu sa zobrazia priame konverzácie
+ Tu sa budú zobrazovať vaše konverzácie v priamych správach. Ťuknutím na + vpravo dole niektorú z nich spustíte.Miestnosti
- Tu sa zobrazia vaše miestnosti
+ Tu sa zobrazia vaše miestnosti. Ťuknutím na + vpravo dole nájdete existujúce miestnosti alebo si môžete založiť vlastnú.Reakcie
- Súhlasím
- Páči sa mi
+ Súhlasím
+ Páči sa miPridať reakciuZobraziť reakcieReakcie
@@ -1593,7 +1575,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Priame konverzácieNová miestnosťVYTVORIŤ
- Názov miestnosti
+ NázovVerejnáKtokoľvek môže vstúpiť do tejto miestnostiAdresár miestností
@@ -1687,4 +1669,424 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí
Odsúhlaste podmienky používania služieb servera totožností (%s), aby vás ostatní mohli nájsť podľa emailovej adresy alebo telefónneho čísla.Povoliť podrobné záznamy.Podrobné záznamy pomôžu vývojárom poskytnúť viac detailov, keď posielate hlásenie o chybe. Aj keď je toto zapnuté, aplikácia nezaznamenáva obsah správ ani žiadne iné súkromné údaje.
+ Oznámenia
+ Viac
+ Zabezpečenie
+ Čakanie…
+ Nálepka
+ Súbor
+ Audio
+ Obrázok.
+ Video.
+ Nastavenia
+ Heslo
+ Upozornenie
+ Ďalej
+ Heslo
+ Používateľské meno
+ Ďalej
+ Ďalej
+ Ďalej
+ Email
+ Upozornenie
+ Úspech!
+ Pokračovať
+ Upozornenie!
+ Email
+ Ďalej
+ Adresa
+ Pokračovať
+ Ďalšie
+ Nastavenia
+ Stlmiť
+ SÚBORY
+ Nálepka
+ Galéria
+ Audio
+ Kamera
+ Kontakt
+ Súbor
+ Ďalšie
+ Nastavenia miestnosti
+ Zistiť viac
+ Overený %s
+ Overiť %s
+ Manuálne overiť
+ Žiadosť o overenie
+ Overenie odoslané
+ Prijali ste
+ Zrušili ste overenie
+ %s bolo zrušené
+ Nezabezpečené
+ Zhodujú sa
+ Povoliť šifrovanie
+ Režim pre vývojárov
+ Pokročilé nastavenia
+ Úvodná synchronizácia…
+ Prihlásiť sa
+ Prihlásiť sa
+ Matrix ID
+ Zastaralý domovský server
+ Poslať znova
+ Zadať kód
+ Telefónne číslo
+ Email (voliteľné)
+ Nové heslo
+ Prihlásiť sa
+ Zaregistrovať sa
+ Zistiť viac
+ Neprečítané správy
+ Len zmienky
+ Všetky správy
+ Ignorovať používateľa
+ IGNOROVAŤ POUŽÍVATEĽA
+ Je to nevyžiadaná správa
+ %s prečítané
+ Skryť heslo
+ Zobraziť heslo
+ Poslať prílohu
+ Verzie
+ Pomocník
+ Právne informácie
+ tu
+ Povoliť
+ Anketa
+ Nedostupný
+ Nedostupný
+ Pripojený
+ Kľúčové slová
+ \@miestnosť
+ Žiadne
+ Priestory
+ Hlas
+ Aktualizovať
+ nestabilná
+ stabilná
+ Spätná väzba
+ Navrhované
+ Popis
+ Náhodné
+ Všeobecné
+ Súkromný
+ Verejný
+ Verejná
+ Súkromná
+ Priestory
+ Pozvánky
+ Zlyhalo
+ Odoslané
+ Odosielanie
+ Typ
+ Vybrané
+ Video
+ Obrázok
+ Snímka obrazovky
+ Prepnúť
+ Používatelia
+ Podržať
+ alebo
+ Povolenia
+ Zverejniť
+ Zrušiť zverejnenie
+ Pridať
+ "Téma: "
+ Návrhy
+ Kontakty
+ Nedávne
+ Téma
+ Opustiť
+ Nastavenia
+ Obnoviť predvolené
+ Anketa
+ Kód
+ Téma
+ Rola
+ Odoslať
+ POZVAŤ
+ Nešifrované
+ Správa…
+ Koniec
+ Obnoviť
+ Odstrániť…
+ Upozornenie:
+ Nie
+ Áno
+ Dôveryhodné
+ Upozornenie
+ Overený
+ Overiť
+ Krížové podpisovanie
+ Časová os
+ Prestať ignorovať
+ Používatelia
+ Pozvánky
+ Vlastná úroveň
+ Moderátori
+ Správcovia
+ Nahrané súbory
+
+ %1$s, %2$s, %3$s a %4$d ďalší
+ %1$s, %2$s, %3$s a %4$d ďalší
+ %1$s, %2$s, %3$s a %4$d ďalších
+
+ %1$s, %2$s, %3$s a %4$s
+ %1$s, %2$s a %3$s
+ Nepodarilo sa overiť
+ Pokračovať s %s
+ Aktualizovať miestnosť
+ Zmeniť názov miestnosti
+ Zmeniť viditeľnosť histórie
+ Zapnúť šifrovanie miestnosti
+ Zmeniť obrázok miestnosti
+ Zrušiť zverejnenie tejto adresy
+ Zverejniť túto adresu
+ Ďalšie zverejnené adresy:
+ Nemôžete napísať priamu správu sebe!
+ Pridať tému
+ %1$d z %2$d
+ Žiadne ďalšie výsledky
+ Téma miestnosti (voliteľné)
+ %1$s a %2$s
+ Zadajte svoj PIN
+ Zrušiť stlmenie mikrofónu
+ Stlmiť mikrofón
+ Načítanie dostupných jazykov…
+ Ďalšie dostupné jazyky
+ Označiť ako dôveryhodné
+ Zapnúť krížové podpisovanie
+ Je dostupná aktualizácia šifrovania
+ Správy obsahujúce @miestnosť
+ Čaká sa na %s…
+ Šifrovanie nie je zapnuté
+ Udržujte ho v bezpečí
+ Toto som nebol ja
+ Nové prihlásenie
+ Overte toto prihlásenie
+
+ %d aktívna relácia
+ %d aktívne relácie
+ %d aktívnych relácií
+
+ Zobraziť všetky relácie
+ Zapnúť end-to-end šifrovanie…
+ Moderátor v %1$s
+ Správca v %1$s
+ Odchod z miestnosti…
+ Čaká sa na %s…
+ Overte pomocou emoji
+ Naskenujte ich kód
+ Overiť túto reláciu
+ Nezhodujú sa
+ Nedôveryhodné prihlásenie
+ Vymazať všetky údaje
+ Vymazať osobné údaje
+ Ste odhlásený
+ Prihláste sa znova
+ Ste odhlásený
+ Používateľské meno alebo emailová adresa
+ Potvrdiť telefónne číslo
+ Telefónne číslo (nepovinné)
+ Nastaviť telefónne číslo
+ Vybrať server
+ Opustiť túto miestnosť
+ Odstrániť z obľúbených
+ Pridať k obľúbeným
+ Oznámenie pomocou zvuku
+ Všetky správy (hlasné)
+ Nahlásiť tento obsah
+ %1$s dňa %2$s
+ Odstrániť anketu
+ Povoliť ankety
+ Ukončiť anketu
+ Ukončiť anketu
+
+ %1$d hlas
+ %1$d hlasy
+ %1$d hlasov
+
+ Systémové nastavenia
+ Teraz nie
+ Vytvoriť možnosti
+ Vytvoriť anketu
+ Vybrať domovský server
+ Vytváranie priestoru…
+ Adresa priestoru
+ Povolenia priestoru
+ Pripojenie zlyhalo
+ Nastavenia účtu
+ Vaše kľúčové slová
+ Zistiť viac
+ Aktualizácia miestnosti
+ Pozvánky do miestnosti
+ Skupinové správy
+ Priame správy
+ My používateľské meno
+ Predvolené oznámenia
+ %1$ds ostáva
+ Vyžaduje sa aktualizácia
+ Vybrať priestory
+ Predvolená verzia
+ Adresy priestoru
+ Adresa priestoru
+ Nepomenovaná miestnosť
+ Súkromný priestor
+ Verejný priestor
+ Verejný priestor
+ Neznáma osoba
+ Váš server
+ Pridať miestnosti
+ Poskytnite spätnú väzbu
+ Spätná väzba na priestory
+ Spravovať miestnosti
+ Verejná miestnosť
+ Kompresia obrázku…
+ Vždy sa opýtať
+ Opustiť priestor
+ Pridať miestnosti
+ Preskúmať miestnosti
+ Pripojiť sa k priestoru
+ Vytvoriť priestor
+ Zdieľať odkaz
+ Pozvať ľudí
+ Vytváranie priestoru…
+ Pridať priestor
+ Navrhované miestnosti
+ Správa odoslaná
+ Adresár miestností
+ DOZVEDIEŤ SA VIAC
+ ROZUMIEM
+ ${app_name} Android
+ Žiadna zmena.
+ Obsah udalosti
+ Upraviť obsah
+ Vývojárske nástroje
+ Vymazať obrázok
+ Zmeniť obrázok
+ Otvoriť widgety
+
+ %d záznam
+ %d záznamy
+ %d záznamov
+
+ Verzia servera
+ Názov servera
+ Nastavenia miestnosti
+ Verzia miestnosti
+ Nová hodnota
+
+ Pozastavený hovor
+ %1$d pozastavené hovory
+ %1$d pozastavených hovorov
+
+ Číselník
+ Zavolať späť
+ Vyčistiť históriu
+ Zmeniť tému
+ Zmeniť povolenia
+ Upraviť widgety
+ Poslať oznámenie všetkým
+ Zakázať používateľov
+ Vylúčiť používateľov
+ Zmeniť nastavenia
+ Pozvať používateľov
+ Odoslať správy
+ Predvolená rola
+ Oprávnenia v miestnosti
+ Predvolené nastavenie systému
+ Zmeniť PIN
+ Lokálne adresy
+ Hlavná adresa
+ Zverejnené adresy
+ Adresy miestnosti
+ Adresy miestnosti
+ Prístup k miestnosti
+ Pozvať priateľov
+ Pridať ľudí
+ Vytváranie miestnosti…
+ Adresa miestnosti
+ Skryť pokročilé možnosti
+ Zobraziť pokročilé možnosti
+ QR kód
+ Začať konverzáciu
+ Priama správa
+ Zahodiť zmeny
+ Nastavenia miestnosti
+ Názov miestnosti
+ Zapnúť biometrické údaje
+ Nastaviť ochranu
+ Obnoviť všetko
+ Vstúpili ste.
+ %s sa pripojil/a.
+
+ %d pozvánka
+ %d pozvánky
+ %d pozvánok
+
+
+ %d sekunda
+ %d sekundy
+ %d sekúnd
+
+ Odstrániť %s\?
+ Telefónne čísla
+ Emailové adresy
+ Zapnúť PIN
+ Nový PIN
+ Obnoviť PIN
+ Zabudli ste PIN kód\?
+ Potvrdiť PIN kód
+ Odvolať pozvánku
+ Zoznam kontaktov
+ Telefónny zoznam
+ Nie je možné dešifrovať
+ Názov miestnosti
+ Bezpečnostná fráza
+ Nastaviť
+ Bezpečné zálohovanie
+ Otvoriť konverzáciu
+ Použiť %1$s
+ Aktuálny jazyk
+ Pozvať používateľov
+ Pozývanie používateľov…
+ Pridať členov
+ Overiť prihlásenie
+ %1$s (%2$s)
+ Prístupová fráza pre obnovenie
+ Zadajte %s
+ Použiť súbor
+ Nastavenie oznámení
+ Šifrovanie zapnuté
+ Hotovo!
+ Potvrdiť %s
+ Heslo účtu
+ Kľúč správy
+ Overovanie zrušené
+ Potvrdiť odstránenie
+ Údaje o účte
+ Vývojárske nástroje
+ QR kód
+ Inicializovať krížové podpisovanie
+ Nedôveryhodné
+ Dokončiť zabezpečenie
+ Spravovať relácie
+ Aktívne relácie
+ Povoliť šifrovanie
+ Povoliť šifrovanie\?
+ Iné miestnosti
+ Nedávne miestnosti
+ Opustiť miestnosť
+
+ Jedna osoba
+ %1$d osoby
+ %1$d osôb
+
+ Zistené otrasy!
+ Vybrať matrix.org
+ Obsah nahlásený
+ Zásady
+ Pokračovať
+ Zúrivé trasenie
+ Iba ja
+ Riot je teraz Element!
+ Skontrolujte prosím svoj e-mail
\ No newline at end of file
diff --git a/vector/src/main/res/values-sl/strings.xml b/vector/src/main/res/values-sl/strings.xml
index 836a4c112e7..c6e8ede5895 100644
--- a/vector/src/main/res/values-sl/strings.xml
+++ b/vector/src/main/res/values-sl/strings.xml
@@ -3,8 +3,8 @@
ImePrijava hroščaPošlji ekransko sliko
- Ponovno pošlji
- Pošlji
+ Ponovno pošlji
+ PošljiSinhroniziram…Pridružil si se v sobi%1$s te je povabil
diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
index 8f2abca53a7..5985bd40feb 100644
--- a/vector/src/main/res/values-sq/strings.xml
+++ b/vector/src/main/res/values-sq/strings.xml
@@ -30,7 +30,7 @@
%1$s përditësoi profilin e tij %2$s%1$s pranoi ftesën tuaj për %2$s** S’arrihet të shfshehtëzohet: %s **
- Pajisja e dërguesit nuk na ka dërguar kyçet për këtë mesazh.
+ Pajisja e dërguesit nuk na ka dërguar kyçet për këtë mesazh.S’u redaktua dotS’arrihet të dërgohet mesazhNgarkimi i figurës dështoi
@@ -273,23 +273,23 @@
Licenca nga palë të tretaPo ngarkohet…OK
- Anuloje
- Ruaje
- Dil
- Dërgoje
- Ridërgoje
- Citim
- Shkarkoje
- Ndaje me të tjerë
- Flisni
- Pastroje
+ Anuloje
+ Ruaje
+ Dil
+ Dërgoje
+ Ridërgoje
+ Citim
+ Shkarkoje
+ Ndaje me të tjerë
+ Flisni
+ PastrojeMë vonë
- Përpara
+ PërparaPermalidhjeShihini BuriminShihni Burim të Shfshehtëzuar
- Fshije
- Riemërtojeni
+ Fshije
+ RiemërtojeniRaportoni LëndëThirrje aktiveS’fillohet dot thirrja, ju lutemi, riprovoni më vonë
@@ -297,7 +297,7 @@
Të dhëna SesioniThirre Sido QoftëDërgoje Sido Qoftë
- Ftoje
+ FtojeJashtë linjeDaljeVeprime
@@ -310,7 +310,7 @@
HapeMbylleU kopjua në të papastër
- Çaktivizoje
+ ÇaktivizojeRipohimKujdesGabim
@@ -447,10 +447,10 @@
Të ruhet te shkarkimet?POVazhdo
- Hiqe
- Bëhuni pjesë
- Paraparje
- Hidheni tej
+ Hiqe
+ Bëhuni pjesë
+ Paraparje
+ Hidheni tejAnëtarë listePo njëkohësohet…Hidhu te të palexuarit
@@ -554,17 +554,6 @@
MESAZHEPERSONAKARTELA
- MERRNI PJESË
- DREJTORI
- TË PARAPËLQYERA
- DHOMA
- ME PËRPARËSI TË ULËT
- FTESA
- Filloni fjalosje
- Krijo dhomë
- Hyni në dhomë
- Hyni në një dhomë
- Shtypni një ID ose alias dhomeShfletoni në drejtoriPo kërkohet në drejtori…Krejt mesazhet (e zhurmshme)
@@ -933,7 +922,7 @@
Lazy-load anëtarët e dhomaveShërbyesi juaj nuk e mbulon ende lazy loading e anëtarëve të dhomës. Provoni më vonë.Po njëkohësohet…
- Hiqe
+ HiqePër shkak lejesh që mungojnë, mund të mungojnë disa veçori…Ky veprim s’është i mundur, për shkak lejesh që mungojnë.Thirrjet konferencë nuk mbulohen në dhoma të fshehtëzuara
@@ -1098,7 +1087,7 @@
U pretendua për kyç Ed25519 shenjash gishtashKërkoni për të dikurshmeSimbole
- Pranoje
+ PranojeJu lutemi, merrni në shqyrtim dhe pranoni rregullat e këtij shërbyesi Home:Diagnostikoni NjoftimeDiagnostikime
@@ -1171,7 +1160,7 @@
Kopjeruajtje KyçeshPërdor Kopjeruajtje KyçeshKopjeruajtja e kyçeve s’ka përfunduar, ju lutemi, pritni…
- Anashkaloje
+ AnashkalojeU bëRregullime të Mëtejshme Për NjoftimetRëndësi njoftimi sipas aktesh
@@ -1268,8 +1257,8 @@
A jeni i sigurt?KopjeruajiDo të humbni hyrjen te mesazhet tuaj të fshehtëzuar, veç në bëfshi kopjeruajtje të kyçeve tuaj, përpara se të dilni nga llogaria.
- Rri
- Ndërprite
+ Rri
+ NdërpriteJeni i sigurt se doni të dilni?Mënyra e ruajtjes së të dhënave aplikon një filtër specifik, që kështu përditësimet rreth pranish dhe njoftime mbi shtypje në tastierë lihen jashtë.Rimarrje Mesazhesh të Fshehtëzuar
@@ -1306,7 +1295,7 @@
VersionAlgoritëmNënshkrim
- Shpërfille
+ ShpërfilleHyni me një hyrje njësheKjo URL s’kapet dot, ju lutemi, kontrollojeniPajisja juaj përdor një protokoll TLS sigurie të vjetruar, pre sulmesh, për hir të sigurisë tuaj, s’do të jeni në gjendje të lidheni
@@ -1424,8 +1413,8 @@
DhomaDhomat tuaja do të shfaqen këtu. Prekni + poshtë djathtas që të gjeni të tilla ekzistuese ose që të nisni një tuajën.Reagime
- Pajtohem
- E pëlqej
+ Pajtohem
+ E pëlqejShtoni ReagimShihni ReagimeReagime
@@ -1505,8 +1494,8 @@
Filtrojini sipas emrash përdoruesish ose ID-sh…Po hyhet në dhomë…Shihni Historik Përpunimesh
- Shqyrtojeni
- Hidhe poshtw
+ Shqyrtojeni
+ Hidhe poshtwQë të vazhdohet, lypset të pranoni Kushtet e këtij shërbimi.Kushte ShërbimiShqyrtoni Kushtet
@@ -1514,8 +1503,8 @@
Përdorni robotë, ura, widget-e dhe paketa ngjitësishLexoni teAsnjë
- Shfuqizoje
- Shkëputu
+ Shfuqizoje
+ ShkëputuS’ka shërbyes identitetesh të formësuar.Thirrja dështoi për shkak shërbyesi të keqformësuarQë thirrjet të funksionojnë në mënyrë të qëndrueshme, ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj Home (%1$s) të formësojë një shërbyes TURN.
@@ -1943,22 +1932,13 @@
Ky sesion është i besuar për shkëmbim të sigurt të mesazheve, ngaqë e verifikoi %1$s (%2$s):Gatit CrossSigningZeroji Kyçet
- Thuaje mbërritëm! A shfaq %s të njëjtën mburojë\?
+ Thuaje mbërritëm! A shfaq %s një shenjë\?JoHumbi lidhja me shërbyesinEmër përdoruesi%s i verifikuarMjete ZhvilluesiTë dhëna Llogarie
-
- %d votë
- %d vota
-
-
- %d votë - Përfundimet finale
- %d vota - Përfundimet finale
-
- Mundësi e PërzgjedhurKrijoni një pyetësor të thjeshtëPërdorni Frazëkalim Rikthimesh ose KyçNëse s’hyni dot në një sesion ekzistues
@@ -2041,7 +2021,7 @@
Fshehtëzim jo i aktivizuarFshehtëzimi i përdorur nga kjo dhomë nuk mbulohet%s krijoi dhe formësoi dhomën.
- Thuajse mbërritëm! A shfaq pajisja juaj tjetër të njëjtën mburojë\?
+ Thuajse mbërritëm! A shfaq pajisja juaj tjetër një shenjë\?Thuajse mbërritëm! Po pritet për ripohim…Po pritet për %s…S’u arrit të importohen kyçe
@@ -2086,7 +2066,7 @@
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- ose një tjetër klient Matrix i aftë për <em>cross-signing</em
+ ose një tjetër klient Matrix i aftë për <em>cross-signing</emPërdorni ${app_name}-in më të ri në pajisjet tuaja të tjera:Mbulohet vetëm për dhoma të fshehtëzuaraPërdorni %1$s tuaj ose përdorni %2$s tuaj që të vazhdohet.
@@ -2159,9 +2139,9 @@
Jepni URL-në e një shërbyesi identiteteshParashtrojeHap termat e %s
- Luaje
- Pauzë
- Hidhe poshtë
+ Luaje
+ Pauzë
+ Hidhe poshtëS’keni leje të nisni një thirrje konferencë në këtë dhomëS’keni leje të nisni thirrje në këtë dhomëKa tashmë një konferencë në ecuri e sipër!
@@ -2277,7 +2257,6 @@
Nëse s’e dini fjalëkalimin, kthehuni mbrapsht që ta ricaktoni.NgjitësPyetësor
- Butona RobotiReagoi me: %sPërfundim VerifikimiVeprime Përgjegjësi
@@ -2663,8 +2642,6 @@
Njëkohësimi fillestar:
\nPo pritet për përgjigje nga shërbyesi…Hapësirat janë mënyra për të grupuar dhoma dhe persona.
- Sinjalizimi lyp mbulim nga shërbyesi dhe version eksperimental dhome
- Hapësirë Eksperimentale - Dhomë e Kufizuar.Jeni ftuarMirë se vini te Hapësira!Shtoni dhoma ekzistuese dhe hapësira
@@ -2689,7 +2666,7 @@
Do të jenë në gjendje të eksplorojnë %sFtojeni në %sJepuni lidhjen
- Ftoni përmes emri përdoruesi
+ Ftoni përmes emri përdoruesiFtoni përmes email-iVetëm ju, hëpërhë. %s do të jetë edhe më mirë me të tjerë.Ftoni njerëz
@@ -2948,7 +2925,7 @@
Ftoni me email, gjeni kontakte, etj…Përfundo ujdisjen e zbulimit.Aktualisht nuk përdorni ndonjë shërbyes identitetesh. Që të ftoni shokë të ekipit dhe të jeni i zbulueshëm prej tyre, formësoni një të tillë më poshtë.
- Ftoni me emër përdoruesi ose email
+ Ftoni me emër përdoruesi ose emailSigurohuni se te %s e shoqërisë kanë hyrje personat e duhur. Më vonë mund të ftoni të tjerë.Cilët janë shokët tuaj të ekipit\?Shtoni te Hapësira e dhënë
@@ -3019,4 +2996,54 @@
Është bërë dalja nga sesioni!U dol nga dhoma!Jo tani
+ Jeni i sigurt se doni të hiqet ky pyetësor\? Po u hoq, s’do të jeni në gjendje ta rimerrni.
+ Hiqe pyetësorin
+ Pyetësori përfundoi
+ U votua
+ Aktivizo Pyetësorë
+ Përfundoje pyetësorin
+ Kjo do t’ua bëjë njerëzve të pamundur të votojnë dhe do të shfaqë rezultatet përfundimtare të pyetësorit.
+ Të përfundohet pyetësori\?
+ Përfundoje pyetësorin
+
+ Rezultati përfundimtar, bazua në %1$d votë
+ Rezultati përfundimtar, bazua në %1$d vota
+
+
+ Bazuar në %1$d votë
+ Bazuar në %1$d vota
+
+
+ %1$d votë
+ %1$d vota
+
+ Jo i passhëm
+ Pyetësor
+ Rregullime sistemi
+ Versione
+ Merrni ndihmë për përdorimin e Element-it
+ Ndihmë dhe asistencë
+ Ndihmë
+ Ligjore
+ Ky shërbyes nuk jep ndonjë palë rregullash.
+ Biblioteka prej palësh të treta
+ Rregulla të shërbyesit tuaj të identiteteve
+ Rregulla të shërbyesit tuaj Home
+ Rregulla për ${app_name}
+ Këtë mund të çaktivizoni në çfarëdo kohe, që nga rregullimet
+ Nuk u japin hollësi palëve të treta
+ Nuk regjistrojmë ose profilizojmë ndonjë të dhënë llogarie
+ këtu
+ Ndihmonani të identifikojmë probleme dhe të përmirësojmë Element-in, duke ndarë me ne të dhëna anonime përdorimi. Për të kuptuar se si i përdorin njerëzit disa pajisje njëherësh, do të prodhojmë një identifikues kuturu, të përbashkët për pajisjet tuaja.
+\n
+\nMund të lexoni krejt kushtet tona %s.
+ Ndihmoni të përmirësohet Element-in
+ Aktivizoje
+
+ S’ka vota të hedhura
+ %1$d votë e hedhur. Votoni, që të shihni përfundimet
+
+ Që ndryshimi të hyjë në fuqi, rinisni aplikacionin.
+ Aktivizo elementë LaTeX për matematikë
+ S’keni leje të hyni në këtë dhomë
\ No newline at end of file
diff --git a/vector/src/main/res/values-sr/strings.xml b/vector/src/main/res/values-sr/strings.xml
index 065fd3154b6..e43d7bce245 100644
--- a/vector/src/main/res/values-sr/strings.xml
+++ b/vector/src/main/res/values-sr/strings.xml
@@ -67,7 +67,7 @@
Мрежна грешкаНеуспело слање сликеНе могу да пошаљем поруку
- Уређај пошиљаоца није нам послао кључеве за ову поруку.
+ Уређај пошиљаоца није нам послао кључеве за ову поруку.Изменили сте ниво снаге корисника %1$s.посебнопосебно (%1$d)
@@ -300,21 +300,21 @@
Изгубићете приступ вашим шифрованим порукама уколико не направите резервну копију кључева пре него што се одјавите.Учитавам…У реду
- Откажи
- Сачувај
- Напусти
- Остани
- Пошаљи
- Пошаљи поново
- Уклони
- Подели
- Прихвати
- Прескочи
+ Откажи
+ Сачувај
+ Напусти
+ Остани
+ Пошаљи
+ Пошаљи поново
+ Уклони
+ Подели
+ Прихвати
+ ПрескочиГотово
- Обустави
- Игнориши
- Прегледај
- Одбаци
+ Обустави
+ Игнориши
+ Прегледај
+ ОдбациИзађиРадњеОдјави се
@@ -327,7 +327,7 @@
Означи као прочитаноОтвориЗатвори
- Искључи
+ ИскључиПотврдаУпозорењеГрешка
@@ -368,26 +368,26 @@
Врати се на екран за пријавуПошаљиПошаљи е-пошту за ресет
- Преименуј
- Обриши
+ Преименуј
+ ОбришиПогледај дешифрован изворПогледај извор
- Напред
+ НапредКасније
- Очисти
- Говори
- Преузми
- Цитирај
+ Очисти
+ Говори
+ Преузми
+ ЦитирајЛиценце треће странеДетаљи о заједнициОслушкујем догађањасистемскаШифрована порука
- Пусти
+ ПустиАктиван позивПријави садржај
- Искључи се
- Повуци
+ Искључи се
+ ПовуциНиштаРезервна копијаУпотребите %1$s или %2$s да наставите.
@@ -434,7 +434,7 @@
ОдбациПрихватиВан везе
- Позивница
+ ПозивницаилиСвеједно пошаљиСвеједно позови
@@ -447,9 +447,9 @@
ВидеоГласПочни ћаскање
- Ресет
- Одбаци
- Паузирај
+ Ресет
+ Одбаци
+ ПаузирајНеуспешно иницијализовање камереВеза није успелаДописник није одговорио.
@@ -706,10 +706,10 @@
Синхронизација…Отвори заглављеЛиста чланова
- Одбаци
- Преглед
- Придружи се
- Избриши
+ Одбаци
+ Преглед
+ Придружи се
+ ИзбришиНаставиПослати одговор (НЕшифрован)…Послати шифрован дговор…
diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml
index 9d880aaa701..1a512fd842a 100644
--- a/vector/src/main/res/values-sv/strings.xml
+++ b/vector/src/main/res/values-sv/strings.xml
@@ -99,7 +99,7 @@
%1$s ändrade behörighetsnivå för %2$s.%1$s från %2$s till %3$s** Kan inte avkryptera: %s **
- Avsändarens enhet har inte gett oss nycklarna för det här meddelandet.
+ Avsändarens enhet har inte gett oss nycklarna för det här meddelandet.Kunde inte döljaKunde inte skicka meddelandetMisslyckades att ladda upp bilden
@@ -295,28 +295,28 @@
TredjepartslicenserLaddar…OK
- Avbryt
- Spara
- Lämna
- Stanna
- Skicka
- Skicka igen
- Ta bort
- Citera
- Ladda ner
- Dela
- Prata
- Rensa
+ Avbryt
+ Spara
+ Lämna
+ Stanna
+ Skicka
+ Skicka igen
+ Ta bort
+ Citera
+ Ladda ner
+ Dela
+ Prata
+ RensaSenare
- Vidarebefordra
+ VidarebefordraPermanent länkVisa källkodVisa avkrypterad källkod
- Radera
- Döp om
+ Radera
+ Döp omIngen
- Återkalla
- Koppla ifrån
+ Återkalla
+ Koppla ifrånRapportera innehållAktivt samtalPågående gruppsamtal.
@@ -333,15 +333,15 @@
Ring ändåSkicka ändåeller
- Bjud in
+ Bjud inBortkopplad
- Godkänn
- Hoppa över
+ Godkänn
+ Hoppa överFärdig
- Avbryt
- Ignorera
- Granska
- Avslå
+ Avbryt
+ Ignorera
+ Granska
+ AvslåAvslutaHandlingarLogga ut
@@ -356,7 +356,7 @@
ÖppnaStängKopierat till klippbordet
- Stäng av
+ Stäng avBekräftelseVarningFel
@@ -580,10 +580,10 @@
JANEJFortsätt
- Ta bort
- Gå med
- Förhandsvisning
- Avslå
+ Ta bort
+ Gå med
+ Förhandsvisning
+ AvslåLista medlemmarÖppna rubrikSynkroniserar…
@@ -647,7 +647,6 @@
IgnoreraFiltrera rumsmedlemmarRUM
- RUM%d rum%d rum
@@ -1062,9 +1061,9 @@
Nuvarande språkAndra tillgängliga språkLaddar tillgängliga språk…
- Spela
- Pausa
- Avfärda
+ Spela
+ Pausa
+ AvfärdaKopieraFramgångAviseringar
@@ -1292,16 +1291,6 @@
SökInga resultatMEDDELANDEN
- GÅ MED
- KATALOG
- FAVORITER
- LÅG PRIORITET
- INBJUDNINGAR
- Starta chatt
- Skapa rum
- Gå med i rum
- Gå med i ett rum
- Skriv ett rums-ID eller ett rumsaliasBläddra i katalogenSöker i katalog…Favorit
@@ -1566,7 +1555,7 @@
Förhindra skärmdumpar av appenAtt aktivera den här inställningen lägger till FLAG_SECURE till alla aktiviteter. Starta om appen för att inställningen ska få effekt.Använd senaste ${app_name} på dina andra enheter; ${app_name} Web, ${app_name} iOS, ${app_name} för Android, eller annan Matrixklient som stöder korssignering
- eller en annan Matrixklient som städer korssignering
+ eller en annan Matrixklient som städer korssigneringAnvänd senaste ${app_name} på dina andra enheter:Tvingar den nuvarande utgående gruppsessionen i ett krypterat rum att kasserasSäkerhetskopian kunde inte avkrypteras med den här återställningsnyckeln: vänligen verifiera att du skrev in rätt återställningsnyckel.
@@ -1925,8 +1914,8 @@
Kom ikapp med olästa meddelanden härKonversationerReaktioner
- Acceptera
- Gilla
+ Acceptera
+ GillaLägg till reaktionVisa reaktionerReaktioner
@@ -2184,15 +2173,6 @@
NejAnslutningen till servern har tappatsFlygplansläge är på
-
- %d röst
- %d röster
-
-
- %d röst - Slutgiltigt resultat
- %d röster - Slutgiltigt resultat
-
- Valt alternativSkapar en enkel omröstningAnvänd en återställningslösenfras eller -nyckelNy inloggning
@@ -2371,7 +2351,6 @@
Visa statushändelser angående rumsmedlemmarInkluderar när personer bjuds in, går med, lämnar, kickas, bannas eller byter sin avatar eller sitt namn.Omröstning
- BottknapparReagerade med: %sVerifieringsavslutningLänken var felformaterad
@@ -2431,7 +2410,7 @@
Filtrera bannade användareDu har inte behörighet att starta ett samtalDu har inte behörighet att starta ett gruppsamtal
- Återställ
+ ÅterställÄmneFörkasta ändringarDet finns osparade ändringar. Förkasta ändringarna\?
@@ -2711,7 +2690,7 @@
Föreslagna rumBjud in till %sDela länk
- Bjud in med användarnamn
+ Bjud in med användarnamnBjud in via e-postDet är bara du här för tillfället. %s kommer att vara ännu bättre med fler.Bjud in personer till ditt utrymme
@@ -2731,8 +2710,6 @@
Hoppa över för tillfälletGå med i mitt utrymme %1$s %2$sDe kommer inte att bli en del av %s
- Varning kräver serverstöd och experimentell rumsversion
- Experimentellt utrymme - Begränsat rum.Du är inbjudenUtrymmen är ett nytt sätt att gruppera rum och personer.Välkommen till utrymmen!
@@ -3002,7 +2979,7 @@
Bjud in med e-post, hitta kontakter och mer…Slutför inställning av upptäckbarhet.Du använder för närvarande ingen identitetsserver. För att bjuda in teammedlemmar och kunna upptäckas av dem, konfigurera en nedan.
- Bjud in med användarnamn eller e-postadress
+ Bjud in med användarnamn eller e-postadressOtillgängligOfflineOnline
@@ -3032,4 +3009,50 @@
Inte nuFör att hitta existerande kontakter så behöver du skicka kontaktinfo (e-postadresser och telefonnummer) till din identitetsserver. Vi hashar din data innan den skickas av sekretesskäl.Går du med på att skicka den här infon\?
+ Du kan stänga av detta när som helst i inställningarna
+ Vi delar inte information med tredje parter
+ Vi spelar inte in eller profilerar någon kontodata
+ här
+ Hjälp oss att identifiera problem och förbättra Element genom att dela anonym användningsdata. För att förstå hur personer använder multipla enheter så generar vi en slumpmässig identifierare som delas mellan dina enheter.
+\n
+\nDu kan läsa alla våra villkor %s.
+ Hjälp att förbättra Element
+ Aktivera
+ Är du säker på att du vill ta bort den här omröstningen\? Du kommer inte kunna få tillbaka den när den har tagits bort.
+ Ta bort omröstning
+ Omröstning avslutad
+ Röst avgiven
+ Aktivera omröstningar
+ Avsluta omröstningen
+ Det här kommer att stoppa personer från att rösta och visa det slutgiltiga resultatet av omröstningen.
+ Avsluta den här omröstningen\?
+ vinnande alternativ
+ Avsluta omröstning
+
+ Slutgiltigt resultat baserat på %1$d röst
+ Slutgiltigt resultat baserat på %1$d röster
+
+
+ Baserat på %1$d röst
+ Baserat på %1$d röster
+
+
+ %1$d röst
+ %1$d röster
+
+ Systeminställningar
+ Versioner
+ Få hjälp med att använda Element
+ Hjälp och support
+ Hjälp
+ Legalt
+ Den här servern förser ingen policy.
+ Tredjepartsbibliotek
+ Din identitetsservers policy
+ ${app_name}s policy
+ Din hemservers policy
+
+ %1$d röst avgiven. Rösta för att se resultatet
+ %1$d röster avgivna. Rösta för att se resultatet
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-szl/strings.xml b/vector/src/main/res/values-szl/strings.xml
index e060344ae4c..ad3e626685b 100644
--- a/vector/src/main/res/values-szl/strings.xml
+++ b/vector/src/main/res/values-szl/strings.xml
@@ -1,32 +1,32 @@
- Zawrzij
- Strzim
- Ôdtwōrz
+ Zawrzij
+ Strzim
+ ÔdtwōrzAktywne połōnczynieZgłoś zawartość
- Rozłōncz
- Ôdkoż
+ Rozłōncz
+ ÔdkożBrak
- Przemianuj
- Skasuj
+ Przemianuj
+ SkasujPokoż ôdszyfrowane zdrzōdłoPokoż zdrzōdłoBezpostrzedni link
- Przekoż
+ PrzekożNiyskorzij
- Wymaż
- Godej
- Udostympnij
- Pobier
- Cytuj
- Wymaż
- Wyślij zaś
- Wyślij
- Ôstōń
- Pociep
- Spamiyntej
- Pociep
+ Wymaż
+ Godej
+ Udostympnij
+ Pobier
+ Cytuj
+ Wymaż
+ Wyślij zaś
+ Wyślij
+ Ôstōń
+ Pociep
+ Spamiyntej
+ PociepOKWgrowanie…Licyncyje podmiotōw trzecich
diff --git a/vector/src/main/res/values-te/strings.xml b/vector/src/main/res/values-te/strings.xml
index 14232e65eba..ffe6c1d5a53 100644
--- a/vector/src/main/res/values-te/strings.xml
+++ b/vector/src/main/res/values-te/strings.xml
@@ -38,7 +38,7 @@
%2$sకోసం %1$s ఆహ్వానాన్ని అంగీకరించారు** వ్యక్తీకరించడానికి సాధ్యం కాలేదు: %s **
- ఈ సందేశానికి పంపేవారి పరికరం మాకు కీలను పంపలేదు.
+ ఈ సందేశానికి పంపేవారి పరికరం మాకు కీలను పంపలేదు.గది స్క్రీన్సందేశం పంపడం సాధ్యం కాలేదు
@@ -69,32 +69,32 @@
గదిఅలాగేసభ్యుని వివరాలు
- దాచు
+ దాచుసంకేతపదం మరచిపోయారా?
- పంపు
- చెరిపేయి
- పంచుకొను
- తొలగించు
- ఆహ్వానము
+ పంపు
+ చెరిపేయి
+ పంచుకొను
+ తొలగించు
+ ఆహ్వానముతెరువుచారిత్రిక
- వదిలివేయు
- తిరిగిపంపు
+ వదిలివేయు
+ తిరిగిపంపుసందేశాలుఅమరికలు
- రద్దుచేయి
+ రద్దుచేయితరువాతమూలాన్ని వీక్షించండి
- పేరు మార్చండి
+ పేరు మార్చండికాల్ను ప్రారంభించలేరు, దయచేసి తరువాత ప్రయత్నించండిపరికర సమాచారంలేదావిడియో కాల్మూసివేయుక్లిప్బోర్డ్కు నకలు చేయబడింది
- అచేతనపరచు
+ అచేతనపరచునిర్ధారణహెచ్చరిక
@@ -133,8 +133,8 @@
బగ్ నివేదికదయచేసి బగ్ను వివరించండి. మీరు ఎం చేసారు? మీరు ఏమి జరిగే అవకాశము ఉందనుకున్నారు? వాస్తవానికి ఏం జరిగింది?ఇక్కడ మీ సమస్యను వివరించండి
- కోట్
- ముందుకు
+ కోట్
+ ముందుకుపెర్మాలింక్డెక్రిప్టెడ్ మూలాన్ని చూడండినివేదిక వివరాలు
@@ -253,9 +253,9 @@
కాదుకొనసాగించండి
- తీసివేయి
- చేరండి
- తిరస్కరించు
+ తీసివేయి
+ చేరండి
+ తిరస్కరించుమొదటి చదవని సందేశానికి వెళ్ళు.
@@ -348,17 +348,6 @@
ప్రజలుదస్త్రాలు
- చేరు
- డైరెక్టరీ
- గదులు
- తక్కువ ప్రాధాన్యత
- ఆహ్వానాలు
- చాట్ ప్రారంభించండి
- గదిని సృష్టించండి
- గదిలో చేరండి
- ఒక గదిలో చేరండి
- ఒక గది id లేదా ఒక గది alias టైప్ చేయండి
-
డైరెక్టరీలో విహరించండిడైరెక్టరీని వెతుకుతున్నాం..
@@ -559,7 +548,7 @@
"మీ కెమెరాను మరియు మీ శబ్ద ప్రసారిణి సాంగత్యం చేయడానికి రియోట్కు అనుమతి అవసరం.
\n
\nదయచేసి పిలుపు చేయడానికి వీలుగా తదుపరి పాప్-అప్ల్లో ప్రాప్యతను అనుమతించండి."
- ప్రత్యేక ప్రదర్శన
+ ప్రత్యేక ప్రదర్శనఇది ఈ గది యొక్క పరిదృశ్యం. గది పరస్పర చర్యలు నిలిపివేయబడ్డాయి.ఇది సరిపోలితే, దిగువ ధృవీకరించు బటన్ను నొక్కండి. అది కాకపోతే, అప్పుడు ఎవరో ఈ పరికరాన్ని అడ్డుకుంటున్నారు మరియు మీరు బహుశా బ్లాక్ బటన్ను నొక్కాలనుకుంటున్నారు.
diff --git a/vector/src/main/res/values-th/strings.xml b/vector/src/main/res/values-th/strings.xml
index 091dc268a08..fef5de04717 100644
--- a/vector/src/main/res/values-th/strings.xml
+++ b/vector/src/main/res/values-th/strings.xml
@@ -4,7 +4,7 @@
หรือเปิดปิด
- ปิดใช้งาน
+ ปิดใช้งานคำเตือนอ่านแล้วข้าม
@@ -16,23 +16,23 @@
การตั้งค่ารายละเอียดสมาชิกตกลง
- ยกเลิก
- บันทึก
- ออก
- ส่ง
- ดาวน์โหลด
- แบ่งปัน
- พูด
- ลบ
- เปลี่ยนชื่อ
- ข้าม
+ ยกเลิก
+ บันทึก
+ ออก
+ ส่ง
+ ดาวน์โหลด
+ แบ่งปัน
+ พูด
+ ลบ
+ เปลี่ยนชื่อ
+ ข้ามส่งสติ๊กเกอร์กำลังโหลด…
- ส่งต่อ
+ ส่งต่อไม่มีรายงานเนื้อหา
- เล่น
- หยุดชั่วคราว
+ เล่น
+ หยุดชั่วคราวเสียงวิดีโอหน้าหลัก
@@ -141,26 +141,26 @@
วางสายปฏิเสธยอมรับ
- ปฏิเสธ
- เพิกเฉย
+ ปฏิเสธ
+ เพิกเฉยเสร็จสิ้น
- ยอมรับ
+ ยอมรับออฟไลน์
- เชิญ
+ เชิญข้อมูลเซสชั่นไม่สามารถเริ่มการโทรเริ่มการประชุมเสียงเริ่มการประชุมวิดีโอเริ่มแชท
- รีเซ็ต
- ปิด
- เลิกเชื่อมต่อ
+ รีเซ็ต
+ ปิด
+ เลิกเชื่อมต่อดูต้นฉบับที่ถอดรหัสแล้วดูต้นฉบับภายหลัง
- เอาออก
- ส่งใหม่
- อยู่
+ เอาออก
+ ส่งใหม่
+ อยู่สำรองข้อมูลคุณแน่ใจหรือไม่\?รายละเอียดชุมชน
@@ -173,7 +173,6 @@
%d ห้อง
- เข้าร่วมยังไม่รองรับการค้นหาในห้องที่เข้ารหัสไฟล์ผู้คน
@@ -244,9 +243,9 @@
ห้องไปที่ข้อความแรกที่ยังไม่ได้อ่านแสดงรายชื่อสมาชิก
- ปฏิเสธ
- แสดงตัวอย่าง
- เข้าร่วม
+ ปฏิเสธ
+ แสดงตัวอย่าง
+ เข้าร่วมดำเนินการต่อไม่ใช่
@@ -262,7 +261,7 @@
ส่งข้อความเสียงเฉพาะรายชื่อผู้ติดต่อ Matrixไม่มีห้องสาธารณะ
- ยกเลิก
+ ยกเลิกทำเครื่องหมายทั้งหมดว่าอ่านแล้ว%1$s ได้ส่งสติ๊กเกอร์คุณได้ส่งสติ๊กเกอร์
@@ -289,12 +288,6 @@
ลงทะเบียนกำลังค้นหาไดเรกทอรี…เรียกดูไดเรกทอรี
- เข้าร่วมห้อง
- เข้าร่วมห้อง
- สร้างห้อง
- เริ่มแชท
- ห้อง
- ไดเรกทอรีเข้าร่วมแล้วไดเรกทอรีผู้ใช้ (%s)ทำให้เป็นผู้ดูแล
@@ -306,10 +299,9 @@
ส่งไฟล์ไดเรกทอรีผู้ใช้
- ล้าง
+ ล้างกำลังซิงค์…
- เอาออก
- รายการโปรด
+ เอาออกรหัสผ่านเปลี่ยนรหัสผ่านเส้นเวลา
diff --git a/vector/src/main/res/values-tlh/strings.xml b/vector/src/main/res/values-tlh/strings.xml
index 0f7f1ac8e92..4cefe5a9e4c 100644
--- a/vector/src/main/res/values-tlh/strings.xml
+++ b/vector/src/main/res/values-tlh/strings.xml
@@ -20,21 +20,21 @@
vIcha\'rupbeHmoHltaH…luq
- qIl
- choq
- mej
- ngeH
- ngeHqa\'
- jatlhqa\'
- lI\'
- bon
- jatlh
- HuvmoH
+ qIl
+ choq
+ mej
+ ngeH
+ ngeHqa\'
+ jatlhqa\'
+ lI\'
+ bon
+ jatlh
+ HuvmoHSIbI\'Ha\'Hal leghSo\'be\'lu\'bogh Hal legh
- Qaw\'
- pongqa\'
+ Qaw\'
+ pongqa\'QumchuqtaHghoghmIllogh
@@ -45,7 +45,7 @@
jIrI\'laHbe\'jan De\'ghap
- ruSvep ngeH
+ ruSvep ngeHQu\'Qagh ja\'
@@ -66,7 +66,7 @@
mejchu\'Dat nej
- Qotlh
+ Qotlhnuvpu\'pa\'mey
@@ -147,7 +147,7 @@
ja\'chuq \'e\' mevnaDev ja\'chuqqa\'pa\'vamDaq ja\'chuqqa\'
- Qaw\'
+ Qaw\'Qagh ja\'Qagh yIDel! nuq DanID? nuq DapIH? qaS nuq?Qagh tu\'meH, janvamvo\' Qagh De\' ghajboghQonoSmey ngeHlu\'. Qaghvam De\', QonoS, jIH mIllogh je leghlaHbe\' vay\'. Dung ngutlhmey neH ngeH DaneHchugh, \'aplo\'vam yISIj:
diff --git a/vector/src/main/res/values-tr/strings.xml b/vector/src/main/res/values-tr/strings.xml
index 6fc2a5a7382..de0762f3cff 100644
--- a/vector/src/main/res/values-tr/strings.xml
+++ b/vector/src/main/res/values-tr/strings.xml
@@ -16,27 +16,27 @@
Topluluk ayrıntılarıYükleniyor…Tamam
- İptal
- Kaydet
+ İptal
+ KaydetOkunmamış ilk mesaja git.Çıkartma gönder3. parti lisansları
- Ayrıl
- Gönder
- Tekrar gönder
- Sil
- Alıntı
- İndir
- Paylaş
- Konuş
- Temizle
+ Ayrıl
+ Gönder
+ Tekrar gönder
+ Sil
+ Alıntı
+ İndir
+ Paylaş
+ Konuş
+ TemizleSonra
- İleri
+ İleriKalıcı bağlantıKaynağı İnceleDeşifre Edilmiş Kaynağı İncele
- Sil
- Yeniden Adlandır
+ Sil
+ Yeniden Adlandırİçeriği bildirŞu anki görüşmeDevam eden konferans görüşmesi.
@@ -51,7 +51,7 @@
Konferans görüşmeleri şifreli (encrypted) odalarda desteklenmiyorNe olursa olsun gönderveya
- Davet et
+ Davet etÇevrimdışıÇıkAksiyonlar
@@ -65,7 +65,7 @@
AçKapaPanoya kopyalandı
- Etkisizleştir
+ EtkisizleştirOnayUyarıEv
@@ -159,13 +159,13 @@
Emin misiniz?YedekleOturumu kapatmadan önce anahtarlarınızı yedeklemezseniz şifrelenmiş mesajlarınıza erişiminizi kaybedeceksiniz.
- Kal
+ KalEksik izinler nedeniyle bu eylem mümkün değil.Yine de Ara
- Kabul Et
- Atla
+ Kabul Et
+ AtlaTamamlandı
- İptal Et
+ İptal EtOturumunuzu kapatmak istediğinizden emin misiniz?Anahtarlar yedekleniyor…Tüm anahtarlar yedeklendi
@@ -309,10 +309,10 @@
EVETHAYIRDevam et
- Sil
- Katıl
- Önizleme
- Reddet
+ Sil
+ Katıl
+ Önizleme
+ ReddetÜyeleri ListeleBaşlık AçEşzamanlanıyor…
@@ -447,17 +447,6 @@
MESAJLARKİŞİLERDOSYALAR
- KATIL
- DİZİN
- FAVORİLER
- ODALAR
- DÜŞÜK ÖNCELİK
- DAVETLER
- Sohbet başlat
- Oda oluştur
- Odaya katıl
- Bir odaya katıl
- Oda ID\'si ya da takma adı girinDizinlere gözat1 oda
@@ -1062,11 +1051,11 @@
Hizmet başlatılıyorOturumu doğrulaHiç (Yok)
- Geri Al
- Bağlantıyı Kes
- Yoksay
- Gözden Geçir
- Reddet
+ Geri Al
+ Bağlantıyı Kes
+ Yoksay
+ Gözden Geçir
+ ReddetOkunmuş olarak işaretleArama yanlış yapılandırılmış sunucudan dolayı başarısız oldu%s kullanmayı deneyin
@@ -1234,8 +1223,8 @@
OdalarOdalar burada görünecek. Mevcut odaları görmek ya da kendi odanızı kurmak için aşağıdan + butonuna tıklayın.Tepkiler
- Bencede
- Beğendim
+ Bencede
+ BeğendimBir Tepki EkleTekpileri GörüntüleTepkiler
@@ -1270,9 +1259,9 @@
Batarya için optimize edildiUygulama arka plandayken gelen mesajlar için uyarılmayacaksınız.Ayarlar güncellenemedi.
- Oynat
- Durdur
- Kapat
+ Oynat
+ Durdur
+ KapatKopyalaBaşarılıBildirimler
@@ -1430,7 +1419,7 @@
Bu odada konferans görüşmesi başlatma izniniz yokBu odada arama başlatma izniniz yokSohbet etmeye başla
- Sıfırla
+ SıfırlaSistem Varsayılan TemasıBekleniyorÖneriler
diff --git a/vector/src/main/res/values-tzm/strings.xml b/vector/src/main/res/values-tzm/strings.xml
index 3566c14f0d0..7ac06c77bba 100644
--- a/vector/src/main/res/values-tzm/strings.xml
+++ b/vector/src/main/res/values-tzm/strings.xml
@@ -39,7 +39,6 @@
DɣerAzenTuzinin
- LKEMIFUYLARzuIfuyla
@@ -50,8 +49,8 @@
%das%das
- Agy
- Lkem
+ Agy
+ LkemUHUYAHAɣuri…
@@ -66,21 +65,21 @@
ṚẓemTigawinFfeɣ
- Agy
- Ɣer
+ Agy
+ ƔerneɣAfidyu
- Ɣer
- Kkes
- Sfeḍ
- Ssiwel
- Bḍu
- Agem
- Ssifeḍ
- Azen
- Ffeɣ
- Ḥḍu
- Sser
+ Ɣer
+ Kkes
+ Sfeḍ
+ Ssiwel
+ Bḍu
+ Agem
+ Ssifeḍ
+ Azen
+ Ffeɣ
+ Ḥḍu
+ SserWAXAsali…Tuzend yat twellaft.
@@ -94,11 +93,11 @@
AzenAsentemAgy
- Ttu
- Agy
+ Ttu
+ AgyAwd yan
- Sfeḍ
- Qqim
+ Sfeḍ
+ QqimTegdeld %1$sigdel %1$s %2$sTeɣrid-d i %1$s
diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml
index dff85c08a8d..4ad5ceae606 100644
--- a/vector/src/main/res/values-uk/strings.xml
+++ b/vector/src/main/res/values-uk/strings.xml
@@ -4,7 +4,6 @@
%1$s надсилає зображення.%s запрошення%1$s запрошує %2$s
-
Запрошення від %sЗапрошення до кімнати%1$s і %2$s
@@ -45,7 +44,7 @@
%1$s надсилає запрошення %2$s приєднатися до кімнати%1$s приймає запрошення до %2$s** Неможливо розшифрувати: %s **
- Пристрій відправника не надіслав нам ключ для цього повідомлення.
+ Пристрій відправника не надіслав нам ключ для цього повідомлення.Не вдається редагуватиНе вдалося надіслати повідомленняНе вдалося завантажити зображення
@@ -173,37 +172,33 @@
Ви відкликали запрошення для %1$sВи заблокували %1$sВи заблокували %1$s
-
Світла ТемаТемна ТемаOLED Тема
-
Синхронізація…Стеження за подіями
-
ПовідомленняКімнатаНалаштуванняІнформація про учасникаІсторіяЗвіт про ваду
-
Гаразд
- Скасувати
- Зберегти
- Вийти
- Надіслати
- Надіслати ще раз
- Прибрати
- Цитувати
- Поділитися
+ Скасувати
+ Зберегти
+ Вийти
+ Надіслати
+ Надіслати ще раз
+ Прибрати
+ Цитувати
+ ПоділитисяПізніше
- Переслати
+ ПереслатиПостійне посиланняПереглянути початковий кодПереглянути розшифроване джерело
- Видалити
- Перейменувати
+ Видалити
+ ПерейменуватиПоскаржитись на вмістАктивний викликВідбувається конференц-дзвінок.
@@ -216,11 +211,10 @@
Не вдалося здійснити викликІнформація про пристрійКонференц-дзвінки не підтримуються у зашифрованих кімнатах
- Все одно надіслати
+ Усе одно надіслатиабо
- Запрошення
+ ЗапрошенняНе в мережі
-
Вийти з облікового записуГолосовий викликВідеовиклик
@@ -231,24 +225,19 @@
ВідкритиЗакритиСкопійовано до буфера обміну
- Вимкнути
-
+ ВимкнутиПідтвердженняПопередження
-
ДомівкаОбраніЛюдиКімнати
-
Пошук кімнатПошук обранихПошук людейПошук кімнат
-
ЗапрошенняНеважливі
-
БесідиЛокальні контактиКаталог користувачів
@@ -256,7 +245,6 @@
Немає бесідВи не надали ${app_name} доступу до контактівНемає результатів
-
КімнатиКаталог кімнатКімнати відсутні
@@ -293,7 +281,6 @@
Здійснити відеовикликНадсилання файлівЗняти світлину чи відео
-
УвійтиРеєстраціяНадіслати
@@ -337,7 +324,6 @@
На адресу %s надіслано електронний лист. Як тільки ви перейдете за посиланням у ньому, натисніть нижче.Не вдалося перевірити email: переконайтеся, що ви перейшли за посиланням у листіПароль скинуто.\n\nВсі ваші пристрої деаутентифіковано, а ви більше не отримаєте push-сповіщень. Щоб увімкнути їх, залогуйтеся знову на всіх пристроях.
-
URL має починатися з http[s]://Збій входу: Мережева помилкаЗбій входу
@@ -352,28 +338,20 @@
Надіслано забагато запитівІм\'я користувача вже використовуєтьсяВи не перейшли за посиланням в електронному листі
-
-
- Перегляд списку вступників
-
-
+ Список міток прочитанняНадіслати як ОригіналВеликийСереднійМалий
-
"Скасувати завантаження?Скасувати відвантаження?%d с%1$dхв %2$dс
-
ВчораСьогодні
-
Назва кімнатиТема кімнати
-
Виклик з\'єднаноВстановлюється з\'єднання…Виклик завершено
@@ -386,10 +364,8 @@
Медіавиклик не вдавсяНеможливо ініціювати камеруДзвінок прийнято іншим пристроєм
-
Зняти світлину чи відео"Не вдалося записати відео"
-
ІнформаціяДля передачі та збереження вкладень потрібен доступ до медіатеки.\n\nБудь ласка, надайте його у наступному виринаючому вікні, щоб отримати змогу надсилати файли з вашого телефону.Для зйомки та відеодзвінків необхідно мати доступ до камери.
@@ -402,30 +378,24 @@
\n
\nНадати ${app_name} доступ до ваших контактів\?Вибачте.. Дію не виконано через нестачу дозволів
-
ЗбереженоЗберегти в завантаженнях?ТАКНІПродовжити
-
- Видалити
- Приєднатися
- Попередній перегляд
- Відхилити
-
+ Видалити
+ Приєднатися
+ Попередній перегляд
+ ВідхилитиПерейти до непрочитаного
-
%s запросив(ла) вас приєднатися до цієї кімнатиЗапрошення надіслано на адресу %s, не пов\'язану з цим обліковим записом.\nВи можете увійти під іншим обліковим записом чи приєднати email до цього.Ви намагаєтесь отримати доступ до %s. Бажаєте приєднатися щоб взяти участь у обговоренні?кімнатаЦе попередній перегляд кімнати. Ви в режимі лише читання.
-
Новий ЧатДодати учасника1 учасник
-
Вийти з кімнатиВи впевнені, що хочете вийти з кімнати\?Ви впевнені, що бажаєте вилучити %s з цієї кімнати\?
@@ -453,7 +423,6 @@
Ви не зможете скасувати цю дію, оскільки надаєте користувачу той же рівень повноважень, що й у вас.
\nВи впевнені\?Ви впевнені, що бажаєте запросити %s до цієї кімнати\?
-
Запросити за IDЛокальні Контакти (%d)Каталог Користувачів (%s)
@@ -461,7 +430,6 @@
Запросити користувача за IDВведіть одну чи декілька email адрес або Matrix IDEmail або Matrix ID
-
Пошук%s друкує…%1$s & %2$s друкують…
@@ -472,12 +440,11 @@
Повідомлення не надіслані. %1$s або %2$s зараз?Повідомлення не надіслані через присутність невідомих сеансів. %1$s або %2$s зараз\?Повторити надсилання
- скасувати все
+ Скасувати всеНадіслати ненадіслані повідомлення зновуВидалити не надіслані повідомленняФайл не знайденоВи не маєте дозволу писати повідомлення у цій кімнаті.
-
ДовірятиНе довірятиВийти
@@ -489,7 +456,6 @@
Сертифікат почав відрізнятися від того, якому довіряв ваш телефон. Це ДУЖЕ НЕЗВИЧНО. Наполегливо радимо НЕ ПРИЙМАТИ цей новий сертифікат.Сертифікат змінився з довіреного на недовірений. Сервер міг оновити свій сертифікат. Зв\'яжіться з адміністратором сервера, щоб отримати дійсний відбиток.Приймайте сертифікат лише у випадку збігу відбитку вище з відбитком, оприлюдненим адміністратором сервера.
-
Деталі про кімнатуЛюдиФайли
@@ -497,14 +463,12 @@
Викривлений ID. Використовуйте email адресу або Matrix ID вигляду \'@localpart:domain\'ЗАПРОШЕНІПРИЄДНАЛИСЯ
-
Причина скарги на цей вмістБажаєте сховати всі повідомлення цього користувача\?
\n
\nЗауважте, що це перезавантажить застосунок та може тривати деякий час.Скасувати відвантаженняСкасувати завантаження
-
ПошукФільтр переліку користувачівТут порожньо
@@ -512,28 +476,13 @@
ПОВІДОМЛЕННЯЛЮДИФАЙЛИ
-
- ПРИЄДНАЛИСЯ
- КАТАЛОГ
- ОБРАНІ
- КІМНАТИ
- НЕВАЖЛИВІ
- ЗАПРОШЕННЯ
- Почати чат
- Створити кімнату
- Увійти до кімнати
- Увійти до кімнати
- Введіть id кімнати чи аліас
-
Огляд каталогуПошук у каталозі…
-
ОбранеНе терміновоОсобиста бесідаВийти з бесідиЗабути
-
ПовідомленняНалаштуванняВерсія
@@ -541,7 +490,6 @@
Примітки третіх сторінCopyrightПолітика приватності
-
АватарПоказуване ім\'яЕ-пошта
@@ -591,7 +539,6 @@
СеансиПоказувати час надсилання для всіх повідомленьПоказувати час надсилання у 12-годинному форматі
-
ТелеметріяРежим економії трафікуПро пристрій
@@ -604,7 +551,7 @@
АутентифікаціяПароль:Надіслати
- Залоговано як
+ Ви увійшли якДомашній серверСервер ідентифікаціїІнтерфейс користувача
@@ -637,42 +584,33 @@
Введіть код активаціїСталася помилка під час перевірки вашого номераКод
-
3 дні1 тиждень1 місяцьЗавжди
-
-
Світлина кімнатиНазва кімнатиТемаМітка кімнатиПозначено як:
-
УлюбленіНеважливіЖодного
-
Доступ та видимістьПоказувати кімнату в каталозіДоступПрочитність історіїХто може читати історію повідомлень?Хто має доступ до кімнати?
-
Будь-хтоЛише учасники (з моменту вибору цієї опції)Лише учасники (з моменту запрошення)Лише учасники (з моменту вступу)
-
Щоб посилатися на кімнату, вона повинна мати адресу.Лише запрошеніБудь-хто з посиланням, окрім гостівБудь-хто з посиланням, включно з гостями
-
Заблоковані користувачі
-
РозширеніВнутрішній ID кімнатиАдреси
@@ -683,7 +621,6 @@
Вийдіть з облікового запису, щоб отримати змогу увімкнути шифрування.Шифрувати лише для звірених сеансівНіколи не надсилати зашифровані повідомлення з цього сеансу незвіреним сеансам у цій кімнаті.
-
Кімната не має локальної адресиНова адреса (наприклад #foo:matrix.org)Хибний формат псевдоніма
@@ -697,11 +634,8 @@
У цій кімнаті увімкнено шифрування.У цій кімнаті вимкнено шифрування.Увімкнути шифрування \n(увага: вимкнути його неможливо!)
-
Каталог
-
%s намагався завантажити певну точку зі стрічки подій цієї кімнати, але не зміг її знайти.
-
Дані про наскрізне шифруванняІнформація про подіюID користувача
@@ -745,23 +679,19 @@
Підтвердьте, порівнявши вказане за допомогою налаштувань користувача в іншому сеансі:Якщо вони відрізняються, безпека вашого зв\'язку може бути під загрозою.Я підтверджую, що ключі збігаються
-
Кімната містить невідомі сеансиКімната містить незвірені невідомі сеанси.
\nЦе означає відсутність будь-яких гарантій у тому, що сеанси належать тим користувачам, які заявляють про належність цих сеансів їм.
\nМи радимо вам звірити кожен сеанс перед тим, як продовжити, проте ви можете перенадіслати повідомлення без звірки, якщо цього бажаєте.
\n
\nНевідомі сеанси:
-
Вибір каталогу кімнатМожливо сервер недоступний чи перевантаженийВведіть сервер для показу каталогу публічних кімнатІм\'я сервераВсі кімнати на сервері %sУсі кімнати сервера %s
-
Пошук в історії
-
Розмір шрифтуКрихітнийДрібний
@@ -770,12 +700,10 @@
ВеликийНайбільшийВеличезний
-
Вам потрібен дозвіл, щоб керувати віджетами у цій кімнатіПомилка створення віджетуЗдійснювати конференц дзвінки через JitsiВи впевнені, що бажаєте видалити віджет із цієї кімнати\?
-
Не вдалося створити віджет.Не вдалося надіслати запит.Рівень повноважень має бути цілим додатним числом.
@@ -791,19 +719,16 @@
Записати відеоВикликТема
-
Увага!ВимкненоГучноЗашифроване повідомленняВикористовувати рідну камеру
-
Щойно доданий вами пристрій \'%s\' править ключі шифрування.Ваш незвірений пристрій «%s» вимагає ключі шифрування.Почати перевіркуПоділитись без перевіркиЗнехтувати запит
-
Помилка виконання командиКоманду %s не розпізнаноВідомості про спільноту
@@ -842,16 +767,16 @@
\n
\nДодати зараз\?
- %d активний участник
- %d активних участника
- %d активних участників
-
+ %d активний учасник
+ %d активні учасники
+ %d активних учасників
+ %d активних учасників
- %d участник
- %d участника
- %d участників
-
+ %d учасник
+ %d учасники
+ %d учасників
+ %d учасниківЗаблокованих користувачів буде вилучено з цієї кімнати й вони не зможуть приєднатися знову.
@@ -866,9 +791,9 @@
• Сповіщення містять лише метадані• Зміст повідомлення було надійно розміщено на домашньому сервері MatrixЛіцензії сторонніх виробників
- Завантажити
- Говорити
- Очистити
+ Завантажити
+ Говорити
+ ОчиститиВдруге запитати ключі шифрування з інших ваших сеансів.Запит ключа надіслано.Запит надіслано
@@ -1074,7 +999,7 @@
%1$s: %2$s+%d%d+
- Все одно подзвонити
+ Усе одно зателефонуватиВилучитиПричинаПопередній перегляд посилань у чаті, у разі якщо Ваш сервер підтримує таку можливість.
@@ -1083,7 +1008,7 @@
Форматування MarkdownФорматувати повідомлення з використанням синтаксису Markdown перед надсиланням. Це дає можливість розгорнутого форматування, як-от використання зірочок для показу курсивного тексту.Показувати підтвердження прочитання
- Натискати на підтвердження прочитання для детального переліку.
+ Натискайте мітки прочитання для детального переліку.Показувати події приєднання та виходуЦе не стосується запрошень, вилучень і блокувань.Показувати події облікових записів
@@ -1098,7 +1023,7 @@
Використовувати стандартний рингтон ${app_name} для вхідних викликівМелодія вхідного викликуВиберіть мелодію викликів:
- Прийняти
+ ПрийнятиБудь ласка, ознайомтесь та прийміть правила цього серверу:Позначити прочитанимЗапуск сервісу
@@ -1144,12 +1069,12 @@
Покласти слухавкуВідхилитиВідповісти
- Відмовити
- Огляд
- Знехтувати
- Перервати
+ Відмовити
+ Огляд
+ Знехтувати
+ ПерерватиГотово
- Пропустити
+ ПропуститиНе вдалося видалити віджетНе вдалося додати віджетВи не можете здійснити дзвінок із самим собою
@@ -1160,12 +1085,12 @@
У вас немає повноважень на дзвінок у цій кімнатіУ вас немає повноважень розпочати конференц-дзвінокУ вас немає повноважень розпочати конференц-дзвінок у цій кімнаті
- Скинути
- Відхилити
- Пауза
- Грати
- Від’єднатися
- Залишитися
+ Скинути
+ Відхилити
+ Пауза
+ Грати
+ Від’єднатися
+ ЗалишитисяРезервна копіяВи впевнені\?Використати резервну копію ключів
@@ -1200,14 +1125,14 @@
Режим розробникаДодаткові налаштуванняРозширені налаштування сповіщень
- Голос та відео
+ Голос і відеоНалаштуванняІнші сеансиПоточний сеансНалаштуванняСповіщенняНалаштування
- Відкликати
+ ВідкликатинемаєВи втратите доступ до своїх зашифрованих повідомлень, якщо не зробите резервну копію ключів перед виходом з системи.Безпечне резервне копіювання ключів має бути активним у всіх ваших сеансах, щоб не втратити доступу до ваших зашифрованих повідомлень.
@@ -1281,7 +1206,7 @@
Фільтрувати бесіди…БесідиУ вас більше немає непрочитаних повідомлень
- Все прочитано!
+ Усе прочитано!Встановти важливість сповіщень за подіямиСховати розширеніПоказати розширені
@@ -1354,9 +1279,9 @@
Або захистіть свою резервну копію за допомогою ключа відновлення, зберігаючи її десь у безпеці.Створення резервної копіїВстановіть парольну фразу
- Ми збережемо зашифровану копію ваших ключів на вашому домашньому сервері. Захистіть свою резервну копію парольною фразою, щоб захистити її.
+ Ми збережемо зашифровану копію ваших ключів на вашому домашньому сервері. Захистіть свою резервну копію парольною фразою.
\n
-\nДля максимальної безпеки він повинен відрізнятися від пароля вашого облікового запису.
+\nДля максимальної безпеки фраза повинна відрізнятися від пароля вашого облікового запису.Захистіть свою резервну копію за допомогою парольної фрази.Експорт ключів вручнуПочати використовувати резервне копіювання ключів
@@ -1834,7 +1759,7 @@
Не вдалося розшифрувати резервну копію цією парольною фразою: переконайтесь, що вказано правильну парольну фразу відновлення.Не знаєте вашої відновлювальної парольної фрази\? Ви можете %s.Парольна фраза відновлення
- Забули або втратили усі можливості для відновлення\? Скинути все
+ Забули або втратили всі можливості для відновлення\? Скинути всеВикористати файлСкористатись парольною фразою відновлення або ключемСкористатись відновлювальними парольною фразою або ключем
@@ -1850,7 +1775,7 @@
Новий вхід. Це були ви\?ОновитиСкинути ключі
- або будь-який інший, здатний до перехресного підписування, Matrix-клієнт
+ або будь-який інший, здатний до перехресного підписування, Matrix-клієнтПерехресне підписування не ввімкненеПерехресне підписування увімкнено.
\nКлючі не є довіреними
@@ -1925,8 +1850,8 @@
Зазначити %sПароль облікового записуКлюч повідомлення
- Подобається
- Гаразд
+ Подобається
+ ГараздРеакціїВи приєднались.Запрошування користувачів…
@@ -2191,11 +2116,11 @@
Невідоме налаштування доступу (%s)Будь-хто може попроситися до кімнати, учасники можуть прийняти або відхилитиВітаємо в %1$s, %2$s.
- Все одно приєднатися
+ Усе одно приєднатисяСтворити ПростірПриєднатися до ПросторуПоділитися посиланням
- Запросити за користувацьким іменем
+ Запросити за користувацьким іменемЗапросити електронним листомПроведіть пальцем, щоб скасуватиЗаписати голосове повідомлення
@@ -2585,7 +2510,6 @@
Ми надіслали вам електронний лист для підтвердження на %s, відкрийте свою е-пошту та клацніть на посилання для підтвердженняМи надіслали вам електронний лист для підтвердження на %s, відкрийте свою е-пошту та клацніть на посилання для підтвердженняВи
- Кнопки ботаОпитуванняФайлГолосове
@@ -2753,19 +2677,6 @@
Звірити порівнявши емоджіЗвіритиСтворює просте опитування
- Вибрана опція
-
- %d голос - Підсумок
- %d голоси - Підсумок
- %d голосів - Підсумок
- %d голосів - Підсумок
-
-
- %d голос
- %d голоси
- %d голосів
- %d голосів
- Ініціалізувати перехресне підписування%1$s (%2$s) входить за допомогою нового сеансу:нестабільна
@@ -2872,10 +2783,8 @@
Змінює ваше показуване ім\'я лише у поточній кімнатіУстановлює назву кімнатиСервер ідентифікації не надав жодних правил
- Попередження: вимагає підтримки сервера та експериментальної версії кімнатиБажаєте поекспериментувати\?
\nМожете додати наявні простори до простору.
- Експериментальний простір - обмежена кімната.Усі кімнати, у яких ви перебуваєте, буде показано на сторінці Домівка.Показувати у ДомівціПеревірку скасовано
@@ -3085,7 +2994,7 @@
Нове: Дозволити людям у просторах знаходити та приєднуватися до приватних кімнатЛише в цю кімнатуВони зможуть переглядати %s
- Запрошення за іменем користувача або е-поштою
+ Запрошення за іменем користувача або е-поштоюГоловнеПоділитися у текстіПоказувати лише кількість непрочитаних повідомлень у звичайному сповіщенні.
@@ -3118,12 +3027,12 @@
Це запрошення до простору надіслане %s, не пов\'язаній із вашим обліковим записомЦе запрошення до кімнати надіслане %s, не пов\'язаній із вашим обліковим записомКімнати можуть лишатися закритими для людей ззовні простору, водночас люди в просторі можуть знаходити їх і приєднуватися. Всі нові кімнати в просторі матимуть цю опцію.
- Допомагає людям у просторах знаходити закриті кімнати й приєднуватися власноруч, без потреби вручну запрошувати всіх.
+ Допомагає людям у просторах знаходити закриті кімнати й приєднуватися самостійно, без потреби вручну запрошувати всіх.Зауважте, що поліпшення створить нову версію кімнати. Всі наявні повідомлення залишаться в цій архівованій кімнаті.Будь-хто в батьківському просторі зможемо знайти кімнату й долучитись — нема потреба вручну запрошувати всіх. Можна змінити це в налаштуваннях кімнати будь-коли.Будь-хто в %s зможе знайти кімнату й долучитись — нема потреби вручну запрошувати всіх. Можна змінити це в налаштуваннях кімнати будь-коли.Не вдалося відповісти чи редагувати, бо голосове повідомлення активне
- Кімната — версії %s, яку домашній сервер позначив як нестабільну.
+ Кімната — версії %s, яку домашній сервер позначив нестабільною.Дозволити будь-кому в %s знаходити й доступатись. Можете також обрати інші простори.Поліпшення кімнати — серйозна операція. Її зазвичай радять, коли кімната нестабільна через вади, брак функціоналу чи вразливості безпеки.
\nЗазвичай це впливає лише на деталі опрацювання кімнати сервером.
@@ -3167,7 +3076,7 @@
Згенерувати ключ безпеки для зберігання в надійному місці, наприклад у менеджері паролів чи сейфі.Не вдалося створити особисте повідомлення. Перевірте користувачів, яких бажаєте запросити, й спробуйте ще.Не вдалося розшифрувати резервну копію цим відновлювальним ключем. Звірте, чи правильний ключ ви ввели.
- Оберіть свій відновлювальний ключ, введіть його власноруч чи вставте з буферу обміну
+ Оберіть свій ключ відновлення, введіть його власноруч або вставте з буфера обмінуВикористати відновлювальний ключ%1$s або %2$s треба для продовження.Відновлювальний ключ резервного копіювання ключів
@@ -3194,4 +3103,61 @@
Можете ввімкнути це, якщо в кімнаті співпрацюватимуть лише внутрішні команди на вашому домашньому сервері. Цього більше не можна буде змінити.Цей сеанс — користувача %1$s, а ви надаєте облікові дані користувача %2$s. Це не підтримується в ${app_name}.
\nБудь ласка, спершу очистіть дані, а тоді ввійдіть в інший обліковий запис.
+
+ %1$d голос. Проголосуйте, щоб побачити результати
+ %1$d голоси. Проголосуйте, щоб побачити результати
+ %1$d голосів. Проголосуйте, щоб побачити результати
+ %1$d голосів. Проголосуйте, щоб побачити результати
+
+ Точно видалити опитування\? Ви не зможете відновити опитування після видалення.
+ Видалити опитування
+ Голосування завершене
+ Голос надіслано
+ Увімкнути опитування
+ Завершити опитування
+ Люди більше не зможуть голосувати, і будуть показані остаточні результати опитування.
+ Завершити це опитування\?
+ варіант-переможець
+ Завершити опитування
+
+ Остаточний результат на підставі %1$d голосу
+ Остаточний результат на підставі %1$d голосів
+ Остаточний результат на підставі %1$d голосів
+ Остаточний результат на підставі %1$d голосів
+
+
+ На підставі %1$d голосу
+ На підставі %1$d голосів
+ На підставі %1$d голосів
+ На підставі %1$d голосів
+
+
+ %1$d голос
+ %1$d голоси
+ %1$d голосів
+ %1$d голосів
+
+ Системні налаштування
+ Версії
+ Отримати допомогу в використанні Element
+ Довідка й підтримка
+ Довідка
+ Правові положення
+ Цей сервер не надає політики.
+ Сторонні бібліотеки
+ Політика вашого сервера ідентифікації
+ Політика вашого домашнього сервера
+ Політика ${app_name}
+ Можете вимкнути це коли завгодно в налаштуваннях
+ Ми не передаємо даних стороннім особам
+ Ми не записуємо й не аналізуємо жодних даних облікового запису
+ тут
+ Допомагайте нам визначати проблеми й удосконалювати Element, надсилаючи анонімні дані про використання. Щоб розуміти, як люди використовують кілька пристроїв, ми створимо спільний для ваших пристроїв випадковий ідентифікатор.
+\n
+\nМожете прочитати всі наші умови %s.
+ Допоможіть покращити Element
+ Увімкнути
+ Перезапустіть застосунок, щоб зміни набули чинності.
+ Увімкнути підтримку LaTeX
+ Вам не дозволено приєднуватися до цієї кімнати
\ No newline at end of file
diff --git a/vector/src/main/res/values-uz/strings.xml b/vector/src/main/res/values-uz/strings.xml
index b705987cdf4..5b61df1cdac 100644
--- a/vector/src/main/res/values-uz/strings.xml
+++ b/vector/src/main/res/values-uz/strings.xml
@@ -1,14 +1,14 @@
Koʻtarish
- Rad etish
- Koʻrib chiqish
- Eʼtiborsiz qoldirish
- Tugatish
+ Rad etish
+ Koʻrib chiqish
+ Eʼtiborsiz qoldirish
+ TugatishBajarildi
- O\'tkazib yuborish
- Qabul qilish
- Taklif qilish
+ O\'tkazib yuborish
+ Qabul qilish
+ Taklif qilishyokiBaribir joʻnatishBaribir qo\'ng\'iroq qilish
@@ -27,18 +27,18 @@
Joriy konferts-aloaqa.
\n%1$s yoki %2$s sifatida qoʻshilishChatni boshlash
- Qayta oʻrnatish
- Bekor qilish
- Ijro etmoq
+ Qayta oʻrnatish
+ Bekor qilish
+ Ijro etmoqFaol qo\'ng\'iroqHisobot mazmuni
- Ajratish
- Bekor qilish
+ Ajratish
+ Bekor qilishYoʻqShifrlangan manbani ko‘rishManbani ko‘rishDoimiy aloqa
- Oldinga
+ OldingaKeyinroqUchinchi tomonlarning litsenziyalariChiqishdan oldin kalitlarning zaxira nusxasini yaratmasangiz, shifrlangan xabarlardan foydalanishni yo‘qotishingiz mumkin.
@@ -88,20 +88,20 @@
Qoʻngʻiroqni amalga oshirish imkoniyati yoʻq, iltimos keyinroq urunib koʻringVideoOvoz
- Pauza
- Qayta nomlash
- Oʻchirib tashlash
- Tozalash
- Gapirish
- Tarqatish
- Yuklash
- Oʻchirish
- Qayta joʻnatish
- Joʻnatish
- Qolish
- Chiqish
- Saqlash
- Bekor qilish
+ Pauza
+ Qayta nomlash
+ Oʻchirib tashlash
+ Tozalash
+ Gapirish
+ Tarqatish
+ Yuklash
+ Oʻchirish
+ Qayta joʻnatish
+ Joʻnatish
+ Qolish
+ Chiqish
+ Saqlash
+ Bekor qilishOKYuklanmoqda…Sessiyani verifikatsiya qilish
diff --git a/vector/src/main/res/values-vi/strings.xml b/vector/src/main/res/values-vi/strings.xml
index 498ee9fbbb8..51b19ba0017 100644
--- a/vector/src/main/res/values-vi/strings.xml
+++ b/vector/src/main/res/values-vi/strings.xml
@@ -19,7 +19,7 @@
PhòngKhông còn kết quả nào nữaLọc danh sách yêu thích
- Bỏ qua
+ Bỏ quaĐã có một cuộc hội thoại đang diễn ra!Không có kết quả nàoBạn chưa cho phép ${app_name} truy cập danh bạ của bạn
@@ -35,7 +35,7 @@
Lọc tên phòngLọc ngườiXác nhận
- Tắt
+ TắtLọc tên phòngCộng đồngPhòng
@@ -63,9 +63,9 @@
Cúp máyTừ chốiĐồng ý
- Từ chối
- Huỷ bỏ
- Bỏ qua
+ Từ chối
+ Huỷ bỏ
+ Bỏ quaNgoại tuyếnhoặcVẫn gọi
@@ -73,8 +73,8 @@
Không thể bắt đầu cuộc gọiBắt đầu cuộc họp âm thanhXong
- Đồng ý
- Mời
+ Đồng ý
+ MờiVẫn gửiGọi hội thoại không được hỗ trợ trong phòng chat được mã hoáThông tin phiên
@@ -94,34 +94,34 @@
Có cuộc gọi đến.
\nTham gia với tư cách %1$s hoặc %2$sBắt đầu trò chuyện
- Cài lại
- Bỏ
- Tạm dừng
- Chạy
+ Cài lại
+ Bỏ
+ Tạm dừng
+ ChạyCuộc gọi đang hoạt độngBáo cáo nội dung
- Ngắt kết nối
- Rút lại
+ Ngắt kết nối
+ Rút lạiTrống
- Đặt lại tên
- Xoá
+ Đặt lại tên
+ XoáXem nguồn đã được giải mãXem nguồnĐường dẫn
- Chuyển tiếp
+ Chuyển tiếpĐể sau
- Xoá
- Nói
- Chia sẻ
- Tải xuống
- Trích
- Xoá
- Gửi lại
- Gửi
- Ở lại
- Thoát
- Lưu
- Huỷ
+ Xoá
+ Nói
+ Chia sẻ
+ Tải xuống
+ Trích
+ Xoá
+ Gửi lại
+ Gửi
+ Ở lại
+ Thoát
+ Lưu
+ HuỷOKĐang tải…Giấy phép bên thứ ba
@@ -291,7 +291,7 @@
ChuyểnKết nốiMột số tin nhắn chưa được gửi
- Phòng này có bản nháp chưa được gửi
+ có bản nháp chưa được gửiXoá ảnh đại diệnThay đổi ảnh đại diệnHình ảnh
@@ -327,7 +327,7 @@
Tải hình ảnh lên thất bạiKhông thể gửi tin nhắnKhông thể rút lại
- Thiết bị của người gửi chưa gửi cho chúng tôi mã khoá cho tin nhắn này.
+ Thiết bị của người gửi chưa gửi cho chúng tôi mã khoá cho tin nhắn này.** Không thể giải mã: %s **%1$s từ %2$s thành %3$sTuỳ chỉnh
@@ -504,7 +504,7 @@
Huỷ xuất bảnXoá tiện ích thất bạiThêm tiện ích thất bại
- Xem xét
+ Xem xétChuyểnĐã cho vào danh sách đenĐã xác minh
@@ -583,10 +583,10 @@
Đang đồng bộ…Mở tiêu đềLiệt kê các thành viên
- Từ chối
- Xem trước
- Tham gia
- Xoá
+ Từ chối
+ Xem trước
+ Tham gia
+ XoáTiếp tụcKHÔNGCÓ
@@ -753,13 +753,14 @@
Đồng bộ ban đầu:
\nĐang nhập dữ liệu tài khoảnĐồng bộ ban đầu:
-\nĐang nhập các cộng đồng
+\nĐang nhập các CommunityĐồng bộ ban đầu:
\nĐang nhập các phòng đã rời khỏiĐồng bộ ban đầu:
\nĐang nhập các phòng đã mời vàoĐồng bộ ban đầu:
-\nĐang nhập các phòng đã tham gia
+\nTải hội thoại của bạn
+\nNếu bạn đã tham gia nhiều phòng, điều này có thể mất một thời gian.Đồng bộ ban đầu:
\nĐang nhập các phòngĐồng bộ ban đầu:
@@ -855,20 +856,20 @@
\@roomTin nhắn trong chat nhóm được mã hóaTin nhắn trong chat nhóm
- Tin nhắn trực tiếp 1-1 được mã hóa
- Tin nhắn trực tiếp 1-1
+ Tin nhắn trực tiếp 1–1 được mã hóa
+ Tin nhắn trực tiếp 1–1Tên đăng nhập của tôiTên hiển thị của tôiTin nhắn chứa @roomTin nhắn được gửi bởi botKhi tôi được mời vào phòngTin nhắn trong phòng chat nhóm
- Tin nhắn trong phòng chat 1-1
+ Tin nhắn trong phòng chat 1–1Tin nhắn chứa tên đăng nhập của tôiTin nhắn chứa trên tôiKhi phòng được nâng cấp phiên bảnTin nhắn mã hóa trong phòng chat nhóm
- Tin nhắn mã hóa trong phòng chat 1-1
+ Tin nhắn mã hóa trong phòng chat 1–1Chọn màu LED, rung, âm thanh…Cấu hình thông báo im lặngCấu hình thông báo cuộc gọi
@@ -1094,9 +1095,9 @@
Hiện mật khẩuĐóng banner sao lưu khóaTạo phòng chat mới
- Tạo phòng chat 1-1 bằng cách quét mã QR
- Tạo mới phòng chat 1-1 theo ID Matrix
- Tạo mới phòng chat 1-1
+ Tạo phòng chat 1–1 bằng cách quét mã QR
+ Tạo mới phòng chat 1–1 theo ID Matrix
+ Tạo mới phòng chat 1–1Đóng menu tạo phòng…Mở menu tạo phòngGửi tệp đính kèm
@@ -1126,7 +1127,7 @@
Tìm TênTên hoặc IDXem danh mục phòng chat
- Gửi tin nhắn tới phòng 1-1
+ Gửi tin nhắn tới phòng 1–1Tạo phòng chat mớiKhông tìm thấy kết quả cần tìm\?Không tìm thấy, sử dụng chức năng thêm thành viên bằng username.
@@ -1431,17 +1432,6 @@
%d phòngDuyệt danh mục phòng
- Nhập ID hoặc tên phòng
- Tham gia phòng
- Tham gia phòng
- Tạo phòng
- Bắt đầu chat
- LỜI MỜI
- ƯU TIÊN THẤP
- PHÒNG
- YÊU THÍCH
- DANH MỤC
- THAM GIATìm kiếm trong phòng mã hóa chưa được hỗ trợ.FILESNGƯỜI
@@ -1645,4 +1635,1363 @@
Định dạng không phù hợp\'%s\' không phải là một ID cộng đồng hợp lệID cộng đồng không hợp lệ
+
+ %1$d cuộc gọi bị tạm dừng
+
+
+ %d mục
+
+
+ Mã sai, còn lại %d lần thử
+
+
+ Các lời mời đã gửi tới %1$s và %2$d người nữa
+
+
+ Hiển thị %d thiết bị bạn có thể xác minh ngay bây giờ
+
+
+ %d phiên đang hoạt động
+
+
+ %1$d người
+
+
+ Quá nhiều yêu cầu vừa được gửi. Bạn có thể thử lại trong %1$d giây…
+
+
+ Đang sao lưu %d khóa…
+
+
+ %d khóa mới vừa được thêm vào phiên này.
+
+
+ Đã khôi phục bản sao lưu với % d chìa khóa.
+
+
+ %d phòng
+
+
+ %d thành viên
+
+
+ %d widget hoạt động
+
+
+ %d thông báo
+
+
+ %1$s: %2$d tin nhắn
+
+
+ %d lời mời
+
+
+ %d phòng
+
+
+ %d tin nhắn được thông báo chưa đọc
+
+
+ %d tin nhắn được thông báo chưa đọc
+
+ Bạn có chắc chắn muốn xóa cuộc thăm dò này không\? Bạn sẽ không thể phục hồi nó một khi bị xóa.
+ Xóa cuộc thăm dò ý kiến
+ Cuộc thăm dò kết thúc
+ Bỏ phiếu
+ Bật Cuộc thăm dò ý kiến
+ Kết thúc cuộc thăm dò ý kiến
+ Điều này sẽ ngăn mọi người có thể bỏ phiếu và sẽ hiển thị kết quả cuối cùng của cuộc thăm dò.
+ Kết thúc cuộc thăm dò này\?
+ tùy chọn người chiến thắng
+ Kết thúc cuộc thăm dò ý kiến
+ Câu hỏi không thể trống
+ TẠO CUỘC THĂM DÒ Ý KIẾN
+ THÊM TÙY CHỌN
+ Tùy chọn %1$d
+ Tạo tùy chọn
+ Câu hỏi hoặc chủ đề
+ Câu hỏi hoặc chủ đề thăm dò ý kiến
+ Tạo Cuộc thăm dò ý kiến
+ %s trong Cài đặt để nhận lời mời trực tiếp trong Element.
+ Liên kết email này với tài khoản của bạn
+ Lời mời này đến Space này đã được gửi đến %s không được liên kết với tài khoản của bạn
+ Lời mời này đến phòng này đã được gửi đến %s không được liên kết với tài khoản của bạn
+ Để giúp các thành viên Space tìm và tham gia một phòng riêng, hãy vào cài đặt của căn phòng đó bằng cách nhấn vào hình đại diện.
+ Giúp các thành viên Space tìm phòng riêng
+ Điều này giúp các phòng dễ dàng giữ riêng tư cho một Space, đồng thời cho phép mọi người trong Space tìm và tham gia cùng họ. Tất cả các phòng mới trong một Space sẽ có tùy chọn này có sẵn.
+ Giúp mọi người trong Space tự tìm và tham gia phòng riêng, không cần phải tự mời mọi người.
+ Mới: Cho phép mọi người trong Space tìm và tham gia phòng riêng
+ Xin lưu ý nâng cấp sẽ tạo ra một phiên bản mới của căn phòng. Tất cả các tin nhắn hiện tại sẽ ở trong phòng lưu trữ này.
+ Bất cứ ai trong Space cha mẹ sẽ có thể tìm và tham gia căn phòng này - không cần phải mời mọi người theo cách thủ công. Bạn sẽ có thể thay đổi điều này trong cài đặt phòng bất cứ lúc nào.
+ Bất kỳ ai trong %s sẽ có thể tìm và tham gia phòng này - không cần phải mời mọi người theo cách thủ công. Bạn sẽ có thể thay đổi điều này trong cài đặt phòng bất cứ lúc nào.
+ Tin nhắn Thoại (%1$s)
+ Không thể trả lời hoặc chỉnh sửa trong khi tin nhắn thoại đang hoạt động
+ Không thể ghi âm một tin nhắn thoại
+ Không thể phát tin nhắn thoại này
+ Bật tin nhắn thoại
+ Nhấn vào bản ghi âm của bạn để dừng hoặc nghe
+ %1$d còn lại
+ Giữ để ghi âm, bỏ ra để gửi
+ Xóa ghi âm
+ Đang ghi âm tin nhắn thoại
+ Dừng ghi âm
+ Tạm dừng Tin nhắn Thoại
+ Phát Tin nhắn Thoại
+ Khóa Tin nhắn Thoại
+ Vuốt để hủy
+ Ghi âm tin nhắn thoại
+ Cuộc gọi nhóm bắt đầu
+ Xin lỗi, lỗi đã xảy ra trong khi cố gắng gia nhập: %s
+ Nâng cấp lên phiên bản phòng được đề xuất
+ Phòng này đang chạy phiên bản phòng %s, mà homeerver này đã đánh dấu là không ổn định.
+ Cho phép bất kỳ ai trong %s tìm và truy nhập. Bạn cũng có thể chọn các Space khác.
+ Bạn cần sự cho phép để nâng cấp một phòng
+ Tự động cập nhật Space cha mẹ
+ Tự động mời người dùng
+ Bạn sẽ nâng cấp phòng này từ %1$s lên %2$s
+ Nâng cấp phòng là một hành động nâng cao và thường được khuyến khích khi phòng không ổn định do lỗi, thiếu tính năng hoặc lỗ hổng bảo mật.
+\nĐiều này thường chỉ ảnh hưởng đến cách phòng được xử lý trên máy chủ.
+ Nâng cấp phòng riêng tư
+ Nâng cấp phòng công cộng
+ Yêu cầu nâng cấp
+ Nâng cấp
+ Hãy kiên nhẫn, có thể mất một thời gian.
+ Tham gia phòng thay thế
+ Hiện tại mọi người có thể không thể tham gia bất kỳ phòng riêng nào bạn làm.
+\n
+\nChúng tôi sẽ cải thiện điều này như một phần của bản beta, nhưng chỉ muốn cho bạn biết.
+ Space đồng đội chưa hoàn toàn sẵn sàng nhưng bạn vẫn có thể thử chúng
+ Phòng không tên
+ Một số phòng có thể bị ẩn vì chúng riêng tư và bạn cần một lời mời.
+ Một số phòng có thể bị ẩn vì chúng riêng tư và bạn cần một lời mời.
+\nBạn không có quyền thêm phòng.
+ Space này không có phòng
+ Vui lòng liên hệ với quản trị viên homeerver của bạn để biết thêm thông tin
+ Có vẻ như homeerver của bạn chưa hỗ trợ Spaces
+ Cảm thấy thử nghiệm\?
+\nBạn có thể thêm các Space hiện có vào một Space.
+ Tất cả các phòng bạn đang ở sẽ được hiển thị tại Home.
+ Hiển thị tất cả các phòng trong Home
+ Quản lý phòng và Space
+ Đánh dấu như không đề xuất
+ Đánh dấu như đề xuất
+ Đề nghị
+ Công khai Space này
+ Quản lý phòng
+ Tìm kiếm một người không có trong %s\?
+ %s mời bạn
+ Bạn được mời
+ Space là một cách mới để nhóm phòng và con người.
+ Chào mừng đến Space!
+ Thêm phòng
+ Thêm một Space vào bất kỳ Space nào bạn quản lý.
+ Thêm Space hiện có
+ Thêm các phòng hiện có
+ Thêm các phòng và Space hiện có
+ Chọn những thứ để rời khỏi
+ Để lại các phòng và Space cụ thể…
+ Không rời bất kỳ phòng và Space nào
+ Bạn sẽ để tất cả các phòng và Space trong %s.
+ Rời khỏi tất cả phòng và Space
+ Bạn là quản trị viên duy nhất của không gian này. Rời khỏi nó sẽ có nghĩa là không ai có quyền kiểm soát nó.
+ Bạn sẽ không thể tham gia lại trừ khi bạn được mời lại.
+ Bạn là người duy nhất ở đây. Nếu bạn rời đi, sẽ không ai có thể tham gia trong tương lai, kể cả bạn
+ Bạn có chắc chắn muốn rời khỏi %s không\?
+ Rời khỏi Space
+ Thêm phòng
+ Khám phá phòng
+ Chào mừng bạn đến với %1$s, %2$s.
+ Bạn vẫn chưa ở trong phòng. Dưới đây là một số phòng được đề xuất, nhưng bạn có thể thấy nhiều hơn với đáy nút màu xanh lá cây bên phải.
+ Khám phá (%s)
+ Hoàn tất cài đặt
+ Mời qua email, tìm liên hệ và hơn thế nữa…
+ Hoàn tất việc cài đặt khám phá.
+ Hiện tại bạn không sử dụng máy chủ xác thực. Để mời đồng đội và có thể khám phá bởi họ, hãy cấu hình một bên dưới.
+ Tham gia Space
+ Tạo Space
+ Bỏ qua ngay bây giờ
+ Gia nhập Space của tôi %1$s %2$s
+ Mời theo tên người dùng hoặc thư
+ Mời theo tên người dùng
+ Mời qua email
+ Chỉ có anh lúc này thôi. %s sẽ còn tốt hơn với những người khác.
+ Mời đến %s
+ Mời mọi người
+ Mời mọi người vào Space của bạn
+ Sự mô tả
+ Đang tạo Space…
+ Ngẫu nhiên
+ Tổng quát
+ Hãy tạo ra một căn phòng cho mỗi người trong số họ. Bạn cũng có thể thêm nhiều hơn sau, bao gồm cả những cái đã có sẵn.
+ Bạn đang làm gì\?
+ Đảm bảo đúng người có quyền truy cập vào công ty %s. Bạn có thể mời thêm sau.
+ Đồng đội của bạn là ai\?
+ Chúng tôi sẽ tạo ra các phòng cho họ. Bạn cũng có thể thêm nhiều hơn sau.
+ Một số cuộc thảo luận bạn muốn có trong %s là gì\?
+ Đặt tên để tiếp tục.
+ Thêm một số chi tiết để giúp mọi người xác định nó. Bạn có thể thay đổi chúng bất cứ lúc nào.
+ Thêm một số chi tiết để giúp nó nổi bật. Bạn có thể thay đổi chúng bất cứ lúc nào.
+ Tạo một Space
+ Chỉ mời, tốt nhất cho bản thân hoặc các đội
+ Riêng tư
+ Mở cửa cho bất cứ ai, tốt nhất cho Community
+ Công cộng
+ Một Space riêng tư cho bạn và đồng đội của bạn
+ Tôi và các đồng đội
+ Một Space riêng tư để sắp xếp các phòng của bạn
+ Chỉ tôi
+ Đảm bảo đúng người có quyền truy nhập vào %s. Bạn có thể thay đổi điều này sau.
+ Bạn làm việc với ai\?
+ Để tham gia một Space hiện có, bạn cần một lời mời.
+ Bạn có thể thay đổi điều này sau
+ Bạn muốn tạo ra loại Space nào\?
+ Space là một cách mới để nhóm phòng và con người
+ Space riêng tư của bạn
+ Space công cộng của bạn
+ Thêm Space
+ Space riêng tư
+ Space công cộng
+ Tin nhắn gửi thất bại
+ Nâng cấp phòng lên phiên bản mới
+ Để lại phòng với id đã cho (hoặc phòng hiện tại nếu null)
+ Gia nhập Space với id đã cho
+ Thêm vào Space đã cho
+ Tạo một Space
+ Nội dung sự kiện
+ Sự kiện trạng thái được gửi!
+ Sự kiện được gửi!
+ Sự kiện bị hỏng
+ Loại tin nhắn bỏ lỡ
+ Nội dung sự kiện
+ Chìa khóa trạng thái
+ Loại
+ Gửi Sự kiện Trạng thái Tùy chỉnh
+ Sửa Nội dung
+ Sự kiện trạng thái
+ Gửi sự kiện trạng thái
+ Không có sẵn
+ Ngoại tuyến
+ Trực tuyến
+ Space công cộng
+ Phòng công cộng
+ Không kiểm tra
+ Kiểm tra
+ Nhập chìa khó từ tệp
+ Mở widget
+ Chụp màn hình
+ Vuốt để kết thúc cuộc gọi
+ Người dùng không biết
+ Chuyển sang %1$s
+ Tư vấn với %1$s
+ Tư vấn trước
+ %1$s nhấp nhẹ để trả về
+ Cuộc gọi đang hoạt động (%1$s) ·
+ Cuộc gọi hiện hoạt động (%1$s)
+ Liên kết Matrix
+ Loại bỏ các thay đổi
+ Có những thay đổi chưa được lưu. Loại bỏ các thay đổi\?
+ Phòng vẫn chưa được tạo ra. Hủy bỏ việc tạo phòng\?
+ Liên kết bị hỏng
+ Mã QR không được quét!
+ Mã QR không hợp lệ (URI không hợp lệ)!
+ Không thể tự gửi tin nhắn trực tiếp!
+ Chia sẻ theo văn bản
+ Không thể tìm thấy phòng này. Hãy chắc chắn rằng nó tồn tại.
+ Không thể mở phòng nơi bạn bị cấm.
+ Xác nhận mã PIN để vô hiệu hóa MÃ PIN
+ Thay đổi mã PIN hiện tại của bạn
+ Thay đổi mã PIN
+ Mã PIN được yêu cầu mỗi khi bạn mở ${app_name}.
+ Mã PIN được yêu cầu sau 2 phút không sử dụng ${app_name}.
+ Yêu cầu mã PIN sau 2 phút
+ Chỉ hiển thị số lượng tin nhắn chưa đọc trong một thông báo đơn giản.
+ Hiển thị chi tiết như tên phòng và nội dung tin nhắn.
+ Hiện nội dung trong thông báo
+ Mã PIN là cách duy nhất để mở khóa ${app_name}.
+ Bật sinh trắc học cụ thể của thiết bị, như dấu vân tay và nhận dạng khuôn mặt.
+ Bật sinh trắc học
+ Nếu bạn muốn đặt lại mã PIN của mình, hãy nhấp vào quên mã PIN để đăng nhập và đặt lại.
+ Bật MÃ PIN
+ Cấu hình bảo vệ
+ Bảo vệ quyền truy cập bằng mã PIN và sinh trắc học.
+ Bảo vệ quyền truy cập
+ Để đặt lại mã PIN của mình, bạn sẽ cần đăng nhập lại và tạo mã PIN mới.
+ Mã PIN mới
+ Đặt lại mã PIN
+ Quên mã PIN\?
+ Nhập mã PIN của bạn
+ Xác thực mã PIN thất bại, vui lòng nhấp vào mã PIN mới.
+ Xác nhận mã PIN
+ Chọn mã PIN để bảo mật
+ Quá nhiều lỗi, bạn đã bị đăng xuất
+ Cảnh báo! Nỗ lực cuối cùng còn lại trước khi bị đăng xuất!
+ Xem lại cài đặt của bạn để bật thông báo Push
+ Thông báo Push bị vô hiệu hóa
+ Hủy cấm người dùng thất bại
+ Bị cấm bởi %1$s
+ Thu hồi lời mời đến %1$s\?
+ Thu hồi lời mời
+ Tìm kiếm danh bạ trên Matrix
+ Sổ danh bạ
+ Sổ danh bạ của bạn trống
+ Lấy lại danh bạ của bạn…
+ Tìm kiếm trong danh bạ của tôi
+ Danh bạ điện thoại
+ Danh bạ điện thoại của bạn trống rỗng
+ Thêm từ danh bạ điện thoại của tôi
+ Lưu khóa khôi phục trong
+ Bạn không thể truy nhập tin nhắn này
+ Đặt avatar
+ Bạn đã thay đổi cài đặt phòng thành công
+ Chủ đề
+ Tên phòng
+ Lưu trữ Khóa bảo mật của bạn ở nơi an toàn, như trình quản lý mật khẩu hoặc két sắt.
+ Lưu Khóa Bảo mật của bạn
+ Nhập lại Cụm từ Bảo mật của bạn để xác nhận.
+ Cụm từ Bảo mật
+ Nhập cụm từ bảo mật chỉ bạn biết, được sử dụng để bảo mật bí mật trên máy chủ của bạn.
+ Đặt Cụm từ Bảo mật
+ Lưu trữ Khóa bảo mật của bạn ở nơi an toàn, như trình quản lý mật khẩu hoặc két sắt.
+ Lưu Khóa Bảo mật của bạn
+ Nhập một cụm từ bí mật chỉ bạn biết và tạo khóa để sao lưu.
+ Sử dụng Cụm Bảo mật
+ Tạo khóa bảo mật để lưu trữ ở đâu đó an toàn như trình quản lý mật khẩu hoặc két sắt.
+ Sử dụng Khóa Bảo mật
+ Cài đặt
+ Bảo vệ chống mất quyền truy cập vào các tin nhắn và dữ liệu được mã hóa bằng cách sao lưu các khóa mã hóa trên máy chủ của bạn.
+ Bảo mật sao lưu
+ Thiết lập Sao lưu Bảo mật
+ Khởi động máy ảnh
+ Dừng máy ảnh
+ Bật tiếng micrô
+ Tắt tiếng micrô
+ Mở cuộc trò chuyện
+ Quyền
+ Đặt quyền
+ Xác nhận
+ Nhập URL của máy chủ xác thực
+ Ngoài ra, bạn có thể nhập bất kỳ URL máy chủ xác thực nào khác
+ Dùng %1$s
+ Homeerver của bạn (%1$s) đề xuất sử dụng %2$s cho máy chủ xác thực của bạn
+ Sự đồng ý của người dùng chưa được cung cấp.
+ Không có mối liên hệ hiện tại với mã định danh này.
+ Sự kết hợp đã thất bại.
+ Đối với quyền riêng tư của bạn, ${app_name} chỉ hỗ trợ gửi email và số điện thoại của người dùng băm.
+ Trước tiên, vui lòng chấp nhận các điều khoản của máy chủ nhận dạng trong cài đặt.
+ Trước tiên, vui lòng cấu hình máy chủ nhận dạng.
+ Hoạt động này là không thể. Homeerver đã lỗi thời.
+ Máy chủ nhận dạng này đã lỗi thời. ${app_name} chỉ hỗ trợ API V2.
+ Ngắt kết nối khỏi máy chủ nhận dạng %s\?
+ Mở các điều khoản của %s
+ Tải các ngôn ngữ có sẵn…
+ Các ngôn ngữ có sẵn khác
+ Ngôn ngữ hiện tại
+ Chia sẻ mã này với mọi người để họ có thể quét nó để thêm bạn và bắt đầu trò chuyện.
+ Mã của tôi
+ Chia sẻ mã của tôi
+ Quét mã QR
+ Chúng tôi không thể mời người dùng. Vui lòng kiểm tra người dùng bạn muốn mời và thử lại.
+ Nó không phải là mã QR Matrix hợp lệ
+ Lời mời được gửi đến %1$s và %2$s
+ Lời mời được gửi đến %1$s
+ 🔐️ Tham gia với tôi trên ${app_name}
+ Hey, nói chuyện với tôi trên ${app_name}: %s
+ Mời bạn bè
+ Mời Người dùng
+ Mời người dùng…
+ MỜI
+ Thêm người
+ Thêm thành viên
+ Chúng tôi không thể tạo ra DM của bạn. Vui lòng kiểm tra người dùng bạn muốn mời và thử lại.
+ Nối kết %1$s đang đưa bạn đến một trang khác: %2$s.
+\n
+\nBạn có chắc chắn muốn tiếp tục\?
+ Kiểm tra lại nối kết này
+ Vui lòng chọn mật khẩu.
+ Vui lòng chọn tên người dùng.
+ Thất bại trong việc thiết lập Xác thực chéo
+ Đánh dấu là Đáng tin cậy
+ Xác nhận danh tính của bạn bằng cách xác minh đăng nhập này, cấp cho nó quyền truy cập vào các tin nhắn được mã hóa.
+ Xác nhận danh tính của bạn bằng cách xác minh đăng nhập này từ một trong các phiên khác của bạn, cấp cho nó quyền truy cập vào các tin nhắn được mã hóa.
+ Xác minh tương tác bằng Emoji
+ Xác minh đăng nhập
+ Xác minh thủ công bằng Văn bản
+ Xác minh thông tin đăng nhập mới truy cập vào tài khoản của bạn: %1$s
+ Xác minh tất cả các phiên của bạn để đảm bảo tài khoản và tin nhắn của bạn được an toàn
+ Xem lại nơi bạn đăng nhập
+ Được mã hóa bởi một thiết bị chưa được xác minh
+ Không được mã hóa
+ gửi tuyết rơi ❄️
+ gửi hoa giấy 🎉
+ Gửi thông điệp đã cho với tuyết rơi
+ Gửi tin nhắn đã cho với hoa giấy
+ Bạn sẽ khởi động lại mà không có lịch sử, không có tin nhắn, thiết bị đáng tin cậy hoặc người dùng đáng tin cậy
+ Nếu bạn đặt lại mọi thứ
+ Chỉ làm điều này nếu bạn không có thiết bị nào khác mà bạn có thể xác minh thiết bị này.
+ Đặt lại mọi thứ
+ Quên hoặc mất tất cả các tùy chọn phục hồi\? Đặt lại mọi thứ
+ Không truy nhập được dung lượng lưu trữ an toàn
+ Sao lưu không thể giải mã được với Khóa Khôi phục này: vui lòng xác minh rằng bạn đã nhập Khóa Khôi phục chính xác.
+ Chọn Khóa Khôi phục của bạn hoặc nhập nó theo cách thủ công bằng cách nhập hoặc dán từ bảng tạm của bạn
+ Sử dụng Khóa Khôi phục
+ Dùng %1$s của bạn hoặc dùng %2$s của bạn để tiếp tục.
+ Chỉ được hỗ trợ trong các phòng được mã hóa
+ Buộc nhóm phiên hướng ra hiện tại trong một căn phòng được mã hóa phải bị loại bỏ
+ Sử dụng ${app_name mới nhất} trên các thiết bị khác của bạn:
+ hoặc một máy khách Matrix có khả năng xác thực chéo khác
+ ${app_name} iOS
+\n${app_name} Android
+ ${app_name} Web
+\n${app_name} Desktop
+ Sử dụng ${app_name} mới nhất trên các thiết bị khác của bạn, Web ${app_name}, Máy tính để bàn ${app_name}, ${app_name} iOS, ${app_name} cho Android hoặc một máy khách Matrix có khả năng xác thực chéo khác
+ Đặt mật khẩu tài khoản mới…
+ Không thể lưu tệp Media
+ Không thể thêm tệp Media vào Bộ sưu tập
+ Tệp Media được thêm vào Bộ sưu tập
+ Bật thiết đặt này thêm FLAG_SECURE cho tất cả các Hoạt động. Khởi động lại ứng dụng để thay đổi có hiệu lực.
+ Ngăn ảnh chụp màn hình của ứng dụng
+ Khóa khôi phục Sao lưu Chính
+ Không biết cụm mật khẩu Sao lưu Khóa của bạn, bạn có thể %s.
+ sử dụng khóa khôi phục Sao lưu Khóa của bạn
+ Nhập chìa khóa Cụm mật khẩu Sao lưu của bạn để tiếp tục.
+ %1$s (%2$s)
+ Lưu trữ bí mật khóa sao lưu trong SSSS
+ Tạo khóa SSSS từ khóa phục hồi
+ Tạo khóa SSSS từ cụm mật khẩu (%s)
+ Tạo khóa SSSS từ cụm mật khẩu
+ Nhận Khóa cong
+ Kiểm tra Khóa sao lưu (%s)
+ Kiểm tra Khóa sao lưu
+ Vui lòng nhập khóa khôi phục
+ Nó không phải là một khóa phục hồi hợp lệ
+ Cụm mật khẩu phục hồi
+ Nhập %s
+ Sử dụng Tệp
+ Nhập %s của bạn để tiếp tục
+ Xác minh bản thân và người khác để giữ an toàn cho cuộc trò chuyện của bạn
+ Bật xác thực chéo
+ Nâng cấp mã hóa có sẵn
+ Tin nhắn…
+ Tài khoản này đã bị vô hiệu hóa.
+ Tên người dùng và/hoặc mật khẩu không chính xác. Mật khẩu đã nhập bắt đầu hoặc kết thúc bằng không gian, vui lòng kiểm tra.
+ Gửi tin nhắn dưới dạng văn bản thuần túy, mà không giải thích nó dưới dạng đánh dấu
+ Đặt tầm quan trọng thông báo theo sự kiện
+ Khắc phục
+ Cấu hình thông báo
+ Thất bại trong việc nhập khóa
+ Đang chờ %s…
+ Gần xong! Đang chờ xác nhận…
+
+ Kết quả cuối cùng dựa trên %1$d phiếu bầu
+
+
+ Đã bỏ %1$d phiếu bầu. Bỏ phiếu để xem kết quả
+
+
+ Dựa trên %1$d phiếu bầu
+
+
+ %1$d phiếu bầu
+
+
+ Ít nhất %1$s tùy chọn là cần thiết
+
+
+ %d người bạn biết đã tham gia
+
+
+ %1$d cuộc gọi đang hoạt động ·
+
+
+ 1 cuộc gọi đang hoạt động (%1$s) · %2$d cuộc gọi bị tạm dừng
+
+ Gần xong! Thiết bị khác có hiển thị dấu tick không\?
+ "Chủ đề: "
+ Thêm chủ đề
+ %s để cho mọi người biết căn phòng này là gì.
+ Đây là phần đầu của lịch sử thư trực tiếp của bạn với %s.
+ Đây là khởi đầu của cuộc trò chuyện này.
+ Đây là sự khởi đầu của %s.
+ Bạn đã tham gia.
+ %s đã tham gia.
+ Bạn đã tạo và cấu hình phòng.
+ %s đã tạo và cấu hình phòng.
+ Mã hóa được sử dụng bởi phòng này không được hỗ trợ
+ Mã hóa không được bật
+ Tin nhắn trong phòng này được mã hóa đầu cuối
+ Tin nhắn trong phòng này được mã hóa đầu cuối. Tìm hiểu thêm và xác minh người dùng trong hồ sơ của họ.
+ Mã hóa được bật
+ Nếu bạn hủy ngay bây giờ, bạn có thể mất tin nhắn và dữ liệu được mã hóa nếu bạn mất quyền truy cập vào thông tin đăng nhập của mình.
+\n
+\nBạn cũng có thể thiết lập Sao lưu Bảo mật và quản lý khóa của mình trong Cài đặt.
+ Thiết lập Cụm mật khẩu Phục hồi cho phép bạn bảo mật và mở khóa tin nhắn và tin cậy được mã hóa.
+ Thiết lập Cụm mật khẩu Phục hồi cho phép bạn bảo mật và mở khóa tin nhắn và tin cậy được mã hóa.
+\n
+\nNếu bạn không muốn đặt Mật khẩu Tin nhắn, hãy tạo Khóa Tin nhắn thay thế.
+ Bạn không thể làm điều đó từ điện thoại di động
+ Sao chép nó vào bộ nhớ đám mây cá nhân của bạn
+ Lưu nó trên khóa USB hoặc ổ đĩa sao lưu
+ In nó và lưu trữ nó ở đâu đó an toàn
+ %2$s &%1$s của bạn đã được đặt.
+\n
+\nGiữ chúng an toàn! Bạn sẽ cần chúng để mở khóa tin nhắn được mã hóa và bảo mật thông tin nếu bạn mất tất cả các phiên đang hoạt động của mình.
+ Đang cài đặt chìa khóa sao lưu
+ Đang đồng bộ chìa khóa đăng nhập của bản thân
+ Giới hạn là không rõ.
+ Homeerver của bạn chấp nhận phần đính kèm (tệp, media, v.v.) với kích thước lên tới %s.
+ Giới hạn tải lên tệp máy chủ
+ Phiên bản máy chủ
+ Tên máy chủ
+ Đăng xuất khỏi phiên này
+ Quản lý Phiên
+ Hiện Tất cả Phiên
+ Phiên Hoạt động
+ Người quản trị máy chủ của bạn đã vô hiệu hóa mã hóa đầu cuối theo mặc định trong phòng riêng và Tin nhắn trực tiếp.
+ Xác thực chéo không được bật
+ Xác thực chéo được kích hoạt.
+\nCác khóa không đáng tin cậy
+ Xác thực chéo chéo được kích hoạt
+\nChìa khóa được tin cậy.
+\nKhóa riêng tư không được biết
+ Xác thực chéo được kích hoạt
+\nKhóa riêng trên thiết bị.
+ Xác thực chéo
+ Phiên mới của bạn hiện đã được xác minh. Nó có quyền truy cập vào các tin nhắn được mã hóa của bạn và những người dùng khác sẽ thấy nó đáng tin cậy.
+ Tin nhắn với người dùng này được mã hóa đầu cuối và không thể được đọc bởi các bên thứ ba.
+ So sánh mã với mã được hiển thị trên màn hình của người dùng khác.
+ So sánh biểu tượng cảm xúc độc đáo, đảm bảo chúng xuất hiện theo cùng một thứ tự.
+ Để được an toàn, hãy làm điều này trực tiếp hoặc sử dụng một cách khác để giao tiếp.
+ Để an toàn, hãy xác minh %s bằng cách kiểm tra mã một lần.
+ Bật mã hóa
+ Sau khi được bật, mã hóa cho một căn phòng không thể bị vô hiệu hóa. Tin nhắn được gửi trong một căn phòng được mã hóa không thể được nhìn thấy bởi máy chủ, chỉ bởi những người tham gia của căn phòng. Cho phép mã hóa có thể ngăn nhiều bot và cầu hoạt động chính xác.
+ Bật mã hóa\?
+ Sau khi được bật, mã hóa không thể bị vô hiệu hóa.
+ Bạn không có quyền bật mã hóa trong phòng này.
+ Bật mã hóa đầu cuối…
+ Trình soạn thảo tin nhắn
+ Dòng thời gian
+ Gửi emote đã cho màu cầu vồng
+ Gửi tin nhắn đã cho có màu cầu vồng
+ Các phòng khác
+ Các phòng gần đây
+ Phiên này không thể chia sẻ xác minh này với các phiên khác của bạn.
+\nViệc xác minh sẽ được lưu cục bộ và chia sẻ trong phiên bản tương lai của ứng dụng.
+ Hủy bỏ qua
+ ${app_name} gặp sự cố khi hiển thị nội dung sự kiện với id \'%1$s\'
+ ${app_name} không xử lý tin nhắn kiểu \'%1$s\'
+ ${app_name} không xử lý các sự kiện thuộc loại \'%1$s\'
+ Nhảy để đọc biên nhận
+ Tin nhắn trực tiếp
+ Tùy chỉnh (%1$d) trong %2$s
+ Mặc định trong %1$s
+ Người điều hành trong %1$s
+ Quản trị viên trong %1$s
+ Người dùng
+ Mời
+ Tùy chọn
+ Điều hành viên
+ Quản trị viên
+ Đang rời phòng…
+ Rời khỏi
+ Rời phòng
+ Tải lên
+ Thông báo
+ Cài đặt
+ Cài đặt phòng
+ Hành động Quản trị
+ Thêm
+ Tìm hiểu thêm
+ Bảo mật
+ Tin nhắn ở đây được mã hóa đầu cuối.
+\n
+\nTin nhắn của bạn được bảo mật bằng khóa và chỉ có bạn và người nhận có các khóa duy nhất để mở khóa chúng.
+ Tin nhắn trong phòng này được mã hóa đầu cuối.
+\n
+\nTin nhắn của bạn được bảo mật bằng khóa và chỉ có bạn và người nhận có các khóa duy nhất để mở khóa chúng.
+ Tin nhắn ở đây không được mã hóa đầu cuối.
+ Tin nhắn trong phòng này không được mã hóa đầu cuối.
+ Để bảo mật thêm, hãy xác minh %s bằng cách kiểm tra mã một lần trên cả hai thiết bị của bạn.
+\n
+\nĐể bảo mật tối đa, hãy làm điều này trực tiếp.
+ Đang chờ %s…
+ Đã xác minh %s
+ Xác minh %s
+ Hình ảnh mã QR
+ Nếu bạn không thể quét mã ở trên, hãy xác minh bằng cách so sánh một lựa chọn biểu tượng cảm xúc ngắn, duy nhất.
+ Xác minh bằng biểu tưởng cảm xúc
+ Xác minh bằng cách so sánh biểu tượng cảm xúc
+ Thay vào đó, xác minh bằng cách so sánh biểu tượng cảm xúc
+ Nếu bạn không trực tiếp, hãy so sánh biểu tượng cảm xúc thay thế
+ Không thể quét
+ Quét bằng thiết bị này
+ Quét mã của họ
+ Quét mã bằng thiết bị khác của bạn hoặc chuyển đổi và quét bằng thiết bị này
+ Quét mã bằng thiết bị của người dùng khác để xác minh lẫn nhau một cách an toàn
+ Bạn
+ Xác minh thủ công
+ Xác minh phiên này
+ Yêu cầu xác minh
+ Xác minh đã gửi
+ Bạn đã chấp nhận
+ %s đã chấp nhận
+ Bạn đã hủy bỏ
+ %s đã hủy bỏ
+ Đang chờ…
+ Kết luận xác minh
+ Phản ứng với: %s
+ Thăm dò ý kiến
+ Sticker
+ Tệp
+ Thoại
+ Âm thanh
+ Hình ảnh.
+ Video.
+ Một trong những điều sau đây có thể bị xâm phạm:
+\n
+\n - Homeserver của bạn
+\n - Homeserver mà bạn đang xác minh được kết nối với
+\n - Kết nối internet của bạn hoặc của người dùng khác
+\n - Thiết bị của bạn hoặc thiết bị của người dùng khác
+ Không bảo mật
+ Tìm kiếm lá chắn màu xanh lá cây để đảm bảo người dùng được tin tưởng. Tin tưởng tất cả người dùng trong một căn phòng để đảm bảo phòng được an toàn.
+ Để bảo mật cuối cùng, hãy sử dụng một phương tiện giao tiếp đáng tin cậy khác hoặc làm điều này trực tiếp.
+ Xác minh người dùng này bằng cách xác nhận biểu tượng cảm xúc duy nhất sau đây xuất hiện trên màn hình của họ, theo cùng một thứ tự.
+ Chúng không phù hợp
+ Chúng phù hợp
+ Đăng nhập không tin cậy
+ Tên miền email của bạn không được phép đăng ký trên máy chủ này
+ Tạo Space…
+ Tạo phòng…
+ Một số ký tự không được phép
+ Vui lòng cung cấp địa chỉ phòng
+ Địa chỉ này đã được sử dụng
+ Địa chỉ Space
+ Địa chỉ phòng
+ Bạn có thể bật điều này nếu phòng sẽ chỉ được sử dụng để cộng tác với các nhóm nội bộ trên nhà của bạn. Điều này không thể thay đổi sau này.
+ Chặn bất kỳ ai không thuộc %s tham gia phòng này
+ Ẩn nâng cao
+ Hiện nâng cao
+ Sau khi được bật, mã hóa không thể bị vô hiệu hóa.
+ Bật mã hóa
+ Thêm ( ͡° ͜ʖ ͡°) vào một tin nhắn văn bản thuần túy
+ "Thêm ̄\\_(ツ)_/ ̄ vào một tin nhắn văn bản thuần túy"
+ Hiển thị một số thông tin hữu ích để giúp gỡ lỗi ứng dụng
+ Hiện thông tin debug trên màn hình
+ ${app_name} có thể gặp sự cố thường xuyên hơn khi một lỗi bất ngờ xảy ra
+ Thất bại nhanh
+ Chỉ hiển thị kết quả đầu tiên, nhập thêm chữ cái
+ Các phiên khác
+ Phiên hiện tại
+ Cài đặt
+ Lắc phát hiện!
+ Lắc điện thoại để kiểm tra ngưỡng phát hiện
+ Ngưỡng phát hiện
+ Rageshake
+ Chế độ nhà phát triển kích hoạt các tính năng ẩn và cũng có thể làm cho ứng dụng kém ổn định hơn. Chỉ dành cho các nhà phát triển!
+ Chế độ nhà phát triển
+ Cài đặt nâng cao
+ Xem tất cả các phiên của tôi
+ Đồng bộ ban đầu…
+ Mô tả quá ngắn
+ Liên kết matrix.to của bạn bị dị hỏng
+ Phiên hiện tại dành cho người dùng %1$s và bạn cung cấp thông tin đăng nhập cho người dùng %2$s. Điều này không được hỗ trợ bởi ${app_name}.
+\nTrước tiên, hãy xóa dữ liệu, sau đó đăng nhập lại trên tài khoản khác.
+ Xóa dữ liệu
+ Bạn sẽ mất quyền truy cập vào các tin nhắn an toàn trừ khi bạn đăng nhập để khôi phục khóa mã hóa của mình.
+ Xóa tất cả dữ liệu hiện đang được lưu trữ trên thiết bị này\?
+\nĐăng nhập lại để truy cập dữ liệu tài khoản và tin nhắn của bạn.
+ Xóa dữ liệu
+ Xóa tất cả dữ liệu
+ Cảnh báo: Dữ liệu cá nhân của bạn (bao gồm cả khóa mã hóa) vẫn được lưu trữ trên thiết bị này.
+\n
+\nXóa nó nếu bạn đã hoàn tất việc sử dụng thiết bị này hoặc muốn đăng nhập vào tài khoản khác.
+ Xóa dữ liệu cá nhân
+ Mật khẩu
+ Đăng nhập
+ Đăng nhập để khôi phục các khóa mã hóa được lưu trữ độc quyền trên thiết bị này. Bạn cần họ đọc tất cả các tin nhắn an toàn của bạn trên bất kỳ thiết bị nào.
+ Người quản trị homeerver (%1$s) của bạn đã đăng xuất bạn ra khỏi tài khoản %2$s (%3$s).
+ Đăng nhập
+ Bạn đã đăng xuất
+ Đăng nhập lại
+ Có thể là do nhiều lý do khác nhau:
+\n
+\n• Bạn đã thay đổi mật khẩu của mình trên một phiên khác.
+\n
+\n• Bạn đã xóa phiên này khỏi phiên khác.
+\n
+\n• Người quản trị máy chủ của bạn đã vô hiệu hóa quyền truy cập của bạn vì lý do bảo mật.
+ Bạn đã đăng xuất
+ Nhìn thấy bởi
+ Không thể tìm thấy một homeerver hợp lệ. Vui lòng kiểm tra mã định danh của bạn
+ Đây không phải là mã định danh người dùng hợp lệ. Định dạng dự kiến: \'@user:homeserver.org\'
+ Nếu bạn không biết mật khẩu của mình, hãy quay lại để đặt lại mật khẩu đó.
+ Matrix ID
+ Nếu bạn thiết lập tài khoản trên homeerver, hãy sử dụng Matrix ID của bạn (ví dụ: @user:domain.com) và mật khẩu bên dưới.
+ Đăng nhập bằng Matrix ID
+ Đăng nhập bằng Matrix ID
+ Ngoài ra, nếu bạn đã có tài khoản và bạn biết mã định danh Ma trận và mật khẩu của mình, bạn có thể sử dụng phương pháp này:
+ Homeerver này đang chạy một phiên bản cũ. Yêu cầu người quản trị homeerver của bạn nâng cấp. Bạn có thể tiếp tục, nhưng một số tính năng có thể không hoạt động chính xác.
+ Homeerver này đang chạy một phiên bản quá cũ để kết nối. Yêu cầu người quản trị homeerver của bạn nâng cấp.
+ Homeerver lỗi thời
+ Không giống như một địa chỉ email hợp lệ
+ Ứng dụng không thể tạo tài khoản trên homeerver này.
+\n
+\nBạn có muốn đăng ký bằng máy khách web không\?
+ Xin lỗi, máy chủ này không chấp nhận tài khoản mới
+ Ứng dụng không thể đăng nhập vào homeerver này. Homeerver hỗ trợ loại signin sau đây:%1$s.
+\n
+\nBạn có muốn đăng nhập bằng máy khách web không\?
+ Lỗi xảy ra khi tải trang: %1$s (%2$d)
+ Nhập địa chỉ của máy chủ bạn muốn sử dụng
+ Nhập địa chỉ của Mô-đun Element hoặc Máy chủ bạn muốn sử dụng
+ Lưu trữ cao cấp cho các tổ chức
+ Lưu trữ cao cấp cho các tổ chức
+ Tham gia hàng triệu máy chủ công cộng miễn phí lớn nhất
+ Thăm dò ý kiến
+ Mở ngăn khung điều hướng
+ Có vẻ như máy chủ mất quá nhiều thời gian để phản hồi, điều này có thể được gây ra bởi kết nối kém hoặc lỗi với máy chủ. Hãy thử lại trong một thời gian.
+ Vui lòng thử lại một khi bạn đã chấp nhận các điều khoản và điều kiện của homeserver của bạn.
+ Nhật ký verbose sẽ giúp các nhà phát triển bằng cách cung cấp thêm nhật ký khi bạn gửi RageShake. Ngay cả khi được bật, ứng dụng không ghi lại nội dung tin nhắn hoặc bất kỳ dữ liệu riêng tư nào khác.
+ Bật nhật ký verbose.
+ Đồng ý với điều khoản dịch vụ của máy chủ xác thực (%s) để cho phép bản thân có thể khám phá bằng địa chỉ email hoặc số điện thoại.
+ Bạn hiện đang chia sẻ địa chỉ email hoặc số điện thoại trên máy chủ xác thực %1$s. Bạn sẽ cần kết nối lại với %2$s để ngừng chia sẻ chúng.
+ Mã xác minh không chính xác.
+ Có lỗi tra cứu số điện thoại
+ Bàn phím số
+ Kết nối thất bại
+ Không trả lời
+ Cuộc gọi video bị bỏ lỡ
+ Cuộc gọi thoại nhỡ
+ Cuộc gọi video bị từ chối
+ Cuộc gọi thoại từ chối
+ Cuộc gọi video đã kết thúc • %1$s
+ Cuộc gọi thoại kết thúc • %1$s
+ Cuộc gọi video đang hoạt động
+ Cuộc gọi thoại đang hoạt động
+ Cuộc gọi thoại đến
+ Cuộc gọi thoại đến
+ Gọi lại
+ Cuộc gọi này đã kết thúc
+ %1$s đã từ chối cuộc gọi này
+ Bạn đã từ chối cuộc gọi này.
+ Bạn đã từ chối cuộc gọi này %s
+ Hiện tại bạn đang ở trong cuộc gọi này
+ %1$s bắt đầu cuộc gọi
+ Bạn bắt đầu một cuộc gọi
+ Mã
+ Thư văn bản đã được gửi đến %s. Vui lòng nhập mã xác minh mà nó chứa.
+ Máy chủ xác thực bạn đã chọn không có bất kỳ điều khoản dịch vụ nào. Chỉ tiếp tục nếu bạn tin tưởng chủ sở hữu dịch vụ
+ Máy chủ xác thực không có điều khoản dịch vụ
+ Vui lòng nhập url máy chủ xác thực
+ Không thể kết nối với máy chủ xác thực
+ Nhập URL máy chủ xác thực
+ Chính sách
+ Bạn có đồng ý gửi thông tin này không\?
+ Để khám phá các liên hệ hiện có, bạn cần gửi thông tin liên hệ (email và số điện thoại) đến máy chủ nhận dạng của mình. Chúng tôi băm dữ liệu của bạn trước khi gửi cho quyền riêng tư.
+ Để khám phá các liên hệ hiện có, bạn cần gửi thông tin liên hệ đến máy chủ xác thực của mình.
+\n
+\nChúng tôi băm dữ liệu của bạn trước khi gửi cho quyền riêng tư. Bạn có đồng ý gửi thông tin này không\?
+ Để khám phá các liên hệ hiện có mà bạn biết, bạn có chấp nhận gửi dữ liệu liên hệ (số điện thoại và/hoặc email) đến máy chủ xác thực được cấu hình (%1$s)\?
+\n
+\nĐể có thêm quyền riêng tư, dữ liệu được gửi sẽ được băm trước khi được gửi.
+ Gửi email và số điện thoại đến %s
+ Gửi email và số điện thoại
+ Đồng ý
+ Thu hồi sự đồng ý của tôi
+ Các liên hệ của bạn là riêng tư. Để khám phá người dùng từ danh bạ của bạn, chúng tôi cần sự cho phép của bạn để gửi thông tin liên hệ đến máy chủ xác thực của bạn.
+ Bạn đã không đồng ý gửi email và số điện thoại đến máy chủ xác thực này để khám phá những người dùng khác từ danh bạ của bạn.
+ Bạn đã đồng ý gửi email và số điện thoại đến máy chủ xác thực này để khám phá những người dùng khác từ danh bạ của bạn.
+ Gửi email và số điện thoại
+ Đang chờ
+ Chúng tôi đã gửi cho bạn một email xác nhận đến %s, trước tiên vui lòng kiểm tra email của bạn và nhấp vào liên kết xác nhận
+ Chúng tôi đã gửi cho bạn một email xác nhận đến %s, kiểm tra email của bạn và nhấp vào liên kết xác nhận
+ Số điện thoại có thể khám phá
+ Ngắt kết nối khỏi máy chủ xác thực của bạn sẽ có nghĩa là bạn sẽ không thể khám phá bởi những người dùng khác và bạn sẽ không thể mời người khác qua email hoặc điện thoại.
+ Tùy chọn Khám phá sẽ xuất hiện khi bạn đã thêm số điện thoại.
+ app_id:
+ Không có cổng Push đã đăng ký
+ Không có quy tắc Push nào được xác định
+ Quy tắc Push
+ Chuyên gia
+ Bảo mật & Quyền riêng tư
+ Sự ưa thích
+ Tổng quát
+ Phản ứng nhanh
+ Bạn đang xem phòng này rồi!
+ Thông báo của bên thứ ba khác
+ Phiên bản Matrix SDK
+ Nhập khóa e2e từ tệp \"%1$s\".
+ Lỗi xảy ra khi nhận được dữ liệu sao lưu khóa
+ Lỗi xảy ra khi nhận được thông tin tin cậy
+ Căn phòng đã được tạo ra, nhưng một số lời mời đã không được gửi vì lý do sau:
+\n
+\n%s
+ Công khai phòng này trong thư mục phòng
+ Thư mục phòng
+ Bất cứ ai cũng có thể tham gia vào căn phòng này.
+ Công cộng
+ Cài đặt phòng
+ Chủ đề
+ Chủ đề phòng (tùy chọn)
+ Tên
+ Tên phòng
+ TẠO
+ Phòng mới
+ Tin nhắn trực tiếp
+ Phòng
+ Căn phòng này không thể xem trước được. Bạn có muốn tham gia nó không\?
+ Căn phòng này không thể truy cập vào thời điểm này.
+\nHãy thử lại sau, hoặc yêu cầu quản trị viên phòng kiểm tra xem bạn có quyền truy cập hay không.
+ Bản xem trước của phòng có thể đọc được trên thế giới vẫn chưa được hỗ trợ bằng ${app_name}
+ Phòng này không thể được xem trước
+ Tất cả Community
+ Vui lòng chờ…
+ Thay đổi mạng
+ Thay đổi
+ Không có mạng. Vui lòng kiểm tra kết nối internet
+ Tạo Space mới
+ Tạo phòng mới
+ Sự kiện bị hỏng, không thể hiển thị
+ Lần cuối được sửa bởi %1$s trên %2$s
+ Sự kiện được vận hành bởi người quản trị phòng
+ Sự kiện bị xóa bởi người dùng
+ Hiển thị người gửi các tin nhắn đã xóa
+ Hiển thị tin nhắn đã xóa
+ Tin nhắn đã xóa
+ Phản ứng
+ Xem phản ứng
+ Thêm phản ứng
+ Thích
+ Đồng ý
+ Phản ứng
+ Phòng
+ Các cuộc hội thoại tin nhắn trực tiếp của bạn sẽ được hiển thị tại đây. Nhấp vào dấu + dưới cùng bên phải để bắt đầu.
+ Các cuộc hội thoại
+ Bắt kịp các tin nhắn chưa đọc tại đây
+ Có vẻ như bạn đang cố gắng kết nối với một homeserver khác. Bạn có muốn đăng xuất không\?
+ Không có máy chủ xác thực nào được cấu hình, cần thiết để đặt lại mật khẩu của bạn.
+ Bạn không sử dụng bất kỳ máy chủ xác thực nào
+ Lỗi không xác định
+ Người dùng không khớp
+ Khóa không khớp
+ Một tin nhắn không hợp lệ đã được nhận
+ Phiên đã nhận được một tin nhắn bất ngờ
+ SAS không khớp
+ Sự cam kết băm không khớp
+ Phiên không thể đồng ý về một sự thỏa thuận khóa, phương pháp băm, MAC hoặc SAS
+ Phiên họp không biết về giao dịch đó
+ Quá trình xác minh đã hết thời gian
+ Người dùng đã hủy xác minh
+ %s muốn xác minh phiên của bạn
+ Yêu cầu xác minh
+ Xác minh Phiên Tương tác
+ Việc xác minh bị hủy bỏ.
+\nLý do: %s
+ Bên kia đã hủy bỏ việc xác minh.
+\n%s
+ Yêu cầu bị hủy
+ Xác minh Khóa
+ Sử dụng xác minh kế thừa.
+ Không có gì xuất hiện\? Không phải tất cả ứng dụng đầu cuối đều hỗ trợ xác minh tương tác. Sử dụng xác minh kế thừa.
+ Đã nhận được
+ Tin nhắn an toàn với người dùng này được mã hóa đầu cuối và không thể được các bên thứ ba đọc.
+ Bạn đã xác minh thành công phiên này.
+ Đã xác minh!
+ Chờ đối tác xác nhận…
+ Xem yêu cầu
+ Bạn đã nhận được yêu cầu xác minh đến.
+ Xác minh phiên này bằng cách xác nhận các số sau đây xuất hiện trên màn hình của đối tác
+ Xác minh phiên này bằng cách xác nhận biểu tượng cảm xúc sau đây xuất hiện trên màn hình của đối tác
+ Xác minh phiên này sẽ đánh dấu nó là đáng tin cậy và cũng đánh dấu phiên của bạn là đáng tin cậy cho đối tác.
+ Xác minh phiên này để đánh dấu nó là đáng tin cậy. Các phiên tin cậy của các đối tác giúp bạn yên tâm hơn khi sử dụng các tin nhắn được mã hóa đầu cuối.
+ Yêu cầu xác minh đến
+ Bắt đầu Xác minh
+ Để bảo mật tối đa, chúng tôi khuyên bạn nên làm điều này trực tiếp hoặc sử dụng một phương tiện liên lạc đáng tin cậy khác.
+ Xác minh bằng cách so sánh một chuỗi văn bản ngắn.
+ Bạn đã bị đăng xuất do mật khẩu không hợp lệ hoặc hết hạn.
+ Sử dụng cấu hình
+ ${app_name} đã phát hiện cấu hình máy chủ tùy chỉnh cho tên miền userId của bạn \"%1$s\":
+\n%2$s
+ Tự động hoàn tất các tùy chọn máy chủ
+ Phản hồi khám phá homeserver không hợp lệ
+ Chữ ký
+ Thuật toán
+ Phiên bản
+ Tất cả các khóa được sao lưu
+ Thiết lập Sao lưu An toàn
+ Sao lưu chìa khóa của bạn. Việc này có thể mất vài phút…
+ Quản lý trong Khóa Sao lưu
+ Khóa thư bảo mật mới
+ Dùng Khóa Sao lưu
+ Không bao giờ mất tin nhắn được mã hóa
+ Bảo vệ chống mất quyền truy cập vào tin nhắn và dữ liệu được mã hóa
+ Sao lưu An toàn
+ Bắt đầu sử dụng Khóa Sao lưu
+ Không bao giờ mất tin nhắn được mã hóa
+ Đó là tôi.
+ Một bản sao lưu khóa thư bảo mật mới đã được phát hiện.
+\n
+\nNếu bạn không thiết lập phương pháp khôi phục mới, kẻ tấn công có thể đang cố gắng truy cập tài khoản của bạn. Thay đổi mật khẩu tài khoản của bạn và đặt phương pháp khôi phục mới ngay lập tức trong Cài đặt.
+ Sao lưu Khóa Mới
+ Xóa khóa mã hóa đã sao lưu của bạn khỏi máy chủ\? Bạn sẽ không còn có thể sử dụng khóa khôi phục của mình để đọc lịch sử tin nhắn được mã hóa.
+ Xóa Sao lưu
+ Kiểm tra trạng thái sao lưu
+ Thất bại trong việc xóa sao lưu (%s)
+ Đang xóa bản sao lưu…
+ Để sử dụng Sao lưu Chính trong phiên này, hãy khôi phục bằng cụm mật khẩu hoặc khóa khôi phục của bạn ngay bây giờ.
+ Thất bại trong việc nhận thông tin tin cậy để sao lưu (%s).
+ Sao lưu có chữ ký không hợp lệ từ phiên chưa được xác minh %s
+ Sao lưu có chữ ký không hợp lệ từ phiên đã xác minh %s
+ Sao lưu có chữ ký hợp lệ từ phiên chưa được xác minh %s
+ Sao lưu có chữ ký hợp lệ từ phiên đã xác minh %s.
+ Sao lưu có chữ ký hợp lệ từ phiên này.
+ Sao lưu có chữ ký từ phiên không xác định với ID %s.
+ Khóa của bạn không được sao lưu từ phiên này.
+ Sao lưu chính không hoạt động trong phiên này.
+ Key Backup đã được thiết lập chính xác cho phiên này.
+ Xóa Sao lưu
+ Khôi phục từ Sao lưu
+ Mã hóa phiên không được kích hoạt
+ Thất bại trong việc nhận được phiên bản khóa khôi phục mới nhất (%s).
+ Sao lưu đã khôi phục %s !
+ Sao lưu không thể được giải mã bằng khóa khôi phục này: vui lòng xác minh rằng bạn đã nhập khóa khôi phục chính xác.
+ Vui lòng nhập khóa khôi phục
+ Mở khóa Lịch sử
+ Đang nhập các khóa…
+ Đang tải xuống các khóa…
+ Đang tính toán khóa khôi phục…
+ Khôi phục sao lưu:
+ Lỗi mạng: vui lòng kiểm tra kết nối của bạn và thử lại .
+ Sao lưu không thể được giải mã bằng cụm mật khẩu này: vui lòng xác minh rằng bạn đã nhập cụm mật khẩu phục hồi chính xác.
+ Mất chìa khóa phục hồi\? Bạn có thể thiết lập một cái mới trong cài đặt.
+ Khôi phục tin nhắn
+ Nhập Khóa Khôi phục
+ Sử dụng Khóa Khôi phục của bạn để mở khóa lịch sử tin nhắn được mã hóa của bạn
+ Không biết cụm mật khẩu phục hồi của bạn, bạn có thể %s.
+ sử dụng khóa khôi phục của bạn
+ Sử dụng cụm mật khẩu khôi phục của bạn để mở khóa lịch sử tin nhắn được mã hóa của bạn
+ Đang tìm phiên bản sao lưu…
+ Bạn có thể mất quyền truy cập vào tin nhắn của mình nếu bạn đăng xuất hoặc mất thiết bị này.
+ Bạn có chắc không\?
+ Khóa mã hóa của bạn hiện đang được sao lưu trong nền cho homeerver của bạn. Việc sao lưu ban đầu có thể mất vài phút.
+ Bắt đầu Sao lưu
+ Lỗi bất ngờ
+ Khóa Khôi phục
+ Tạo Khóa Phục hồi bằng cách sử dụng cụm mật khẩu, quá trình này có thể mất vài giây.
+ Chia sẻ khóa phục hồi với…
+ Vui lòng tạo bản sao
+ Dừng
+ Thay thế
+ Có vẻ như bạn đã thiết lập bản sao lưu khóa từ một phiên khác. Bạn có muốn thay thế nó bằng cái mà bạn đang tạo ra không\?
+ Một bản sao lưu đã tồn tại trên homeerver của bạn
+ Khóa phục hồi đã được lưu.
+ Khóa khôi phục đã được lưu thành \'%s\'.
+\n
+\nCảnh báo: tệp này có thể bị xóa nếu ứng dụng được gỡ cài đặt.
+ Lưu dưới dạng Tệp
+ Chia sẻ
+ Lưu Khóa Khôi phục
+ Tôi đã tạo ra một bản sao
+ Xong
+ Giữ khóa khôi phục của bạn ở đâu đó rất an toàn, như trình quản lý mật khẩu (hoặc két an toàn)
+ Khóa khôi phục của bạn là một mạng lưới an toàn - bạn có thể sử dụng nó để khôi phục quyền truy cập vào các tin nhắn được mã hóa của mình nếu bạn quên cụm mật khẩu của mình.
+\nGiữ khóa khôi phục của bạn ở đâu đó rất an toàn, như trình quản lý mật khẩu (hoặc an toàn)
+ Các khóa của bạn đang được sao lưu.
+ Thành công!
+ (Nâng cao) Thiết lập với Khóa Khôi phục
+ Hoặc, bảo mật sao lưu của bạn bằng Khóa Khôi phục, lưu nó ở đâu đó an toàn.
+ Tạo Sao lưu
+ Đặt Cụm mật khẩu
+ Chúng tôi sẽ lưu trữ một bản sao được mã hóa của khóa của bạn trên homeerver của bạn. Bảo vệ bản sao lưu của bạn bằng cụm mật khẩu để giữ an toàn.
+\n
+\nĐể bảo mật tối đa, điều này phải khác với mật khẩu tài khoản của bạn.
+ Bảo mật sao lưu của bạn bằng Cụm mật khẩu.
+ Xuất các khóa thủ công
+ (Nâng cao)
+ Bắt đầu sử dụng Khóa Sao lưu
+ Tin nhắn trong các phòng được mã hóa được bảo mật bằng mã hóa đầu cuối. Chỉ có bạn và người nhận mới có chìa khóa để đọc các tin nhắn này.
+\n
+\nSao lưu an toàn chìa khóa của bạn để tránh mất chúng.
+ Không bao giờ mất tin nhắn được mã hóa
+ Đang đồng hộ chìa khóa người dùng
+ Đang đồng bộ chìa khóa Master
+ Xác định khóa mặc định SSSS
+ Tạo khóa an toàn từ cụm mật khẩu
+ Công khai hóa các chìa khóa nhận dạng đã tạo
+ Sử dụng %1$s này làm mạng lưới an toàn trong trường hợp bạn quên %2$s của mình.
+ Kết thúc
+ Giữ an toàn
+ Bạn đã hoàn tất!
+ Khóa phục hồi của bạn
+ Cài lập phục hồi.
+ Việc này có thể mất vài giây, xin hãy kiên nhẫn.
+ Nhập cụm từ bảo mật chỉ bạn biết, được sử dụng để bảo mật bí mật trên máy chủ của bạn.
+ Không sử dụng mật khẩu tài khoản của bạn.
+ Nhập lại %s của bạn để xác nhận.
+ Bảo mật & mở khóa tin nhắn mã hóa và tin cậy bằng %s.
+ Nhập %s của bạn để tiếp tục.
+ Xác nhận %s
+ Tạo chía khóa tin nhắn
+ Đặt %s
+ Mật khẩu tài khoản
+ Chìa khóa tin nhắn
+ Cụm mật khẩu phục hồi
+ Xác minh bị hủy bỏ
+ Xác minh đã bị hủy bỏ. Bạn có thể bắt đầu xác minh lại.
+ Một trong những điều sau đây có thể bị xâm phạm:
+\n
+\n- Mật khẩu của bạn
+\n- Người ở nhà của anh
+\n- Thiết bị này hoặc thiết bị khác
+\n- Kết nối internet mà một trong hai thiết bị đang sử dụng
+\n
+\nChúng tôi khuyên bạn nên thay đổi mật khẩu và khóa khôi phục trong Cài đặt ngay lập tức.
+ Bạn sẽ không xác minh %1$s (%2$s) nếu bạn hủy ngay. Bắt đầu lại trong hồ sơ người dùng của họ.
+ Nếu bạn hủy, bạn sẽ không thể đọc tin nhắn được mã hóa trên thiết bị mới của mình và những người dùng khác sẽ không tin tưởng nó.
+ Nếu bạn hủy, bạn sẽ không thể đọc tin nhắn được mã hóa trên thiết bị này và những người dùng khác sẽ không tin tưởng nó.
+ Tài khoản của bạn có thể bị xâm phạm
+ Đây không phải là tôi.
+ Sử dụng phiên này để xác minh phiên mới của bạn, cấp cho nó quyền truy cập vào các tin nhắn được mã hóa.
+ Nhấp để xem xét và xác minh
+ Đăng nhập mới. Đây có phải là bạn không\?
+ Làm tươi
+ Mở khóa lịch sử tin nhắn được mã hóa
+ Kiểm toán Xuất
+ Yêu cầu chìa khóa
+ ${app_name} Android
+ Chìa khóa đã được cập nhật!
+ Sự kiện được kiểm duyệt bởi người quản trị phòng, lý do: %1$s
+ Sự kiện bị người dùng xóa, lý do: %1$s
+ Lý do tái sửa
+ Bao gồm một lý do
+ Bạn có chắc chắn muốn loại bỏ (xóa) sự kiện này không\? Lưu ý rằng nếu bạn xóa tên phòng hoặc thay đổi chủ đề, nó có thể hoàn tác thay đổi.
+ Xác nhận Loại bỏ
+ Gửi media với kích thước ban đầu
+ Bạn có muốn gửi phần đính kèm này đến %1$s không\?
+ Xóa…
+ Bạn chỉ nên truy cập lưu trữ bí mật từ một thiết bị đáng tin cậy
+ Cảnh báo:
+ Nhập cụm mật khẩu lưu trữ bí mật
+ Không thể tìm thấy bí mật trong kho
+ Đăng nhập mới
+ Nếu bạn không thể truy nhập phiên hiện có
+ Sử dụng Cụm mật khẩu hoặc Khóa phục hồi
+ Tạo một cuộc thăm dò ý kiến đơn giản
+ Xóa dữ liệu tài khoản của loại %1$s\?
+\n
+\nSử dụng một cách thận trọng, nó có thể dẫn đến hành vi bất ngờ.
+ Dữ liệu tài khoản
+ Công cụ Dev
+ Chế độ máy bay đang bật
+ Kết nối với máy chủ đã bị mất
+ Không
+ Có
+ Gần xong! %s có hiển thị dấu tích không
+ Mã QR
+ Đặt lại khóa
+ Khởi tạo xác thực chéo
+ Cho đến khi người dùng này tin tưởng phiên này, tin nhắn được gửi đến và đi từ nó được dán nhãn cảnh báo. Ngoài ra, bạn có thể xác minh thủ công.
+ %1$s (%2$s) đã đăng nhập bằng phiên mới:
+ Phiên này được tin cậy để nhắn tin an toàn vì %1$s (%2$s) đã xác minh:
+ Không tin cậy
+ Tin cậy
+ Phiên
+ Không nhận được phiên
+ Cảnh báo
+ Đã xác minh
+ Xác minh
+ Sử dụng phiên hiện có để xác minh phiên này, cấp cho nó quyền truy cập vào các thư được mã hóa.
+ Bảo mật hoàn toàn
+ Những người dùng khác có thể không tin tưởng nó.
+ Xác minh đăng nhập này
+ Xác minh phiên này để đánh dấu nó là đáng tin cậy và cấp cho nó quyền truy cập vào các thư được mã hóa. Nếu bạn không đăng nhập vào phiên này, tài khoản của bạn có thể bị xâm phạm:
+ Phiên này được tin cậy để nhắn tin an toàn vì bạn đã xác minh nó:
+ Không có thông tin mật mã sẵn dùng
+ bất ổn định
+ ổn định
+ Phiên bản Mặc định
+ Phiên bản phòng 👓
+ Không có phiên Matrix sẵn dùng
+ Vui lòng xóa cụm mật khẩu nếu bạn muốn ${app_name} để tạo khóa khôi phục.
+ Cụm mật khẩu quá yếu
+ Vui lòng nhập cụm mật khẩu
+ Cụm mật khẩu không khớp
+ Nhập cụm mật khẩu
+ Xác nhận cụm mật khẩu
+ Tạo cụm mật khẩu
+ Không tìm thấy APK Google Play Services hợp lệ. Thông báo có thể không hoạt động bình thường.
+ %d+
+ +%d
+ %1$s: %2$s
+ %1$s:
+ Chỉ dành cho lỗi
+ Đối với tin nhắn và lỗi
+ Luôn luôn
+ Hiện vùng thông tin
+ thu hẹp
+ mở rộng
+ Xin lỗi, một lỗi đã xảy ra
+ Homeerver của bạn chưa hỗ trợ tải chậm các thành viên phòng. Hãy thử sau.
+ Tăng hiệu suất bằng cách chỉ tải các thành viên phòng ở trong lần xem đầu tiên.
+ Tải chậm các phòng và thành viên
+ Vui lòng %s để tiếp tục sử dụng dịch vụ này.
+ Vui lòng %s để tăng giới hạn này.
+ Homeerver này đã đạt đến giới hạn người dùng hoạt động hàng tháng.
+ Homeerver này đã đạt đến giới hạn Người dùng hoạt động hàng tháng của nó vì vậy một số người dùng sẽ không thể đăng nhập.
+ Homeserver này đã vượt quá một trong những giới hạn tài nguyên của nó.
+ Homeerver này đã vượt quá một trong những giới hạn tài nguyên của nó vì vậy một số người dùng sẽ không thể đăng nhập.
+ liên hệ với người quản trị dịch vụ của bạn
+ Liên hệ quản trị viên
+ Vượt quá giới hạn tài nguyên
+ Bấm vào đây để xem tin nhắn cũ hơn
+ Phòng này là sự tiếp nối của một cuộc trò chuyện khác.
+ Cuộc trò chuyện tiếp tục ở đây
+ Phòng này đã được thay thế và không còn hoạt động nữa.
+ Vui lòng nhập mật khẩu của bạn.
+ Vui lòng nhập tên người dùng.
+ Hủy kích hoạt Tài khoản
+ Để tiếp tục, vui lòng nhập mật khẩu của bạn:
+ Vui lòng quên tất cả các tin nhắn tôi đã gửi khi tài khoản của tôi bị vô hiệu hóa (Cảnh báo: điều này sẽ khiến người dùng trong tương lai thấy chế độ xem cuộc hội thoại không đầy đủ)
+ Điều này sẽ làm cho tài khoản của bạn vĩnh viễn không thể sử dụng được. Bạn sẽ không thể đăng nhập và không ai có thể đăng ký lại cùng một ID người dùng. Điều này sẽ khiến tài khoản của bạn rời khỏi tất cả các phòng mà nó đang tham gia và nó sẽ xóa chi tiết tài khoản của bạn khỏi máy chủ nhận dạng của bạn. Điều này là không thể đảo ngược.
+\n
+\nHủy kích hoạt tài khoản của bạn does không theo mặc định khiến chúng tôi quên tin nhắn bạn đã gửi. Nếu bạn muốn chúng tôi quên tin nhắn của bạn, vui lòng đánh dấu vào hộp bên dưới.
+\n
+\nKhả năng hiển thị tin nhắn trong Matrix tương tự như email. Chúng tôi quên tin nhắn của bạn có nghĩa là tin nhắn bạn đã gửi sẽ không được chia sẻ với bất kỳ người dùng mới hoặc chưa đăng ký nào, nhưng người dùng đã đăng ký đã có quyền truy cập vào các tin nhắn này vẫn sẽ có quyền truy cập vào bản sao của họ.
+ Để tiếp tục sử dụng homeserver %1$s, bạn phải xem xét và đồng ý với các điều khoản và điều kiện.
+ Avatar
+ Chú ý avatar
+ Nhận avatar
+ Quên phòng
+ Tham gia lại
+ Lý do: %1$s
+ Bạn đã bị cấm từ %1$s bởi %2$s
+ Bạn đã bị đá từ %1$s bởi %2$s
+ Quản trị viên Community đã không cung cấp mô tả cho cộng đồng này.
+ Lọc nhóm phòng
+ Lọc thành viên nhóm
+ Đã mời
+ Đã tham gia
+ Phòng
+ Không có người dùng
+ Phòng
+ Danh bạ
+ Nhà
+ Ví dụ
+ ID Community
+ Ví dụ
+ Tên Community
+ Tạo Community
+ Tạo
+ Tin nhắn được mã hóa
+ Ồn ào
+ Im lặng
+ Tắt
+ Đánh dấu đã bị vô hiệu hóa.
+ Đánh dấu đã được kích hoạt.
+ Hiển thị thông tin về người dùng
+ Để sửa trình quản lý ứng dụng Matrix
+ Đánh dấu Bật/Tắt
+ Chỉ thay đổi avatar của bạn trong căn phòng hiện tại này
+ Thay đổi avatar của căn phòng hiện tại
+ Chỉ thay đổi biệt danh hiển thị của bạn trong phòng hiện tại
+ Thay đổi biệt danh hiển thị của bạn
+ Đá người dùng với id đã cho
+ Đặt chủ đề phòng
+ Rời khỏi phòng
+ Tham gia phòng có địa chỉ đã cho
+ Mời người dùng có id đã cho đến phòng hiện tại
+ Đặt tên phòng
+ Deops user với id đã cho
+ Xác định cấp độ quyền của người dùng
+ Ngừng bỏ qua người dùng, tiếp tục hiển thị thông điệp của họ
+ Bỏ qua người dùng, che giấu tin nhắn của họ khỏi bạn
+ Bỏ cấm người dùng với id đã cho
+ Cấm người dùng có id đã cho
+ Hiển thị hành động
+ Lệnh \"%s\" cần nhiều tham số hơn hoặc một số tham số không chính xác.
+ Lệnh không được nhận ra: %s
+ Lỗi lệnh
+ Kêu gọi hội nghị đang được phát triển và có thể không đáng tin cậy.
+ Yêu cầu Chia sẻ Khóa
+ Một phiên chưa được xác minh đang yêu cầu khóa mã hóa.
+\nTên phiên: %1$s
+\nLần nhìn thấy lần cuối: %2$s
+\nNếu bạn không đăng nhập vào phiên khác, hãy bỏ qua yêu cầu này.
+ Phiên chưa được xác minh của bạn \'%s\' đang yêu cầu khóa mã hóa
+ Một phiên mới đang yêu cầu các khóa mã hóa.
+\nTên phiên: %1$s
+\nLần nhìn thấy lần cuối: %2$s
+\nNếu bạn không đăng nhập vào phiên khác, hãy bỏ qua yêu cầu này.
+ Bạn đã thêm phiên mới \'%s\', nó đang yêu cầu các khóa mã hóa.
+ Để tiếp tục, bạn cần phải chấp nhận các điều khoản của dịch vụ này.
+ Tùy chọn này yêu cầu một ứng dụng của bên thứ ba để ghi lại các tin nhắn.
+ Gửi tin nhắn thoại
+ Sử dụng phím Enter của bàn phím để gửi tin nhắn
+ Khởi động camera hệ thống thay vì màn hình camera tùy chỉnh.
+ Sử dụng máy ảnh gốc
+ Không có widget hoạt động
+ Quản lý Tích hợp
+ Thêm ứng dụng Matrix
+ Không có trình quản lý tích hợp nào được cấu hình.
+ Một tham số không hợp lệ
+ Một tham số cần thiết bị thiếu.
+ Phòng %s không hiển thị.
+ Thiếu user_id trong yêu cầu
+ Thiếu room_id trong yêu cầu.
+ Bạn không được phép làm điều đó trong căn phòng này.
+ Bạn không ở trong căn phòng này.
+ Cấp độ quyền phải là số nguyên dương.
+ Gửi yêu cầu thất bại.
+ Không thể tạo widget.
+ Đọc Media được DRM bảo vệ
+ Sử dụng micrô
+ Sử dụng máy ảnh
+ Chặn Tất cả
+ Cho phép
+ Widget này muốn sử dụng các tài nguyên sau:
+ Rời khỏi hội nghị hiện tại và chuyển sang hội nghị khác\?
+ Xin lỗi, một lỗi đã xảy ra trong khi cố gắng tham gia hội nghị
+ Xin lỗi, các cuộc gọi hội nghị với Jitsi không được hỗ trợ trên các thiết bị cũ (thiết bị có hệ điều hành Android dưới 6.0)
+ ID phòng
+ Widget ID
+ ID người dùng của bạn
+ URL avatar của bạn
+ Tên hiển thị của bạn
+ Thu hồi quyền truy cập cho tôi
+ Mở trong trình duyệt
+ Tải lại widget
+ Thất bại trong việc tải widget.%s
+ Sử dụng nó có thể chia sẻ dữ liệu với %s:
+ Sử dụng nó có thể đặt cookie và chia sẻ dữ liệu với %s:
+ Widget này được thêm vào bởi:
+ Tải Widget
+ Widget
+ Widget đang hoạt động
+ XEM
+ Bạn có chắc chắn muốn xóa widget khỏi căn phòng này không\?
+ Tạo cuộc gọi hội nghị với jitsi
+ Tạo widget đã thất bại
+ Bạn cần sự cho phép để quản lý các widget trong phòng này
+ Khổng lồ
+ Lớn nhất
+ Lớn hơn
+ Lớn
+ Vừa
+ Nhỏ
+ Bé tí
+ Cỡ chữ
+ Tìm kiếm lịch sử
+ %1$s: %2$s %3$s
+ %1$s: %2$s
+ ** Gửi thất bại - vui lòng mở phòng
+ Tôi
+ Lời mời mới
+ Tin nhắn mới
+ Phòng
+ Sự kiện mới
+ %1$s và %2$s
+ %1$s trong %2$s và %3$s
+ %1$s trong %2$s
+ Gõ vào đây…
+ Máy chủ này đã có trong danh sách
+ Không thể tìm thấy máy chủ này hoặc danh sách phòng của nó
+ Nhập tên của một máy chủ mới mà bạn muốn khám phá.
+ Thêm máy chủ mới
+ Máy chủ của bạn
+ Tất cả các phòng %s gốc
+ Tất cả các phòng trên %s server
+ Tên máy chủ
+ Nhập homeserver để liệt kê các phòng công cộng từ
+ Chọn thư mục phòng
+ Không bao giờ gửi tin nhắn được mã hóa đến các phiên chưa được xác minh từ phiên này.
+ Chỉ mã hóa cho các phiên đã xác minh
+ Thư mục
+ Bật mã hóa (cảnh báo: không thể bị vô hiệu hóa trở lại!)
+ Mã hóa bị vô hiệu hóa trong phòng này.
+ Mã hóa được kích hoạt trong phòng này.
+ Sao chép Địa chỉ Phòng
+ Sao chép ID Phòng
+ Bỏ đặt làm địa chỉ chính
+ Đặt làm địa chỉ chính
+ Cảnh báo địa chỉ chính
+ Bạn sẽ không có địa chỉ chính được chỉ định cho căn phòng này.
+ ID cộng đồng mới (ví dụ : +foo:matrix.org)
+ Máy chủ này không cung cấp bất kỳ chính sách nào.
+ Thư viện bên thứ ba
+ Chính sách máy chủ xác thực của bạn
+ Chính sách homeerver của bạn
+ Chính sách ${app_name}
+ Bạn có thể tắt tính năng này bất cứ lúc nào trong cài đặt
+ Chúng tôi không chia sẻ thông tin với bên thứ ba
+ Chúng tôi không ghi âm hoặc tạo hồ sơ bất kỳ dữ liệu tài khoản nào
+ ở đây
+ Giúp chúng tôi xác định các vấn đề và cải thiện Element bằng cách chia sẻ dữ liệu sử dụng ẩn danh. Để hiểu cách mọi người sử dụng nhiều thiết bị, chúng tôi sẽ tạo ra một mã định danh ngẫu nhiên, được chia sẻ bởi các thiết bị của bạn.
+\n
+\nBạn có thể đọc tất cả các thuật ngữ của chúng tôi %s.
+ Giúp cải thiện Element
+ Thiết bị đã bị đăng xuất!
+ Căn phòng đã bị bỏ lại!
+ Chọn homeerver
+ Không thể kết nối đến một homeserver tại URL %s. Vui lòng kiểm tra liên kết của bạn hoặc chọn homeerver thủ công.
+ Không phải bây giờ
+ Kích hoạt
+ Nghe thông báo
+ Tùy chọn Khám phá sẽ xuất hiện sau khi bạn đã thêm email.
+ Địa chỉ email có thể khám phá
+ Hiện tại bạn không sử dụng máy chủ xác thực. Để khám phá và có thể khám phá bởi các liên hệ hiện có mà bạn biết, hãy cấu hình một danh bạ dưới đây.
+ Không có chính sách được cung cấp bởi máy chủ xác thực
+ Ẩn chính sách máy chủ xác thực
+ Hiện chính sách máy chủ xác thực
+ Mở Cài đặt Khám phá
+ Thêm tab dành riêng cho các thông báo chưa đọc trên màn hình chính.
+ Tìm kiếm theo tên, ID hoặc thư
+ Lọc hội thoại…
+ Không tìm thấy bản chỉnh sửa
+ Sửa tin nhắn
+ (đã sửa)
+ Tệp %1$s đã được tải xuống!
+ Đang tải xuống tệp %1$s…
+ Nén video %d%%
+ Nén hình ảnh…
+ Tệp Đang gửi (%1$s / %2$s)
+ Mã hóa tệp…
+ Gửi hình thu nhỏ (%1$s / %2$s)
+ Đang mã hóa hình nhỏ…
+ Đang đợi…
+ Tin nhắn trực tiếp
+ Hiển thị lịch sử đầy đủ trong các phòng được mã hóa
+ Hiện các sự kiện ẩn trong dòng thời gian
+ Đưa phản hồi
+ Gửi phản hồi thất bại (%s)
+ Cảm ơn, phản hồi của bạn đã được gửi thành công
+ Bạn có thể liên hệ với tôi nếu bạn có bất kỳ câu hỏi tiếp theo nào
+ Bạn đang sử dụng phiên bản beta của Space. Phản hồi của bạn sẽ giúp thông báo cho các phiên bản tiếp theo. Nền tảng và tên người dùng của bạn sẽ được ghi nhận để giúp chúng tôi sử dụng phản hồi của bạn càng nhiều càng tốt.
+ Phản hồi
+ Phản hồi Space
+ Đề xuất không được gửi (%s)
+ Cảm ơn, gợi ý đã được gửi thành công
+ Mô tả đề xuất của bạn ở đây
+ Vui lòng viết gợi ý của bạn dưới đây.
+ Đưa gợi ý
+ Token đăng ký
+ Cài đặt hệ thống
+ Phiên bản
+ Nhận trợ giúp về việc sử dụng Element
+ Trợ giúp và hỗ trợ
+ Trợ giúp
+ Pháp lý
+ Trợ giúp & Giới thiệu
+ Voice & Video
+ Format:
+ Url:
+ session_name:
+ app_display_name:
+ push_key:
+
+ Gửi video với kích thước gốc
+
+
+ Gửi ảnh với kích thước gốc
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-vls/strings.xml b/vector/src/main/res/values-vls/strings.xml
index c8190e7a680..424430d5842 100644
--- a/vector/src/main/res/values-vls/strings.xml
+++ b/vector/src/main/res/values-vls/strings.xml
@@ -48,7 +48,7 @@
%1$s èt d’uutnodigienge vo %2$s anveird** Kun nie ountsleuteln: %s **
- ’t Toestel van den afzender èt geen sleutels vo da bericht hier gesteurd.
+ ’t Toestel van den afzender èt geen sleutels vo da bericht hier gesteurd.Kosteg nie verwyderd wordnKosteg ’t bericht nie verzendn
@@ -138,6 +138,6 @@
Loadn…Oké
- Annuleern
- Ipsloan
+ Annuleern
+ Ipsloan
diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml
index a7afd7aadb2..3477e4d7dfd 100644
--- a/vector/src/main/res/values-zh-rCN/strings.xml
+++ b/vector/src/main/res/values-zh-rCN/strings.xml
@@ -33,7 +33,7 @@
%1$s 移除了聊天室名称%1$s 移除了聊天室主题** 无法解密:%s **
- 发送者的设备没有向我们发送此消息的密钥。
+ 发送者的设备没有向我们发送此消息的密钥。无法发送消息上传图像失败网络错误
@@ -210,10 +210,10 @@
接受拒绝挂断
- 重新发送
- 引用
- 分享
- 转发
+ 重新发送
+ 引用
+ 分享
+ 转发语音通话视频通话全部标记为已读
@@ -238,9 +238,9 @@
无法录制视频已保存继续
- 加入
- 查看
- 拒绝
+ 加入
+ 查看
+ 拒绝%s 邀请你加入这个聊天室新的聊天添加成员
@@ -255,14 +255,14 @@
聊天室设置成员信息
- 保存
- 离开
- 发送
+ 保存
+ 离开
+ 发送查看源代码查看解密后的源代码或登出
- 禁用
+ 禁用警告请描述你遇到的问题。你做了什么?你期望发生什么?实际上发生了什么?在这里描述你的问题
@@ -329,10 +329,6 @@
聊天室消息文件
- 加入
- 聊天室
- 开始聊天
- 创建聊天室私聊消息设置
@@ -368,8 +364,8 @@
Ed25519 指纹导入已验证
- 取消
- 删除
+ 取消
+ 删除无法开始通话,请稍后重试由于缺少权限,某些功能将无法使用…无法发起通话
@@ -448,8 +444,6 @@
\n注意,此操作会重启应用并将花费一些时间。取消上传取消下载
- 收藏夹
- 低优先级降低优先级退出对话版权
@@ -543,7 +537,7 @@
聊天室包含未知设备稍后再说永久链接
- 重命名
+ 重命名举报内容当前通话正在进行电话会议。
@@ -588,7 +582,7 @@
\n请在接下来的弹出窗口中授权允许访问,以便进行通话。对不起。因为权限不足,操作已取消保存至下载?
- 移除
+ 移除此邀请已发送至未与此账号关联的 %s。
\n你可能希望用一个不同的账号登录,或者把这个电子邮箱加入到你的账号。这是此聊天室的预览。与聊天室的交互已禁用。
@@ -598,8 +592,6 @@
这可能意味着有人正在恶意劫持你的流量,或者你的手机不信任远程服务器提供的数字证书。如果服务器管理员说这是预期的情况,请确保下面的指纹与管理员提供的指纹相匹配。报告这个内容的原因
- 目录
- 邀请浏览目录正在搜索目录…收藏夹
@@ -640,7 +632,7 @@
列入黑名单移出黑名单确认
- 移除
+ 移除你似乎沮丧地摇了摇手机。你想打开问题反馈界面吗?发送至已读标签清单
@@ -683,7 +675,7 @@
\n
\n未知设备:
历史消息
- 邀请
+ 邀请全局搜索主页收藏夹
@@ -693,17 +685,14 @@
按收藏夹过滤按联系人过滤按聊天室名称过滤
-
邀请低优先级
-
对话本地通讯录只显示 Matrix 联系人没有对话没有结果你没有授予 ${app_name} 访问本地通讯录的权限
-
聊天室聊天室目录没有聊天室
@@ -712,20 +701,15 @@
请输入一个或多个电子邮箱地址或 Matrix ID电子邮箱地址或 Matrix ID忘记
-
选择一个聊天室目录服务器可能不可用或过载请输入一个要列出公共聊天室的主服务器服务器名称%s 服务器上的所有聊天室所有本地 %s 聊天室
-
搜索历史历史消息用 ID 邀请
- 进入聊天室
- 进入一个聊天室
- 输入聊天室 ID 或者聊天室别名跳到未读主页显示固定含错过通知的聊天室
@@ -763,7 +747,6 @@
创建挂件失败用 jitsi 创建会议通话你确定要删除这个挂件吗?
-
无法创建挂件。发送请求失败。特权级别必须是正整数。
@@ -787,13 +770,10 @@
拍摄照片拍摄视频使用原生相机
-
警告!会议通话正在开发中,可能不可靠。
-
命令错误不可识别的命令:%s
-
关闭已加密消息响铃通知
@@ -860,7 +840,6 @@
已启用 %d 个挂件
-
社群名称社群 ID主页
@@ -925,8 +904,8 @@
要想继续使用主服务器 %1$s 你必须阅读并同意其服务条款。现在阅读第三方开源协议
- 下载
- 清除
+ 下载
+ 清除发送语音消息使用…打开对不起,没有可完成此操作的外部应用。
@@ -937,7 +916,7 @@
在此输入…发送语音消息请输入你的密码。
- 发言
+ 发言如果可能的话,请使用英文撰写问题描述。发送加密回复…发送回复(未加密)…
@@ -1002,7 +981,7 @@
请 %s 以继续使用本服务。请 %s 以增加此限制的额度。仍然呼叫
- 接受
+ 接受错误请审阅并接受此主服务器的政策:通话
@@ -1126,10 +1105,10 @@
确定吗?备份如果你在登出账号之前不备份密钥,你将失去你的已加密消息的访问权。
- 留下
- 跳过
+ 留下
+ 跳过完成
- 中止
+ 中止你确定要登出账号吗?高级通知设置事件的通知重要程度
@@ -1258,7 +1237,7 @@
版本算法签名
- 忽略
+ 忽略以单点登录方式登录无法连接到此 URL,请检查你的设备使用了过时的 TLS 安全协议,容易受到攻击,为保证安全,你将无法进行连接
@@ -1337,8 +1316,8 @@
对话聊天室响应
- 同意
- 喜欢
+ 同意
+ 喜欢响应查看响应响应
@@ -1371,10 +1350,10 @@
帮助和关于(已编辑)无
- 撤消
- 断开连接
- 检查
- 拒绝
+ 撤消
+ 断开连接
+ 检查
+ 拒绝没有设置身份服务器。服务器的错误配置导致通话失败请要求你的主服务器 (%1$s) 的管理员配置 TURN 服务器,以使通话可靠地工作。
@@ -1389,9 +1368,9 @@
這不是有效的 Matrix 服务器位置无法在此 URL 找到主服务器,请检查允许后备呼叫协助服务器
- 播放
- 暂停
- 忽略
+ 播放
+ 暂停
+ 忽略复制成功通知
@@ -1980,13 +1959,6 @@
飞行模式已打开开发工具账号数据
-
- %d 票
-
-
- %d 票 - 最终结果
-
- 已选选项创建简单调查使用恢复密语或密钥如果你无法访问已有会话
@@ -2126,7 +2098,7 @@
\n${app_name} Desktop${app_name} iOS
\n${app_name} Android
- 或其他能够交叉签名的 Matrix 客户端
+ 或其他能够交叉签名的 Matrix 客户端在你的其他设备上使用最新的 ${app_name}:强制丢弃加密聊天室中的当前出站群组会话仅在加密聊天室中支持
@@ -2290,7 +2262,6 @@
显示聊天室成员状态事件包括邀请/加入/离开/踢掉/封禁事件和头像/昵称更改。轮询
- 机器人按钮回应:%s验证结果是否删除类型 %1$s 的账号数据?
@@ -2347,7 +2318,7 @@
过滤被封禁的用户你没有权限发起通话你没有权限发起会议通话
- 重置
+ 重置允许访问你的联系人。如需扫描二维码,你须允许相机访问权限。没有更多结果
@@ -2591,8 +2562,6 @@
管理聊天室正在寻找不在 %s 中的人?%s 邀请了你
- 警告!需要服务支持实验性聊天室版本
- 实验性空间 - 受限的聊天室。你被邀请空间是一种将聊天室和人们进行分组的新方式空间是一种将聊天室和人们进行重新分组的新方式。
@@ -2622,7 +2591,7 @@
他们将可以探索 %s邀请至 %s分享链接
- 通过用户名进行邀请
+ 通过用户名进行邀请通过电子邮件进行邀请此刻仅有你自己。%s 与他人一道会更好。邀请至 %s
@@ -2913,7 +2882,7 @@
通过电子邮件邀请、寻找联系人和更多…设置“发现”已毕。您目前没有使用身份服务器。为了邀请队友并被他们发现,请在下方配置一个这样的服务器。
- 通过用户名或邮件邀请
+ 通过用户名或邮件邀请确保只有合适的人能访问 %s 空间。稍后你可以邀请更多的人加入。谁是你的队友?添加至规定的空间
@@ -2985,4 +2954,46 @@
你同意发送此信息吗?要发现现有的联系人,您需要将联系人信息(电子邮件和电话号码)发送到您的身份服务器。出乎隐私考量,我们会在发送前对您的数据进行散列处理。不是现在
+ 您确定要删除此投票吗?一旦移除,就无法恢复。
+ 删除投票
+ 投票已结束
+ 已投票
+ 启用投票
+ 结束投票
+ 这将使人们无法再投票,并将显示投票的最终结果。
+ 结束此投票?
+ 赢家选项
+ 结束投票
+
+ 基于 %1$d 票的最终结果
+
+
+ 已投了 %1$d 票。投票查看结果
+
+
+ 基于 %1$d 票
+
+
+ %1$d 票
+
+ 系统设置
+ 版本
+ 获取使用 Element 的帮助
+ 帮助和支持
+ 帮助
+ 法律
+ 此服务器不提供任何政策。
+ 第三方库
+ 你的身份服务器政策
+ 我们不记录任何账户数据或绘制任何账户数据的画像
+ 你的主服务器政策
+ ${app_name} 政策
+ 你可以随时在设置中关闭它
+ 我们不与第三方共享信息
+ 此处
+ 通过共享匿名使用数据,帮助我们识别问题并改进 Element。为了理解人们如何使用多台设备,我们将生成一个随机标识符,由您的设备共享。
+\n
+\n你可以阅读我们所有的条款 %s。
+ 帮助改进 Element
+ 启用
\ No newline at end of file
diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml
index 7d7e7dbb0ef..c5a33b70726 100644
--- a/vector/src/main/res/values-zh-rTW/strings.xml
+++ b/vector/src/main/res/values-zh-rTW/strings.xml
@@ -39,7 +39,7 @@
%1$s 傳送加入房間的邀請給 %2$s%1$s 接受 %2$s 的邀請** 無法解密:%s **
- 傳送者的裝置並未在此訊息傳送他們的金鑰。
+ 傳送者的裝置並未在此訊息傳送他們的金鑰。無法編輯無法傳送訊息上傳圖片失敗
@@ -266,27 +266,27 @@
設定會員訊息錯誤回報
- 取消
+ 取消確定
- 離開
- 儲存
+ 離開
+ 儲存載入中…
- 發送
- 重新發送
- 分享
+ 發送
+ 重新發送
+ 分享查看源代碼通知音效靜音通知歷史社群細節
- 移除
- 引用
+ 移除
+ 引用稍後
- 轉寄
+ 轉寄永久連結檢視解密的來源
- 刪除
- 重新命名
+ 刪除
+ 重新命名回報內容進行中的通話正在進行會議通話。
@@ -301,7 +301,7 @@
不支援在加密聊天室的會議通話無論如何都要傳送或
- 邀請
+ 邀請離線離開動作
@@ -315,7 +315,7 @@
開啟關閉複製到剪貼簿
- 停用
+ 停用確認警告首頁
@@ -496,10 +496,10 @@
是否繼續
- 移除
- 加入
- 預覽
- 拒絕
+ 移除
+ 加入
+ 預覽
+ 拒絕列出成員打開標頭正在同步……
@@ -586,9 +586,9 @@
你的手機曾經信任的憑證已經變動。這非常不尋常。建議你不要接受此新的憑證。發送貼圖第三方開放原始碼授權
- 下載
- 說話
- 清除
+ 下載
+ 說話
+ 清除發送語音訊息發送貼圖您目前沒有任何貼圖。
@@ -622,17 +622,6 @@
訊息聯絡人檔案
- 加入
- 目錄
- 最愛
- 聊天室
- 低優先度
- 邀請
- 開始聊天
- 新建聊天室
- 加入聊天室
- 加入聊天室
- 輸入聊天室 ID 或聊天室別名瀏覽目錄%d 個聊天室
@@ -1080,7 +1069,7 @@
為來電使用預設的 ${app_name} 鈴聲來電鈴聲選取通話鈴聲:
- 接受
+ 接受請審閱並接受此家伺服器的政策:疑難排解通知疑難排解診斷
@@ -1153,7 +1142,7 @@
金鑰備份使用金鑰備份金鑰備份尚未完成,請稍候……
- 略過
+ 略過完成進階通知設定活動通知重要程度
@@ -1248,8 +1237,8 @@
您確定嗎?備份除非您在登出前備份您的金鑰,否則您將會失去對您的加密訊息的存取權。
- 保留
- 放棄
+ 保留
+ 放棄您想要登出嗎?數據節省模式會套用特定的過濾器,這樣狀態更新與輸入通知就會被過濾掉。加密訊息復原
@@ -1294,7 +1283,7 @@
正在計算復原金鑰……正在下載金鑰……正在匯出金鑰……
- 忽略
+ 忽略使用單一登入系統登入這個 URL 不可用,請檢查您的裝置正在使用過期的 TLS 安全協定,容易遭受攻擊,為了您的安全將不會連線
@@ -1402,8 +1391,8 @@
聊天室您的聊天室將會在此顯示。點擊右下角的 + 來尋找既有的或開始您自己的。反應
- 同意
- 喜歡
+ 同意
+ 喜歡新增反應檢視反應反應
@@ -1485,8 +1474,8 @@
透過使用者名稱或 ID 過濾……正在加入聊天室……檢視編輯歷史
- 審閱
- 婉拒
+ 審閱
+ 婉拒要繼續,您必須接受此服務的條款。服務條款審閱條款
@@ -1494,8 +1483,8 @@
使用機器人、橋接、小工具與貼紙包閱讀於無
- 撤銷
- 斷線
+ 撤銷
+ 斷線未設定身份識別伺服器。因為錯誤設定的伺服器導致通話失敗請要求您家伺服器 (%1$s) 的管理員設定 TURN 伺服器以讓通話正常運作。
@@ -1925,13 +1914,6 @@
使用者名稱開發者工具帳號資料
-
- %d 投票
-
-
- %d 投票 - 最後結果
-
- 已選取的選項建立簡易投票使用復原通關密語或金鑰如果您無法存取既有的工作階段的話
@@ -2058,7 +2040,7 @@
\n${app_name} 桌面版${app_name} iOS
\n${app_name} Android
- 或其他有交叉簽章功能的 Matrix 客戶端
+ 或其他有交叉簽章功能的 Matrix 客戶端在您的其他裝置上使用最新的 ${app_name}:強制丟棄目前在加密聊天室中的外發群組工作階段僅在加密聊天室中支援
@@ -2131,9 +2113,9 @@
或者您可以輸入任何身份識別伺服器 URL輸入身份識別伺服器 URL遞交
- 播放
- 暫停
- 忽略
+ 播放
+ 暫停
+ 忽略複製成功通知
@@ -2325,7 +2307,6 @@
顯示聊天室成員狀態活動包含邀請/加入/離開/踢除/封鎖事件與大頭貼/顯示名稱變更等。投票
- 機器人按鈕反應:%s驗證結論連結格式錯誤
@@ -2382,7 +2363,7 @@
過濾被封鎖的使用者您沒有開始通話的權限您沒有開始會議通話的權限
- 重設
+ 重設啟用生物識別技術放棄變更有未儲存的變更。要放棄變更嗎?
@@ -2622,8 +2603,6 @@
顯示帶有明確內容的聊天室聊天室目錄訊息已傳送
- 警告需要伺服器支援與實驗性聊天室版本
- 實驗性空間 - 受限制的聊天室。您被邀請了空間是將聊天室與人們分組的新方式。歡迎使用空間!
@@ -2648,7 +2627,7 @@
他們將可以探索 %s邀請至 %s分享連結
- 透過使用者名稱邀請
+ 透過使用者名稱邀請透過電子郵件邀請此刻只有您。%s 與其他人一起會更好。邀請夥伴
@@ -2903,7 +2882,7 @@
透過電子郵件邀請、尋找聯絡人以及更多……完成探索設定。您目前並未使用身份認證伺服器。為了邀請隊友並被他們探索,請在下方設定一個。
- 透過使用者名稱或電子郵件邀請
+ 透過使用者名稱或電子郵件邀請確保合適的人可以存取 %s 公司。您可以稍後再邀請。誰是您的隊友?新增至指定的空間
@@ -2975,4 +2954,49 @@
您同意傳送此資訊嗎?要探索現有聯絡人,您必須傳送聯絡人資訊(電子郵件與電話號碼)到您的身份識別伺服器。我們會在傳送前對您的資料進行雜湊處理以保護隱私。現在不要
+ 您確定要移除此投票?移除後將無法復原。
+ 移除投票
+ 投票已結束
+ 投票
+ 啟用投票
+ 結束投票
+ 這將阻止人們投票並顯示投票的最終結果。
+ 結束此投票?
+ 獲勝選項
+ 結束投票
+
+ 以 %1$d 票為基礎的最終結果
+
+
+ 已投 %1$d 票。投票以檢視結果
+
+
+ 以 %1$d 票為基礎
+
+
+ %1$d 票
+
+ 系統設定
+ 版本
+ 取得關於使用 Element 的協助
+ 說明與支援
+ 說明
+ 法律
+ 此伺服器並未提供任何政策。
+ 第三方函式庫
+ 您的身份識別伺服器政策
+ 您的家伺服器政策
+ ${app_name} 政策
+ 您隨時可以在設定中關閉此功能
+ 我們不會與第三方分享資訊
+ 我們不會記錄或分析任何帳號資料
+ 這裡
+ 透過分享匿名使用資料協助我們找出問題並改善 Element。為了了解人們如何使用多裝置,我們將會產生隨機識別字串,在您的裝置間共享。
+\n
+\n您可以閱讀我們的條款 %s。
+ 協助改善 Element
+ 啟用
+ 重新啟動應用程式以讓變更生效。
+ 啟用 LaTeX 數學
+ 您無法加入此聊天室
\ No newline at end of file
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index 34ac5fcddc7..c9adbc9d4a6 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -147,7 +147,7 @@
%1$s from %2$s to %3$s** Unable to decrypt: %s **
- The sender\'s device has not sent us the keys for this message.
+ The sender\'s device has not sent us the keys for this message.
@@ -169,6 +169,7 @@
It is not currently possible to re-join an empty room.
+ You are not allowed to join this roomEmail address
@@ -357,34 +358,13 @@
OK
- Cancel
- Save
- Leave
- Stay
- Send
- Resend
- Remove
- Quote
- Download
- Share
- Speak
- ClearLater
- ForwardPermalinkView SourceView Decrypted Source
- Delete
- RenameNone
- Revoke
- DisconnectReport ContentActive call
- Play
- Pause
- Dismiss
- ResetStart ChattingLearn MoreSpaces
@@ -421,23 +401,16 @@
Call AnywaySend Anywayor
- InviteOffline
- Accept
- SkipDone
- Abort
- Ignore
- Review
- DeclineAcceptDeclineHang Up
- ExitActions
+ ExitSign outAre you sure you want to sign out?Voice Call
@@ -453,11 +426,47 @@
AddSwitchUnpublish
- Copied to clipboard
- DisableReturnEnableNot now
+ Agree
+ Like
+ "Change"
+ Remove
+ Join
+ Preview
+ Reject
+ Disable
+ Accept
+ Skip
+ Abort
+ Ignore
+ Review
+ Decline
+ Invite
+ Cancel
+ Save
+ Leave
+ Stay
+ Send
+ Resend
+ Remove
+ Quote
+ Download
+ Share
+ Speak
+ Clear
+ Forward
+ Delete
+ Rename
+ Revoke
+ Disconnect
+ Play
+ Pause
+ Dismiss
+ Reset
+
+ Copied to clipboardConfirmation
@@ -802,12 +811,6 @@
ContinueContinue Anyway
-
- Remove
- Join
- Preview
- Reject
-
List membersOpen header
@@ -959,6 +962,8 @@
Delete unsent messagesFile not foundYou do not have permission to post to this room.
+ Encryption has been misconfigured so you can\'t send messages. Please contact an admin to restore encryption to a valid state.
+ Encryption has been misconfigured so you can\'t send messages. Click to open settings.%d new message%d new messages
@@ -1043,19 +1048,6 @@
FILESSearching in encrypted rooms is not supported yet.
-
- JOIN
- DIRECTORY
- FAVORITES
- ROOMS
- LOW PRIORITY
- INVITES
- Start chat
- Create room
- Join room
- Join a room
- Type a room id or a room alias
-
Browse directory
@@ -2210,10 +2202,6 @@
Your rooms will be displayed here. Tap the + bottom right to find existing ones or start some of your own.Reactions
-
- Agree
-
- LikeAdd ReactionView ReactionsReactions
@@ -2230,7 +2218,6 @@
Create New RoomCreate New SpaceNo network. Please check your Internet connection.
- "Change""Change network""Please wait…""All Communities"
@@ -2531,11 +2518,22 @@
You made this invite only.Unread messages
+
+ Own your conversations.
+ End-to-end encrypted messaging for secure and independent communication, connected via Matrix.
+ You\'re in control.
+ Element lets you choose where you messages are stored, keeping you in control of your data.
+ Connect with anyone.
+ Element works with all Matrix-based apps and can even bridge into proprietary messengers.
+ Cut the slack from teams.
+ As universal as email, Element is a completely new type of collaboration.
+
It\'s your conversation. Own it.Chat with people directly or in groupsKeep conversations private with encryptionExtend & customise your experienceGet started
+ I already have an accountSelect a serverJust like email, accounts have one home, although you can talk to anyone
@@ -2756,7 +2754,6 @@
FileStickerPoll
- Bot ButtonsReacted with: %sVerification Conclusion
@@ -2795,8 +2792,11 @@
Messages in this room are not end-to-end encrypted.Messages here are not end-to-end encrypted.Messages in this room are end-to-end encrypted.\n\nYour messages are secured with locks and only you and the recipient have the unique keys to unlock them.
+ Encryption has been misconfigured.
+ Please contact an admin to restore encryption to a valid state.Messages here are end-to-end encrypted.\n\nYour messages are secured with locks and only you and the recipient have the unique keys to unlock them.Security
+ Restore EncryptionLearn moreMoreAdmin Actions
@@ -2812,6 +2812,8 @@
Leave"Leaving the room…"
+ Override nick color
+
AdminsModeratorsCustom
@@ -2936,15 +2938,6 @@
Account DataDelete the account data of type %1$s?\n\nUse with caution, it may lead to unexpected behavior.
-
- %d vote
- %d votes
-
-
- %d vote - Final results
- %d votes - Final results
-
- Selected OptionCreates a simple pollUse a Recovery Passphrase or KeyIf you can’t access an existing session
@@ -3064,6 +3057,7 @@
Messages in this room are end-to-end encrypted. Learn more & verify users in their profile.Messages in this room are end-to-end encrypted.Encryption not enabled
+ Encryption is misconfiguredThe encryption used by this room is not supported%s created and configured the room.
@@ -3140,7 +3134,7 @@
${app_name} Web\n${app_name} Desktop${app_name} iOS\n${app_name} Android
- or another cross-signing capable Matrix client
+ or another cross-signing capable Matrix clientUse the latest ${app_name} on your other devices:Forces the current outbound group session in an encrypted room to be discarded
@@ -3432,6 +3426,7 @@
Default trust levelWarning trust levelTrusted trust level
+ Misconfigured trust levelOpen Emoji pickerClose Emoji pickerChecked
@@ -3517,8 +3512,8 @@
Invite to %sIt’s just you at the moment. %s will be even better with others.Invite by email
- Invite by username
- Invite by username or mail
+ Invite by username
+ Invite by username or mailShare linkInvite to %s"They’ll be able to explore %s"
@@ -3574,9 +3569,9 @@
Spaces are a new way to group rooms and people.You are invited
+ Auto Report Decryption Errors.
+ Your system will automatically send logs when an unable to decrypt error occurs
- Experimental Space - Restricted Room.
- Warning requires server support and experimental room version%s invites youLooking for someone not in %s?
@@ -3661,6 +3656,9 @@
%s in Settings to receive invites directly in Element.
+ Enable LaTeX mathematics
+ Restart the application for the change to take effect.
+
Create PollPoll question or topic
@@ -3701,4 +3699,12 @@
Poll endedRemove pollAre you sure you want to remove this poll? You won\'t be able to recover it once removed.
+
+ Open camera
+ Send images and videos
+ Upload file
+ Send sticker
+ Open contacts
+ Create poll
+
diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml
index 8e92b65e731..d2e9df4985f 100644
--- a/vector/src/main/res/xml/vector_settings_labs.xml
+++ b/vector/src/main/res/xml/vector_settings_labs.xml
@@ -46,9 +46,9 @@
+ android:key="SETTINGS_LABS_ENABLE_LATEX_MATHS"
+ android:summary="@string/restart_the_application_to_apply_changes"
+ android:title="@string/labs_enable_latex_maths" />
+
+
\ No newline at end of file