mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
Compare commits
98 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0ac9bea63c | |||
| 2bb3ad546e | |||
| 41a6b9a6c9 | |||
| fb7c119afc | |||
| 5910fc245a | |||
| 7d8887eddd | |||
| 37471ae9fa | |||
| 29a4a4712c | |||
| 644bd1f594 | |||
| ed6eca8920 | |||
| 47512f786e | |||
| add51186e6 | |||
| 52f63b28ba | |||
| 889c9aab45 | |||
| de5940e709 | |||
| 6e184f735d | |||
| c33ff20d0a | |||
| c67c3c8972 | |||
| f98a5178b3 | |||
| 6dfccdab84 | |||
| 40faa3d43e | |||
| 74f6853815 | |||
| cef6817187 | |||
| 6f547dfb66 | |||
| d6e05f61ac | |||
| 55649b0c4b | |||
| 4d9f8dd244 | |||
| 3880da8a08 | |||
| 5e8666835d | |||
| 2f5619141e | |||
| 4a07d7fd9d | |||
| 1493583db7 | |||
| dc363a0281 | |||
| fcffe3922a | |||
| d546d8041f | |||
| 267caf9b03 | |||
| d55ad1f32a | |||
| be07043b47 | |||
| cc3e6bcd9d | |||
| 43654fdadb | |||
| 774add2380 | |||
| 1133a6e624 | |||
| 0aad1b3d76 | |||
| b58a9d0bab | |||
| 54a74a8586 | |||
| f25474947b | |||
| 9ebd8e4a37 | |||
| 975ad2e149 | |||
| e6350aaec2 | |||
| d373537d6d | |||
| 960581e5f2 | |||
| fccf8f402e | |||
| e0459978f7 | |||
| 72bd7376ca | |||
| 94fbdcde05 | |||
| 89d77e7638 | |||
| d9edee117f | |||
| 6cfdb87924 | |||
| 613940577c | |||
| 43a3e21495 | |||
| b5375b8c0e | |||
| 39aec04fea | |||
| 94e2c8dbed | |||
| da45c7bc1c | |||
| d180704d52 | |||
| 653c8688b7 | |||
| 9a382a4948 | |||
| dcaa19b29d | |||
| 11845da65f | |||
| 82262cb166 | |||
| e85ae5247a | |||
| 74e14bd0ea | |||
| 40cdeee47a | |||
| 844231e5e7 | |||
| 0ccf0a9309 | |||
| 5040fb4634 | |||
| a57122a902 | |||
| 4313e8824b | |||
| 464cba299a | |||
| 102c3fd82a | |||
| dc31eee4bc | |||
| 875f0e5c86 | |||
| 2b36e2dc26 | |||
| 6a9c3ab8ca | |||
| 2ab544b18e | |||
| 2630e22421 | |||
| 1b7e32ab44 | |||
| 8436909977 | |||
| 9dd44c24b3 | |||
| 5d0e85b30d | |||
| 5193dfa412 | |||
| 96490e23f8 | |||
| 7959b07d45 | |||
| c4ae7927ad | |||
| ba0515ebc5 | |||
| 349bab9510 | |||
| e26f803d1f | |||
| 67d2c89bcc |
@@ -1,20 +0,0 @@
|
|||||||
name: add artifact links to pull request
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["Upload Preview APK"]
|
|
||||||
types: [completed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
artifacts-url-comments:
|
|
||||||
name: add artifact links to pull request
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
||||||
steps:
|
|
||||||
- name: add artifact links to pull request
|
|
||||||
uses: tonyhallett/artifacts-url-comments@v1.1.0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
prefix: "**To test the changes in this pull request, install this apk:**"
|
|
||||||
format: "[📦 {name}]({url})"
|
|
||||||
addTo: pull
|
|
||||||
@@ -10,21 +10,24 @@ on:
|
|||||||
- 'jni/dc_wrapper.c'
|
- 'jni/dc_wrapper.c'
|
||||||
- 'scripts/ndk-make.sh'
|
- 'scripts/ndk-make.sh'
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
- uses: android-actions/setup-android@v3
|
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
|
||||||
- uses: nttld/setup-ndk@v1
|
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
|
||||||
id: setup-ndk
|
id: setup-ndk
|
||||||
with:
|
with:
|
||||||
ndk-version: r27
|
ndk-version: r27
|
||||||
|
|
||||||
- uses: Swatinem/rust-cache@v2
|
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
|
||||||
with:
|
with:
|
||||||
workspaces: jni/deltachat-core-rust
|
workspaces: jni/deltachat-core-rust
|
||||||
|
|
||||||
@@ -34,7 +37,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Cache compiled core
|
- name: Cache compiled core
|
||||||
id: cache-core
|
id: cache-core
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
jni/arm64-v8a
|
jni/arm64-v8a
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ on:
|
|||||||
branches: [main]
|
branches: [main]
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||||
@@ -16,12 +18,16 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
- uses: actions/setup-java@v5
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
|
||||||
with:
|
with:
|
||||||
java-version: 17
|
java-version: 17
|
||||||
distribution: temurin
|
distribution: temurin
|
||||||
- uses: actions/cache@v4
|
- name: Restore Gradle cache
|
||||||
|
id: gradle-cache
|
||||||
|
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.gradle/caches
|
~/.gradle/caches
|
||||||
@@ -30,6 +36,14 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-gradle-
|
${{ runner.os }}-gradle-
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: gradle/actions/wrapper-validation@v4
|
uses: gradle/actions/wrapper-validation@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
run: ./gradlew spotlessCheck
|
run: ./gradlew spotlessCheck
|
||||||
|
- name: Save Gradle cache
|
||||||
|
if: github.event_name == 'push' && steps.gradle-cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
|||||||
@@ -6,24 +6,31 @@ concurrency:
|
|||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Upload Preview APK
|
name: Upload Preview APK
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Validate Fastlane Metadata
|
- name: Validate Fastlane Metadata
|
||||||
uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2
|
uses: ashutoshgngwr/validate-fastlane-supply-metadata@c8857fdbbd3e00f9a5cbe8604bcecfa95ce8fef8 # v2.1.0
|
||||||
|
|
||||||
- uses: actions/setup-java@v5
|
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
|
||||||
with:
|
with:
|
||||||
java-version: 17
|
java-version: 17
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
|
|
||||||
- uses: actions/cache@v4
|
- uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.gradle/caches
|
~/.gradle/caches
|
||||||
@@ -33,15 +40,15 @@ jobs:
|
|||||||
${{ runner.os }}-gradle-
|
${{ runner.os }}-gradle-
|
||||||
|
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: gradle/actions/wrapper-validation@v4
|
uses: gradle/actions/wrapper-validation@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
|
||||||
|
|
||||||
- uses: android-actions/setup-android@v3
|
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
|
||||||
- uses: nttld/setup-ndk@v1
|
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
|
||||||
id: setup-ndk
|
id: setup-ndk
|
||||||
with:
|
with:
|
||||||
ndk-version: r27
|
ndk-version: r27
|
||||||
|
|
||||||
- uses: Swatinem/rust-cache@v2
|
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
|
||||||
with:
|
with:
|
||||||
workspaces: jni/deltachat-core-rust
|
workspaces: jni/deltachat-core-rust
|
||||||
|
|
||||||
@@ -51,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Restore compiled core
|
- name: Restore compiled core
|
||||||
id: core-cache
|
id: core-cache
|
||||||
uses: actions/cache/restore@v4
|
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
jni/arm64-v8a
|
jni/arm64-v8a
|
||||||
@@ -70,7 +77,22 @@ jobs:
|
|||||||
run: ./gradlew --no-daemon -PABI_FILTER=arm64-v8a assembleFossDebug
|
run: ./gradlew --no-daemon -PABI_FILTER=arm64-v8a assembleFossDebug
|
||||||
|
|
||||||
- name: Upload APK
|
- name: Upload APK
|
||||||
uses: actions/upload-artifact@v4
|
id: upload
|
||||||
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||||
with:
|
with:
|
||||||
name: app-preview.apk
|
name: app-preview.apk
|
||||||
path: 'build/outputs/apk/foss/debug/*.apk'
|
path: 'build/outputs/apk/foss/debug/*.apk'
|
||||||
|
|
||||||
|
- name: Add artifact links to PR
|
||||||
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||||
|
env:
|
||||||
|
ARTIFACT_URL: ${{ steps.upload.outputs.artifact-url }}
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const url = process.env.ARTIFACT_URL;
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
body: `**To test the changes in this pull request, install this apk:**\n\n[📦 app-preview.apk](${url})`,
|
||||||
|
});
|
||||||
|
|||||||
@@ -23,18 +23,18 @@ jobs:
|
|||||||
name: Upload Release APK
|
name: Upload Release APK
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- uses: Swatinem/rust-cache@v2
|
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
|
||||||
with:
|
with:
|
||||||
working-directory: jni/deltachat-core-rust
|
working-directory: jni/deltachat-core-rust
|
||||||
- uses: actions/setup-java@v3
|
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
|
||||||
with:
|
with:
|
||||||
java-version: 17
|
java-version: 17
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
- uses: android-actions/setup-android@v3
|
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
|
||||||
- uses: nttld/setup-ndk@v1
|
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
|
||||||
id: setup-ndk
|
id: setup-ndk
|
||||||
with:
|
with:
|
||||||
ndk-version: r27
|
ndk-version: r27
|
||||||
@@ -63,7 +63,7 @@ jobs:
|
|||||||
mv build/outputs/mapping/gplayRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-gplay.txt
|
mv build/outputs/mapping/gplayRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-gplay.txt
|
||||||
|
|
||||||
- name: Release on GitHub
|
- name: Release on GitHub
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
|
||||||
with:
|
with:
|
||||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
|
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
name: GitHub Actions Security Analysis with zizmor
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
pull_request:
|
||||||
|
branches: ["**"]
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
zizmor:
|
||||||
|
name: Run zizmor
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files.
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Run zizmor
|
||||||
|
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
rules:
|
||||||
|
unpinned-uses:
|
||||||
|
config:
|
||||||
|
policies:
|
||||||
|
actions/*: ref-pin
|
||||||
|
dependabot/*: ref-pin
|
||||||
+31
-1
@@ -1,14 +1,44 @@
|
|||||||
# Delta Chat Android Changelog
|
# Delta Chat Android Changelog
|
||||||
|
|
||||||
## Unreleased
|
## v2.50.0
|
||||||
|
2026-05
|
||||||
|
|
||||||
* Better incoming call system integration
|
* Better incoming call system integration
|
||||||
* Calls are not experimental anymore and don't need to be manually enabled
|
* Calls are not experimental anymore and don't need to be manually enabled
|
||||||
|
* Calls can be answered by tapping messages
|
||||||
|
* Notify the user when they try to make a call while the device is offline
|
||||||
|
* Channels are no longer experimental and are available by default
|
||||||
* Display a permanent notification when doing location streaming and get rid of dangerous "Access Location in Background" permission
|
* Display a permanent notification when doing location streaming and get rid of dangerous "Access Location in Background" permission
|
||||||
|
* Autoplay all voice messages in a chat
|
||||||
* Allow to share location for 24 hours
|
* Allow to share location for 24 hours
|
||||||
* Allow mini-apps to play audio without user interaction
|
* Allow mini-apps to play audio without user interaction
|
||||||
|
* Allow to paste and open invitation links from search
|
||||||
* Mark chats as unread (long tap a chat and select the corresponding option from the three-dot-menu)
|
* Mark chats as unread (long tap a chat and select the corresponding option from the three-dot-menu)
|
||||||
|
* Add "Mark all as read" option to profile menu in the profile switcher
|
||||||
* Fix process of upgrading from a very old version of the app
|
* Fix process of upgrading from a very old version of the app
|
||||||
|
* Show more recent added stickers at the top of the sticker picker
|
||||||
|
* Allow to open links in messages via actions in TalkBack menu
|
||||||
|
* Allow to open map if user clicks "Location streaming enabled" system message
|
||||||
|
* Allow to disable incoming calls notifications
|
||||||
|
* Add an option to process unencrypted messages; by default, only encrypted messages can be sent or received
|
||||||
|
* Fix: do not accidentally set draft in chats that don't allow sending messages
|
||||||
|
* Fix swipe navigation between tabs in RTL languages
|
||||||
|
* Remove "Move to DeltaChat folder", in case you are using the option, a device message shows how to proceed
|
||||||
|
* Remove "Only fetch from DeltaChat folder" option, the functionality is preserved for existing profiles
|
||||||
|
* Remove "Delete Messages from Server" option, this is now up to the server:
|
||||||
|
Chatmail handles that automatically, classic email servers used as relay often have lots of storage or options themselves
|
||||||
|
* Remove "Show Email" options, all messages are shown by default, shared usage of email account is not supported
|
||||||
|
* Allow otherwise invalid TLS connections if the key is unchanged
|
||||||
|
* Adapt quota warning to automatic cleanup.
|
||||||
|
* Don't show non-delivery-notfications in broadcast channels
|
||||||
|
* Resend the last 10 messages to new broadcast channel member
|
||||||
|
* Enable PQC (Post-Quantum Cryptography) support. We do not generate PQC keys yet, this step is needed for forward compatibility
|
||||||
|
* Improve avatar quality
|
||||||
|
* Fix: avoid invalid empty "~" notifications when some peer is streaming location
|
||||||
|
* Fix: Improve detection of stickers
|
||||||
|
* Fix text direction issues for RTL languages in "Show full message" view
|
||||||
|
* Fix: Reconnect when removing a relay
|
||||||
|
* Update to core 2.50.0
|
||||||
|
|
||||||
## v2.49.0
|
## v2.49.0
|
||||||
2026-04
|
2026-04
|
||||||
|
|||||||
+2
-2
@@ -34,8 +34,8 @@ android {
|
|||||||
useLibrary 'org.apache.http.legacy'
|
useLibrary 'org.apache.http.legacy'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
versionCode 30000742
|
versionCode 30000743
|
||||||
versionName "2.49.0"
|
versionName "2.50.0"
|
||||||
|
|
||||||
applicationId "chat.delta.lite"
|
applicationId "chat.delta.lite"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
|||||||
@@ -1643,12 +1643,6 @@ JNIEXPORT void Java_com_b44t_messenger_DcMsg_setHtml(JNIEnv *env, jobject obj, j
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT void Java_com_b44t_messenger_DcMsg_forceSticker(JNIEnv *env, jobject obj)
|
|
||||||
{
|
|
||||||
dc_msg_force_sticker(get_dc_msg(env, obj));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobject obj)
|
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
char* temp = dc_msg_get_poi_location(get_dc_msg(env, obj));
|
char* temp = dc_msg_get_poi_location(get_dc_msg(env, obj));
|
||||||
|
|||||||
+1
-1
Submodule jni/deltachat-core-rust updated: 570119830f...ad50c27fab
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -628,6 +643,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1425,23 +1631,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#wie-viele-mitglieder-können-in-einer-einzelnen-gruppe-sein">Wie viele Mitglieder können in einer einzelnen Gruppe sein?</a></li>
|
<li><a href="#wie-viele-mitglieder-können-in-einer-einzelnen-gruppe-sein">Wie viele Mitglieder können in einer einzelnen Gruppe sein?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Kanäle</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#einem-kanal-beitreten">Einem Kanal beitreten</a></li>
|
||||||
|
<li><a href="#einen-kanal-erstellen">Einen Kanal erstellen</a></li>
|
||||||
|
<li><a href="#wie-viele-empfänger-kann-ein-kanal-haben">Wie viele Empfänger kann ein Kanal haben?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Anrufe</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#jemanden-anrufen">Jemanden anrufen</a></li>
|
||||||
|
<li><a href="#einen-anruf-annehmen-oder-ablehnen">Einen Anruf annehmen oder ablehnen</a></li>
|
||||||
|
<li><a href="#während-des-anrufs">Während des Anrufs</a></li>
|
||||||
|
<li><a href="#verpasste-anrufe-und-benachrichtigungen">Verpasste Anrufe und Benachrichtigungen</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-Chat-Apps</a>
|
<li><a href="#webxdc">In-Chat-Apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#wo-bekomme-ich-in-chat-apps">Wo bekomme ich In-Chat-Apps?</a></li>
|
<li><a href="#wo-bekomme-ich-in-chat-apps">Wo bekomme ich In-Chat-Apps?</a></li>
|
||||||
@@ -584,6 +599,197 @@ aber mehr als 150 sind nicht empfohlen.</p>
|
|||||||
|
|
||||||
<p>Wenn Gruppen größer werden, können sie sozial instabil werden und benötigen möglicherweise eine Hierarchie - und Delta Chat ist ein privater Messenger für Chats mit <a href="#groups">gleichen Rechten</a>. Vgl. <a href="https://de.wikipedia.org/wiki/Dunbar-Zahl">Dunbar-Zahl</a>.</p>
|
<p>Wenn Gruppen größer werden, können sie sozial instabil werden und benötigen möglicherweise eine Hierarchie - und Delta Chat ist ein privater Messenger für Chats mit <a href="#groups">gleichen Rechten</a>. Vgl. <a href="https://de.wikipedia.org/wiki/Dunbar-Zahl">Dunbar-Zahl</a>.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Kanäle <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Kanäle dienen der Verbreitung von Nachrichten an viele Empfänger.</p>
|
||||||
|
|
||||||
|
<h3 id="einem-kanal-beitreten">
|
||||||
|
|
||||||
|
|
||||||
|
Einem Kanal beitreten <a href="#einem-kanal-beitreten" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="einen-kanal-erstellen">
|
||||||
|
|
||||||
|
|
||||||
|
Einen Kanal erstellen <a href="#einen-kanal-erstellen" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="wie-viele-empfänger-kann-ein-kanal-haben">
|
||||||
|
|
||||||
|
|
||||||
|
Wie viele Empfänger kann ein Kanal haben? <a href="#wie-viele-empfänger-kann-ein-kanal-haben" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Anrufe <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="jemanden-anrufen">
|
||||||
|
|
||||||
|
|
||||||
|
Jemanden anrufen <a href="#jemanden-anrufen" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="einen-anruf-annehmen-oder-ablehnen">
|
||||||
|
|
||||||
|
|
||||||
|
Einen Anruf annehmen oder ablehnen <a href="#einen-anruf-annehmen-oder-ablehnen" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="während-des-anrufs">
|
||||||
|
|
||||||
|
|
||||||
|
Während des Anrufs <a href="#während-des-anrufs" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="verpasste-anrufe-und-benachrichtigungen">
|
||||||
|
|
||||||
|
|
||||||
|
Verpasste Anrufe und Benachrichtigungen <a href="#verpasste-anrufe-und-benachrichtigungen" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1329,23 +1535,16 @@ im Falle einer Beschlagnahmung des Geräts nicht ohne Weiteres identifiziert wer
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Das verwendete <a href="#relays">Relay</a> muss Ihre IP-Adresse kennen,
|
<p>Die verwendeten <a href="#relays">Relays</a> müssen deine IP-Adresse kennen,
|
||||||
sowie manchmal auch die Geräte Ihrer Kontakte, wenn Sie einen <a href="#experiments">Anruf</a> tätigen
|
sowie manchmal auch die Geräte deiner Kontakte, wenn du einen <a href="#calls">Anruf</a> tätigst
|
||||||
oder gemeinsam <a href="#webxdc">Apps</a> verwenden.</p>
|
oder ihr gemeinsam <a href="#webxdc">Apps</a> verwendet.</p>
|
||||||
|
|
||||||
<p>IP-Adressen sind für Verbindungen und für Effizienz erforderlich.
|
<p>IP-Adressen sind für Verbindungen und für Effizienz erforderlich.
|
||||||
Sie werden weder gespeichert noch offengelegt.
|
Sie werden von Delta Chat weder gespeichert noch offengelegt.
|
||||||
Beachten Sie, dass die IP-Adresse
|
IP-Adressen sind nicht mit einer Adresse, die du einem Lieferdienst gibst, vergleichbar - sondern viel gröber und oft nur die Stadt oder die Region beschreibend.</p>
|
||||||
nicht mit einer Adresse, die Sie einem Lieferdienst geben, vergleichbar ist -
|
|
||||||
sondern viel gröber ist und oft nur die Region oder das Land angibt.</p>
|
|
||||||
|
|
||||||
<p>Da dies die Standardfunktion des Internets und anderer Messenger ist,
|
<p>Wenn du deine IP-Adresse als Risiko betrachtest, empfehlen wir, ein VPN für das gesamte System zu verwenden.
|
||||||
bieten wir hier keine Optionen an und stellen auch keine Fragen im Voraus.</p>
|
Einstellungen auf App-Ebene hinterlassen Lücken überall im System. Wenn man beispielsweise auf einen Link tippt, können IP-Adressen an Unbekannte weitergegeben werden, was bei weitem das größere Risiko darstellt</p>
|
||||||
|
|
||||||
<p>Wenn Sie Ihre IP-Adresse als Sicherheits- oder Datenschutzrisiko betrachten,
|
|
||||||
empfehlen wir Ihnen, ein VPN in Kombination mit dem System-Lockdown-Modus zu verwenden.
|
|
||||||
Alle einzelnen Apps auf Ihrem System nach IP-Optionen abzusuchen wird nicht zufriedenstellen sein;
|
|
||||||
beispielsweise legt das Antippen eines Links IP-Adressen gegenüber unbekannten Parteien offen und stellt hier das weitaus größere Risiko dar.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -627,6 +642,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1425,23 +1631,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
+377
-176
@@ -2,38 +2,53 @@
|
|||||||
<html lang="es"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
<html lang="es"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||||
<li><a href="#qué-es-delta-chat">¿Qué es Delta Chat?</a>
|
<li><a href="#qué-es-delta-chat">¿Qué es Delta Chat?</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">¿Cómo puedo encontrar gente para chatear?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#por-qué-un-chat-aparece-marcado-como-solicitud">¿Por qué un chat aparece marcado como “Solicitud”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#cómo-puedo-poner-en-contacto-a-dos-de-mis-amigos-entre-ellos">¿Cómo puedo poner en contacto a dos de mis amigos entre ellos?</a></li>
|
||||||
<li><a href="#multiple-accounts">¿Qué son los perfiles? ¿Cómo puedo cambiar entre ellos?</a></li>
|
<li><a href="#multiple-accounts">¿Qué son los perfiles? ¿Cómo puedo cambiar entre ellos?</a></li>
|
||||||
<li><a href="#quién-ve-mi-foto-de-perfil">¿Quién ve mi foto de perfil?</a></li>
|
<li><a href="#quién-ve-mi-foto-de-perfil">¿Quién ve mi foto de perfil?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">¿Puedo establecer una Bio/Estado en Delta Chat?</a></li>
|
||||||
<li><a href="#qué-significa-fijar-mutear-archivar">¿Qué significa fijar, mutear, archivar?</a></li>
|
<li><a href="#qué-significa-fijar-mutear-archivar">¿Qué significa fijar, mutear, archivar?</a></li>
|
||||||
<li><a href="#save">¿Cómo funcionan los “Mensajes guardados”?</a></li>
|
<li><a href="#save">¿Cómo funcionan los “Mensajes guardados”?</a></li>
|
||||||
<li><a href="#qué-significa-el-punto-verde">¿Qué significa el punto verde?</a></li>
|
<li><a href="#qué-significa-el-punto-verde">¿Qué significa el punto verde?</a></li>
|
||||||
<li><a href="#qué-significan-las-marcas-que-se-muestran-junto-a-los-mensajes-salientes">¿Qué significan las marcas que se muestran junto a los mensajes salientes?</a></li>
|
<li><a href="#qué-significan-las-marcas-que-se-muestran-junto-a-los-mensajes-salientes">¿Qué significan las marcas que se muestran junto a los mensajes salientes?</a></li>
|
||||||
<li><a href="#edit">Corregir errores y borrar mensajes después de enviar</a></li>
|
<li><a href="#edit">Corregir errores y borrar mensajes después de enviar</a></li>
|
||||||
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
<li><a href="#mediaquality">¿Cómo se gestiona la calidad de los archivos multimedia?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">¿Cómo funciona la desaparición de mensajes?</a></li>
|
<li><a href="#ephemeralmsgs">¿Cómo funciona la desaparición de mensajes?</a></li>
|
||||||
<li><a href="#delold">¿Qué pasa si activo “Borrar mensajes del dispositivo”?</a></li>
|
<li><a href="#delold">¿Qué pasa si activo “Borrar mensajes del dispositivo”?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">¿Cómo puedo borrar mi perfil?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#groups">Groups</a>
|
<li><a href="#groups">Grupos</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#creación-de-un-grupo">Creación de un grupo</a></li>
|
<li><a href="#creación-de-un-grupo">Creación de un grupo</a></li>
|
||||||
<li><a href="#addmembers">Add and remove members</a></li>
|
<li><a href="#addmembers">Añadir y eliminar miembros</a></li>
|
||||||
<li><a href="#me-he-eliminado-por-accidente">Me he eliminado por accidente.</a></li>
|
<li><a href="#me-he-eliminado-por-accidente">Me he eliminado por accidente.</a></li>
|
||||||
<li><a href="#no-quiero-recibir-más-los-mensajes-de-un-grupo">No quiero recibir más los mensajes de un grupo.</a></li>
|
<li><a href="#no-quiero-recibir-más-los-mensajes-de-un-grupo">No quiero recibir más los mensajes de un grupo.</a></li>
|
||||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
<li><a href="#clonar-un-grupo">Clonar un grupo</a></li>
|
||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#cuántos-miembros-pueden-participar-en-un-solo-grupo">¿Cuántos miembros pueden participar en un solo grupo?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#channels">Channels</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
<li><a href="#how-private-are-in-chat-apps">How private are in-chat apps?</a></li>
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
<li><a href="#create-xdc">How can I create my own in-chat apps?</a></li>
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#webxdc">Aplicaciones en chats</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#dónde-puedo-conseguir-aplicaciones-para-el-chat">¿Dónde puedo conseguir aplicaciones para el chat?</a></li>
|
||||||
|
<li><a href="#cómo-de-privadas-son-las-aplicaciones-en-el-chat">¿Cómo de privadas son las aplicaciones en el chat?</a></li>
|
||||||
|
<li><a href="#create-xdc">¿Cómo puedo crear mis propias aplicaciones para el chat?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#instant-delivery">Entrega de mensajes instantáneos y notificaciones Push</a>
|
<li><a href="#instant-delivery">Entrega de mensajes instantáneos y notificaciones Push</a>
|
||||||
@@ -57,7 +72,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a href="#experiments">Experimental Features</a></li>
|
<li><a href="#experiments">Experimental Features</a></li>
|
||||||
<li><a href="#relays">What are Relays?</a></li>
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#puedo-utilizar-una-dirección-de-email-clásico-con-delta-chat">¿Puedo utilizar una dirección de email clásico con Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
||||||
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
||||||
@@ -67,8 +82,8 @@
|
|||||||
<li><a href="#e2ee">Cifrado y seguridad</a>
|
<li><a href="#e2ee">Cifrado y seguridad</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#qué-estándares-se-utilizan-para-el-cifrado-de-extremo-a-extremo">¿Qué estándares se utilizan para el cifrado de extremo a extremo?</a></li>
|
<li><a href="#qué-estándares-se-utilizan-para-el-cifrado-de-extremo-a-extremo">¿Qué estándares se utilizan para el cifrado de extremo a extremo?</a></li>
|
||||||
<li><a href="#whene2e">How can I know if messages are end-to-end encrypted?</a></li>
|
<li><a href="#whene2e">¿Cómo puedo saber si los mensajes están cifrados de extremo a extremo?</a></li>
|
||||||
<li><a href="#can-i-still-receive-or-send-messages-without-end-to-end-encryption">Can I still receive or send messages without end-to-end encryption?</a></li>
|
<li><a href="#puedo-enviar-o-recibir-mensajes-sin-cifrado-de-extremo-a-extremo">¿Puedo enviar o recibir mensajes sin cifrado de extremo a extremo?</a></li>
|
||||||
<li><a href="#e2eeguarantee">What does the green checkmark in a contact profile mean?</a></li>
|
<li><a href="#e2eeguarantee">What does the green checkmark in a contact profile mean?</a></li>
|
||||||
<li><a href="#los-adjuntos-imágenes-archivos-audio-etc-están-cifrados-de-extremo-a-extremo">¿Los adjuntos (imágenes, archivos, audio, etc.) están cifrados de extremo a extremo?</a></li>
|
<li><a href="#los-adjuntos-imágenes-archivos-audio-etc-están-cifrados-de-extremo-a-extremo">¿Los adjuntos (imágenes, archivos, audio, etc.) están cifrados de extremo a extremo?</a></li>
|
||||||
<li><a href="#openpgp-secure">¿Es OpenPGP seguro?</a></li>
|
<li><a href="#openpgp-secure">¿Es OpenPGP seguro?</a></li>
|
||||||
@@ -77,11 +92,11 @@
|
|||||||
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
||||||
<li><a href="#message-metadata">¿Cómo Delta Chat protege los metadatos en los mensajes?</a></li>
|
<li><a href="#message-metadata">¿Cómo Delta Chat protege los metadatos en los mensajes?</a></li>
|
||||||
<li><a href="#device-seizure">¿Cómo proteger los metadatos y los contactos cuando se incauta un dispositivo?</a></li>
|
<li><a href="#device-seizure">¿Cómo proteger los metadatos y los contactos cuando se incauta un dispositivo?</a></li>
|
||||||
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
<li><a href="#quién-puede-ver-mi-dirección-ip">¿Quién puede ver mi dirección IP?</a></li>
|
||||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
<li><a href="#sealedsender">¿Soporta Delta Chat “Sealed Sender”?</a></li>
|
||||||
<li><a href="#pfs">¿Soporta Delta Chat Perfect Forward Secrecy?</a></li>
|
<li><a href="#pfs">¿Soporta Delta Chat Perfect Forward Secrecy?</a></li>
|
||||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
<li><a href="#pqc">¿Soporta Delta Chat criptografía postcuántica?</a></li>
|
||||||
<li><a href="#how-can-i-manually-check-encryption-information">How can I manually check encryption information?</a></li>
|
<li><a href="#cómo-puedo-comprobar-manualmente-la-información-de-cifrado">¿Cómo puedo comprobar manualmente la información de cifrado?</a></li>
|
||||||
<li><a href="#importkey">¿Puedo reutilizar mi clave privada existente?</a></li>
|
<li><a href="#importkey">¿Puedo reutilizar mi clave privada existente?</a></li>
|
||||||
<li><a href="#security-audits">¿Se auditó Delta Chat de forma independiente en busca de vulnerabilidades de seguridad?</a></li>
|
<li><a href="#security-audits">¿Se auditó Delta Chat de forma independiente en busca de vulnerabilidades de seguridad?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -89,7 +104,7 @@
|
|||||||
<li><a href="#miscelaneo">Miscelaneo</a>
|
<li><a href="#miscelaneo">Miscelaneo</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#qué-permisos-necesita-delta-chat">¿Qué permisos necesita Delta Chat?</a></li>
|
<li><a href="#qué-permisos-necesita-delta-chat">¿Qué permisos necesita Delta Chat?</a></li>
|
||||||
<li><a href="#where-can-my-friends-find-delta-chat">Where can my friends find Delta Chat?</a></li>
|
<li><a href="#dónde-pueden-encontrar-mis-amigos-delta-chat">¿Dónde pueden encontrar mis amigos Delta Chat?</a></li>
|
||||||
<li><a href="#cómo-se-financia-el-desarrollo-de-delta-chat">¿Cómo se financia el desarrollo de Delta Chat?</a></li>
|
<li><a href="#cómo-se-financia-el-desarrollo-de-delta-chat">¿Cómo se financia el desarrollo de Delta Chat?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -109,85 +124,85 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>Instant creation of <strong>private chat profiles</strong>
|
<p>Creación instantánea de <strong>perfiles de chat privados</strong>
|
||||||
with secure and interoperable <a href="https://chatmail.at/relays">chatmail relays</a>
|
con <a href="https://chatmail.at/relays">servidores de chatmail</a> seguros e interoperables
|
||||||
that offer instant message delivery, and Push Notifications for iOS and Android devices.</p>
|
que ofrecen un envío instantáneo de mensajes y Notificaciones Push en dispositivos Android e iOS.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
|
<p>Soporte generalizado <a href="#multiple-accounts">multiperfil</a> y
|
||||||
<a href="#multiclient">multi-device</a> support on all platforms
|
soporte <a href="#multiclient">multidispositivo</a> en todas las plataformas
|
||||||
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
|
y entre diferentes <a href="https://chatmail.at/clients">aplicaciones de chatmail</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
|
<p>Aplicaciones interactivas <a href="#webxdc">en el chat</a> para juegos y colaboración</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="#security-audits">Audited end-to-end encryption</a>
|
<p><a href="#security-audits">Cifrado de extremo a extremo auditado</a>
|
||||||
safe against network and server attacks.</p>
|
seguro contra ataques a la red y al servidor.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Free and Open Source software, both app and server side,
|
<p>Software gratuito y de código abierto, tanto las aplicaciones como los servidores,
|
||||||
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
|
construido sobre <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">estándares de internet</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="howtoe2ee">
|
<h3 id="howtoe2ee">
|
||||||
|
|
||||||
|
|
||||||
How can I find people to chat with? <a href="#howtoe2ee" class="anchor"></a>
|
¿Cómo puedo encontrar gente para chatear? <a href="#howtoe2ee" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>First, note that Delta Chat is a private messenger.
|
<p>En primer lugar, ten en cuenta que Delta Chat es un sistema de mensajería privado.
|
||||||
There is no public discovery, <em>you</em> decide about your contacts.</p>
|
No hay descubrimiento público, <em>tú</em> decides sobre tus contactos.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>If you are <strong>face to face</strong> with your friend or family,
|
<p>Si estas <strong>cara a cara</strong> con tus amigos o familia,
|
||||||
tap the <strong>QR Code</strong> icon <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
pulsa el icono del <strong>Código QR</strong> <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
||||||
on the main screen.<br />
|
en la pantalla principal.
|
||||||
Ask your chat partner to <strong>scan</strong> the QR image
|
Pídele a la otra persona que <strong>escanee</strong> el código QR
|
||||||
with their Delta Chat app.</p>
|
con su aplicación de Delta Chat.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>For a <strong>remote</strong> contact setup,
|
<p>Para configurar un contacto <strong>a distancia</strong>,
|
||||||
from the same screen,
|
desde la misma pantalla,
|
||||||
click “Copy” or “Share” and send the <strong>invite link</strong>
|
haga clic en “Copiar” o “Compartir” y envíe el <strong>enlace de invitación</strong>
|
||||||
through another private chat.</p>
|
a través de otro chat privado.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Now wait while connection gets established.</p>
|
<p>Espera mientras la conexión se establece.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>If both sides are online, they will soon see a chat
|
<p>Si ambas partes están en línea, pronto verán un chat
|
||||||
and can start messaging securely.</p>
|
y podrán empezar a mensajearse de forma segura.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If one side is offline or in bad network,
|
<p>Si una de las partes no está conectada o tiene una mala conexión,
|
||||||
the ability to chat is delayed until connectivity is restored.</p>
|
la capacidad de chatear se retrasará hasta que la conectividad se haya restaurado.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Congratulations!
|
<p>¡Enhorabuena!
|
||||||
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
|
Ahora estás utilizando automáticamente el <a href="#e2ee">cifrado de extremo a extremo</a> con este contacto.
|
||||||
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
|
Si os añadís mutuamente a <a href="#groups">grupos</a>, el cifrado de extremo a extremo se establecerá entre todos los miembros.</p>
|
||||||
|
|
||||||
<h3 id="why-is-a-chat-marked-as-request">
|
<h3 id="por-qué-un-chat-aparece-marcado-como-solicitud">
|
||||||
|
|
||||||
|
|
||||||
Why is a chat marked as “Request”? <a href="#why-is-a-chat-marked-as-request" class="anchor"></a>
|
¿Por qué un chat aparece marcado como “Solicitud”? <a href="#por-qué-un-chat-aparece-marcado-como-solicitud" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>As being a private messenger,
|
<p>Al ser un sistema de mensajería privada
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
solo los amigos y familiares con los que <a href="#howtoe2ee">compartas tu código QR o enlace de invitación</a> pueden escribirte.</p>
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends,
|
<p>Tus amigos pueden compartir tu contacto con otros amigos,
|
||||||
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
esto aparecerá como <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Solicitud</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -201,10 +216,10 @@ this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-s
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="how-can-i-put-two-of-my-friends-in-contact-with-each-other">
|
<h3 id="cómo-puedo-poner-en-contacto-a-dos-de-mis-amigos-entre-ellos">
|
||||||
|
|
||||||
|
|
||||||
How can I put two of my friends in contact with each other? <a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other" class="anchor"></a>
|
¿Cómo puedo poner en contacto a dos de mis amigos entre ellos? <a href="#cómo-puedo-poner-en-contacto-a-dos-de-mis-amigos-entre-ellos" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -223,16 +238,16 @@ and can tap it to start chatting with the first contact.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>A profile is <strong>a name, a picture</strong> and some additional information for encrypting messages.
|
<p>Un perfil es <strong>un nombre, una foto</strong> y alguna información adicional para cifrar los mensajes.
|
||||||
A profile lives on your device(s) only
|
Un perfil se almacena únicamente en tu dispositivo (o dispositivos)
|
||||||
and uses the server only to relay messages.</p>
|
y solo utiliza el servidor para enviar los mensajes.</p>
|
||||||
|
|
||||||
<p>En la primera instalación de Delta Chat se crea un primer perfil.</p>
|
<p>En la primera instalación de Delta Chat se crea un primer perfil.</p>
|
||||||
|
|
||||||
<p>Después, puedes tocar la imagen de tu perfil en la esquina superior izquierda para <strong>Añadir perfiles</strong>
|
<p>Después, puedes tocar la imagen de tu perfil en la esquina superior izquierda para <strong>Añadir perfiles</strong>
|
||||||
o para <strong>Cambiar perfiles</strong>.</p>
|
o para <strong>Cambiar perfiles</strong>.</p>
|
||||||
|
|
||||||
<p>You may want to use separate profiles for political, family or work related activities.</p>
|
<p>Puede utilizar perfiles diferentes para actividades políticas, familiares o laborales.</p>
|
||||||
|
|
||||||
<p>Quizás quieres aprender <a href="#multiclient">cómo se usa el mismo perfil en múltiples dispositivos</a>.</p>
|
<p>Quizás quieres aprender <a href="#multiclient">cómo se usa el mismo perfil en múltiples dispositivos</a>.</p>
|
||||||
|
|
||||||
@@ -252,15 +267,15 @@ o los agrega a través de un código QR, ellos lo verán automáticamente como s
|
|||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
|
|
||||||
Can I set a Bio/Status with Delta Chat? <a href="#signature" class="anchor"></a>
|
¿Puedo establecer una Bio/Estado en Delta Chat? <a href="#signature" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Yes,
|
<p>Sí,
|
||||||
you can do so under <strong>Settings → Profile → Bio</strong>.
|
es posible hacerlo en <strong>Ajustes → Perfil → Texto de firma</strong>.
|
||||||
Once you sent a message to a contact,
|
Una vez que hayas enviado un mensaje a un contacto,
|
||||||
they will see it when they view your contact details.</p>
|
este lo verá cuando consulte tus datos de contacto.</p>
|
||||||
|
|
||||||
<h3 id="qué-significa-fijar-mutear-archivar">
|
<h3 id="qué-significa-fijar-mutear-archivar">
|
||||||
|
|
||||||
@@ -280,7 +295,7 @@ they will see it when they view your contact details.</p>
|
|||||||
<p><strong>Chats muteados</strong> si no quieres recibir notificaciones de ellos. Chats muteados se mantienen en su lugar e inclusive puedes fijarlos.</p>
|
<p><strong>Chats muteados</strong> si no quieres recibir notificaciones de ellos. Chats muteados se mantienen en su lugar e inclusive puedes fijarlos.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Archivar chats</strong> si no deseas verlos en tu lista de chats. Los chats archivados siguen siendo accesibles arriba de la lista de chats o a través de la búsqueda.</p>
|
<p><strong>Archivar chats</strong> si no deseas verlos en tu lista de chats. Los chats archivados siguen siendo accesibles arriba de la lista de chats o a través de la búsqueda y aparecen marcados como <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archivado</b>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Cuando un chat archivado recibe un nuevo mensaje, a menos que esté silenciado, <strong>saldrá del archivo</strong> y volverá a aparecer en tu lista de chats.
|
<p>Cuando un chat archivado recibe un nuevo mensaje, a menos que esté silenciado, <strong>saldrá del archivo</strong> y volverá a aparecer en tu lista de chats.
|
||||||
@@ -352,16 +367,16 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>Un tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
significa que el mensaje se ha enviado correctamente al <a href="#relays">servidor</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Dos ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
indicate your contact has read the message.</p>
|
indican que tu contacto ha leído el mensaje.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
<p>En los <a href="#groups">grupos</a> el segundo tick indica que, al menos, uno de los miembros ha leído el mensaje.</p>
|
||||||
|
|
||||||
<p>You will only get the second tick if both you and one of the recipients who read the message
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
@@ -396,13 +411,12 @@ who could have already replied, forwarded, saved, screenshotted or otherwise cop
|
|||||||
<h3 id="mediaquality">
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
¿Cómo se gestiona la calidad de los archivos multimedia? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
<p>Imágenes, vídeos, archivos, mensajes de voz, etc., pueden enviarse utilizando los botones de <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Adjuntar</strong> o <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Mensaje de Voz</strong>.</p>
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -460,8 +474,8 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>If you want to save storage on your device, you can choose to delete old
|
<p>Si quieres ahorrar espacio en tu dispositivo, puedes elegir borrar los mensajes antiguos
|
||||||
messages automatically.</p>
|
automáticamente.</p>
|
||||||
|
|
||||||
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
||||||
You can set a timeframe between “after an hour” and “after a year”;
|
You can set a timeframe between “after an hour” and “after a year”;
|
||||||
@@ -471,7 +485,7 @@ older than that.</p>
|
|||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
|
|
||||||
How can I delete my chat profile? <a href="#remove-account" class="anchor"></a>
|
¿Cómo puedo borrar mi perfil? <a href="#remove-account" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -490,12 +504,12 @@ or the respective page from your chosen <a href="https://chatmail.at/relays">3rd
|
|||||||
<h2 id="groups">
|
<h2 id="groups">
|
||||||
|
|
||||||
|
|
||||||
Groups <a href="#groups" class="anchor"></a>
|
Grupos <a href="#groups" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<p>Groups let several people chat together privately with <strong>equal rights</strong>.</p>
|
<p>Los grupos permiten a varias personas chatear juntas en privado con <strong>igualdad de derechos</strong>.</p>
|
||||||
|
|
||||||
<p>Anyone can
|
<p>Anyone can
|
||||||
change the group name or avatar,
|
change the group name or avatar,
|
||||||
@@ -503,7 +517,7 @@ change the group name or avatar,
|
|||||||
set <a href="#ephemeralmsgs">disappearing messages</a>,
|
set <a href="#ephemeralmsgs">disappearing messages</a>,
|
||||||
and <a href="#edit">delete their own messages</a> from all member’s devices.</p>
|
and <a href="#edit">delete their own messages</a> from all member’s devices.</p>
|
||||||
|
|
||||||
<p>Because all members have the same rights, groups work best among <strong>trusted friends and family</strong>.</p>
|
<p>Como todos los miembros tienen los mismos derechos, los grupos funcionan mejor entre <strong>amigos de confianza y familiares</strong>.</p>
|
||||||
|
|
||||||
<h3 id="creación-de-un-grupo">
|
<h3 id="creación-de-un-grupo">
|
||||||
|
|
||||||
@@ -528,17 +542,17 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
|
|
||||||
|
|
||||||
Add and remove members <a href="#addmembers" class="anchor"></a>
|
Añadir y eliminar miembros <a href="#addmembers" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>All group members have the <strong>same rights</strong>.
|
<p>Todos los miembros del grupo tienen los <strong>mismos derechos</strong>.
|
||||||
For this reason, everyone can delete any member or add new ones.</p>
|
Por esta razón, todos pueden eliminar a cualquier miembro o añadir otros nuevos.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>Para <strong>añadir o eliminar miembros</strong>, pulsa el nombre del grupo en el chat y selecciona el miembro a añadir o eliminar.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If the member is not yet in your contact list, but <strong>face to face</strong> with you,
|
<p>If the member is not yet in your contact list, but <strong>face to face</strong> with you,
|
||||||
@@ -583,84 +597,275 @@ Si desea unirse al grupo nuevamente más tarde, pídale a otro miembro del grupo
|
|||||||
<p>Como alternativa, también puede “silenciar” a un grupo, lo que significa que recibirá todos los mensajes y
|
<p>Como alternativa, también puede “silenciar” a un grupo, lo que significa que recibirá todos los mensajes y
|
||||||
aún puede escribir, pero ya no se le notifican nuevos mensajes.</p>
|
aún puede escribir, pero ya no se le notifican nuevos mensajes.</p>
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="clonar-un-grupo">
|
||||||
|
|
||||||
|
|
||||||
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
|
Clonar un grupo <a href="#clonar-un-grupo" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>You can duplicate a group to start a separate discussion
|
<p>Puedes duplicar un grupo para empezar una discusión separada
|
||||||
or to exclude members without them noticing.</p>
|
o para excluir a miembros sin notificárselo.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>Open the group profile and tap <strong>Clone Chat</strong> (Android/iOS),
|
<p>Abre el perfil del grupo y pulsa <strong>Clonar Chat</strong> (Android/iOS),
|
||||||
or right-click the group in the chat list (Desktop).</p>
|
o haz clic derecho en el grupo en la lista de chats (Escritorio).</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Set a new name, choose an avatar, and adjust the member list if needed.</p>
|
<p>Establece un nuevo nombre, elige un avatar y ajusta la lista de miembros si es necesario.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>The new group is <strong>fully independent</strong> from the original,
|
<p>El nuevo grupo es <strong>completamente independiente</strong> del original,
|
||||||
which continues to work as before.</p>
|
que continúa funcionando como antes.</p>
|
||||||
|
|
||||||
<h3 id="how-many-members-can-participate-in-a-single-group">
|
<h3 id="cuántos-miembros-pueden-participar-en-un-solo-grupo">
|
||||||
|
|
||||||
|
|
||||||
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
¿Cuántos miembros pueden participar en un solo grupo? <a href="#cuántos-miembros-pueden-participar-en-un-solo-grupo" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>There is no strict technical limit,
|
<p>No hay una limitación técnica,
|
||||||
but more than 150 is not recommended.</p>
|
pero no se recomiendan más de 150.</p>
|
||||||
|
|
||||||
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
In-chat apps <a href="#webxdc" class="anchor"></a>
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<p>You can send apps to a chat - games, editors, polls and other tools.
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
This makes Delta Chat a truly extensible messenger.</p>
|
|
||||||
|
|
||||||
<h3 id="where-can-i-get-in-chat-apps">
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
Where can I get in-chat apps? <a href="#where-can-i-get-in-chat-apps" class="anchor"></a>
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>In a chat, using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Apps</strong></p>
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>You can also <a href="#create-xdc">create your own app</a> and attach it using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → File</strong></p>
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="how-private-are-in-chat-apps">
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
How private are in-chat apps? <a href="#how-private-are-in-chat-apps" class="anchor"></a>
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>In-chat apps can not send data to the Internet, or download anything.</p>
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
|
Aplicaciones en chats <a href="#webxdc" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Puedes enviar aplicaciones a un chat: juegos, editores, encuestas y otras herramientas.
|
||||||
|
Esto convierte a Delta Chat en una aplicación de mensajería realmente ampliable.</p>
|
||||||
|
|
||||||
|
<h3 id="dónde-puedo-conseguir-aplicaciones-para-el-chat">
|
||||||
|
|
||||||
|
|
||||||
|
¿Dónde puedo conseguir aplicaciones para el chat? <a href="#dónde-puedo-conseguir-aplicaciones-para-el-chat" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>En un chat, utilizando <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Botón Adjuntar → Aplicaciones</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>También puedes <a href="#create-xdc">crear tu propia aplicación</a> y adjuntarla utilizando <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Botón Adjuntar → Archivo</strong></p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="cómo-de-privadas-son-las-aplicaciones-en-el-chat">
|
||||||
|
|
||||||
|
|
||||||
|
¿Cómo de privadas son las aplicaciones en el chat? <a href="#cómo-de-privadas-son-las-aplicaciones-en-el-chat" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Las aplicaciones en el chat no pueden enviar datos a Internet ni descargar nada.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>An in-chat app can only exchange data within a chat, with its
|
<p>An in-chat app can only exchange data within a chat, with its
|
||||||
@@ -672,29 +877,28 @@ isolated from the Internet.</p>
|
|||||||
trust the people you chat with, you can trust the in-chat app as well.</p>
|
trust the people you chat with, you can trust the in-chat app as well.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>This also means: Just like for web links, do not open apps from untrusted contacts.</p>
|
<p>Esto también significa que, al igual que con los enlaces web, no debes abrir aplicaciones de contactos en los que no confíes.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="create-xdc">
|
<h3 id="create-xdc">
|
||||||
|
|
||||||
|
|
||||||
How can I create my own in-chat apps? <a href="#create-xdc" class="anchor"></a>
|
¿Cómo puedo crear mis propias aplicaciones para el chat? <a href="#create-xdc" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>In-chat apps are zip files with <code class="language-plaintext highlighter-rouge">.xdc</code> extension containing html, css, and javascript code.</p>
|
<p>Las aplicaciones de chat son archivos zip con extensión <code class="language-plaintext highlighter-rouge">.xdc</code> que contienen código html, css y javascript.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>You can extend the <a href="https://github.com/webxdc/hello">Hello World example app</a>
|
<p>Para empezar, puedes ampliar la <a href="https://github.com/webxdc/hello">aplicación de ejemplo Hola, Mundo</a></p>
|
||||||
to get started.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>All else you need to know is written in the
|
<p>Todo lo que necesitas saber lo puedes encontrar en
|
||||||
<a href="https://webxdc.org/docs">Webxdc documentation</a>.</p>
|
la <a href="https://webxdc.org/docs">documentación de Webxdc</a></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If you have question, you can ask others with experience
|
<p>If you have question, you can ask others with experience
|
||||||
@@ -871,21 +1075,21 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Yes. You can use the same profile on different devices:</p>
|
<p>Sí. Puedes utilizar el mismo perfil en diferentes dispositivos.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>Asegurate que ambos dispositivos estén en la misma Wi-Fi o red</p>
|
<p>Asegurate que ambos dispositivos estén en la misma Wi-Fi o red</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On the first device, go to <strong>Settings → Add Second Device</strong>, unlock the screen if needed
|
<p>En el primer dispositivo, ve a <strong>Ajustes → Añadir segundo dispositivo</strong>, desbloquea la pantalla si es necesario,
|
||||||
and wait a moment until a QR code is shown</p>
|
y espera un momento hasta que aparezca un código QR</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>En el otro dispositivo, <a href="https://get.delta.chat">instala Delta Chat</a></p>
|
<p>En el otro dispositivo, <a href="https://get.delta.chat">instala Delta Chat</a></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On the second device, start Delta Chat, select <strong>Add as Second Device</strong>, and scan the QR code from the old device</p>
|
<p>En el segundo dispositivo, abre Delta Chat, selecciona **Añadir desde otro dispositivo” y escanea el código QR del primer dispositivo</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>La transferencia debería comenzar después de unos segundos y durante la transferencia ambos dispositivos mostrarán el <strong>progreso</strong>.
|
<p>La transferencia debería comenzar después de unos segundos y durante la transferencia ambos dispositivos mostrarán el <strong>progreso</strong>.
|
||||||
@@ -946,8 +1150,8 @@ Do not exit Delta Chat.
|
|||||||
You can use multiple profiles per device, just <a href="#multiple-accounts">add another profile</a></p>
|
You can use multiple profiles per device, just <a href="#multiple-accounts">add another profile</a></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If you still have problems or if you <strong>cannot scan a QR code</strong>
|
<p>Si todavía tienes problemas o si <strong>no puedes escanear el código QR</strong>
|
||||||
try the <strong>manual transfer</strong> described below</p>
|
utiliza la <strong>transferencia manual</strong> descrita debajo</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@@ -1048,7 +1252,7 @@ If you have multiple relays, you will receive messages on all of them.
|
|||||||
Contacts learn your current relays automatically when you message them.</p>
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
<p>Pulsa en un retransmisor para establecerlo como <strong>usado para enviar</strong>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If you <strong>remove</strong> a relay,
|
<p>If you <strong>remove</strong> a relay,
|
||||||
@@ -1057,17 +1261,17 @@ To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in
|
|||||||
instead of removing it right away.</p>
|
instead of removing it right away.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
<p>Para <strong>mostrar</strong> de nuevo un retransmisor oculto, pulsa en él.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>For more details and future possibilities of relays,
|
<p>For more details and future possibilities of relays,
|
||||||
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="puedo-utilizar-una-dirección-de-email-clásico-con-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
Can I use a classic email address with Delta Chat? <a href="#can-i-use-a-classic-email-address-with-delta-chat" class="anchor"></a>
|
¿Puedo utilizar una dirección de email clásico con Delta Chat? <a href="#puedo-utilizar-una-dirección-de-email-clásico-con-delta-chat" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1141,27 +1345,27 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
which is why Delta Chat for Android asks whether you want
|
which is why Delta Chat for Android asks whether you want
|
||||||
to send anonymous usage statistics.</p>
|
to send anonymous usage statistics.</p>
|
||||||
|
|
||||||
<p>You can turn it on and off at
|
<p>Puedes activarlo y desactivarlo en
|
||||||
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
<strong>Ajustes → Avanzado → Enviar estadísticas a los desarrolladores de Delta Chat</strong>.</p>
|
||||||
|
|
||||||
<p>When you turn it on,
|
<p>Cuando lo activas,
|
||||||
weekly statistics will be automatically sent to a bot.</p>
|
las estadísticas semanales se envían automáticamente a un bot.</p>
|
||||||
|
|
||||||
<p>We are interested e.g. in statistics like:</p>
|
<p>Estamos interesados en estadísticas como, p. ej.:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Which versions of Delta Chat are being used?</p>
|
<p>¿Qué versiones de Delta Chat están siendo utilizadas?</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>What errors occur for users?</p>
|
<p>¿Qué errores se producen para los usuarios?</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
<p>Nosotros <em>no</em> recopilaremos ninguna información de carácter personal sobre ti.</p>
|
||||||
|
|
||||||
<h3 id="estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">
|
<h3 id="estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">
|
||||||
|
|
||||||
@@ -1212,12 +1416,12 @@ enables receivers to use end-to-end encryption with the contact.</p>
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Delta Chat does not query, publish or interact with any OpenPGP key servers.</p>
|
<p>Delta Chat no consulta, publica o interacciona con ningún servidor de claves OpenPGP.</p>
|
||||||
|
|
||||||
<h3 id="whene2e">
|
<h3 id="whene2e">
|
||||||
|
|
||||||
|
|
||||||
How can I know if messages are end-to-end encrypted? <a href="#whene2e" class="anchor"></a>
|
¿Cómo puedo saber si los mensajes están cifrados de extremo a extremo? <a href="#whene2e" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1226,10 +1430,10 @@ enables receivers to use end-to-end encryption with the contact.</p>
|
|||||||
Since the Delta Chat Version 2 release series (July 2025)
|
Since the Delta Chat Version 2 release series (July 2025)
|
||||||
there are no lock or similar markers on end-to-end encrypted messages, anymore.</p>
|
there are no lock or similar markers on end-to-end encrypted messages, anymore.</p>
|
||||||
|
|
||||||
<h3 id="can-i-still-receive-or-send-messages-without-end-to-end-encryption">
|
<h3 id="puedo-enviar-o-recibir-mensajes-sin-cifrado-de-extremo-a-extremo">
|
||||||
|
|
||||||
|
|
||||||
Can I still receive or send messages without end-to-end encryption? <a href="#can-i-still-receive-or-send-messages-without-end-to-end-encryption" class="anchor"></a>
|
¿Puedo enviar o recibir mensajes sin cifrado de extremo a extremo? <a href="#puedo-enviar-o-recibir-mensajes-sin-cifrado-de-extremo-a-extremo" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1409,41 +1613,38 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
<h3 id="who-sees-my-ip-address">
|
<h3 id="quién-puede-ver-mi-dirección-ip">
|
||||||
|
|
||||||
|
|
||||||
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
¿Quién puede ver mi dirección IP? <a href="#quién-puede-ver-mi-dirección-ip" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
Does Delta Chat support “Sealed Sender”? <a href="#sealedsender" class="anchor"></a>
|
¿Soporta Delta Chat “Sealed Sender”? <a href="#sealedsender" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>No, todavía no.</p>
|
||||||
|
|
||||||
<p>The Signal messenger introduced <a href="https://signal.org/blog/sealed-sender/">“Sealed Sender” in 2018</a>
|
<p>The Signal messenger introduced <a href="https://signal.org/blog/sealed-sender/">“Sealed Sender” in 2018</a>
|
||||||
to keep their server infrastructure ignorant of who is sending a message to a set of recipients.
|
to keep their server infrastructure ignorant of who is sending a message to a set of recipients.
|
||||||
@@ -1464,7 +1665,7 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
<p>Todavía no, pero llegará con <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||||
This means that if your private decryption key is leaked,
|
This means that if your private decryption key is leaked,
|
||||||
@@ -1482,12 +1683,12 @@ This approach is specified in the <a href="https://datatracker.ietf.org/doc/draf
|
|||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
|
|
||||||
Does Delta Chat support Post-Quantum-Cryptography? <a href="#pqc" class="anchor"></a>
|
¿Soporta Delta Chat criptografía postcuántica? <a href="#pqc" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
<p>Todavía no, pero llegará con <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
@@ -1495,10 +1696,10 @@ Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">
|
|||||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
|
|
||||||
<h3 id="how-can-i-manually-check-encryption-information">
|
<h3 id="cómo-puedo-comprobar-manualmente-la-información-de-cifrado">
|
||||||
|
|
||||||
|
|
||||||
How can I manually check encryption information? <a href="#how-can-i-manually-check-encryption-information" class="anchor"></a>
|
¿Cómo puedo comprobar manualmente la información de cifrado? <a href="#cómo-puedo-comprobar-manualmente-la-información-de-cifrado" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1614,37 +1815,37 @@ You can read the <a href="https://delta.chat/assets/blog/2019-first-security-rev
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Some features require certain permissions,
|
<p>Algunas características requieren ciertos permisos,
|
||||||
e.g. you need to grant camera permission if you want to <a href="#howtoe2ee">scan an invite QR code</a>.</p>
|
p. ej., tienes que conceder permiso de acceso a la cámara si quieres <a href="#howtoe2ee">escanear un código QR de invitación</a>.</p>
|
||||||
|
|
||||||
<p>See <a href="https://delta.chat/en/gdpr#24-app-permissions">Privacy Policy</a> for a detailed overview.</p>
|
<p>Consulta la <a href="https://delta.chat/en/gdpr#24-app-permissions">Política de privacidad</a> para obtener información detallada.</p>
|
||||||
|
|
||||||
<h3 id="where-can-my-friends-find-delta-chat">
|
<h3 id="dónde-pueden-encontrar-mis-amigos-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
Where can my friends find Delta Chat? <a href="#where-can-my-friends-find-delta-chat" class="anchor"></a>
|
¿Dónde pueden encontrar mis amigos Delta Chat? <a href="#dónde-pueden-encontrar-mis-amigos-delta-chat" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Delta Chat is available for all major and some minor platforms:</p>
|
<p>Delta Chat está disponible para todas las plataformas principales y algunas secundarias:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>The <strong>official website</strong>, <a href="https://delta.chat/download">https://delta.chat/download</a> shows all options in detail</p>
|
<p>La <strong>página web oficial</strong>, <a href="https://delta.chat/download">https://delta.chat/download</a>, muestra todas las opciones en detalle.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If unavailable, use the <strong>mirror</strong> at <a href="https://deltachat.github.io/deltachat-pages">https://deltachat.github.io/deltachat-pages</a></p>
|
<p>Si no está disponible, utiliza el <strong>mirror</strong> en <a href="https://deltachat.github.io/deltachat-pages">https://deltachat.github.io/deltachat-pages</a></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Open one of the following <strong>app stores and search for “Delta Chat”:</strong>
|
<p>Abre una de las siguientes <strong>tiendas de aplicaciones y busca “Delta Chat”:</strong>
|
||||||
Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microsoft Store</p>
|
Google Play Store, F-Droid, Huawei App Gallery, iOS y macOS App Store, Microsoft Store</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Check the <strong>package manager</strong> of your Linux distributions</p>
|
<p>Comprueba el <strong>gestor de paquetes</strong> de tu distribución de Linux</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Android APKs</strong> are also available on <a href="https://github.com/deltachat/deltachat-android/releases">https://github.com/deltachat/deltachat-android/releases</a></p>
|
<p>Las <strong>Android APKs</strong> están también disponibles en <a href="https://github.com/deltachat/deltachat-android/releases">https://github.com/deltachat/deltachat-android/releases</a></p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#zenbat-kide-izan-ditzake-talde-batek">Zenbat kide izan ditzake talde batek?</a></li>
|
<li><a href="#zenbat-kide-izan-ditzake-talde-batek">Zenbat kide izan ditzake talde batek?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">Txat barruko aplikazioak</a>
|
<li><a href="#webxdc">Txat barruko aplikazioak</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#non-lortu-ditzaket-txat-barruko-aplikazioak">Non lortu ditzaket txat barruko aplikazioak?</a></li>
|
<li><a href="#non-lortu-ditzaket-txat-barruko-aplikazioak">Non lortu ditzaket txat barruko aplikazioak?</a></li>
|
||||||
@@ -624,6 +639,197 @@ baina ez da komeni 150 baino gehiago izatea.</p>
|
|||||||
Delta Chat <a href="#groups">eskubide berberekin</a> txateatzeko aukera ematen duen mezularitza pribatuko zerbitzu bat da.
|
Delta Chat <a href="#groups">eskubide berberekin</a> txateatzeko aukera ematen duen mezularitza pribatuko zerbitzu bat da.
|
||||||
Informazio gehiago nahi baduzu, kontsultatu <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbarren zenbakia</a>.</p>
|
Informazio gehiago nahi baduzu, kontsultatu <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbarren zenbakia</a>.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1431,26 +1637,20 @@ txat-kontaktuak ezin izango dira erraz identifikatu.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Erabiltzen duzun <a href="#relays">erreleak</a> zure IP helbidea jakin behar du,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
eta, batzuetan, baita zure kontaktuen gailuena ere; adibidez,
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
kontaktu horiekin <a href="#experiments">deiak</a> egiten badituzu edo
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
<a href="#webxdc">aplikazioak</a> erabiltzen badituzu.</p>
|
|
||||||
|
|
||||||
<p>IP helbideak ezinbestekoak dira konektibitaterako eta eraginkortasunerako.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
Ez dira gordetzen, ez argitara ematen.
|
Delta Chat neither persists nor exposes them.
|
||||||
Kontuan izan IP helbidea ez dela mezularitzako zerbitzuei-eta eman ohi zaiena
|
Note that IP Addresses
|
||||||
bezalako helbide zehatz bat; askoz orokorragoa da, eta askotan eskualdea edo
|
are not like an address you give to a delivery service,
|
||||||
herrialdea baizik ez du identifikatzen.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>Internetek eta beste mezularitza-aplikazioek horrela funtzionatzen dutenez,
|
<p>If you see your IP Address as a risk,
|
||||||
ez dugu horren gaineko bestelako aukerarik eskaintzen, ez galderarik egiten.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>Uste baduzu zure IP helbidea jakiteak zure segurtasuna edo pribatutasuna
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
arriskuan jar ditzakeela, zera gomendatuko genizuke, VPN bat erabiltzea,
|
|
||||||
sistema blokeatzeko moduarekin batera. Zure sistemako aplikazio guztietan
|
|
||||||
alternatibak bilatzeak segurtasun-zuloak utziko ditu; adibidez, esteka batean klik egindakoan,
|
|
||||||
IP helbideak agerian geratzen zaizkie hirugarren ezezagunei, eta
|
|
||||||
hori askoz arriskutsuagoa da.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -547,6 +562,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1338,23 +1544,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -627,6 +642,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1425,23 +1631,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#quanti-membri-possono-partecipare-a-un-singolo-gruppo">Quanti membri possono partecipare a un singolo gruppo?</a></li>
|
<li><a href="#quanti-membri-possono-partecipare-a-un-singolo-gruppo">Quanti membri possono partecipare a un singolo gruppo?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">Apps in chat</a>
|
<li><a href="#webxdc">Apps in chat</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#dove-posso-trovare-le-apps-in-chat">Dove posso trovare le apps in chat?</a></li>
|
<li><a href="#dove-posso-trovare-le-apps-in-chat">Dove posso trovare le apps in chat?</a></li>
|
||||||
@@ -620,6 +635,197 @@ ma non è consigliabile superare i 150.</p>
|
|||||||
dove Delta Chat è un servizio di messaggistica privato per chattare con <a href="#groups">uguali diritti</a>.
|
dove Delta Chat è un servizio di messaggistica privato per chattare con <a href="#groups">uguali diritti</a>.
|
||||||
Vedi <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">numero di Dunbar</a> per ulteriori approfondimenti.</p>
|
Vedi <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">numero di Dunbar</a> per ulteriori approfondimenti.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1412,23 +1618,20 @@ non possono essere identificati facilmente.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Il <a href="#relays">ripetitore</a> utilizzato deve conoscere il tuo indirizzo IP,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
e talvolta anche i dispositivi dei tuoi contatti se avete una <a href="#experiments">chiamata</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
o utilizzate <a href="#webxdc">apps</a> insieme.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>Gli indirizzi IP sono necessari per la connettività e l’efficienza.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
Non sono né persistenti né esposti.
|
Delta Chat neither persists nor exposes them.
|
||||||
Si noti che l’indirizzo IP
|
Note that IP Addresses
|
||||||
non è come un indirizzo dettagliato che si fornisce a un servizio di consegna,
|
are not like an address you give to a delivery service,
|
||||||
ma molto più generico, che spesso definisce solo la regione o il paese.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>Poiché questo è il modo in cui Internet e altri servizi di messaggistica funzionano di default,
|
<p>If you see your IP Address as a risk,
|
||||||
non offriamo opzioni né poniamo domande in anticipo.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>Se ritieni che il tuo indirizzo IP rappresenti un rischio per la sicurezza o la privacy,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
ti consigliamo di utilizzare una VPN, in combinazione con la modalità di blocco del sistema.
|
|
||||||
Esplorare le opzioni in tutte le app del tuo sistema lascerà delle lacune.
|
|
||||||
Ad esempio, cliccare su un link espone gli indirizzi IP a sconosciuti e rappresenta il rischio di gran lunga maggiore.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -622,6 +637,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1419,23 +1625,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
+275
-124
@@ -2,18 +2,18 @@
|
|||||||
<html lang="pl"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
<html lang="pl"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||||
<li><a href="#czym-jest-delta-chat">Czym jest Delta Chat?</a>
|
<li><a href="#czym-jest-delta-chat">Czym jest Delta Chat?</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">Jak znaleźć osoby do czatu?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#dlaczego-czat-jest-oznaczony-jako-prośba">Dlaczego czat jest oznaczony jako „Prośba”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#jak-mogę-skontaktować-ze-sobą-dwóch-znajomych">Jak mogę skontaktować ze sobą dwóch znajomych?</a></li>
|
||||||
<li><a href="#multiple-accounts">Czym są profile? Jak mogę przełączać się między nimi?</a></li>
|
<li><a href="#multiple-accounts">Czym są profile? Jak mogę przełączać się między nimi?</a></li>
|
||||||
<li><a href="#kto-widzi-moje-zdjęcie-profilowe">Kto widzi moje zdjęcie profilowe?</a></li>
|
<li><a href="#kto-widzi-moje-zdjęcie-profilowe">Kto widzi moje zdjęcie profilowe?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">Czy w Delta Chat mogę ustawić biografię/status?</a></li>
|
||||||
<li><a href="#co-oznacza-przypinanie-wyciszanie-i-archiwizowanie">Co oznacza przypinanie, wyciszanie i archiwizowanie?</a></li>
|
<li><a href="#co-oznacza-przypinanie-wyciszanie-i-archiwizowanie">Co oznacza przypinanie, wyciszanie i archiwizowanie?</a></li>
|
||||||
<li><a href="#save">Jak działają „Zapisane wiadomości”?</a></li>
|
<li><a href="#save">Jak działają „Zapisane wiadomości”?</a></li>
|
||||||
<li><a href="#co-oznacza-zielona-kropka">Co oznacza zielona kropka?</a></li>
|
<li><a href="#co-oznacza-zielona-kropka">Co oznacza zielona kropka?</a></li>
|
||||||
<li><a href="#co-oznaczają-znaczniki-wyświetlane-obok-wiadomości-wychodzących">Co oznaczają znaczniki wyświetlane obok wiadomości wychodzących?</a></li>
|
<li><a href="#co-oznaczają-znaczniki-wyświetlane-obok-wiadomości-wychodzących">Co oznaczają znaczniki wyświetlane obok wiadomości wychodzących?</a></li>
|
||||||
<li><a href="#edit">Poprawianie literówek i usuwanie wiadomości po wysłaniu</a></li>
|
<li><a href="#edit">Poprawianie literówek i usuwanie wiadomości po wysłaniu</a></li>
|
||||||
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
<li><a href="#mediaquality">Jak obsługiwana jest jakość multimediów?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">Jak działają znikające wiadomości?</a></li>
|
<li><a href="#ephemeralmsgs">Jak działają znikające wiadomości?</a></li>
|
||||||
<li><a href="#delold">Co się stanie, jeśli włączę opcję „Usuń wiadomości z urządzenia”?</a></li>
|
<li><a href="#delold">Co się stanie, jeśli włączę opcję „Usuń wiadomości z urządzenia”?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -107,87 +122,67 @@
|
|||||||
|
|
||||||
<p>Delta Chat to niezawodna, zdecentralizowana i bezpieczna aplikacja do błyskawicznego przesyłania wiadomości, dostępna na platformy mobilne i stacjonarne.</p>
|
<p>Delta Chat to niezawodna, zdecentralizowana i bezpieczna aplikacja do błyskawicznego przesyłania wiadomości, dostępna na platformy mobilne i stacjonarne.</p>
|
||||||
|
|
||||||
|
<p>Natychmiastowe tworzenie <strong>prywatnych profili czatu</strong> z bezpiecznymi i interoperacyjnymi <a href="https://chatmail.at/relays">przekaźnikami chatmail</a>, które oferują natychmiastowe dostarczanie wiadomości oraz powiadomienia push dla urządzeń z systemem iOS i Android.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>Instant creation of <strong>private chat profiles</strong>
|
<p>Wszechstronna obsługa <a href="#multiple-accounts">wielu profili</a> i <a href="#multiclient">wielu urządzeń</a> na wszystkich platformach i między różnymi <a href="https://chatmail.at/clients">aplikacjami chatmail</a>.</p>
|
||||||
with secure and interoperable <a href="https://chatmail.at/relays">chatmail relays</a>
|
|
||||||
that offer instant message delivery, and Push Notifications for iOS and Android devices.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
|
<p>Interaktywne <a href="#webxdc">aplikacje do czatu</a> w grach i do współpracy</p>
|
||||||
<a href="#multiclient">multi-device</a> support on all platforms
|
|
||||||
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
|
<p><a href="#security-audits">Audytowne szyfrowanie end-to-end</a> zabezpieczające przed atakami sieciowymi i serwerowymi.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="#security-audits">Audited end-to-end encryption</a>
|
<p>Bezpłatne i otwartoźródłowe oprogramowanie zarówno po stronie aplikacji, jak i serwera, stworzone w oparciu o <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">standardy internetowe</a>.</p>
|
||||||
safe against network and server attacks.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Free and Open Source software, both app and server side,
|
|
||||||
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="howtoe2ee">
|
<h3 id="howtoe2ee">
|
||||||
|
|
||||||
|
|
||||||
How can I find people to chat with? <a href="#howtoe2ee" class="anchor"></a>
|
Jak znaleźć osoby do czatu? <a href="#howtoe2ee" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>First, note that Delta Chat is a private messenger.
|
<p>Najpierw pamiętaj, że Delta Chat to prywatny komunikator. Nie ma możliwości publicznego wyszukiwania, sam decydujesz o swoich kontaktach.</p>
|
||||||
There is no public discovery, <em>you</em> decide about your contacts.</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>If you are <strong>face to face</strong> with your friend or family,
|
<p>Jeśli jesteś twarzą w twarz ze znajomym lub rodziną, dotknij ikony <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>kodu QR</strong> na ekranie głównym.
|
||||||
tap the <strong>QR Code</strong> icon <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
Poproś partnera czatu o <strong>zeskanowanie</strong> obrazu QR za pomocą aplikacji Delta Chat.</p>
|
||||||
on the main screen.<br />
|
|
||||||
Ask your chat partner to <strong>scan</strong> the QR image
|
|
||||||
with their Delta Chat app.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>For a <strong>remote</strong> contact setup,
|
<p>Aby skonfigurować kontakt <strong>zdalny</strong>, na tym samym ekranie naciśnij „Kopiuj” lub „Udostępnij” i wyślij <strong>link zaproszenia</strong> za pośrednictwem innego prywatnego czatu.</p>
|
||||||
from the same screen,
|
|
||||||
click “Copy” or “Share” and send the <strong>invite link</strong>
|
|
||||||
through another private chat.</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Now wait while connection gets established.</p>
|
<p>Poczekaj, aż połączenie zostanie nawiązane.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>If both sides are online, they will soon see a chat
|
<p>Jeśli obie strony są online, wkrótce zobaczą czat i będą mogły bezpiecznie wysyłać wiadomości.</p>
|
||||||
and can start messaging securely.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If one side is offline or in bad network,
|
<p>Jeśli jedna ze stron jest offline lub ma słaby zasięg, możliwość czatowania zostanie wstrzymana do czasu przywrócenia połączenia.</p>
|
||||||
the ability to chat is delayed until connectivity is restored.</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Congratulations!
|
<p>Gratulacje! Teraz będziesz automatycznie korzystać z <a href="#e2ee">szyfrowania typu end-to-end</a> dla tego kontaktu. Jeśli dodacie się nawzajem do <a href="#groups">grup</a>, szyfrowanie typu end-to-end zostanie nawiązane między wszystkimi członkami.</p>
|
||||||
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
|
|
||||||
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
|
|
||||||
|
|
||||||
<h3 id="why-is-a-chat-marked-as-request">
|
<h3 id="dlaczego-czat-jest-oznaczony-jako-prośba">
|
||||||
|
|
||||||
|
|
||||||
Why is a chat marked as “Request”? <a href="#why-is-a-chat-marked-as-request" class="anchor"></a>
|
Dlaczego czat jest oznaczony jako „Prośba”? <a href="#dlaczego-czat-jest-oznaczony-jako-prośba" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>As being a private messenger,
|
<p>Ponieważ jest to prywatny komunikator, tylko znajomi i rodzina, którym <a href="#howtoe2ee">udostępnisz swój kod QR lub link zaproszenia</a>, mogą do ciebie pisać.</p>
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends,
|
<p>Twoi znajomi mogą udostępniać twoje dane kontaktowe innym znajomym, co jest oznaczone jako <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Prośba</b></p>
|
||||||
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -201,19 +196,17 @@ this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-s
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="how-can-i-put-two-of-my-friends-in-contact-with-each-other">
|
<h3 id="jak-mogę-skontaktować-ze-sobą-dwóch-znajomych">
|
||||||
|
|
||||||
|
|
||||||
How can I put two of my friends in contact with each other? <a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other" class="anchor"></a>
|
Jak mogę skontaktować ze sobą dwóch znajomych? <a href="#jak-mogę-skontaktować-ze-sobą-dwóch-znajomych" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Attach the first contact to the chat of the second using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Contact</strong>.
|
<p>Dołącz pierwszy kontakt do czatu drugiego, używając przycisku <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Dołączania → Kontakt</strong>. Możesz również dodać krótką wiadomość powitalną.</p>
|
||||||
You can also add a little introduction message.</p>
|
|
||||||
|
|
||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>Drugi kontakt otrzyma wtedy <strong>kartkę</strong> i może ją nacisnąć, aby rozpocząć czat z pierwszym kontaktem.</p>
|
||||||
and can tap it to start chatting with the first contact.</p>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
@@ -223,15 +216,13 @@ and can tap it to start chatting with the first contact.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>A profile is <strong>a name, a picture</strong> and some additional information for encrypting messages.
|
<p>Profil składa się z <strong>nazwy, zdjęcia</strong> i dodatkowych informacji służących do szyfrowania wiadomości. Profil jest dostępny tylko na twoim urządzeniu (urządzeniach) i korzysta z serwera wyłącznie do przekazywania wiadomości.</p>
|
||||||
A profile lives on your device(s) only
|
|
||||||
and uses the server only to relay messages.</p>
|
|
||||||
|
|
||||||
<p>Podczas pierwszej instalacji Delta Chat tworzony jest pierwszy profil.</p>
|
<p>Podczas pierwszej instalacji Delta Chat tworzony jest pierwszy profil.</p>
|
||||||
|
|
||||||
<p>Później możesz dotknąć swojego zdjęcia profilowego w lewym górnym rogu, aby <strong>Dodać profile</strong> lub <strong>Przełączyć profile</strong>.</p>
|
<p>Później możesz dotknąć swojego zdjęcia profilowego w lewym górnym rogu, aby <strong>Dodać profile</strong> lub <strong>Przełączyć profile</strong>.</p>
|
||||||
|
|
||||||
<p>You may want to use separate profiles for political, family or work related activities.</p>
|
<p>Możesz używać osobnych profili dla aktywności politycznych, rodzinnych lub zawodowych.</p>
|
||||||
|
|
||||||
<p>Możesz także dowiedzieć się, <a href="#multiclient">jak używać tego samego profilu na wielu urządzeniach</a>.</p>
|
<p>Możesz także dowiedzieć się, <a href="#multiclient">jak używać tego samego profilu na wielu urządzeniach</a>.</p>
|
||||||
|
|
||||||
@@ -243,22 +234,19 @@ and uses the server only to relay messages.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Możesz dodać zdjęcie profilowe w swoich ustawieniach. Jeśli napiszesz do swoich kontaktów lub dodasz je za pomocą kodu QR, automatycznie zobaczą je jako Twoje zdjęcie profilowe.</p>
|
<p>Możesz dodać zdjęcie profilowe w swoich ustawieniach. Jeśli napiszesz do swoich kontaktów lub dodasz je za pomocą kodu QR, automatycznie zobaczą je jako twoje zdjęcie profilowe.</p>
|
||||||
|
|
||||||
<p>Ze względów prywatności nikt nie widzi Twojego zdjęcia profilowego, dopóki nie napiszesz do niego wiadomości.</p>
|
<p>Ze względów prywatności nikt nie widzi twojego zdjęcia profilowego, dopóki nie napiszesz do niego wiadomości.</p>
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
|
|
||||||
Can I set a Bio/Status with Delta Chat? <a href="#signature" class="anchor"></a>
|
Czy w Delta Chat mogę ustawić biografię/status? <a href="#signature" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Yes,
|
<p>Tak, możesz to zrobić w <strong>Ustawieniach → Profil → Biografia</strong>. Po wysłaniu wiadomości do kontaktu zostanie ona wyświetlona, gdy będzie on przeglądał twoje dane kontaktowe.</p>
|
||||||
you can do so under <strong>Settings → Profile → Bio</strong>.
|
|
||||||
Once you sent a message to a contact,
|
|
||||||
they will see it when they view your contact details.</p>
|
|
||||||
|
|
||||||
<h3 id="co-oznacza-przypinanie-wyciszanie-i-archiwizowanie">
|
<h3 id="co-oznacza-przypinanie-wyciszanie-i-archiwizowanie">
|
||||||
|
|
||||||
@@ -278,7 +266,7 @@ they will see it when they view your contact details.</p>
|
|||||||
<p><strong>Wycisz czaty</strong>, jeśli nie chcesz otrzymywać z nich powiadomień. Wyciszone czaty pozostają na swoim miejscu i możesz też przypiąć wyciszony czat.</p>
|
<p><strong>Wycisz czaty</strong>, jeśli nie chcesz otrzymywać z nich powiadomień. Wyciszone czaty pozostają na swoim miejscu i możesz też przypiąć wyciszony czat.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Archiwizuj czaty</strong>, jeśli nie chcesz ich już widzieć na liście czatów. Zarchiwizowane czaty pozostają dostępne nad listą czatów lub poprzez wyszukiwanie.</p>
|
<p><strong>Archiwizuj czaty</strong>, jeśli nie chcesz ich już widzieć na liście czatów. Pozostają dostępne nad listą czatów lub poprzez wyszukiwanie i są oznaczone jako <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Zarchiwizowane</b></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Gdy zarchiwizowany czat otrzyma nową wiadomość, o ile nie zostanie wyciszony, <strong>wyskoczy z archiwum</strong> i wróci na twoją listę czatów.
|
<p>Gdy zarchiwizowany czat otrzyma nową wiadomość, o ile nie zostanie wyciszony, <strong>wyskoczy z archiwum</strong> i wróci na twoją listę czatów.
|
||||||
@@ -309,7 +297,7 @@ they will see it when they view your contact details.</p>
|
|||||||
<p>Później otwórz czat „Zapisane wiadomości” — zobaczysz tam zapisane wiadomości. Naciskając <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="ikona strzałki w prawo" />, możesz wrócić do oryginalnej wiadomości w oryginalnym czacie</p>
|
<p>Później otwórz czat „Zapisane wiadomości” — zobaczysz tam zapisane wiadomości. Naciskając <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="ikona strzałki w prawo" />, możesz wrócić do oryginalnej wiadomości w oryginalnym czacie</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Na koniec możesz również użyć „Zapisz wiadomości”, aby robić <strong>osobiste notatki</strong> — otwórz czat, wpisz coś, dodaj zdjęcie lub wiadomość głosową itp.</p>
|
<p>Na koniec możesz również użyć „Zapisanych wiadomości”, aby robić <strong>osobiste notatki</strong> — otwórz czat, wpisz coś, dodaj zdjęcie lub wiadomość głosową itp.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Ponieważ „Zapisane wiadomości” są zsynchronizowane, mogą być bardzo przydatne do przesyłania danych między urządzeniami</p>
|
<p>Ponieważ „Zapisane wiadomości” są zsynchronizowane, mogą być bardzo przydatne do przesyłania danych między urządzeniami</p>
|
||||||
@@ -326,13 +314,9 @@ they will see it when they view your contact details.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>You can sometimes see a <strong>green dot</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
|
<p>Czasami można zobaczyć <strong>zieloną kropkę</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> obok awatara kontaktu. Oznacza to, że był on <strong>niedawno widziany przez ciebie</strong> w ciągu ostatnich 10 minut, np. wysłał ci wiadomość lub potwierdzenie odczytu.</p>
|
||||||
next to the avatar of a contact.
|
|
||||||
It means they were <strong>recently seen by you</strong> in the last 10 minutes,
|
|
||||||
e.g. because they messaged you or sent a read receipt.</p>
|
|
||||||
|
|
||||||
<p>So this is not a real time online status
|
<p>Nie jest to więc status online w czasie rzeczywistym i inni również nie zawsze zobaczą, że jesteś „online”.</p>
|
||||||
and others will as well not always see that you are “online”.</p>
|
|
||||||
|
|
||||||
<h3 id="co-oznaczają-znaczniki-wyświetlane-obok-wiadomości-wychodzących">
|
<h3 id="co-oznaczają-znaczniki-wyświetlane-obok-wiadomości-wychodzących">
|
||||||
|
|
||||||
@@ -344,19 +328,16 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>Jeden znacznik</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" /> oznacza, że wiadomość została pomyślnie wysłana do <a href="#relays">przekaźnika</a>.</p>
|
||||||
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Dwa znaczniki</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" /> oznaczają, że twój kontakt przeczytał wiadomość.</p>
|
||||||
indicate your contact has read the message.</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
<p>W <a href="#groups">grupach</a> drugi znacznik oznacza, że co najmniej jeden członek potwierdził przeczytanie wiadomości.</p>
|
||||||
|
|
||||||
<p>You will only get the second tick if both you and one of the recipients who read the message
|
<p>Drugi znacznik pojawi się tylko wtedy, gdy ty i jeden z odbiorców, którzy przeczytali wiadomość, macie włączoną opcję <strong>Ustawienia → Czaty → Potwierdzenie odczytu</strong>.</p>
|
||||||
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
@@ -382,26 +363,22 @@ has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
|||||||
<h3 id="mediaquality">
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
Jak obsługiwana jest jakość multimediów? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
<p>Obrazy, filmy, pliki, wiadomości głosowe itp. można wysyłać za pomocą przycisków: <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Załącz</strong> lub <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /><strong>Wiadomość głosowa</strong>.</p>
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
<p>Domyślnie kompresja zapewnia <strong>szybką i wydajną dostawę</strong>, respektując limity danych i pamięci wszystkich użytkowników. Jest to idealne rozwiązanie do codziennej komunikacji.</p>
|
||||||
This is ideal for everyday communication.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>In regions with worse connectivity,
|
<p>W regionach o słabszej łączności można wybrać wyższą kompresję w <strong>Ustawieniach → Czaty → Jakość mediów wychodzących</strong>.</p>
|
||||||
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
<p>Jeśli chcesz wysłać multimedia w <strong>oryginalnej jakości</strong>, użyj w czacie opcji <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Załącz → Plik</strong>. Używaj tej metody oszczędnie, ponieważ wysyłanie oryginalnych plików znacznie zwiększy zużycie danych przez ciebie i wszystkich odbiorców na czacie.</p>
|
||||||
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@@ -415,21 +392,11 @@ Please use this method sparingly, as sending original files will significantly i
|
|||||||
|
|
||||||
<p>Możesz włączyć „znikające wiadomości” w ustawieniach czatu, w prawym górnym rogu okna czatu, wybierając przedział czasu od 5 minut do 1 roku.</p>
|
<p>Możesz włączyć „znikające wiadomości” w ustawieniach czatu, w prawym górnym rogu okna czatu, wybierając przedział czasu od 5 minut do 1 roku.</p>
|
||||||
|
|
||||||
<p>Until the setting is turned off again,
|
<p>Dopóki ustawienie nie zostanie ponownie wyłączone, aplikacja Delta Chat u każdego członka czatu zajmie się usuwaniem wiadomości po wybranym okresie. Przedział czasu rozpoczyna się w momencie, gdy odbiorca po raz pierwszy zobaczy wiadomość w Delta Chat. Wiadomości są usuwane zarówno na serwerze, jak i w samej aplikacji.</p>
|
||||||
each chat member’s Delta Chat app takes care
|
|
||||||
of deleting the messages
|
|
||||||
after the selected time span.
|
|
||||||
The time span begins
|
|
||||||
when the receiver first sees the message in Delta Chat.
|
|
||||||
The messages are deleted both,
|
|
||||||
on the servers,
|
|
||||||
and in the apps itself.</p>
|
|
||||||
|
|
||||||
<p>Pamiętaj, że na znikających wiadomościach możesz polegać tylko wtedy, gdy ufasz swoim partnerom czatu; złośliwi partnerzy czatu mogą robić zdjęcia lub w inny sposób zapisywać, kopiować lub przesyłać dalej wiadomości przed usunięciem.</p>
|
<p>Pamiętaj, że na znikających wiadomościach możesz polegać tylko wtedy, gdy ufasz swoim partnerom czatu; złośliwi partnerzy czatu mogą robić zdjęcia lub w inny sposób zapisywać, kopiować lub przesyłać dalej wiadomości przed usunięciem.</p>
|
||||||
|
|
||||||
<p>Apart from that,
|
<p>Poza tym, jeśli jeden z uczestników czatu odinstaluje aplikację Delta Chat, usunięcie (i tak zaszyfrowanych) wiadomości z jego serwera może potrwać dłużej.</p>
|
||||||
if one chat partner uninstalls Delta Chat,
|
|
||||||
the (anyway encrypted) messages may take longer to get deleted from their server.</p>
|
|
||||||
|
|
||||||
<h3 id="delold">
|
<h3 id="delold">
|
||||||
|
|
||||||
@@ -439,9 +406,9 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Jeśli chcesz zaoszczędzić miejsce na urządzeniu, możesz wybrać opcję automatycznego usuwania starych wiadomości.</p>
|
<p>Jeśli chcesz zaoszczędzić miejsce na swoim urządzeniu, możesz wybrać opcję automatycznego usuwania starych wiadomości.</p>
|
||||||
|
|
||||||
<p>Aby ją włączyć, przejdź do „Usuń wiadomości z urządzenia” w ustawieniach w sekcji „Czaty i media”. Możesz ustawić przedział czasowy pomiędzy „po 1 godzinie” a „po 1 roku”; w ten sposób <em>wszystkie</em> wiadomości zostaną usunięte z urządzenia, gdy tylko staną się starsze.</p>
|
<p>Aby ją włączyć, przejdź do <strong>Ustawienia → Czaty → Usuń wiadomości z urządzenia</strong> . Możesz ustawić przedział czasowy pomiędzy „po 1 godzinie” a „po 1 roku”; w ten sposób <em>wszystkie</em> wiadomości zostaną usunięte z urządzenia, gdy tylko staną się starsze.</p>
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -493,10 +460,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
<p>Wybierz <strong>Nowy czat</strong>, a następnie <strong>Nowa grupa</strong> z menu w prawym górnym rogu lub naciśnij odpowiedni przycisk na Androidzie / iOS.</p>
|
<p>Wybierz <strong>Nowy czat</strong>, a następnie <strong>Nowa grupa</strong> z menu w prawym górnym rogu lub naciśnij odpowiedni przycisk na Androidzie / iOS.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Na następnym ekranie wybierz <strong>członków grupy</strong> i zdefiniuj <strong>nazwę grupy</strong>. Możesz też wybrać awatar <strong>grupy</strong>.</p>
|
<p>Na następnym ekranie wybierz <strong>członków grupy</strong> i zdefiniuj <strong>nazwę grupy</strong>. Możesz też wybrać <strong>awatar grupy</strong>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Zaraz po napisaniu pierwszej wiadomości w grupie wszyscy członkowie zostaną poinformowani o nowej grupie i mogą odpowiedzieć w grupie (jeżeli nie napiszesz wiadomości w grupie, grupa jest niewidoczna dla członków).</p>
|
<p>Gdy tylko napiszesz <strong>pierwszą wiadomość</strong> w grupie, wszyscy członkowie zostaną poinformowani o nowej grupie i będą mogli odpowiadać w grupie (dopóki nie napiszesz wiadomości w grupie, grupa będzie niewidoczna dla członków).</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@@ -539,8 +506,7 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Ponieważ nie jesteś członkiem grupy, nie możesz dodać siebie ponownie.
|
<p>Ponieważ nie jesteś członkiem grupy, nie możesz dodać siebie ponownie. Jednak nie ma problemu, po prostu poproś dowolnego członka grupy na normalnym czacie, aby dodał cię ponownie.</p>
|
||||||
Jednak nie ma problemu, po prostu poproś dowolnego członka grupy na normalnym czacie, aby dodał cię ponownie.</p>
|
|
||||||
|
|
||||||
<h3 id="nie-chcę-już-otrzymywać-wiadomości-od-grupy">
|
<h3 id="nie-chcę-już-otrzymywać-wiadomości-od-grupy">
|
||||||
|
|
||||||
@@ -555,8 +521,7 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
Jeśli później będziesz chciał ponownie dołączyć do grupy, poproś innego członka grupy, aby dodał cię do grupy.</li>
|
Jeśli później będziesz chciał ponownie dołączyć do grupy, poproś innego członka grupy, aby dodał cię do grupy.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Alternatywnie możesz też „Wyłączyć powiadomienia” dla grupy dzięki temu otrzymasz wszystkie wiadomości i
|
<p>Alternatywnie możesz też „Wyłączyć powiadomienia” dla grupy, dzięki temu otrzymasz wszystkie wiadomości i nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych nowych wiadomościach.</p>
|
||||||
nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych nowych wiadomościach.</p>
|
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="cloning-a-group">
|
||||||
|
|
||||||
@@ -597,6 +562,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -849,8 +1005,7 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
|
|||||||
<p>Sprawdź dokładnie, czy oba urządzenia są w tym <strong>samym Wi-Fi lub tej samej sieci</strong></p>
|
<p>Sprawdź dokładnie, czy oba urządzenia są w tym <strong>samym Wi-Fi lub tej samej sieci</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Na <strong>Windowsie</strong>, przejdź do “Panel sterowania / Sieć i internet” i upewnij się, że <strong>Sieć prywatna</strong> jest wybrana jako “Typ profilu sieci”
|
<p>Na <strong>Windowsie</strong>, przejdź do „Panel sterowania / Sieć i internet” i upewnij się, że <strong>Sieć prywatna</strong> jest wybrana jako „Typ profilu sieci” (po przeniesieniu możesz wrócić do pierwotnej wartości)</p>
|
||||||
(po przeniesieniu możesz wrócić do pierwotnej wartości)</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>W systemie <strong>iOS</strong> upewnij się, że jest przydzielony dostęp do opcji „Ustawienia » Aplikacje » Delta Chat » <strong>Sieć lokalna</strong>”</p>
|
<p>W systemie <strong>iOS</strong> upewnij się, że jest przydzielony dostęp do opcji „Ustawienia » Aplikacje » Delta Chat » <strong>Sieć lokalna</strong>”</p>
|
||||||
@@ -894,15 +1049,14 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>Na starym urządzeniu przejdź do <strong>Ustawienia → Czaty i media → Eksport kopii zapasowej</strong>. Wprowadź swój PIN odblokowania ekranu, wzór lub hasło. Następnie możesz nacisnąć „Utwórz kopię”. Spowoduje to zapisanie pliku kopii zapasowej na urządzeniu. Teraz musisz jakoś przenieść go na inne urządzenie.</p>
|
<p>Na starym urządzeniu przejdź do <strong>Ustawienia → Czaty → Eksport kopii zapasowej</strong>. Wprowadź swój PIN odblokowania ekranu, wzór lub hasło. Następnie możesz nacisnąć „Utwórz kopię”. Spowoduje to zapisanie pliku kopii zapasowej na urządzeniu. Teraz musisz jakoś przenieść go na inne urządzenie.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Na nowym urządzeniu, na ekranie logowania, zamiast logować się na swoje konto e-mail, wybierz <strong>Przywróć z kopii zapasowej</strong>. Po zaimportowaniu Twoje rozmowy, klucze szyfrujące i multimedia powinny zostać skopiowane na nowe urządzenie.
|
<p>Na nowym urządzeniu wybierz: <strong>Mam już profil → Przywróć z kopii zapasowej</strong>. Jeśli korzystasz z iOS i napotykasz trudności, może <a href="https://support.delta.chat/t/import-backup-to-ios/1628">ten poradnik</a> ci pomoże.</p>
|
||||||
Jeśli korzystasz z iOS i napotykasz trudności, może <a href="https://support.delta.chat/t/import-backup-to-ios/1628">ten poradnik</a> Ci pomoże.</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Jesteś teraz zsynchronizowany i możesz używać obu urządzeń do wysyłania i odbierania wiadomości zaszyfrowanych end-to-end w komunikacji ze swoimi partnerami.</p>
|
<p>Jesteś teraz zsynchronizowany i w komunikacji ze swoimi partnerami możesz używać obu urządzeń do wysyłania i odbierania wiadomości zaszyfrowanych metodą end-to-end.</p>
|
||||||
|
|
||||||
<h3 id="czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">
|
<h3 id="czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">
|
||||||
|
|
||||||
@@ -1289,23 +1443,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#quantos-membros-podem-participar-em-um-único-grupo">Quantos membros podem participar em um único grupo?</a></li>
|
<li><a href="#quantos-membros-podem-participar-em-um-único-grupo">Quantos membros podem participar em um único grupo?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">Aplicativos embutidos</a>
|
<li><a href="#webxdc">Aplicativos embutidos</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#onde-posso-obter-aplicativos-embutidos">Onde posso obter aplicativos embutidos?</a></li>
|
<li><a href="#onde-posso-obter-aplicativos-embutidos">Onde posso obter aplicativos embutidos?</a></li>
|
||||||
@@ -622,6 +637,197 @@ mas não é recomendável mais de 150.</p>
|
|||||||
mas o Delta Chat é um mensageiro privado para conversar com <a href="#groups">direitos iguais</a>.
|
mas o Delta Chat é um mensageiro privado para conversar com <a href="#groups">direitos iguais</a>.
|
||||||
Consulte o <a href="https://pt.wikipedia.org/wiki/N%C3%BAmero_de_Dunbar">Número de Dunbar</a> para obter mais informações.</p>
|
Consulte o <a href="https://pt.wikipedia.org/wiki/N%C3%BAmero_de_Dunbar">Número de Dunbar</a> para obter mais informações.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1420,23 +1626,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#сколько-участников-может-быть-в-одной-группе">Сколько участников может быть в одной группе?</a></li>
|
<li><a href="#сколько-участников-может-быть-в-одной-группе">Сколько участников может быть в одной группе?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">Встроенные приложения чата</a>
|
<li><a href="#webxdc">Встроенные приложения чата</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#где-можно-найти-встроенные-приложения">Где можно найти встроенные приложения?</a></li>
|
<li><a href="#где-можно-найти-встроенные-приложения">Где можно найти встроенные приложения?</a></li>
|
||||||
@@ -622,6 +637,197 @@
|
|||||||
в то время как Delta Chat - это приватный мессенджер для общения на <a href="#groups">равных правах</a>.
|
в то время как Delta Chat - это приватный мессенджер для общения на <a href="#groups">равных правах</a>.
|
||||||
Смотрите <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">число Данбара</a> для более глубокого понимания.</p>
|
Смотрите <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">число Данбара</a> для более глубокого понимания.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1418,25 +1624,20 @@ Delta Chat вместо этого использует реализацию Ope
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Используемый <a href="#relays">релей</a> должен знать ваш IP-адрес,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
а также иногда устройства ваших контактов, если вы проводите совместные <a href="#experiments">звонки</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
или используете <a href="#webxdc">приложения</a>.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP-адреса необходимы для обеспечения соединения и эффективности.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
Они не сохраняются и не передаются третьим лицам.
|
Delta Chat neither persists nor exposes them.
|
||||||
Обратите внимание, что IP-адрес</p>
|
Note that IP Addresses
|
||||||
<ul>
|
are not like an address you give to a delivery service,
|
||||||
<li>это не подробный адрес, который вы указываете службе доставки,
|
but typically less precise, often defining city or region only.</p>
|
||||||
а скорее приблизительный, обычно определяющий регион или страну.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Поскольку именно так по умолчанию работает интернет и другие мессенджеры,
|
<p>If you see your IP Address as a risk,
|
||||||
мы не предлагаем здесь никаких настроек и не задаём предварительных вопросов</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>Если вы считаете свой IP-адрес угрозой безопасности или конфиденциальности,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
мы рекомендуем использовать VPN в сочетании с режимом блокировки системы.
|
|
||||||
Поиск настроек во всех приложениях на вашем устройстве оставит уязвимости.
|
|
||||||
Например, нажатие на ссылку раскрывает IP-адрес неизвестным лицам и представляет собой гораздо больший риск в данном случае.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -627,6 +642,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1425,23 +1631,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -627,6 +642,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1427,23 +1633,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,21 @@
|
|||||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||||
@@ -582,6 +597,197 @@ but more than 150 is not recommended.</p>
|
|||||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1268,23 +1474,20 @@ can not be identified easily.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
as well as sometimes your contact’s devices if you have a <a href="#experiments">call</a>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
or use <a href="#webxdc">apps</a> together.</p>
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP Addresses are needed for connectivity and efficiency.
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
They are neither persisted nor exposed.
|
Delta Chat neither persists nor exposes them.
|
||||||
Note that the IP Address
|
Note that IP Addresses
|
||||||
is not like a detailed address you give to a delivery service,
|
are not like an address you give to a delivery service,
|
||||||
but much more coarse, often defining region or country only.</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>As this is just how the internet and other messengers work by default,
|
<p>If you see your IP Address as a risk,
|
||||||
we do not offer options here or ask upfront questions.</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>If you see your IP Address as a security or privacy risk,
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
we recommend to use a VPN, in combination with system lockdown mode.
|
|
||||||
Hunting down options in all apps on your system will leave gaps.
|
|
||||||
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
|
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,21 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
<li><a href="#webxdc">Webxdc 应用</a>
|
<li><a href="#webxdc">Webxdc 应用</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#我在哪里可以获得-webxdc-应用">我在哪里可以获得 Webxdc 应用?</a></li>
|
<li><a href="#我在哪里可以获得-webxdc-应用">我在哪里可以获得 Webxdc 应用?</a></li>
|
||||||
@@ -621,6 +636,197 @@ Please use this method sparingly, as sending original files will significantly i
|
|||||||
其中Delta Chat 是与<a href="#groups">平等权利</a> 聊天的私人信使。
|
其中Delta Chat 是与<a href="#groups">平等权利</a> 聊天的私人信使。
|
||||||
相关知识,请参阅<a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">邓巴数</a>。</p>
|
相关知识,请参阅<a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">邓巴数</a>。</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1414,22 +1620,20 @@ Delta Chat 应用程序不会在服务器上存储任何有关联系人或群组
|
|||||||
|
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<p>使用的 <a href="#relays">中继服务器</a> 需要知道您的 IP 地址、
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
有时还需要知道联系人的设备(如果你们有 <a href="#experiments">通话</a>),或一起使用 <a href="#webxdc">Webxdc应用程序</a>。</p>
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
<p>IP 地址是连接和提高效率所必需的。
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
它们既不会持久存在,也不会暴露。
|
Delta Chat neither persists nor exposes them.
|
||||||
请注意,IP 地址
|
Note that IP Addresses
|
||||||
不像你给快递服务的详细地址、
|
are not like an address you give to a delivery service,
|
||||||
而是更粗略,通常只定义地区或国家。</p>
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
<p>这只是互联网和其他信使的默认工作方式、
|
<p>If you see your IP Address as a risk,
|
||||||
我们在此不提供选项,也不预先提问。</p>
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
<p>如果你认为你的 IP 地址存在安全或隐私风险、
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
我们建议使用 VPN 并结合系统锁定模式。
|
|
||||||
在系统的所有应用程序中查找选项会留下漏洞。
|
|
||||||
例如,点击链接会将 IP 地址暴露给未知方,这是目前最大的风险。</p>
|
|
||||||
|
|
||||||
<p>###Delta Chat 是否支持 “密封发件人”?{#sealedsender}</p>
|
<p>###Delta Chat 是否支持 “密封发件人”?{#sealedsender}</p>
|
||||||
|
|
||||||
|
|||||||
@@ -443,10 +443,19 @@ public class Rpc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Estimate the number of messages that will be deleted
|
* Estimates the number of messages that will be deleted
|
||||||
* by the set_config()-options `delete_device_after` or `delete_server_after`.
|
* by the `set_config()`-option `delete_device_after`.
|
||||||
|
* <p>
|
||||||
* This is typically used to show the estimated impact to the user
|
* This is typically used to show the estimated impact to the user
|
||||||
* before actually enabling deletion of old messages.
|
* before actually enabling deletion of old messages.
|
||||||
|
* <p>
|
||||||
|
* Messages in the "Saved Messages" chat are not counted as they will not be deleted automatically.
|
||||||
|
* <p>
|
||||||
|
* Parameters:
|
||||||
|
* - `from_server`: Deprecated, pass `false` here
|
||||||
|
* - `seconds`: Count messages older than the given number of seconds.
|
||||||
|
* <p>
|
||||||
|
* Returns the number of messages that are older than the given number of seconds.
|
||||||
*/
|
*/
|
||||||
public Integer estimateAutoDeletionCount(Integer accountId, Boolean fromServer, Integer seconds) throws RpcException {
|
public Integer estimateAutoDeletionCount(Integer accountId, Boolean fromServer, Integer seconds) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "estimate_auto_deletion_count", mapper.valueToTree(accountId), mapper.valueToTree(fromServer), mapper.valueToTree(seconds));
|
return transport.callForResult(new TypeReference<Integer>(){}, "estimate_auto_deletion_count", mapper.valueToTree(accountId), mapper.valueToTree(fromServer), mapper.valueToTree(seconds));
|
||||||
@@ -913,8 +922,22 @@ public class Rpc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all messages of a particular chat.
|
* Get all message IDs belonging to a chat.
|
||||||
* <p>
|
* <p>
|
||||||
|
* The list is already sorted and starts with the oldest message.
|
||||||
|
* Clients should not try to re-sort the list as this would be an expensive action
|
||||||
|
* and would result in inconsistencies between clients.
|
||||||
|
* Note that the messages are not necessarily sorted by their ID or by their displayed timestamp;
|
||||||
|
* UIs need to handle both the case of descending message IDs
|
||||||
|
* and of decreasing timestamps.
|
||||||
|
* <p>
|
||||||
|
* Optionally, 'daymarkers' added to the ID array may help to
|
||||||
|
* implement virtual lists.
|
||||||
|
* <p>
|
||||||
|
* Parameters:
|
||||||
|
* <p>
|
||||||
|
* * chat_id The chat ID of which the messages IDs should be queried.
|
||||||
|
* * _info_only: Deprecated, pass `false` here.
|
||||||
* * `add_daymarker` - If `true`, add day markers as `DC_MSG_ID_DAYMARKER` to the result,
|
* * `add_daymarker` - If `true`, add day markers as `DC_MSG_ID_DAYMARKER` to the result,
|
||||||
* e.g. [1234, 1237, 9, 1239]. The day marker timestamp is the midnight one for the
|
* e.g. [1234, 1237, 9, 1239]. The day marker timestamp is the midnight one for the
|
||||||
* corresponding (following) day in the local timezone.
|
* corresponding (following) day in the local timezone.
|
||||||
@@ -932,6 +955,14 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_existing_msg_ids", mapper.valueToTree(accountId), mapper.valueToTree(msgIds));
|
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_existing_msg_ids", mapper.valueToTree(accountId), mapper.valueToTree(msgIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all messages belonging to a chat.
|
||||||
|
* <p>
|
||||||
|
* Similar to `get_message_ids` / `getMessageIds`,
|
||||||
|
* see that function for details.
|
||||||
|
* The difference is that this function here returns a list of `MessageListItem`,
|
||||||
|
* which is an enum of a message or a daymarker.
|
||||||
|
*/
|
||||||
public java.util.List<MessageListItem> getMessageListItems(Integer accountId, Integer chatId, Boolean infoOnly, Boolean addDaymarker) throws RpcException {
|
public java.util.List<MessageListItem> getMessageListItems(Integer accountId, Integer chatId, Boolean infoOnly, Boolean addDaymarker) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<MessageListItem>>(){}, "get_message_list_items", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(infoOnly), mapper.valueToTree(addDaymarker));
|
return transport.callForResult(new TypeReference<java.util.List<MessageListItem>>(){}, "get_message_list_items", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(infoOnly), mapper.valueToTree(addDaymarker));
|
||||||
}
|
}
|
||||||
@@ -1181,11 +1212,6 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<String>(){}, "make_vcard", mapper.valueToTree(accountId), mapper.valueToTree(contacts));
|
return transport.callForResult(new TypeReference<String>(){}, "make_vcard", mapper.valueToTree(accountId), mapper.valueToTree(contacts));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets vCard containing the given contacts to the message draft. */
|
|
||||||
public void setDraftVcard(Integer accountId, Integer msgId, java.util.List<Integer> contacts) throws RpcException {
|
|
||||||
transport.call("set_draft_vcard", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(contacts));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the [`ChatId`] for the 1:1 chat with `contact_id` if it exists.
|
* Returns the [`ChatId`] for the 1:1 chat with `contact_id` if it exists.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -1328,10 +1354,47 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<String>(){}, "get_connectivity_html", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "get_connectivity_html", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets current location.
|
||||||
|
* <p>
|
||||||
|
* Returns true if location streaming is currently
|
||||||
|
* enabled and locations should be updated.
|
||||||
|
* <p>
|
||||||
|
* Location is represented as latitude and longitude in degrees
|
||||||
|
* and horizontal accuracy in meters.
|
||||||
|
*/
|
||||||
|
public Boolean setLocation(Float latitude, Float longitude, Float accuracy) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<Boolean>(){}, "set_location", mapper.valueToTree(latitude), mapper.valueToTree(longitude), mapper.valueToTree(accuracy));
|
||||||
|
}
|
||||||
|
|
||||||
public java.util.List<Location> getLocations(Integer accountId, Integer chatId, Integer contactId, Integer timestampBegin, Integer timestampEnd) throws RpcException {
|
public java.util.List<Location> getLocations(Integer accountId, Integer chatId, Integer contactId, Integer timestampBegin, Integer timestampEnd) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<Location>>(){}, "get_locations", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(contactId), mapper.valueToTree(timestampBegin), mapper.valueToTree(timestampEnd));
|
return transport.callForResult(new TypeReference<java.util.List<Location>>(){}, "get_locations", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(contactId), mapper.valueToTree(timestampBegin), mapper.valueToTree(timestampEnd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables location streaming in chat identified by `chat_id` for `seconds` seconds.
|
||||||
|
* <p>
|
||||||
|
* Pass 0 as the number of seconds to disable location streaming in the chat.
|
||||||
|
*/
|
||||||
|
public void sendLocationsToChat(Integer accountId, Integer chatId, Integer seconds) throws RpcException {
|
||||||
|
transport.call("send_locations_to_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(seconds));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns whether any chat is sending locations. */
|
||||||
|
public Boolean isSendingLocations(Integer accountId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<Boolean>(){}, "is_sending_locations", mapper.valueToTree(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns whether `chat_id` is sending locations. */
|
||||||
|
public Boolean isSendingLocationsToChat(Integer accountId, Integer chatId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<Boolean>(){}, "is_sending_locations_to_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Stops sending locations to all chats. */
|
||||||
|
public void stopSendingLocations() throws RpcException {
|
||||||
|
transport.call("stop_sending_locations");
|
||||||
|
}
|
||||||
|
|
||||||
public void sendWebxdcStatusUpdate(Integer accountId, Integer instanceMsgId, String updateStr, String descr) throws RpcException {
|
public void sendWebxdcStatusUpdate(Integer accountId, Integer instanceMsgId, String updateStr, String descr) throws RpcException {
|
||||||
transport.call("send_webxdc_status_update", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(updateStr), mapper.valueToTree(descr));
|
transport.call("send_webxdc_status_update", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(updateStr), mapper.valueToTree(descr));
|
||||||
}
|
}
|
||||||
@@ -1467,17 +1530,18 @@ public class Rpc {
|
|||||||
transport.call("resend_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
transport.call("resend_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @deprecated as of 2026-04; use `send_msg` with `Viewtype::Sticker` instead. */
|
||||||
public Integer sendSticker(Integer accountId, Integer chatId, String stickerPath) throws RpcException {
|
public Integer sendSticker(Integer accountId, Integer chatId, String stickerPath) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "send_sticker", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(stickerPath));
|
return transport.callForResult(new TypeReference<Integer>(){}, "send_sticker", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(stickerPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a reaction to message.
|
* Sends a reaction to message.
|
||||||
* <p>
|
* <p>
|
||||||
* Reaction is a string of emojis separated by spaces. Reaction to a
|
* A reaction is a string that represents an emoji.
|
||||||
* single message can be sent multiple times. The last reaction
|
* You can call this function again to change the emoji;
|
||||||
* received overrides all previously received reactions. It is
|
* the last sent reaction overrides all previously sent reactions.
|
||||||
* possible to remove all reactions by sending an empty string.
|
* It is possible to remove the reaction by sending an empty string.
|
||||||
*/
|
*/
|
||||||
public Integer sendReaction(Integer accountId, Integer messageId, java.util.List<String> reaction) throws RpcException {
|
public Integer sendReaction(Integer accountId, Integer messageId, java.util.List<String> reaction) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "send_reaction", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(reaction));
|
return transport.callForResult(new TypeReference<Integer>(){}, "send_reaction", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(reaction));
|
||||||
|
|||||||
@@ -12,6 +12,13 @@ public class EnteredLoginParam {
|
|||||||
/** TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
|
/** TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public EnteredCertificateChecks certificateChecks;
|
public EnteredCertificateChecks certificateChecks;
|
||||||
|
/**
|
||||||
|
* IMAP server folder.
|
||||||
|
* <p>
|
||||||
|
* Defaults to "INBOX" if not set. Should not be an empty string.
|
||||||
|
*/
|
||||||
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
|
public String imapFolder;
|
||||||
/** Imap server port. */
|
/** Imap server port. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer imapPort;
|
public Integer imapPort;
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ package chat.delta.rpc.types;
|
|||||||
public class Reactions {
|
public class Reactions {
|
||||||
/** Unique reactions and their count, sorted in descending order. */
|
/** Unique reactions and their count, sorted in descending order. */
|
||||||
public java.util.List<Reaction> reactions;
|
public java.util.List<Reaction> reactions;
|
||||||
/** Map from a contact to it's reaction to message. */
|
/** Map from a contact to it's reaction to message. There is only a single reaction per contact, but this contains a list of reactions for historical reasons. */
|
||||||
public java.util.Map<String, java.util.List<String>> reactionsByContact;
|
public java.util.Map<String, java.util.List<String>> reactionsByContact;
|
||||||
}
|
}
|
||||||
@@ -14,7 +14,7 @@ public enum Viewtype {
|
|||||||
Gif,
|
Gif,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Message containing a sticker, similar to image. NB: When sending, the message viewtype may be changed to `Image` by some heuristics like checking for transparent pixels. Use `Message::force_sticker()` to disable them.
|
* Message containing a sticker, similar to image.
|
||||||
* <p>
|
* <p>
|
||||||
* If possible, the ui should display the image without borders in a transparent way. A click on a sticker will offer to install the sticker set in some future.
|
* If possible, the ui should display the image without borders in a transparent way. A click on a sticker will offer to install the sticker set in some future.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ public class WebxdcMessageInfo {
|
|||||||
public String icon;
|
public String icon;
|
||||||
/** True if full internet access should be granted to the app. */
|
/** True if full internet access should be granted to the app. */
|
||||||
public Boolean internetAccess;
|
public Boolean internetAccess;
|
||||||
|
/** Define if the local user is the one who initially shared the webxdc application in the chat. */
|
||||||
|
public Boolean isAppSender;
|
||||||
|
/** Define if the app runs in a broadcasting context. */
|
||||||
|
public Boolean isBroadcast;
|
||||||
/**
|
/**
|
||||||
* The name of the app.
|
* The name of the app.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -194,8 +194,6 @@ public class DcMsg {
|
|||||||
|
|
||||||
public native void setHtml(String text);
|
public native void setHtml(String text);
|
||||||
|
|
||||||
public native void forceSticker();
|
|
||||||
|
|
||||||
public native void setFileAndDeduplicate(String file, String name, String filemime);
|
public native void setFileAndDeduplicate(String file, String name, String filemime);
|
||||||
|
|
||||||
public native void setDimension(int width, int height);
|
public native void setDimension(int width, int height);
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.content.ComponentName;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.ViewGroup;
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
@@ -12,21 +11,23 @@ import androidx.appcompat.view.ActionMode;
|
|||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.media3.session.MediaController;
|
import androidx.media3.session.MediaController;
|
||||||
import androidx.media3.session.SessionCommand;
|
import androidx.media3.session.SessionCommand;
|
||||||
import androidx.media3.session.SessionToken;
|
import androidx.media3.session.SessionToken;
|
||||||
import androidx.viewpager.widget.ViewPager;
|
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||||
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
import com.b44t.messenger.DcChat;
|
import com.b44t.messenger.DcChat;
|
||||||
import com.b44t.messenger.DcContext;
|
import com.b44t.messenger.DcContext;
|
||||||
import com.b44t.messenger.DcEvent;
|
import com.b44t.messenger.DcEvent;
|
||||||
import com.b44t.messenger.DcMsg;
|
import com.b44t.messenger.DcMsg;
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
|
import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import org.thoughtcrime.securesms.components.audioplay.AudioPlaybackViewModel;
|
import org.thoughtcrime.securesms.components.audioplay.AudioPlaybackViewModel;
|
||||||
|
import org.thoughtcrime.securesms.components.audioplay.ChatAudioQueueProvider;
|
||||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
import org.thoughtcrime.securesms.service.AudioPlaybackService;
|
import org.thoughtcrime.securesms.service.AudioPlaybackService;
|
||||||
@@ -54,7 +55,6 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
|||||||
this.type3 = type3;
|
this.type3 = type3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
;
|
|
||||||
|
|
||||||
private DcContext dcContext;
|
private DcContext dcContext;
|
||||||
private int chatId;
|
private int chatId;
|
||||||
@@ -63,7 +63,7 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
|||||||
private final ArrayList<TabData> tabs = new ArrayList<>();
|
private final ArrayList<TabData> tabs = new ArrayList<>();
|
||||||
private Toolbar toolbar;
|
private Toolbar toolbar;
|
||||||
private TabLayout tabLayout;
|
private TabLayout tabLayout;
|
||||||
private ViewPager viewPager;
|
private ViewPager2 viewPager;
|
||||||
|
|
||||||
private @Nullable MediaController mediaController;
|
private @Nullable MediaController mediaController;
|
||||||
private ListenableFuture<MediaController> mediaControllerFuture;
|
private ListenableFuture<MediaController> mediaControllerFuture;
|
||||||
@@ -97,8 +97,20 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
|||||||
isGlobalGallery() ? R.string.menu_all_media : R.string.apps_and_media);
|
isGlobalGallery() ? R.string.menu_all_media : R.string.apps_and_media);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.tabLayout.setupWithViewPager(viewPager);
|
AllMediaPagerAdapter adapter = new AllMediaPagerAdapter(this);
|
||||||
this.viewPager.setAdapter(new AllMediaPagerAdapter(getSupportFragmentManager()));
|
this.viewPager.setAdapter(adapter);
|
||||||
|
this.viewPager.registerOnPageChangeCallback(
|
||||||
|
new ViewPager2.OnPageChangeCallback() {
|
||||||
|
@Override
|
||||||
|
public void onPageSelected(int position) {
|
||||||
|
adapter.onPageChanged(position);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
new TabLayoutMediator(
|
||||||
|
this.tabLayout,
|
||||||
|
this.viewPager,
|
||||||
|
(tab, position) -> tab.setText(getString(tabs.get(position).title)))
|
||||||
|
.attach();
|
||||||
if (getIntent().getBooleanExtra(FORCE_GALLERY, false)) {
|
if (getIntent().getBooleanExtra(FORCE_GALLERY, false)) {
|
||||||
this.viewPager.setCurrentItem(1, false);
|
this.viewPager.setCurrentItem(1, false);
|
||||||
}
|
}
|
||||||
@@ -107,7 +119,9 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
|||||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||||
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||||
|
|
||||||
|
int accountId = DcHelper.getAccounts(this).getSelectedAccount().getAccountId();
|
||||||
playbackViewModel = new ViewModelProvider(this).get(AudioPlaybackViewModel.class);
|
playbackViewModel = new ViewModelProvider(this).get(AudioPlaybackViewModel.class);
|
||||||
|
playbackViewModel.setQueueProvider(new ChatAudioQueueProvider(this, chatId, accountId));
|
||||||
initializeMediaController();
|
initializeMediaController();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,6 +133,7 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
|||||||
mediaController = null;
|
mediaController = null;
|
||||||
playbackViewModel.setMediaController(null);
|
playbackViewModel.setMediaController(null);
|
||||||
}
|
}
|
||||||
|
playbackViewModel.setQueueProvider(null);
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,31 +197,16 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
|||||||
return contactId == 0 && chatId == 0;
|
return contactId == 0 && chatId == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AllMediaPagerAdapter extends FragmentStatePagerAdapter {
|
private class AllMediaPagerAdapter extends FragmentStateAdapter {
|
||||||
private Object currentFragment = null;
|
private int currentPosition = -1;
|
||||||
|
|
||||||
AllMediaPagerAdapter(FragmentManager fragmentManager) {
|
AllMediaPagerAdapter(FragmentActivity activity) {
|
||||||
super(fragmentManager);
|
super(activity);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
|
|
||||||
super.setPrimaryItem(container, position, object);
|
|
||||||
if (currentFragment != null && currentFragment != object) {
|
|
||||||
ActionMode action = null;
|
|
||||||
if (currentFragment instanceof MessageSelectorFragment) {
|
|
||||||
action = ((MessageSelectorFragment) currentFragment).getActionMode();
|
|
||||||
}
|
|
||||||
if (action != null) {
|
|
||||||
action.finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
currentFragment = object;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Fragment getItem(int position) {
|
public Fragment createFragment(int position) {
|
||||||
TabData data = tabs.get(position);
|
TabData data = tabs.get(position);
|
||||||
Fragment fragment;
|
Fragment fragment;
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
@@ -229,13 +229,24 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getItemCount() {
|
||||||
return tabs.size();
|
return tabs.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void onPageChanged(int newPosition) {
|
||||||
public CharSequence getPageTitle(int position) {
|
if (currentPosition != -1 && currentPosition != newPosition) {
|
||||||
return getString(tabs.get(position).title);
|
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
|
||||||
|
if (!(fragment instanceof MessageSelectorFragment)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ActionMode action = ((MessageSelectorFragment) fragment).getActionMode();
|
||||||
|
if (action != null) {
|
||||||
|
action.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentPosition = newPosition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -255,12 +255,6 @@ public class ApplicationContext extends MultiDexApplication {
|
|||||||
// 2025-12-16: The setting was removed.
|
// 2025-12-16: The setting was removed.
|
||||||
// Revert it to the default if it was changed in the past.
|
// Revert it to the default if it was changed in the past.
|
||||||
ac.setConfigInt("webxdc_realtime_enabled", 1);
|
ac.setConfigInt("webxdc_realtime_enabled", 1);
|
||||||
|
|
||||||
// 2025-11-12: this is needed until core starts ignoring "delete_server_after" for
|
|
||||||
// chatmail
|
|
||||||
if (ac.isChatmail()) {
|
|
||||||
ac.setConfig("delete_server_after", null); // reset
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (allAccounts.length == 0) {
|
if (allAccounts.length == 0) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -423,9 +423,18 @@ public abstract class BaseConversationListFragment extends Fragment implements A
|
|||||||
.setIcon(IconCompat.createWithAdaptiveBitmap(avatar))
|
.setIcon(IconCompat.createWithAdaptiveBitmap(avatar))
|
||||||
.setIntent(intent)
|
.setIntent(intent)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
boolean success;
|
||||||
|
try {
|
||||||
|
success = ShortcutManagerCompat.requestPinShortcut(activity, shortcutInfoCompat, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "ErrAddToHomescreen: requestPinShortcut() failed", e);
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
boolean finalSuccess = success;
|
||||||
Util.runOnMain(
|
Util.runOnMain(
|
||||||
() -> {
|
() -> {
|
||||||
if (!ShortcutManagerCompat.requestPinShortcut(activity, shortcutInfoCompat, null)) {
|
if (!finalSuccess) {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
activity,
|
activity,
|
||||||
"ErrAddToHomescreen: requestPinShortcut() failed",
|
"ErrAddToHomescreen: requestPinShortcut() failed",
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ import org.thoughtcrime.securesms.components.ScaleStableImageView;
|
|||||||
import org.thoughtcrime.securesms.components.SendButton;
|
import org.thoughtcrime.securesms.components.SendButton;
|
||||||
import org.thoughtcrime.securesms.components.audioplay.AudioPlaybackViewModel;
|
import org.thoughtcrime.securesms.components.audioplay.AudioPlaybackViewModel;
|
||||||
import org.thoughtcrime.securesms.components.audioplay.AudioView;
|
import org.thoughtcrime.securesms.components.audioplay.AudioView;
|
||||||
|
import org.thoughtcrime.securesms.components.audioplay.ChatAudioQueueProvider;
|
||||||
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
|
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
|
||||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||||
@@ -199,7 +200,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
private final boolean isSecureText = true;
|
private final boolean isSecureText = true;
|
||||||
private boolean isDefaultSms = true;
|
private boolean isDefaultSms = true;
|
||||||
private boolean isSecurityInitialized = false;
|
private boolean isSecurityInitialized = false;
|
||||||
private boolean successfulForwardingAttempt = false;
|
|
||||||
private boolean isEditing = false;
|
private boolean isEditing = false;
|
||||||
private boolean switchedProfile = false;
|
private boolean switchedProfile = false;
|
||||||
|
|
||||||
@@ -223,7 +223,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
initializeViews();
|
initializeViews();
|
||||||
initializeResources();
|
initializeResources();
|
||||||
|
|
||||||
|
int accountId = DcHelper.getAccounts(this).getSelectedAccount().getAccountId();
|
||||||
playbackViewModel = new ViewModelProvider(this).get(AudioPlaybackViewModel.class);
|
playbackViewModel = new ViewModelProvider(this).get(AudioPlaybackViewModel.class);
|
||||||
|
playbackViewModel.setQueueProvider(new ChatAudioQueueProvider(this, chatId, accountId));
|
||||||
initializeMediaController();
|
initializeMediaController();
|
||||||
|
|
||||||
initializeSecurity(false, isDefaultSms)
|
initializeSecurity(false, isDefaultSms)
|
||||||
@@ -413,6 +415,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
mediaController = null;
|
mediaController = null;
|
||||||
playbackViewModel.setMediaController(null);
|
playbackViewModel.setMediaController(null);
|
||||||
}
|
}
|
||||||
|
playbackViewModel.setQueueProvider(null);
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,12 +635,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
return true;
|
return true;
|
||||||
} else if (itemId == R.id.menu_start_audio_call) {
|
} else if (itemId == R.id.menu_start_audio_call) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
CallUtil.startAudioCall(context, chatId);
|
CallUtil.startAudioCall(this, chatId);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (itemId == R.id.menu_start_video_call) {
|
} else if (itemId == R.id.menu_start_video_call) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
CallUtil.startVideoCall(context, chatId);
|
CallUtil.startVideoCall(this, chatId);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (itemId == R.id.menu_all_media) {
|
} else if (itemId == R.id.menu_all_media) {
|
||||||
@@ -672,8 +675,14 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setDraftText(String txt) {
|
public void setDraftText(String txt) {
|
||||||
composeText.setText(txt);
|
try {
|
||||||
composeText.setSelection(composeText.getText().length());
|
if (rpc.canSend(rpc.getSelectedAccountId(), chatId)) {
|
||||||
|
composeText.setText(txt);
|
||||||
|
composeText.setSelection(composeText.getText().length());
|
||||||
|
}
|
||||||
|
} catch (RpcException e) {
|
||||||
|
Log.e(TAG, "Rpc error", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void hideSoftKeyboard() {
|
public void hideSoftKeyboard() {
|
||||||
@@ -836,20 +845,17 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
if (dcChat.isSelfTalk()) {
|
if (dcChat.isSelfTalk()) {
|
||||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||||
} else {
|
} else {
|
||||||
String name = dcChat.getName();
|
int messageIds[] = ShareUtil.getForwardedMessageIDs(this);
|
||||||
if (!dcChat.isMultiUser()) {
|
int messageCount = messageIds == null ? 0 : messageIds.length;
|
||||||
int[] contactIds = dcContext.getChatContacts(chatId);
|
|
||||||
if (contactIds.length == 1 || contactIds.length == 2) {
|
|
||||||
name = dcContext.getContact(contactIds[0]).getDisplayName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
new AlertDialog.Builder(this)
|
new AlertDialog.Builder(this)
|
||||||
.setMessage(getString(R.string.ask_forward, name))
|
.setMessage(
|
||||||
|
getResources()
|
||||||
|
.getQuantityString(
|
||||||
|
R.plurals.ask_forward_messages, messageCount, messageCount, dcChat.getName()))
|
||||||
.setPositiveButton(
|
.setPositiveButton(
|
||||||
R.string.ok,
|
R.string.forward,
|
||||||
(dialogInterface, i) -> {
|
(dialogInterface, i) -> {
|
||||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||||
successfulForwardingAttempt = true;
|
|
||||||
})
|
})
|
||||||
.setNegativeButton(R.string.cancel, (dialogInterface, i) -> finish())
|
.setNegativeButton(R.string.cancel, (dialogInterface, i) -> finish())
|
||||||
.setOnCancelListener(dialog -> finish())
|
.setOnCancelListener(dialog -> finish())
|
||||||
@@ -1119,6 +1125,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
if (chatId == DcChat.DC_CHAT_NO_CHAT)
|
if (chatId == DcChat.DC_CHAT_NO_CHAT)
|
||||||
throw new IllegalStateException("can't display a conversation for no chat.");
|
throw new IllegalStateException("can't display a conversation for no chat.");
|
||||||
dcChat = DcHelper.getContext(context).getChat(chatId);
|
dcChat = DcHelper.getContext(context).getChat(chatId);
|
||||||
|
attachmentTypeSelector = null;
|
||||||
recipient = new Recipient(this, dcChat);
|
recipient = new Recipient(this, dcChat);
|
||||||
glideRequests = GlideApp.with(this);
|
glideRequests = GlideApp.with(this);
|
||||||
|
|
||||||
@@ -1267,6 +1274,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
|
|
||||||
DcContext dcContext = DcHelper.getContext(context);
|
DcContext dcContext = DcHelper.getContext(context);
|
||||||
final int currentChatId = dcChat.getId();
|
final int currentChatId = dcChat.getId();
|
||||||
|
final boolean canSend = dcChat.canSend();
|
||||||
Util.runOnAnyBackgroundThread(
|
Util.runOnAnyBackgroundThread(
|
||||||
() -> {
|
() -> {
|
||||||
DcMsg msg = null;
|
DcMsg msg = null;
|
||||||
@@ -1389,7 +1397,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dcContext.setDraft(currentChatId, msg);
|
// set or clear draft if user can't send in chat since they can't delete it otherwise
|
||||||
|
dcContext.setDraft(currentChatId, canSend ? msg : null);
|
||||||
}
|
}
|
||||||
future.set(currentChatId);
|
future.set(currentChatId);
|
||||||
});
|
});
|
||||||
@@ -1611,7 +1620,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
msg.setQuote(quote.get().getQuotedMsg());
|
msg.setQuote(quote.get().getQuotedMsg());
|
||||||
}
|
}
|
||||||
msg.setFileAndDeduplicate(path, null, null);
|
msg.setFileAndDeduplicate(path, null, null);
|
||||||
msg.forceSticker();
|
|
||||||
dcContext.sendMsg(chatId, msg);
|
dcContext.sendMsg(chatId, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -944,6 +944,8 @@ public class ConversationFragment extends MessageSelectorFragment {
|
|||||||
WebxdcActivity.openWebxdcActivity(
|
WebxdcActivity.openWebxdcActivity(
|
||||||
getContext(), messageRecord.getParent(), messageRecord.getWebxdcHref());
|
getContext(), messageRecord.getParent(), messageRecord.getWebxdcHref());
|
||||||
}
|
}
|
||||||
|
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_LOCATIONSTREAMING_ENABLED) {
|
||||||
|
WebxdcActivity.openMaps(getContext(), (int) chatId);
|
||||||
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_CHAT_DESCRIPTION_CHANGED) {
|
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_CHAT_DESCRIPTION_CHANGED) {
|
||||||
Intent intent = new Intent(getContext(), ProfileActivity.class);
|
Intent intent = new Intent(getContext(), ProfileActivity.class);
|
||||||
intent.putExtra(ProfileActivity.CHAT_ID_EXTRA, (int) chatId);
|
intent.putExtra(ProfileActivity.CHAT_ID_EXTRA, (int) chatId);
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import android.graphics.PorterDuff;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -36,6 +37,7 @@ import androidx.annotation.DimenRes;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
import chat.delta.rpc.RpcException;
|
import chat.delta.rpc.RpcException;
|
||||||
import chat.delta.rpc.types.CallInfo;
|
import chat.delta.rpc.types.CallInfo;
|
||||||
import chat.delta.rpc.types.CallState;
|
import chat.delta.rpc.types.CallState;
|
||||||
@@ -44,6 +46,7 @@ import chat.delta.rpc.types.VcardContact;
|
|||||||
import com.b44t.messenger.DcChat;
|
import com.b44t.messenger.DcChat;
|
||||||
import com.b44t.messenger.DcContact;
|
import com.b44t.messenger.DcContact;
|
||||||
import com.b44t.messenger.DcMsg;
|
import com.b44t.messenger.DcMsg;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.thoughtcrime.securesms.calls.CallCoordinator;
|
import org.thoughtcrime.securesms.calls.CallCoordinator;
|
||||||
@@ -72,6 +75,7 @@ import org.thoughtcrime.securesms.mms.VcardSlide;
|
|||||||
import org.thoughtcrime.securesms.reactions.ReactionsConversationView;
|
import org.thoughtcrime.securesms.reactions.ReactionsConversationView;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.util.Linkifier;
|
import org.thoughtcrime.securesms.util.Linkifier;
|
||||||
|
import org.thoughtcrime.securesms.util.LongClickCopySpan;
|
||||||
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
|
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
|
||||||
import org.thoughtcrime.securesms.util.MarkdownUtil;
|
import org.thoughtcrime.securesms.util.MarkdownUtil;
|
||||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||||
@@ -120,6 +124,9 @@ public class ConversationItem extends BaseConversationItem {
|
|||||||
private Stub<CallItemView> callViewStub;
|
private Stub<CallItemView> callViewStub;
|
||||||
private @Nullable EventListener eventListener;
|
private @Nullable EventListener eventListener;
|
||||||
|
|
||||||
|
// IDs of accessibility actions registered via ViewCompat.addAccessibilityAction
|
||||||
|
private final List<Integer> linkActionIds = new ArrayList<>();
|
||||||
|
|
||||||
private int measureCalls;
|
private int measureCalls;
|
||||||
|
|
||||||
private int incomingBubbleColor;
|
private int incomingBubbleColor;
|
||||||
@@ -424,6 +431,12 @@ public class ConversationItem extends BaseConversationItem {
|
|||||||
bodyText.setClickable(false);
|
bodyText.setClickable(false);
|
||||||
bodyText.setFocusable(false);
|
bodyText.setFocusable(false);
|
||||||
|
|
||||||
|
// Remove any link actions registered for the previous message binding
|
||||||
|
for (int id : linkActionIds) {
|
||||||
|
ViewCompat.removeAccessibilityAction(this, id);
|
||||||
|
}
|
||||||
|
linkActionIds.clear();
|
||||||
|
|
||||||
String subject = messageRecord.getSubject();
|
String subject = messageRecord.getSubject();
|
||||||
String text = messageRecord.getText();
|
String text = messageRecord.getText();
|
||||||
|
|
||||||
@@ -433,12 +446,33 @@ public class ConversationItem extends BaseConversationItem {
|
|||||||
if (messageRecord.getType() == DcMsg.DC_MSG_CALL || text.isEmpty()) {
|
if (messageRecord.getType() == DcMsg.DC_MSG_CALL || text.isEmpty()) {
|
||||||
bodyText.setVisibility(View.GONE);
|
bodyText.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
Spannable spannable = (Spannable) MarkdownUtil.toMarkdown(context, text);
|
Spannable spannable = MarkdownUtil.toMarkdown(context, text);
|
||||||
if (batchSelected.isEmpty()) {
|
if (batchSelected.isEmpty()) {
|
||||||
spannable = Linkifier.linkify(spannable);
|
Linkifier.linkify(spannable);
|
||||||
}
|
}
|
||||||
bodyText.setText(spannable);
|
bodyText.setText(spannable);
|
||||||
bodyText.setVisibility(View.VISIBLE);
|
bodyText.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
// Register a TalkBack "Actions" entry for each link in the message
|
||||||
|
Spanned spanned = (Spanned) spannable;
|
||||||
|
final TextView tv = bodyText;
|
||||||
|
for (LongClickCopySpan span :
|
||||||
|
spanned.getSpans(0, spanned.length(), LongClickCopySpan.class)) {
|
||||||
|
int start = spanned.getSpanStart(span);
|
||||||
|
int end = spanned.getSpanEnd(span);
|
||||||
|
if (start >= 0 && end > start && end <= spanned.length()) {
|
||||||
|
String linkText = spanned.subSequence(start, end).toString();
|
||||||
|
String label = context.getString(R.string.open_link, linkText);
|
||||||
|
linkActionIds.add(
|
||||||
|
ViewCompat.addAccessibilityAction(
|
||||||
|
this,
|
||||||
|
label,
|
||||||
|
(v, args) -> {
|
||||||
|
span.onClick(tv);
|
||||||
|
return true;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int downloadState = messageRecord.getDownloadState();
|
int downloadState = messageRecord.getDownloadState();
|
||||||
@@ -1062,7 +1096,18 @@ public class ConversationItem extends BaseConversationItem {
|
|||||||
if (!messageRecord.isOutgoing() && callInfo.state instanceof CallState.Alerting) {
|
if (!messageRecord.isOutgoing() && callInfo.state instanceof CallState.Alerting) {
|
||||||
int callId = messageRecord.getId();
|
int callId = messageRecord.getId();
|
||||||
CallCoordinator coordinator = CallCoordinator.getInstance(context);
|
CallCoordinator coordinator = CallCoordinator.getInstance(context);
|
||||||
coordinator.showIncomingCallScreen(callId);
|
|
||||||
|
if (coordinator.hasActiveCall()) {
|
||||||
|
coordinator.showIncomingCallScreen(callId);
|
||||||
|
} else {
|
||||||
|
if (callInfo.sdpOffer == null) {
|
||||||
|
Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int accId = dcContext.getAccountId();
|
||||||
|
coordinator.handleIncomingCallFromConversation(
|
||||||
|
accId, callId, callInfo.sdpOffer, callInfo.hasVideo);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (callInfo.hasVideo) {
|
if (callInfo.hasVideo) {
|
||||||
CallUtil.startVideoCall(getContext(), chatId);
|
CallUtil.startVideoCall(getContext(), chatId);
|
||||||
|
|||||||
@@ -607,6 +607,13 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void handleQrFromSearch(String rawQrString) {
|
||||||
|
qrData = rawQrString;
|
||||||
|
new QrCodeHandler(this)
|
||||||
|
.handleQrData(
|
||||||
|
rawQrString, SecurejoinSource.Scan, SecurejoinUiPath.QrIcon, relayLockLauncher);
|
||||||
|
}
|
||||||
|
|
||||||
private void handleResetRelaying() {
|
private void handleResetRelaying() {
|
||||||
resetRelayingMessageContent(this);
|
resetRelayingMessageContent(this);
|
||||||
refreshTitle();
|
refreshTitle();
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import android.content.Context;
|
|||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -61,7 +60,6 @@ public class ConversationListFragment extends BaseConversationListFragment
|
|||||||
private RecyclerView list;
|
private RecyclerView list;
|
||||||
private View emptyState;
|
private View emptyState;
|
||||||
private TextView emptySearch;
|
private TextView emptySearch;
|
||||||
private final String queryFilter = "";
|
|
||||||
private boolean archive;
|
private boolean archive;
|
||||||
private Timer reloadTimer;
|
private Timer reloadTimer;
|
||||||
private boolean chatlistJustLoaded;
|
private boolean chatlistJustLoaded;
|
||||||
@@ -285,22 +283,17 @@ public class ConversationListFragment extends BaseConversationListFragment
|
|||||||
Log.w(TAG, "Ignoring call to loadChatlist()");
|
Log.w(TAG, "Ignoring call to loadChatlist()");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DcChatlist chatlist =
|
long startMs = System.currentTimeMillis();
|
||||||
DcHelper.getContext(context)
|
DcChatlist chatlist = DcHelper.getContext(context).getChatlist(listflags, null, 0);
|
||||||
.getChatlist(listflags, queryFilter.isEmpty() ? null : queryFilter, 0);
|
Log.i(TAG, "⏰ getChatlist(): " + (System.currentTimeMillis() - startMs) + "ms");
|
||||||
|
|
||||||
Util.runOnMain(
|
Util.runOnMain(
|
||||||
() -> {
|
() -> {
|
||||||
if (chatlist.getCnt() <= 0 && TextUtils.isEmpty(queryFilter)) {
|
if (chatlist.getCnt() <= 0) {
|
||||||
list.setVisibility(View.INVISIBLE);
|
list.setVisibility(View.INVISIBLE);
|
||||||
emptyState.setVisibility(View.VISIBLE);
|
emptyState.setVisibility(View.VISIBLE);
|
||||||
emptySearch.setVisibility(View.INVISIBLE);
|
emptySearch.setVisibility(View.INVISIBLE);
|
||||||
fab.startPulse(3 * 1000);
|
fab.startPulse(3 * 1000);
|
||||||
} else if (chatlist.getCnt() <= 0 && !TextUtils.isEmpty(queryFilter)) {
|
|
||||||
list.setVisibility(View.INVISIBLE);
|
|
||||||
emptyState.setVisibility(View.GONE);
|
|
||||||
emptySearch.setVisibility(View.VISIBLE);
|
|
||||||
emptySearch.setText(getString(R.string.search_no_result_for_x, queryFilter));
|
|
||||||
} else {
|
} else {
|
||||||
list.setVisibility(View.VISIBLE);
|
list.setVisibility(View.VISIBLE);
|
||||||
emptyState.setVisibility(View.GONE);
|
emptyState.setVisibility(View.GONE);
|
||||||
|
|||||||
@@ -44,9 +44,11 @@ import org.thoughtcrime.securesms.components.AvatarView;
|
|||||||
import org.thoughtcrime.securesms.components.DeliveryStatusView;
|
import org.thoughtcrime.securesms.components.DeliveryStatusView;
|
||||||
import org.thoughtcrime.securesms.components.FromTextView;
|
import org.thoughtcrime.securesms.components.FromTextView;
|
||||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
|
import org.thoughtcrime.securesms.contacts.avatars.GeneratedContactPhoto;
|
||||||
import org.thoughtcrime.securesms.database.model.ThreadRecord;
|
import org.thoughtcrime.securesms.database.model.ThreadRecord;
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
|
import org.thoughtcrime.securesms.search.QrInviteData;
|
||||||
import org.thoughtcrime.securesms.util.DateUtils;
|
import org.thoughtcrime.securesms.util.DateUtils;
|
||||||
import org.thoughtcrime.securesms.util.ThemeUtil;
|
import org.thoughtcrime.securesms.util.ThemeUtil;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
@@ -222,6 +224,40 @@ public class ConversationListItem extends RelativeLayout
|
|||||||
avatar.setSeenRecently(false);
|
avatar.setSeenRecently(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bind(@NonNull QrInviteData inviteData, @NonNull GlideRequests glideRequests) {
|
||||||
|
this.selectedThreads = Collections.emptySet();
|
||||||
|
|
||||||
|
fromView.setText(inviteData.getDisplayTitle());
|
||||||
|
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||||
|
subjectView.setVisibility(VISIBLE);
|
||||||
|
subjectView.setText(inviteData.getDisplaySubtitle());
|
||||||
|
subjectView.setTypeface(LIGHT_TYPEFACE);
|
||||||
|
subjectView.setTextColor(
|
||||||
|
ThemeUtil.getThemedColor(getContext(), R.attr.conversation_list_item_subject_color));
|
||||||
|
|
||||||
|
dateView.setText("");
|
||||||
|
dateView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||||
|
archivedBadgeView.setVisibility(GONE);
|
||||||
|
requestBadgeView.setVisibility(GONE);
|
||||||
|
unreadIndicator.setVisibility(GONE);
|
||||||
|
deliveryStatusIndicator.setNone();
|
||||||
|
|
||||||
|
setBatchState(false);
|
||||||
|
|
||||||
|
if (inviteData.getContactId() > 0) {
|
||||||
|
DcContext dcContext = DcHelper.getContext(getContext());
|
||||||
|
DcContact contact = dcContext.getContact(inviteData.getContactId());
|
||||||
|
Recipient recipient = new Recipient(getContext(), contact);
|
||||||
|
avatar.setAvatar(glideRequests, recipient, false);
|
||||||
|
avatar.setSeenRecently(contact.wasSeenRecently());
|
||||||
|
} else {
|
||||||
|
avatar.setImageDrawable(
|
||||||
|
new GeneratedContactPhoto("+")
|
||||||
|
.asDrawable(getContext(), ThemeUtil.getDummyContactColor(getContext())));
|
||||||
|
avatar.setSeenRecently(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unbind() {}
|
public void unbind() {}
|
||||||
|
|
||||||
|
|||||||
@@ -33,14 +33,13 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.FrameLayout;
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.loader.app.LoaderManager;
|
import androidx.loader.app.LoaderManager;
|
||||||
import androidx.loader.content.Loader;
|
import androidx.loader.content.Loader;
|
||||||
import androidx.viewpager.widget.PagerAdapter;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.viewpager.widget.ViewPager;
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
import com.b44t.messenger.DcChat;
|
import com.b44t.messenger.DcChat;
|
||||||
import com.b44t.messenger.DcContext;
|
import com.b44t.messenger.DcContext;
|
||||||
import com.b44t.messenger.DcMediaGalleryElement;
|
import com.b44t.messenger.DcMediaGalleryElement;
|
||||||
@@ -48,7 +47,6 @@ import com.b44t.messenger.DcMsg;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
import org.thoughtcrime.securesms.components.MediaView;
|
import org.thoughtcrime.securesms.components.MediaView;
|
||||||
import org.thoughtcrime.securesms.components.viewpager.ExtendedOnPageChangedListener;
|
|
||||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
import org.thoughtcrime.securesms.database.Address;
|
import org.thoughtcrime.securesms.database.Address;
|
||||||
import org.thoughtcrime.securesms.database.loaders.PagingMediaLoader;
|
import org.thoughtcrime.securesms.database.loaders.PagingMediaLoader;
|
||||||
@@ -88,7 +86,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
@Nullable private DcMsg messageRecord;
|
@Nullable private DcMsg messageRecord;
|
||||||
private DcContext dcContext;
|
private DcContext dcContext;
|
||||||
private MediaItem initialMedia;
|
private MediaItem initialMedia;
|
||||||
private ViewPager mediaPager;
|
private ViewPager2 mediaPager;
|
||||||
private Recipient conversationRecipient;
|
private Recipient conversationRecipient;
|
||||||
private boolean leftIsRecent;
|
private boolean leftIsRecent;
|
||||||
|
|
||||||
@@ -190,7 +188,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
private void initializeViews() {
|
private void initializeViews() {
|
||||||
mediaPager = findViewById(R.id.media_pager);
|
mediaPager = findViewById(R.id.media_pager);
|
||||||
mediaPager.setOffscreenPageLimit(1);
|
mediaPager.setOffscreenPageLimit(1);
|
||||||
mediaPager.addOnPageChangeListener(new ViewPagerListener());
|
mediaPager.registerOnPageChangeCallback(new ViewPagerListener());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeResources() {
|
private void initializeResources() {
|
||||||
@@ -260,10 +258,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
|
|
||||||
private int cleanupMedia() {
|
private int cleanupMedia() {
|
||||||
int restartItem = mediaPager.getCurrentItem();
|
int restartItem = mediaPager.getCurrentItem();
|
||||||
|
|
||||||
mediaPager.removeAllViews();
|
|
||||||
mediaPager.setAdapter(null);
|
mediaPager.setAdapter(null);
|
||||||
|
|
||||||
return restartItem;
|
return restartItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,22 +478,25 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
DcMediaPagerAdapter adapter =
|
DcMediaPagerAdapter adapter =
|
||||||
new DcMediaPagerAdapter(this, GlideApp.with(this), getWindow(), data, leftIsRecent);
|
new DcMediaPagerAdapter(this, GlideApp.with(this), getWindow(), data, leftIsRecent);
|
||||||
mediaPager.setAdapter(adapter);
|
|
||||||
adapter.setActive(true);
|
adapter.setActive(true);
|
||||||
|
mediaPager.setAdapter(adapter);
|
||||||
|
|
||||||
if (restartItem < 0) mediaPager.setCurrentItem(data.getPosition());
|
if (restartItem < 0) mediaPager.setCurrentItem(data.getPosition(), false);
|
||||||
else mediaPager.setCurrentItem(restartItem);
|
else mediaPager.setCurrentItem(restartItem, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoaderReset(Loader<DcMediaGalleryElement> loader) {}
|
public void onLoaderReset(Loader<DcMediaGalleryElement> loader) {}
|
||||||
|
|
||||||
private class ViewPagerListener extends ExtendedOnPageChangedListener {
|
private class ViewPagerListener extends ViewPager2.OnPageChangeCallback {
|
||||||
|
|
||||||
|
private Integer currentPage = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageSelected(int position) {
|
public void onPageSelected(int position) {
|
||||||
super.onPageSelected(position);
|
if (currentPage != null && currentPage != position) onPageUnselected(currentPage);
|
||||||
|
currentPage = position;
|
||||||
|
|
||||||
MediaItemAdapter adapter = (MediaItemAdapter) mediaPager.getAdapter();
|
MediaItemAdapter adapter = (MediaItemAdapter) mediaPager.getAdapter();
|
||||||
|
|
||||||
@@ -510,8 +508,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void onPageUnselected(int position) {
|
||||||
public void onPageUnselected(int position) {
|
|
||||||
MediaItemAdapter adapter = (MediaItemAdapter) mediaPager.getAdapter();
|
MediaItemAdapter adapter = (MediaItemAdapter) mediaPager.getAdapter();
|
||||||
|
|
||||||
if (adapter != null) {
|
if (adapter != null) {
|
||||||
@@ -526,7 +523,9 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class SingleItemPagerAdapter extends PagerAdapter implements MediaItemAdapter {
|
private static class SingleItemPagerAdapter
|
||||||
|
extends RecyclerView.Adapter<SingleItemPagerAdapter.MediaViewHolder>
|
||||||
|
implements MediaItemAdapter {
|
||||||
|
|
||||||
private final GlideRequests glideRequests;
|
private final GlideRequests glideRequests;
|
||||||
private final Window window;
|
private final Window window;
|
||||||
@@ -555,37 +554,29 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getItemCount() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
|
public MediaViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
return view == object;
|
return new MediaViewHolder(inflater.inflate(R.layout.media_view_page, parent, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull Object instantiateItem(@NonNull ViewGroup container, int position) {
|
public void onBindViewHolder(@NonNull MediaViewHolder holder, int position) {
|
||||||
View itemView = inflater.inflate(R.layout.media_view_page, container, false);
|
|
||||||
MediaView mediaView = itemView.findViewById(R.id.media_view);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mediaView.set(glideRequests, window, uri, name, mediaType, size, true);
|
holder.mediaView.set(glideRequests, window, uri, name, mediaType, size, true);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
container.addView(itemView);
|
|
||||||
|
|
||||||
return itemView;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
|
public void onViewRecycled(@NonNull MediaViewHolder holder) {
|
||||||
MediaView mediaView = ((FrameLayout) object).findViewById(R.id.media_view);
|
super.onViewRecycled(holder);
|
||||||
mediaView.cleanup();
|
holder.mediaView.cleanup();
|
||||||
|
|
||||||
container.removeView((FrameLayout) object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -595,9 +586,20 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pause(int position) {}
|
public void pause(int position) {}
|
||||||
|
|
||||||
|
static class MediaViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
final MediaView mediaView;
|
||||||
|
|
||||||
|
MediaViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
mediaView = itemView.findViewById(R.id.media_view);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class DcMediaPagerAdapter extends PagerAdapter implements MediaItemAdapter {
|
private static class DcMediaPagerAdapter
|
||||||
|
extends RecyclerView.Adapter<DcMediaPagerAdapter.MediaViewHolder>
|
||||||
|
implements MediaItemAdapter {
|
||||||
|
|
||||||
private final WeakHashMap<Integer, MediaView> mediaViews = new WeakHashMap<>();
|
private final WeakHashMap<Integer, MediaView> mediaViews = new WeakHashMap<>();
|
||||||
|
|
||||||
@@ -630,21 +632,20 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getItemCount() {
|
||||||
if (!active) return 0;
|
if (!active) return 0;
|
||||||
else return gallery.getCount();
|
else return gallery.getCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
|
public MediaViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
return view == object;
|
View itemView = LayoutInflater.from(context).inflate(R.layout.media_view_page, parent, false);
|
||||||
|
return new MediaViewHolder(itemView);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NonNull Object instantiateItem(@NonNull ViewGroup container, int position) {
|
public void onBindViewHolder(@NonNull MediaViewHolder holder, int position) {
|
||||||
View itemView =
|
|
||||||
LayoutInflater.from(context).inflate(R.layout.media_view_page, container, false);
|
|
||||||
MediaView mediaView = itemView.findViewById(R.id.media_view);
|
|
||||||
boolean autoplay = position == autoPlayPosition;
|
boolean autoplay = position == autoPlayPosition;
|
||||||
int cursorPosition = getCursorPosition(position);
|
int cursorPosition = getCursorPosition(position);
|
||||||
|
|
||||||
@@ -656,7 +657,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
mediaView.set(
|
holder.mediaView.set(
|
||||||
glideRequests,
|
glideRequests,
|
||||||
window,
|
window,
|
||||||
Uri.fromFile(msg.getFileAsFile()),
|
Uri.fromFile(msg.getFileAsFile()),
|
||||||
@@ -668,19 +669,17 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaViews.put(position, mediaView);
|
mediaViews.put(position, holder.mediaView);
|
||||||
container.addView(itemView);
|
|
||||||
|
|
||||||
return itemView;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
|
public void onViewRecycled(@NonNull MediaViewHolder holder) {
|
||||||
MediaView mediaView = ((FrameLayout) object).findViewById(R.id.media_view);
|
super.onViewRecycled(holder);
|
||||||
mediaView.cleanup();
|
int pos = holder.getBindingAdapterPosition();
|
||||||
|
if (pos != RecyclerView.NO_POSITION) {
|
||||||
mediaViews.remove(position);
|
mediaViews.remove(pos);
|
||||||
container.removeView((FrameLayout) object);
|
}
|
||||||
|
holder.mediaView.cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MediaItem getMediaItemFor(int position) {
|
public MediaItem getMediaItemFor(int position) {
|
||||||
@@ -710,6 +709,15 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
if (leftIsRecent) return position;
|
if (leftIsRecent) return position;
|
||||||
else return gallery.getCount() - 1 - position;
|
else return gallery.getCount() - 1 - position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class MediaViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
final MediaView mediaView;
|
||||||
|
|
||||||
|
MediaViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
mediaView = itemView.findViewById(R.id.media_view);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class MediaItem {
|
private static class MediaItem {
|
||||||
@@ -742,7 +750,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface MediaItemAdapter {
|
private interface MediaItemAdapter {
|
||||||
MediaItem getMediaItemFor(int position);
|
MediaItem getMediaItemFor(int position);
|
||||||
|
|
||||||
void pause(int position);
|
void pause(int position);
|
||||||
|
|||||||
@@ -543,11 +543,25 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
Toast.makeText(context, R.string.one_moment, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, R.string.one_moment, Toast.LENGTH_SHORT).show();
|
||||||
if (!ShortcutManagerCompat.requestPinShortcut(context, shortcutInfoCompat, null)) {
|
Util.runOnAnyBackgroundThread(
|
||||||
Toast.makeText(
|
() -> {
|
||||||
context, "ErrAddToHomescreen: requestPinShortcut() failed", Toast.LENGTH_LONG)
|
boolean success;
|
||||||
.show();
|
try {
|
||||||
}
|
success = ShortcutManagerCompat.requestPinShortcut(context, shortcutInfoCompat, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "ErrAddToHomescreen: requestPinShortcut() failed", e);
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
if (!success) {
|
||||||
|
Util.runOnMain(
|
||||||
|
() ->
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
"ErrAddToHomescreen: requestPinShortcut() failed",
|
||||||
|
Toast.LENGTH_LONG)
|
||||||
|
.show());
|
||||||
|
}
|
||||||
|
});
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Toast.makeText(context, "ErrAddToHomescreen: " + e, Toast.LENGTH_LONG).show();
|
Toast.makeText(context, "ErrAddToHomescreen: " + e, Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -157,6 +157,12 @@ public class AccountSelectionListFragment extends DialogFragment
|
|||||||
onSetTag(accountId);
|
onSetTag(accountId);
|
||||||
} else if (itemId == R.id.menu_move_to_top) {
|
} else if (itemId == R.id.menu_move_to_top) {
|
||||||
onMoveToTop(accountId);
|
onMoveToTop(accountId);
|
||||||
|
} else if (itemId == R.id.menu_mark_all_as_read) {
|
||||||
|
try {
|
||||||
|
DcHelper.getRpc(requireActivity()).marknoticedAllChats(accountId);
|
||||||
|
} catch (RpcException e) {
|
||||||
|
Log.e(TAG, "Error calling rpc.marknoticedAllChats()", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import android.app.PictureInPictureParams;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Rational;
|
import android.util.Rational;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -22,7 +24,9 @@ import android.widget.TextView;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.activity.OnBackPressedCallback;
|
import androidx.activity.OnBackPressedCallback;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.cardview.widget.CardView;
|
import androidx.cardview.widget.CardView;
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||||
@@ -54,6 +58,7 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
private static final String TAG = "CallActivity";
|
private static final String TAG = "CallActivity";
|
||||||
private static final int MIC_PERMISSION_REQUEST_CODE = 1001;
|
private static final int MIC_PERMISSION_REQUEST_CODE = 1001;
|
||||||
private static final int CAMERA_PERMISSION_REQUEST_CODE = 1002;
|
private static final int CAMERA_PERMISSION_REQUEST_CODE = 1002;
|
||||||
|
private static final int CAMERA_MID_CALL_PERMISSION_REQUEST_CODE = 1003;
|
||||||
|
|
||||||
public static final String ACTION_ANSWER_CALL = BuildConfig.APPLICATION_ID + ".ANSWER_CALL";
|
public static final String ACTION_ANSWER_CALL = BuildConfig.APPLICATION_ID + ".ANSWER_CALL";
|
||||||
public static final String ACTION_DECLINE_CALL = BuildConfig.APPLICATION_ID + ".DECLINE_CALL";
|
public static final String ACTION_DECLINE_CALL = BuildConfig.APPLICATION_ID + ".DECLINE_CALL";
|
||||||
@@ -99,6 +104,7 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
private boolean awaitingPermissionResult = false;
|
private boolean awaitingPermissionResult = false;
|
||||||
private boolean pausedWhileAwaitingPermission = false;
|
private boolean pausedWhileAwaitingPermission = false;
|
||||||
private boolean intentHandled = false;
|
private boolean intentHandled = false;
|
||||||
|
private boolean doNotAutoFinish = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -227,6 +233,7 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
Log.d(TAG, "Resuming existing call");
|
Log.d(TAG, "Resuming existing call");
|
||||||
} else if (!coordinator.isIncomingCall()) {
|
} else if (!coordinator.isIncomingCall()) {
|
||||||
Log.d(TAG, "Starting outgoing call");
|
Log.d(TAG, "Starting outgoing call");
|
||||||
|
coordinator.ensureServiceStarted();
|
||||||
viewModel.startOutgoingCallWhenReady();
|
viewModel.startOutgoingCallWhenReady();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -374,6 +381,18 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
videoButton.setOnClickListener(
|
videoButton.setOnClickListener(
|
||||||
v -> {
|
v -> {
|
||||||
if (viewModel != null) {
|
if (viewModel != null) {
|
||||||
|
Boolean currentEnabled = viewModel.getVideoEnabled().getValue();
|
||||||
|
boolean needToEnable = currentEnabled == null || !currentEnabled;
|
||||||
|
|
||||||
|
if (needToEnable && !hasCameraPermission()) {
|
||||||
|
awaitingPermissionResult = true;
|
||||||
|
ActivityCompat.requestPermissions(
|
||||||
|
this,
|
||||||
|
new String[] {Manifest.permission.CAMERA},
|
||||||
|
CAMERA_MID_CALL_PERMISSION_REQUEST_CODE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
viewModel.toggleVideo();
|
viewModel.toggleVideo();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -634,7 +653,7 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
new Handler(Looper.getMainLooper())
|
new Handler(Looper.getMainLooper())
|
||||||
.postDelayed(
|
.postDelayed(
|
||||||
() -> {
|
() -> {
|
||||||
if (!isFinishing()) {
|
if (!isFinishing() && !doNotAutoFinish) {
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -643,7 +662,9 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
case ENDED:
|
case ENDED:
|
||||||
statusText.setText(R.string.call_ended);
|
statusText.setText(R.string.call_ended);
|
||||||
finish();
|
if (!doNotAutoFinish) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ERROR:
|
case ERROR:
|
||||||
@@ -656,7 +677,7 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
new Handler(Looper.getMainLooper())
|
new Handler(Looper.getMainLooper())
|
||||||
.postDelayed(
|
.postDelayed(
|
||||||
() -> {
|
() -> {
|
||||||
if (!isFinishing()) {
|
if (!isFinishing() && !doNotAutoFinish) {
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -842,16 +863,28 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleMicPermissionDenied() {
|
private void handleMicPermissionDenied() {
|
||||||
Toast.makeText(this, R.string.call_requires_mic_permission, Toast.LENGTH_LONG).show();
|
|
||||||
|
|
||||||
CallCoordinator coordinator = CallCoordinator.getInstance(getApplication());
|
CallCoordinator coordinator = CallCoordinator.getInstance(getApplication());
|
||||||
if (coordinator.hasActiveCall()
|
|
||||||
&& coordinator.isIncomingCall()
|
if (coordinator.hasActiveCall() && !coordinator.hasOngoingCall()) {
|
||||||
&& !coordinator.hasOngoingCall()) {
|
if (coordinator.isIncomingCall()) {
|
||||||
coordinator.declineCall();
|
coordinator.declineCall();
|
||||||
|
} else {
|
||||||
|
coordinator.hangUp();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
finish();
|
if (!shouldShowRequestPermissionRationale(Manifest.permission.RECORD_AUDIO)) {
|
||||||
|
doNotAutoFinish = true;
|
||||||
|
showPermissionSettingsDialog(
|
||||||
|
getString(R.string.call_requires_mic_permission),
|
||||||
|
() -> {
|
||||||
|
doNotAutoFinish = false;
|
||||||
|
if (!isFinishing()) finish();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, R.string.call_requires_mic_permission, Toast.LENGTH_LONG).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void proceedAfterPermissions() {
|
private void proceedAfterPermissions() {
|
||||||
@@ -878,6 +911,22 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
CallCoordinator coordinator = CallCoordinator.getInstance(getApplication());
|
CallCoordinator coordinator = CallCoordinator.getInstance(getApplication());
|
||||||
|
|
||||||
|
if (requestCode == CAMERA_MID_CALL_PERMISSION_REQUEST_CODE) {
|
||||||
|
boolean cameraGranted =
|
||||||
|
grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
|
||||||
|
|
||||||
|
if (cameraGranted && viewModel != null) {
|
||||||
|
viewModel.toggleVideo();
|
||||||
|
} else {
|
||||||
|
if (!shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
|
||||||
|
showPermissionSettingsDialog(getString(R.string.call_requires_camera_permission), null);
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, R.string.call_requires_camera_permission, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (requestCode == MIC_PERMISSION_REQUEST_CODE) {
|
if (requestCode == MIC_PERMISSION_REQUEST_CODE) {
|
||||||
boolean micGranted =
|
boolean micGranted =
|
||||||
grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
|
grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
|
||||||
@@ -893,9 +942,17 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
if (!cameraGranted) {
|
if (!cameraGranted) {
|
||||||
Log.w(TAG, "Camera permission denied, switching to audio-only");
|
Log.w(TAG, "Camera permission denied, switching to audio-only");
|
||||||
Toast.makeText(
|
if (!shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
|
||||||
this, "Starting audio-only call (camera permission denied)", Toast.LENGTH_SHORT)
|
Toast.makeText(
|
||||||
.show();
|
this,
|
||||||
|
"Camera permission permanently denied. Enable in app settings for video calls.",
|
||||||
|
Toast.LENGTH_LONG)
|
||||||
|
.show();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(
|
||||||
|
this, "Starting audio-only call (camera permission denied)", Toast.LENGTH_SHORT)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
coordinator.setStartsWithVideo(false);
|
coordinator.setStartsWithVideo(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -903,6 +960,34 @@ public class CallActivity extends AppCompatActivity {
|
|||||||
proceedAfterPermissions();
|
proceedAfterPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showPermissionSettingsDialog(String message, @Nullable Runnable onDismissAction) {
|
||||||
|
if (isFinishing() || isDestroyed()) {
|
||||||
|
if (onDismissAction != null) onDismissAction.run();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle("Permission Required")
|
||||||
|
.setMessage(message)
|
||||||
|
.setPositiveButton(
|
||||||
|
"Open Settings",
|
||||||
|
(dialog, which) -> {
|
||||||
|
Intent intent =
|
||||||
|
new Intent(
|
||||||
|
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
|
||||||
|
Uri.fromParts("package", getPackageName(), null));
|
||||||
|
startActivity(intent);
|
||||||
|
})
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.setOnDismissListener(
|
||||||
|
dialog -> {
|
||||||
|
if (onDismissAction != null) {
|
||||||
|
onDismissAction.run();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
// Picture-in-Picture
|
// Picture-in-Picture
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import android.os.Looper;
|
|||||||
import android.telecom.DisconnectCause;
|
import android.telecom.DisconnectCause;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
import androidx.core.app.NotificationManagerCompat;
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
@@ -32,6 +33,7 @@ import androidx.core.telecom.CallControlScope;
|
|||||||
import androidx.core.telecom.CallEndpointCompat;
|
import androidx.core.telecom.CallEndpointCompat;
|
||||||
import androidx.core.telecom.CallException;
|
import androidx.core.telecom.CallException;
|
||||||
import androidx.core.telecom.CallsManager;
|
import androidx.core.telecom.CallsManager;
|
||||||
|
import androidx.core.util.Pair;
|
||||||
import androidx.lifecycle.FlowLiveDataConversions;
|
import androidx.lifecycle.FlowLiveDataConversions;
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MediatorLiveData;
|
import androidx.lifecycle.MediatorLiveData;
|
||||||
@@ -97,6 +99,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
private final MutableLiveData<Boolean> outgoingCallPlaced = new MutableLiveData<>(false);
|
private final MutableLiveData<Boolean> outgoingCallPlaced = new MutableLiveData<>(false);
|
||||||
private final MutableLiveData<Boolean> answeredElsewhere = new MutableLiveData<>(false);
|
private final MutableLiveData<Boolean> answeredElsewhere = new MutableLiveData<>(false);
|
||||||
private final MutableLiveData<Boolean> isFrontCamera = new MutableLiveData<>(true);
|
private final MutableLiveData<Boolean> isFrontCamera = new MutableLiveData<>(true);
|
||||||
|
private final MutableLiveData<Boolean> mediaCaptureReady = new MutableLiveData<>(false);
|
||||||
|
|
||||||
// Audio Routing Support
|
// Audio Routing Support
|
||||||
private final MediatorLiveData<CallEndpointCompat> currentAudioEndpoint =
|
private final MediatorLiveData<CallEndpointCompat> currentAudioEndpoint =
|
||||||
@@ -119,6 +122,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
private String pendingOfferSdp;
|
private String pendingOfferSdp;
|
||||||
private boolean hasNotifiedBackend = false;
|
private boolean hasNotifiedBackend = false;
|
||||||
private boolean hasAutoSelectedEarpiece = false;
|
private boolean hasAutoSelectedEarpiece = false;
|
||||||
|
private boolean pendingMediaCapture = false;
|
||||||
|
|
||||||
private CallControlScope activeCallControlScope;
|
private CallControlScope activeCallControlScope;
|
||||||
private CallViewModel activeCallViewModel;
|
private CallViewModel activeCallViewModel;
|
||||||
@@ -228,6 +232,11 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
mainHandler.removeCallbacks(outgoingRingtoneRunnable);
|
mainHandler.removeCallbacks(outgoingRingtoneRunnable);
|
||||||
mainHandler.postDelayed(outgoingRingtoneRunnable, 1500);
|
mainHandler.postDelayed(outgoingRingtoneRunnable, 1500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pendingMediaCapture) {
|
||||||
|
pendingMediaCapture = false;
|
||||||
|
callService.startMediaCapture();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,6 +345,10 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
return isFrontCamera;
|
return isFrontCamera;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LiveData<Boolean> getMediaCaptureReady() {
|
||||||
|
return mediaCaptureReady;
|
||||||
|
}
|
||||||
|
|
||||||
// State Update Methods (CallService)
|
// State Update Methods (CallService)
|
||||||
|
|
||||||
public void updateConnectionState(PeerConnection.PeerConnectionState state) {
|
public void updateConnectionState(PeerConnection.PeerConnectionState state) {
|
||||||
@@ -375,6 +388,11 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
isFrontCamera.postValue(front);
|
isFrontCamera.postValue(front);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateMediaCaptureReady(boolean ready) {
|
||||||
|
Log.d(TAG, "updateMediaCaptureReady: " + ready);
|
||||||
|
mediaCaptureReady.postValue(ready);
|
||||||
|
}
|
||||||
|
|
||||||
public void reportError(String error) {
|
public void reportError(String error) {
|
||||||
Log.e(TAG, "reportError: " + error);
|
Log.e(TAG, "reportError: " + error);
|
||||||
errorMessage.postValue(error);
|
errorMessage.postValue(error);
|
||||||
@@ -387,7 +405,8 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
if (callService != null) {
|
if (callService != null) {
|
||||||
callService.startMediaCapture();
|
callService.startMediaCapture();
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "Cannot start media capture, service not ready");
|
Log.d(TAG, "Service not ready, deferring media capture");
|
||||||
|
pendingMediaCapture = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -651,11 +670,17 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
public synchronized void setVideoEnabled(boolean enabled) {
|
public synchronized void setVideoEnabled(boolean enabled) {
|
||||||
Log.d(TAG, "setVideoEnabled: " + enabled);
|
Log.d(TAG, "setVideoEnabled: " + enabled);
|
||||||
|
|
||||||
|
if (callService != null) {
|
||||||
|
boolean success = callService.setVideoEnabled(enabled);
|
||||||
|
if (!success && enabled) {
|
||||||
|
enabled = false;
|
||||||
|
reportError("Camera unavailable");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
localVideoEnabled.postValue(enabled);
|
localVideoEnabled.postValue(enabled);
|
||||||
|
|
||||||
if (callService != null) {
|
if (callService != null) {
|
||||||
callService.setVideoEnabled(enabled);
|
|
||||||
|
|
||||||
callService.sendMutedState(Boolean.TRUE.equals(localAudioEnabled.getValue()), enabled);
|
callService.sendMutedState(Boolean.TRUE.equals(localAudioEnabled.getValue()), enabled);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -875,32 +900,15 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
int accId, int callId, String offerSdp, boolean startsWithVideo) {
|
int accId, int callId, String offerSdp, boolean startsWithVideo) {
|
||||||
Log.d(TAG, "onIncomingCall: accId=" + accId + ", callId=" + callId);
|
Log.d(TAG, "onIncomingCall: accId=" + accId + ", callId=" + callId);
|
||||||
|
|
||||||
if (hasActiveCall()) {
|
Pair<DcChat, String> result = setupIncomingCallState(accId, callId, offerSdp, startsWithVideo);
|
||||||
Log.w(TAG, "Already have an active call, ignoring incoming call");
|
if (result == null) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
resetLiveDataForNewCall();
|
DcChat dcChat = result.first;
|
||||||
|
String callerName = result.second;
|
||||||
this.activeAccId = accId;
|
|
||||||
this.activeCallId = callId;
|
|
||||||
this.isIncomingCall = true;
|
|
||||||
this.startsWithVideo = startsWithVideo;
|
|
||||||
this.pendingOfferSdp = offerSdp;
|
|
||||||
|
|
||||||
// Get caller info
|
|
||||||
DcContext dcContext = ApplicationContext.getDcAccounts().getAccount(accId);
|
|
||||||
int chatId = dcContext.getMsg(callId).getChatId();
|
|
||||||
this.activeChatId = chatId;
|
|
||||||
DcChat dcChat = dcContext.getChat(chatId);
|
|
||||||
String callerName = getNameFromChat(dcChat);
|
|
||||||
Icon callerIcon = getIconFromChat(this.appContext, dcChat);
|
Icon callerIcon = getIconFromChat(this.appContext, dcChat);
|
||||||
|
|
||||||
displayName.postValue(callerName);
|
|
||||||
displayIcon.postValue(callerIcon);
|
displayIcon.postValue(callerIcon);
|
||||||
|
|
||||||
this.preferredStartingEndpoint = getPreferredStartingEndpoint(startsWithVideo);
|
|
||||||
|
|
||||||
// Add to CallsManager
|
// Add to CallsManager
|
||||||
CallAttributesCompat callAttributes = createCallAttributes(callerName, callId, true);
|
CallAttributesCompat callAttributes = createCallAttributes(callerName, callId, true);
|
||||||
addCallToTelecom(callAttributes, callerName, callerIcon);
|
addCallToTelecom(callAttributes, callerName, callerIcon);
|
||||||
@@ -911,6 +919,37 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
startAndBindService();
|
startAndBindService();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized void handleIncomingCallFromConversation(
|
||||||
|
int accId, int callId, String offerSdp, boolean hasVideo) {
|
||||||
|
Log.d(TAG, "handleIncomingCallFromConversation: accId=" + accId + ", callId=" + callId);
|
||||||
|
|
||||||
|
if (offerSdp == null || offerSdp.isEmpty()) {
|
||||||
|
Log.e(TAG, "Cannot start incoming call: no SDP offer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pair<DcChat, String> result = setupIncomingCallState(accId, callId, offerSdp, hasVideo);
|
||||||
|
if (result == null) return;
|
||||||
|
|
||||||
|
DcChat dcChat = result.first;
|
||||||
|
String callerName = result.second;
|
||||||
|
|
||||||
|
new Thread(
|
||||||
|
() -> {
|
||||||
|
Icon callerIcon = getIconFromChat(this.appContext, dcChat);
|
||||||
|
displayIcon.postValue(callerIcon);
|
||||||
|
})
|
||||||
|
.start();
|
||||||
|
|
||||||
|
// Add to CallsManager
|
||||||
|
CallAttributesCompat callAttributes = createCallAttributes(callerName, callId, true);
|
||||||
|
addCallToTelecom(callAttributes, callerName, null);
|
||||||
|
|
||||||
|
startAndBindService();
|
||||||
|
|
||||||
|
launchCallActivity();
|
||||||
|
}
|
||||||
|
|
||||||
private synchronized void onIncomingCallAccepted(int callId, boolean fromThisDevice) {
|
private synchronized void onIncomingCallAccepted(int callId, boolean fromThisDevice) {
|
||||||
Log.d(TAG, "onIncomingCallAccepted: callId=" + callId + ", fromThisDevice=" + fromThisDevice);
|
Log.d(TAG, "onIncomingCallAccepted: callId=" + callId + ", fromThisDevice=" + fromThisDevice);
|
||||||
|
|
||||||
@@ -1129,6 +1168,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
this.pendingOfferSdp = null;
|
this.pendingOfferSdp = null;
|
||||||
this.hasNotifiedBackend = false;
|
this.hasNotifiedBackend = false;
|
||||||
this.hasAutoSelectedEarpiece = false;
|
this.hasAutoSelectedEarpiece = false;
|
||||||
|
this.pendingMediaCapture = false;
|
||||||
|
|
||||||
mainHandler.removeCallbacks(outgoingRingtoneRunnable);
|
mainHandler.removeCallbacks(outgoingRingtoneRunnable);
|
||||||
|
|
||||||
@@ -1194,6 +1234,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
private void resetLiveDataForNewCall() {
|
private void resetLiveDataForNewCall() {
|
||||||
connectionState.postValue(PeerConnection.PeerConnectionState.NEW);
|
connectionState.postValue(PeerConnection.PeerConnectionState.NEW);
|
||||||
answeredElsewhere.postValue(false); // clearLiveData() must not reset answeredElsewhere
|
answeredElsewhere.postValue(false); // clearLiveData() must not reset answeredElsewhere
|
||||||
|
mediaCaptureReady.postValue(false);
|
||||||
clearLiveData();
|
clearLiveData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1209,6 +1250,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
outgoingCallPlaced.postValue(false);
|
outgoingCallPlaced.postValue(false);
|
||||||
currentAudioEndpoint.postValue(null);
|
currentAudioEndpoint.postValue(null);
|
||||||
availableAudioEndpoints.postValue(null);
|
availableAudioEndpoints.postValue(null);
|
||||||
|
mediaCaptureReady.postValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void initiateOutgoingCall(int accId, int chatId, boolean startsWithVideo) {
|
public synchronized void initiateOutgoingCall(int accId, int chatId, boolean startsWithVideo) {
|
||||||
@@ -1219,16 +1261,6 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check microphone permission
|
|
||||||
if (!hasMicrophonePermission()) {
|
|
||||||
Log.e(TAG, "Microphone permission not granted");
|
|
||||||
|
|
||||||
Intent intent = new Intent(appContext, CallActivity.class);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
|
||||||
appContext.startActivity(intent);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
resetLiveDataForNewCall();
|
resetLiveDataForNewCall();
|
||||||
|
|
||||||
this.activeCallId = -1; // Placeholder call ID for Intent
|
this.activeCallId = -1; // Placeholder call ID for Intent
|
||||||
@@ -1254,7 +1286,9 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
|
|
||||||
this.preferredStartingEndpoint = getPreferredStartingEndpoint(startsWithVideo);
|
this.preferredStartingEndpoint = getPreferredStartingEndpoint(startsWithVideo);
|
||||||
|
|
||||||
startAndBindService();
|
if (hasMicrophonePermission()) {
|
||||||
|
startAndBindService();
|
||||||
|
}
|
||||||
|
|
||||||
launchCallActivity();
|
launchCallActivity();
|
||||||
}
|
}
|
||||||
@@ -1286,6 +1320,43 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate {
|
|||||||
addCallToTelecom(callAttributes, calleeName, calleeIcon);
|
addCallToTelecom(callAttributes, calleeName, calleeIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Pair<DcChat, String> setupIncomingCallState(
|
||||||
|
int accId, int callId, String offerSdp, boolean startsWithVideo) {
|
||||||
|
if (hasActiveCall()) {
|
||||||
|
Log.w(TAG, "Already have an active call, ignoring incoming call");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
resetLiveDataForNewCall();
|
||||||
|
|
||||||
|
this.activeAccId = accId;
|
||||||
|
this.activeCallId = callId;
|
||||||
|
this.isIncomingCall = true;
|
||||||
|
this.startsWithVideo = startsWithVideo;
|
||||||
|
this.pendingOfferSdp = offerSdp;
|
||||||
|
|
||||||
|
DcContext dcContext = ApplicationContext.getDcAccounts().getAccount(accId);
|
||||||
|
int chatId = dcContext.getMsg(callId).getChatId();
|
||||||
|
this.activeChatId = chatId;
|
||||||
|
DcChat dcChat = dcContext.getChat(chatId);
|
||||||
|
String callerName = getNameFromChat(dcChat);
|
||||||
|
|
||||||
|
displayName.postValue(callerName);
|
||||||
|
|
||||||
|
this.preferredStartingEndpoint = getPreferredStartingEndpoint(startsWithVideo);
|
||||||
|
|
||||||
|
return new Pair<>(dcChat, callerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void ensureServiceStarted() {
|
||||||
|
if (isServiceBound || !hasActiveCall()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log.d(TAG, "Starting service after permission grant");
|
||||||
|
startAndBindService();
|
||||||
|
}
|
||||||
|
|
||||||
private void addCallToTelecom(
|
private void addCallToTelecom(
|
||||||
CallAttributesCompat callAttributes, String displayName, Icon icon) {
|
CallAttributesCompat callAttributes, String displayName, Icon icon) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -126,13 +126,13 @@ public class CallService extends Service implements WebRTCClient.Callbacks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start camera/microphone capture
|
* Start media capture
|
||||||
*
|
*
|
||||||
* <p>Must be called when app is in foreground. Called by coordinator when ViewModel/Activity is
|
* <p>Must be called when app is in foreground. Called by coordinator when ViewModel/Activity is
|
||||||
* ready.
|
* ready.
|
||||||
*/
|
*/
|
||||||
public void startMediaCapture() {
|
public void startMediaCapture() {
|
||||||
Log.d(TAG, "startMediaCapture (Camera/Microphone)");
|
Log.d(TAG, "startMediaCapture");
|
||||||
|
|
||||||
if (webRTCClient != null && webRTCClient.hasLocalMediaStream()) {
|
if (webRTCClient != null && webRTCClient.hasLocalMediaStream()) {
|
||||||
Log.w(TAG, "Media already initialized, skipping");
|
Log.w(TAG, "Media already initialized, skipping");
|
||||||
@@ -153,7 +153,7 @@ public class CallService extends Service implements WebRTCClient.Callbacks {
|
|||||||
|
|
||||||
boolean startsWithVideo = callCoordinator.isStartsWithVideo();
|
boolean startsWithVideo = callCoordinator.isStartsWithVideo();
|
||||||
|
|
||||||
Log.d(TAG, "Creating media stream with video: " + startsWithVideo);
|
Log.d(TAG, "Creating media stream");
|
||||||
|
|
||||||
mediaStreamManager.createMediaStream(
|
mediaStreamManager.createMediaStream(
|
||||||
new MediaStreamManager.Callback() {
|
new MediaStreamManager.Callback() {
|
||||||
@@ -163,31 +163,22 @@ public class CallService extends Service implements WebRTCClient.Callbacks {
|
|||||||
|
|
||||||
webRTCClient.setLocalMediaStream(stream);
|
webRTCClient.setLocalMediaStream(stream);
|
||||||
|
|
||||||
callCoordinator.updateFrontCamera(mediaStreamManager.isFrontCamera());
|
|
||||||
|
|
||||||
callCoordinator.setVideoEnabled(startsWithVideo);
|
|
||||||
|
|
||||||
if (!stream.videoTracks.isEmpty()) {
|
if (!stream.videoTracks.isEmpty()) {
|
||||||
VideoTrack localTrack = stream.videoTracks.get(0);
|
VideoTrack localTrack = stream.videoTracks.get(0);
|
||||||
callCoordinator.updateLocalVideoTrack(localTrack);
|
callCoordinator.updateLocalVideoTrack(localTrack);
|
||||||
} else {
|
|
||||||
Log.w(TAG, "No video track in stream, call will be audio-only");
|
|
||||||
if (startsWithVideo) {
|
|
||||||
callCoordinator.reportError("Camera unavailable, using audio only");
|
|
||||||
}
|
|
||||||
callCoordinator.setVideoEnabled(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
callCoordinator.setVideoEnabled(startsWithVideo);
|
||||||
|
|
||||||
|
callCoordinator.updateMediaCaptureReady(true);
|
||||||
|
|
||||||
Log.d(TAG, "Media capture complete, ready for call");
|
Log.d(TAG, "Media capture complete, ready for call");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(String error) {
|
public void onError(String error) {
|
||||||
Log.e(TAG, "Failed to setup media: " + error);
|
Log.e(TAG, "Failed to setup media: " + error);
|
||||||
if (startsWithVideo) {
|
callCoordinator.reportError("Camera/microphone error: " + error);
|
||||||
callCoordinator.reportError("Camera/microphone error: " + error);
|
|
||||||
}
|
|
||||||
callCoordinator.setVideoEnabled(false);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -395,12 +386,30 @@ public class CallService extends Service implements WebRTCClient.Callbacks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setVideoEnabled(boolean enabled) {
|
public boolean setVideoEnabled(boolean enabled) {
|
||||||
Log.d(TAG, "setVideoEnabled: " + enabled);
|
Log.d(TAG, "setVideoEnabled: " + enabled);
|
||||||
|
|
||||||
if (webRTCClient != null) {
|
if (enabled) {
|
||||||
webRTCClient.setVideoEnabled(enabled);
|
if (mediaStreamManager != null) {
|
||||||
|
boolean captureReady = mediaStreamManager.startVideoCapture();
|
||||||
|
if (!captureReady) {
|
||||||
|
Log.w(TAG, "Failed to start video capture");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
callCoordinator.updateFrontCamera(mediaStreamManager.isFrontCamera());
|
||||||
|
}
|
||||||
|
if (webRTCClient != null) {
|
||||||
|
webRTCClient.setVideoEnabled(true);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (webRTCClient != null) {
|
||||||
|
webRTCClient.setVideoEnabled(false);
|
||||||
|
}
|
||||||
|
if (mediaStreamManager != null) {
|
||||||
|
mediaStreamManager.stopVideoCapture();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendMutedState(boolean audioEnabled, boolean videoEnabled) {
|
public void sendMutedState(boolean audioEnabled, boolean videoEnabled) {
|
||||||
|
|||||||
@@ -5,13 +5,18 @@ import android.content.Intent;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.graphics.drawable.Icon;
|
import android.graphics.drawable.Icon;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.Network;
|
||||||
|
import android.net.NetworkCapabilities;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.core.telecom.CallEndpointCompat;
|
import androidx.core.telecom.CallEndpointCompat;
|
||||||
import com.b44t.messenger.DcChat;
|
import com.b44t.messenger.DcChat;
|
||||||
|
import com.b44t.messenger.DcContext;
|
||||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
@@ -52,8 +57,22 @@ public class CallUtil {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int accId = DcHelper.getContext(context).getAccountId();
|
Runnable proceedWithCall =
|
||||||
coordinator.initiateOutgoingCall(accId, chatId, startsWithVideo);
|
() -> {
|
||||||
|
int accId = DcHelper.getContext(context).getAccountId();
|
||||||
|
coordinator.initiateOutgoingCall(accId, chatId, startsWithVideo);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!isNetworkAvailable(context)) {
|
||||||
|
new AlertDialog.Builder(context)
|
||||||
|
.setMessage(context.getString(R.string.call_requires_connection))
|
||||||
|
.setPositiveButton(R.string.perm_continue, (dialog, which) -> proceedWithCall.run())
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
proceedWithCall.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -138,4 +157,24 @@ public class CallUtil {
|
|||||||
}
|
}
|
||||||
return iconRes;
|
return iconRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||||
|
private static boolean isNetworkAvailable(Context context) {
|
||||||
|
ConnectivityManager manager =
|
||||||
|
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
if (manager == null) return true;
|
||||||
|
|
||||||
|
boolean networkAvailable = false;
|
||||||
|
Network network = manager.getActiveNetwork();
|
||||||
|
if (network != null) {
|
||||||
|
NetworkCapabilities caps = manager.getNetworkCapabilities(network);
|
||||||
|
networkAvailable =
|
||||||
|
caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean serverConnected =
|
||||||
|
DcHelper.getContext(context).getConnectivity() >= DcContext.DC_CONNECTIVITY_WORKING;
|
||||||
|
|
||||||
|
return networkAvailable || serverConnected;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ public class CallViewModel extends AndroidViewModel {
|
|||||||
private final MediatorLiveData<CallState> callState;
|
private final MediatorLiveData<CallState> callState;
|
||||||
|
|
||||||
// Observer References for one-time observe
|
// Observer References for one-time observe
|
||||||
private Observer<VideoTrack> answerCallObserver;
|
private Observer<Boolean> answerCallObserver;
|
||||||
private Observer<VideoTrack> startOutgoingCallObserver;
|
private Observer<Boolean> startOutgoingCallObserver;
|
||||||
|
|
||||||
private final AtomicBoolean hasCallEnded = new AtomicBoolean(false);
|
private final AtomicBoolean hasCallEnded = new AtomicBoolean(false);
|
||||||
|
|
||||||
@@ -211,25 +211,24 @@ public class CallViewModel extends AndroidViewModel {
|
|||||||
callCoordinator.startMediaCapture();
|
callCoordinator.startMediaCapture();
|
||||||
|
|
||||||
// Create one-time observer
|
// Create one-time observer
|
||||||
LiveData<VideoTrack> localTrack = callCoordinator.getLocalVideoTrack();
|
LiveData<Boolean> mediaReady = callCoordinator.getMediaCaptureReady();
|
||||||
|
|
||||||
answerCallObserver =
|
answerCallObserver =
|
||||||
new Observer<VideoTrack>() {
|
new Observer<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public void onChanged(VideoTrack videoTrack) {
|
public void onChanged(Boolean ready) {
|
||||||
if (videoTrack != null) {
|
if (Boolean.TRUE.equals(ready)) {
|
||||||
// Media is ready, remove observer
|
mediaReady.removeObserver(this);
|
||||||
localTrack.removeObserver(this);
|
|
||||||
answerCallObserver = null;
|
answerCallObserver = null;
|
||||||
|
|
||||||
Log.d(TAG, "Local video ready, answering call (WebRTC)");
|
Log.d(TAG, "Media capture ready, answering call (WebRTC)");
|
||||||
|
|
||||||
callCoordinator.answerWebRTC();
|
callCoordinator.answerWebRTC();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
localTrack.observeForever(answerCallObserver);
|
mediaReady.observeForever(answerCallObserver);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Start outgoing call with media capture Called by Activity for outgoing calls */
|
/** Start outgoing call with media capture Called by Activity for outgoing calls */
|
||||||
@@ -244,30 +243,28 @@ public class CallViewModel extends AndroidViewModel {
|
|||||||
callCoordinator.startMediaCapture();
|
callCoordinator.startMediaCapture();
|
||||||
|
|
||||||
// Create one-time observer
|
// Create one-time observer
|
||||||
LiveData<VideoTrack> localTrack = callCoordinator.getLocalVideoTrack();
|
LiveData<Boolean> mediaReady = callCoordinator.getMediaCaptureReady();
|
||||||
VideoTrack currentValue = localTrack.getValue();
|
|
||||||
|
|
||||||
if (currentValue != null) {
|
if (Boolean.TRUE.equals(mediaReady.getValue())) {
|
||||||
Log.d(TAG, "Media already ready, starting call immediately");
|
Log.d(TAG, "Media already ready, starting call immediately");
|
||||||
callCoordinator.startOutgoingCall();
|
callCoordinator.startOutgoingCall();
|
||||||
} else {
|
} else {
|
||||||
startOutgoingCallObserver =
|
startOutgoingCallObserver =
|
||||||
new Observer<VideoTrack>() {
|
new Observer<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public void onChanged(VideoTrack videoTrack) {
|
public void onChanged(Boolean ready) {
|
||||||
if (videoTrack != null) {
|
if (Boolean.TRUE.equals(ready)) {
|
||||||
// Media is ready, remove observer
|
mediaReady.removeObserver(this);
|
||||||
localTrack.removeObserver(this);
|
|
||||||
startOutgoingCallObserver = null;
|
startOutgoingCallObserver = null;
|
||||||
|
|
||||||
Log.d(TAG, "Local video ready, starting outgoing call");
|
Log.d(TAG, "Media capture ready, starting outgoing call");
|
||||||
|
|
||||||
callCoordinator.startOutgoingCall();
|
callCoordinator.startOutgoingCall();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
localTrack.observeForever(startOutgoingCallObserver);
|
mediaReady.observeForever(startOutgoingCallObserver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -460,12 +457,12 @@ public class CallViewModel extends AndroidViewModel {
|
|||||||
Log.d(TAG, "CallViewModel cleared");
|
Log.d(TAG, "CallViewModel cleared");
|
||||||
|
|
||||||
if (answerCallObserver != null) {
|
if (answerCallObserver != null) {
|
||||||
callCoordinator.getLocalVideoTrack().removeObserver(answerCallObserver);
|
callCoordinator.getMediaCaptureReady().removeObserver(answerCallObserver);
|
||||||
answerCallObserver = null;
|
answerCallObserver = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startOutgoingCallObserver != null) {
|
if (startOutgoingCallObserver != null) {
|
||||||
callCoordinator.getLocalVideoTrack().removeObserver(startOutgoingCallObserver);
|
callCoordinator.getMediaCaptureReady().removeObserver(startOutgoingCallObserver);
|
||||||
startOutgoingCallObserver = null;
|
startOutgoingCallObserver = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ public class MediaStreamManager {
|
|||||||
private static final String AUDIO_TRACK_ID = "audio_track";
|
private static final String AUDIO_TRACK_ID = "audio_track";
|
||||||
private static final String VIDEO_TRACK_ID = "video_track";
|
private static final String VIDEO_TRACK_ID = "video_track";
|
||||||
|
|
||||||
|
private static final int VIDEO_WIDTH = 1280;
|
||||||
|
private static final int VIDEO_HEIGHT = 720;
|
||||||
|
private static final int VIDEO_FPS = 30;
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final PeerConnectionFactory peerConnectionFactory;
|
private final PeerConnectionFactory peerConnectionFactory;
|
||||||
|
|
||||||
@@ -37,6 +41,7 @@ public class MediaStreamManager {
|
|||||||
private AudioSource audioSource;
|
private AudioSource audioSource;
|
||||||
private SurfaceTextureHelper surfaceTextureHelper;
|
private SurfaceTextureHelper surfaceTextureHelper;
|
||||||
private volatile boolean isFrontCamera = true;
|
private volatile boolean isFrontCamera = true;
|
||||||
|
private volatile boolean isCapturing = false;
|
||||||
|
|
||||||
public interface Callback {
|
public interface Callback {
|
||||||
void onMediaStreamReady(MediaStream stream);
|
void onMediaStreamReady(MediaStream stream);
|
||||||
@@ -56,9 +61,8 @@ public class MediaStreamManager {
|
|||||||
this.peerConnectionFactory = peerConnectionFactory;
|
this.peerConnectionFactory = peerConnectionFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create media stream with audio and optionally video */
|
/** Create a media stream with an audio track and a video track. */
|
||||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
public synchronized void createMediaStream(Callback callback) {
|
||||||
public void createMediaStream(Callback callback) {
|
|
||||||
try {
|
try {
|
||||||
MediaStream mediaStream = peerConnectionFactory.createLocalMediaStream(STREAM_ID);
|
MediaStream mediaStream = peerConnectionFactory.createLocalMediaStream(STREAM_ID);
|
||||||
|
|
||||||
@@ -68,24 +72,11 @@ public class MediaStreamManager {
|
|||||||
AudioTrack audioTrack = peerConnectionFactory.createAudioTrack(AUDIO_TRACK_ID, audioSource);
|
AudioTrack audioTrack = peerConnectionFactory.createAudioTrack(AUDIO_TRACK_ID, audioSource);
|
||||||
mediaStream.addTrack(audioTrack);
|
mediaStream.addTrack(audioTrack);
|
||||||
|
|
||||||
// Create video track
|
// Create video source and track
|
||||||
videoCapturer = createVideoCapturer();
|
videoSource = peerConnectionFactory.createVideoSource(false);
|
||||||
if (videoCapturer == null) {
|
|
||||||
callback.onError("No camera available");
|
|
||||||
callback.onMediaStreamReady(mediaStream);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
videoSource = peerConnectionFactory.createVideoSource(videoCapturer.isScreencast());
|
|
||||||
VideoTrack videoTrack = peerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, videoSource);
|
VideoTrack videoTrack = peerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, videoSource);
|
||||||
mediaStream.addTrack(videoTrack);
|
mediaStream.addTrack(videoTrack);
|
||||||
|
|
||||||
// Start capturing
|
|
||||||
surfaceTextureHelper =
|
|
||||||
SurfaceTextureHelper.create("CaptureThread", EglUtils.getEglBase().getEglBaseContext());
|
|
||||||
videoCapturer.initialize(surfaceTextureHelper, context, videoSource.getCapturerObserver());
|
|
||||||
videoCapturer.startCapture(1280, 720, 30);
|
|
||||||
|
|
||||||
callback.onMediaStreamReady(mediaStream);
|
callback.onMediaStreamReady(mediaStream);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -94,6 +85,62 @@ public class MediaStreamManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the camera and start sending frames to VideoSource.
|
||||||
|
*
|
||||||
|
* @return true if the camera is capturing, false if it could not be started
|
||||||
|
*/
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||||
|
public synchronized boolean startVideoCapture() {
|
||||||
|
if (isCapturing) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (videoSource == null) {
|
||||||
|
Log.e(TAG, "VideoSource not initialized");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (videoCapturer == null) {
|
||||||
|
videoCapturer = createVideoCapturer();
|
||||||
|
if (videoCapturer == null) {
|
||||||
|
Log.w(TAG, "Cannot start video capture: no camera available");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (surfaceTextureHelper == null) {
|
||||||
|
surfaceTextureHelper =
|
||||||
|
SurfaceTextureHelper.create("CaptureThread", EglUtils.getEglBase().getEglBaseContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
videoCapturer.initialize(surfaceTextureHelper, context, videoSource.getCapturerObserver());
|
||||||
|
}
|
||||||
|
|
||||||
|
videoCapturer.startCapture(VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_FPS);
|
||||||
|
isCapturing = true;
|
||||||
|
Log.d(TAG, "Video capture started");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Stop the camera. The capturer is kept alive. */
|
||||||
|
public synchronized void stopVideoCapture() {
|
||||||
|
if (!isCapturing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (videoCapturer != null) {
|
||||||
|
try {
|
||||||
|
videoCapturer.stopCapture();
|
||||||
|
Log.d(TAG, "Video capture stopped");
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Log.e(TAG, "Interrupted while stopping capture", e);
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isCapturing = false;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private VideoCapturer createVideoCapturer() {
|
private VideoCapturer createVideoCapturer() {
|
||||||
if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
|
if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
|
||||||
@@ -129,6 +176,14 @@ public class MediaStreamManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void switchCamera(@Nullable CameraSwitchCallback callback) {
|
public void switchCamera(@Nullable CameraSwitchCallback callback) {
|
||||||
|
if (!isCapturing) {
|
||||||
|
Log.w(TAG, "Cannot switch camera while not capturing");
|
||||||
|
if (callback != null) {
|
||||||
|
callback.onError("Camera not active");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(videoCapturer instanceof CameraVideoCapturer)) {
|
if (!(videoCapturer instanceof CameraVideoCapturer)) {
|
||||||
Log.e(TAG, "switchCamera called but videoCapturer is not a CameraVideoCapturer");
|
Log.e(TAG, "switchCamera called but videoCapturer is not a CameraVideoCapturer");
|
||||||
return;
|
return;
|
||||||
@@ -186,10 +241,12 @@ public class MediaStreamManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Cleanup resources */
|
/** Cleanup resources */
|
||||||
public void dispose() {
|
public synchronized void dispose() {
|
||||||
if (videoCapturer != null) {
|
if (videoCapturer != null) {
|
||||||
try {
|
try {
|
||||||
videoCapturer.stopCapture();
|
if (isCapturing) {
|
||||||
|
videoCapturer.stopCapture();
|
||||||
|
}
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
Log.e(TAG, "Error stopping capture", e);
|
Log.e(TAG, "Error stopping capture", e);
|
||||||
}
|
}
|
||||||
@@ -197,6 +254,8 @@ public class MediaStreamManager {
|
|||||||
videoCapturer = null;
|
videoCapturer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isCapturing = false;
|
||||||
|
|
||||||
if (surfaceTextureHelper != null) {
|
if (surfaceTextureHelper != null) {
|
||||||
surfaceTextureHelper.dispose();
|
surfaceTextureHelper.dispose();
|
||||||
surfaceTextureHelper = null;
|
surfaceTextureHelper = null;
|
||||||
|
|||||||
@@ -92,6 +92,10 @@ public class AttachmentTypeSelector extends PopupWindow {
|
|||||||
ViewUtil.findById(layout, R.id.location_linear_layout).setVisibility(View.GONE);
|
ViewUtil.findById(layout, R.id.location_linear_layout).setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DcHelper.getContext(context).getChat(chatId).isOutBroadcast()) {
|
||||||
|
ViewUtil.findById(layout, R.id.webxdc_linear_layout).setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
setLocationButtonImage(context);
|
setLocationButtonImage(context);
|
||||||
|
|
||||||
setContentView(layout);
|
setContentView(layout);
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.components;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.viewpager.widget.ViewPager;
|
|
||||||
import org.thoughtcrime.securesms.components.viewpager.HackyViewPager;
|
|
||||||
|
|
||||||
/** An implementation of {@link ViewPager} that disables swiping when the view is disabled. */
|
|
||||||
public class ControllableViewPager extends HackyViewPager {
|
|
||||||
|
|
||||||
public ControllableViewPager(@NonNull Context context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ControllableViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent ev) {
|
|
||||||
return isEnabled() && super.onTouchEvent(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
|
||||||
return isEnabled() && super.onInterceptTouchEvent(ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+109
-36
@@ -6,15 +6,19 @@ import android.net.Uri;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
import androidx.lifecycle.ViewModel;
|
import androidx.lifecycle.ViewModel;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
|
import androidx.media3.common.PlaybackException;
|
||||||
import androidx.media3.common.Player;
|
import androidx.media3.common.Player;
|
||||||
import androidx.media3.session.MediaController;
|
import androidx.media3.session.MediaController;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
@@ -34,6 +38,8 @@ public class AudioPlaybackViewModel extends ViewModel {
|
|||||||
private final ExecutorService extractionExecutor = Executors.newFixedThreadPool(2);
|
private final ExecutorService extractionExecutor = Executors.newFixedThreadPool(2);
|
||||||
|
|
||||||
private @Nullable MediaController mediaController;
|
private @Nullable MediaController mediaController;
|
||||||
|
private @Nullable ChatAudioQueueProvider queueProvider;
|
||||||
|
private @Nullable Player.Listener playerListener;
|
||||||
private final Handler handler;
|
private final Handler handler;
|
||||||
private boolean isUserSeeking = false;
|
private boolean isUserSeeking = false;
|
||||||
|
|
||||||
@@ -47,6 +53,11 @@ public class AudioPlaybackViewModel extends ViewModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setMediaController(@Nullable MediaController controller) {
|
public void setMediaController(@Nullable MediaController controller) {
|
||||||
|
if (this.mediaController != null && playerListener != null) {
|
||||||
|
this.mediaController.removeListener(playerListener);
|
||||||
|
}
|
||||||
|
playerListener = null;
|
||||||
|
|
||||||
this.mediaController = controller;
|
this.mediaController = controller;
|
||||||
if (mediaController != null && mediaController.isPlaying()) {
|
if (mediaController != null && mediaController.isPlaying()) {
|
||||||
startUpdateProgress();
|
startUpdateProgress();
|
||||||
@@ -59,30 +70,41 @@ public class AudioPlaybackViewModel extends ViewModel {
|
|||||||
public void loadAudioAndPlay(int msgId, Uri audioUri) {
|
public void loadAudioAndPlay(int msgId, Uri audioUri) {
|
||||||
if (mediaController == null) return;
|
if (mediaController == null) return;
|
||||||
|
|
||||||
// Set media item if we have a different audio.
|
String mediaId = String.valueOf(msgId);
|
||||||
if (isDifferentAudio(msgId, audioUri)) {
|
|
||||||
updateState(msgId, audioUri, AudioPlaybackState.PlaybackStatus.LOADING, 0, 0);
|
|
||||||
|
|
||||||
MediaItem mediaItem =
|
MediaItem current = mediaController.getCurrentMediaItem();
|
||||||
new MediaItem.Builder().setMediaId(String.valueOf(msgId)).setUri(audioUri).build();
|
if (current != null && mediaId.equals(current.mediaId)) {
|
||||||
mediaController.setMediaItem(mediaItem);
|
mediaController.play();
|
||||||
mediaController.prepare();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
play(msgId, audioUri);
|
updateState(msgId, audioUri, AudioPlaybackState.PlaybackStatus.LOADING, 0, 0);
|
||||||
|
|
||||||
|
List<MediaItem> items = null;
|
||||||
|
int startIndex = -1;
|
||||||
|
|
||||||
|
if (queueProvider != null) {
|
||||||
|
items = queueProvider.buildAudioQueue();
|
||||||
|
startIndex = indexOfMediaId(items, mediaId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startIndex < 0) {
|
||||||
|
items =
|
||||||
|
Collections.singletonList(
|
||||||
|
new MediaItem.Builder().setMediaId(mediaId).setUri(audioUri).build());
|
||||||
|
startIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mediaController.setMediaItems(items, startIndex, 0);
|
||||||
|
mediaController.prepare();
|
||||||
|
mediaController.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSameAudio(int msgId, Uri audioUri) {
|
private static int indexOfMediaId(List<MediaItem> items, String mediaId) {
|
||||||
return !isDifferentAudio(msgId, audioUri);
|
for (int i = 0; i < items.size(); i++) {
|
||||||
}
|
if (mediaId.equals(items.get(i).mediaId)) return i;
|
||||||
|
}
|
||||||
private boolean isDifferentAudio(int msgId, Uri audioUri) {
|
return -1;
|
||||||
AudioPlaybackState currentState = playbackState.getValue();
|
|
||||||
|
|
||||||
return currentState != null
|
|
||||||
&& (msgId != currentState.getMsgId()
|
|
||||||
|| currentState.getAudioUri() == null
|
|
||||||
|| currentState.getAudioUri() != null && !currentState.getAudioUri().equals(audioUri));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public LiveData<Map<Integer, Long>> getDurations() {
|
public LiveData<Map<Integer, Long>> getDurations() {
|
||||||
@@ -138,46 +160,72 @@ public class AudioPlaybackViewModel extends ViewModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void pause(int msgId, Uri audioUri) {
|
public void pause(int msgId) {
|
||||||
if (mediaController != null && isSameAudio(msgId, audioUri)) {
|
if (isCurrentItem(msgId)) {
|
||||||
mediaController.pause();
|
mediaController.pause();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void play(int msgId, Uri audioUri) {
|
public void play(int msgId) {
|
||||||
if (mediaController != null && isSameAudio(msgId, audioUri)) {
|
if (isCurrentItem(msgId)) {
|
||||||
mediaController.play();
|
mediaController.play();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void seekTo(long position, int msgId, Uri audioUri) {
|
public void seekTo(long position, int msgId) {
|
||||||
if (mediaController != null && isSameAudio(msgId, audioUri)) {
|
if (isCurrentItem(msgId)) {
|
||||||
mediaController.seekTo(position);
|
mediaController.seekTo(position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop(int msgId, Uri audioUri) {
|
public void stop(int msgId) {
|
||||||
if (mediaController != null && isSameAudio(msgId, audioUri)) {
|
if (isCurrentItem(msgId)) {
|
||||||
mediaController.stop();
|
mediaController.stop();
|
||||||
|
mediaController.clearMediaItems();
|
||||||
stopUpdateProgress();
|
stopUpdateProgress();
|
||||||
playbackState.setValue(AudioPlaybackState.idle());
|
playbackState.setValue(AudioPlaybackState.idle());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isCurrentItem(int msgId) {
|
||||||
|
if (mediaController == null) return false;
|
||||||
|
MediaItem current = mediaController.getCurrentMediaItem();
|
||||||
|
return current != null && String.valueOf(msgId).equals(current.mediaId);
|
||||||
|
}
|
||||||
|
|
||||||
public void stopNonMessageAudioPlayback() {
|
public void stopNonMessageAudioPlayback() {
|
||||||
stopByIds(NON_MESSAGE_AUDIO_MSG_ID);
|
stopByIds(NON_MESSAGE_AUDIO_MSG_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// A special method for deleting message, where we only use message Ids
|
// A special method for deleting message, where we only use message Ids
|
||||||
public void stopByIds(int... msgIds) {
|
public void stopByIds(int... msgIds) {
|
||||||
AudioPlaybackState currentState = playbackState.getValue();
|
if (mediaController == null) return;
|
||||||
|
|
||||||
if (mediaController != null && currentState != null) {
|
AudioPlaybackState currentState = playbackState.getValue();
|
||||||
|
boolean stoppedCurrent = false;
|
||||||
|
|
||||||
|
if (currentState != null) {
|
||||||
for (int msgId : msgIds) {
|
for (int msgId : msgIds) {
|
||||||
if (msgId == currentState.getMsgId()) {
|
if (msgId == currentState.getMsgId()) {
|
||||||
mediaController.stop();
|
mediaController.stop();
|
||||||
|
mediaController.clearMediaItems();
|
||||||
stopUpdateProgress();
|
stopUpdateProgress();
|
||||||
playbackState.setValue(AudioPlaybackState.idle());
|
playbackState.setValue(AudioPlaybackState.idle());
|
||||||
|
stoppedCurrent = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stoppedCurrent) {
|
||||||
|
Set<String> deletedMediaIds = new HashSet<>();
|
||||||
|
for (int msgId : msgIds) {
|
||||||
|
deletedMediaIds.add(String.valueOf(msgId));
|
||||||
|
}
|
||||||
|
for (int i = mediaController.getMediaItemCount() - 1; i >= 0; i--) {
|
||||||
|
MediaItem item = mediaController.getMediaItemAt(i);
|
||||||
|
if (deletedMediaIds.contains(item.mediaId)) {
|
||||||
|
mediaController.removeMediaItem(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -191,10 +239,10 @@ public class AudioPlaybackViewModel extends ViewModel {
|
|||||||
private void setupPlayerListener() {
|
private void setupPlayerListener() {
|
||||||
if (mediaController == null) return;
|
if (mediaController == null) return;
|
||||||
|
|
||||||
mediaController.addListener(
|
playerListener =
|
||||||
new Player.Listener() {
|
new Player.Listener() {
|
||||||
@Override
|
@Override
|
||||||
public void onEvents(Player player, Player.Events events) {
|
public void onEvents(@NonNull Player player, @NonNull Player.Events events) {
|
||||||
if (events.containsAny(Player.EVENT_IS_PLAYING_CHANGED)) {
|
if (events.containsAny(Player.EVENT_IS_PLAYING_CHANGED)) {
|
||||||
if (player.isPlaying()) {
|
if (player.isPlaying()) {
|
||||||
startUpdateProgress();
|
startUpdateProgress();
|
||||||
@@ -203,20 +251,40 @@ public class AudioPlaybackViewModel extends ViewModel {
|
|||||||
}
|
}
|
||||||
updateCurrentState(false);
|
updateCurrentState(false);
|
||||||
}
|
}
|
||||||
|
if (events.containsAny(Player.EVENT_MEDIA_ITEM_TRANSITION)) {
|
||||||
|
updateCurrentState(true);
|
||||||
|
}
|
||||||
if (events.containsAny(Player.EVENT_PLAYBACK_STATE_CHANGED)) {
|
if (events.containsAny(Player.EVENT_PLAYBACK_STATE_CHANGED)) {
|
||||||
if (player.getPlaybackState() == Player.STATE_READY) {
|
if (player.getPlaybackState() == Player.STATE_READY) {
|
||||||
updateCurrentState(false);
|
updateCurrentState(false);
|
||||||
} else if (player.getPlaybackState() == Player.STATE_ENDED) {
|
} else if (player.getPlaybackState() == Player.STATE_ENDED
|
||||||
// This is to prevent automatically playing after the audio
|
&& !player.hasNextMediaItem()) {
|
||||||
// has been play to the end once, then user dragged the seek bar again
|
|
||||||
mediaController.setPlayWhenReady(false);
|
mediaController.setPlayWhenReady(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (events.containsAny(Player.EVENT_PLAYER_ERROR)) {
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerError(@NonNull PlaybackException error) {
|
||||||
|
Log.w(
|
||||||
|
TAG,
|
||||||
|
"Playback error on msgId="
|
||||||
|
+ (mediaController.getCurrentMediaItem() != null
|
||||||
|
? mediaController.getCurrentMediaItem().mediaId
|
||||||
|
: "null"),
|
||||||
|
error);
|
||||||
|
|
||||||
|
if (mediaController.hasNextMediaItem()) {
|
||||||
|
mediaController.seekToNextMediaItem();
|
||||||
|
mediaController.prepare();
|
||||||
|
mediaController.play();
|
||||||
|
} else {
|
||||||
updateCurrentAudioState(AudioPlaybackState.PlaybackStatus.ERROR, 0, 0);
|
updateCurrentAudioState(AudioPlaybackState.PlaybackStatus.ERROR, 0, 0);
|
||||||
|
mediaController.clearMediaItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
mediaController.addListener(playerListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateCurrentState(boolean queryPlaying) {
|
private void updateCurrentState(boolean queryPlaying) {
|
||||||
@@ -285,6 +353,11 @@ public class AudioPlaybackViewModel extends ViewModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Playing Queue
|
||||||
|
public void setQueueProvider(@Nullable ChatAudioQueueProvider provider) {
|
||||||
|
this.queueProvider = provider;
|
||||||
|
}
|
||||||
|
|
||||||
// Progress tracking
|
// Progress tracking
|
||||||
private final Runnable progressRunnable =
|
private final Runnable progressRunnable =
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
|
|||||||
@@ -109,12 +109,12 @@ public class AudioView extends FrameLayout {
|
|||||||
|
|
||||||
AudioPlaybackState state = viewModel.getPlaybackState().getValue();
|
AudioPlaybackState state = viewModel.getPlaybackState().getValue();
|
||||||
|
|
||||||
if (state != null && msgId == state.getMsgId() && audioUri.equals(state.getAudioUri())) {
|
if (state != null && msgId == state.getMsgId()) {
|
||||||
// Same audio
|
// Same audio
|
||||||
if (state.getStatus() == AudioPlaybackState.PlaybackStatus.PLAYING) {
|
if (state.getStatus() == AudioPlaybackState.PlaybackStatus.PLAYING) {
|
||||||
viewModel.pause(msgId, audioUri);
|
viewModel.pause(msgId);
|
||||||
} else {
|
} else {
|
||||||
viewModel.play(msgId, audioUri);
|
viewModel.play(msgId);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Different audio
|
// Different audio
|
||||||
@@ -145,7 +145,7 @@ public class AudioView extends FrameLayout {
|
|||||||
@Override
|
@Override
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
viewModel.setUserSeeking(false);
|
viewModel.setUserSeeking(false);
|
||||||
viewModel.seekTo(seekBar.getProgress(), msgId, audioUri);
|
viewModel.seekTo(seekBar.getProgress(), msgId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -305,7 +305,7 @@ public class AudioView extends FrameLayout {
|
|||||||
if (audioUri == null || state == null) return;
|
if (audioUri == null || state == null) return;
|
||||||
|
|
||||||
// Check if this state is about this message
|
// Check if this state is about this message
|
||||||
boolean isThisMessage = msgId == state.getMsgId() && audioUri.equals(state.getAudioUri());
|
boolean isThisMessage = msgId == state.getMsgId();
|
||||||
|
|
||||||
if (isThisMessage) {
|
if (isThisMessage) {
|
||||||
updateUIForPlaybackState(state);
|
updateUIForPlaybackState(state);
|
||||||
@@ -340,13 +340,9 @@ public class AudioView extends FrameLayout {
|
|||||||
private void onDurationsChanged(Map<Integer, Long> durations) {
|
private void onDurationsChanged(Map<Integer, Long> durations) {
|
||||||
AudioPlaybackState state = viewModel.getPlaybackState().getValue();
|
AudioPlaybackState state = viewModel.getPlaybackState().getValue();
|
||||||
|
|
||||||
// When there is no playback happening, msgId can be -1 and audioUri is null
|
// When there is no playback happening, msgId can be -1
|
||||||
if (state != null
|
if (state != null && msgId >= 0 && msgId == state.getMsgId()) {
|
||||||
&& msgId >= 0
|
return;
|
||||||
&& msgId == state.getMsgId()
|
|
||||||
&& audioUri != null
|
|
||||||
&& audioUri.equals(state.getAudioUri())) {
|
|
||||||
return; // Is playing this message
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Long duration = durations.get(msgId);
|
Long duration = durations.get(msgId);
|
||||||
|
|||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
package org.thoughtcrime.securesms.components.audioplay;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.Uri;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.media3.common.MediaItem;
|
||||||
|
import com.b44t.messenger.DcContext;
|
||||||
|
import com.b44t.messenger.DcMsg;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
|
|
||||||
|
public class ChatAudioQueueProvider {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final int chatId;
|
||||||
|
private final int accountId;
|
||||||
|
|
||||||
|
public ChatAudioQueueProvider(@NonNull Context context, int chatId, int accountId) {
|
||||||
|
this.context = context.getApplicationContext();
|
||||||
|
this.chatId = chatId;
|
||||||
|
this.accountId = accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public List<MediaItem> buildAudioQueue() {
|
||||||
|
DcContext dcContext = DcHelper.getContext(context);
|
||||||
|
int[] msgIds = dcContext.getChatMedia(chatId, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0);
|
||||||
|
|
||||||
|
List<MediaItem> items = new ArrayList<>(msgIds.length);
|
||||||
|
for (int msgId : msgIds) {
|
||||||
|
String id = String.valueOf(msgId);
|
||||||
|
items.add(
|
||||||
|
new MediaItem.Builder()
|
||||||
|
.setMediaId(id)
|
||||||
|
.setUri(Uri.parse("dcmsg://" + accountId + "/" + id))
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -71,7 +71,7 @@ public class StickerPickerView extends RecyclerView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sort stickers just to provide consistent order
|
// Sort stickers just to provide consistent order
|
||||||
Collections.sort(stickerFiles, (f1, f2) -> f1.getName().compareToIgnoreCase(f2.getName()));
|
Collections.sort(stickerFiles, (f1, f2) -> f2.getName().compareToIgnoreCase(f1.getName()));
|
||||||
|
|
||||||
return stickerFiles;
|
return stickerFiles;
|
||||||
}
|
}
|
||||||
|
|||||||
-22
@@ -1,22 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.components.viewpager;
|
|
||||||
|
|
||||||
import androidx.viewpager.widget.ViewPager;
|
|
||||||
|
|
||||||
public abstract class ExtendedOnPageChangedListener implements ViewPager.OnPageChangeListener {
|
|
||||||
|
|
||||||
private Integer currentPage = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPageSelected(int position) {
|
|
||||||
if (currentPage != null && currentPage != position) onPageUnselected(currentPage);
|
|
||||||
currentPage = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract void onPageUnselected(int position);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPageScrollStateChanged(int state) {}
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.components.viewpager;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import androidx.viewpager.widget.ViewPager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hacky fix for http://code.google.com/p/android/issues/detail?id=18990
|
|
||||||
*
|
|
||||||
* <p>ScaleGestureDetector seems to mess up the touch events, which means that ViewGroups which make
|
|
||||||
* use of onInterceptTouchEvent throw a lot of IllegalArgumentException: pointerIndex out of range.
|
|
||||||
*
|
|
||||||
* <p>There's not much I can do in my code for now, but we can mask the result by just catching the
|
|
||||||
* problem and ignoring it.
|
|
||||||
*
|
|
||||||
* @author Chris Banes
|
|
||||||
*/
|
|
||||||
public class HackyViewPager extends ViewPager {
|
|
||||||
|
|
||||||
private static final String TAG = "HackyViewPager";
|
|
||||||
|
|
||||||
public HackyViewPager(Context context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public HackyViewPager(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
|
||||||
try {
|
|
||||||
return super.onInterceptTouchEvent(ev);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
Log.w(TAG, e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,6 @@ import androidx.annotation.NonNull;
|
|||||||
import com.b44t.messenger.DcContact;
|
import com.b44t.messenger.DcContact;
|
||||||
import com.b44t.messenger.DcContext;
|
import com.b44t.messenger.DcContext;
|
||||||
import org.thoughtcrime.securesms.util.AsyncLoader;
|
import org.thoughtcrime.securesms.util.AsyncLoader;
|
||||||
import org.thoughtcrime.securesms.util.Prefs;
|
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
|
||||||
public class DcContactsLoader extends AsyncLoader<DcContactsLoader.Ret> {
|
public class DcContactsLoader extends AsyncLoader<DcContactsLoader.Ret> {
|
||||||
@@ -53,10 +52,7 @@ public class DcContactsLoader extends AsyncLoader<DcContactsLoader.Ret> {
|
|||||||
}
|
}
|
||||||
if (query == null && addCreateGroupLinks) {
|
if (query == null && addCreateGroupLinks) {
|
||||||
additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_GROUP);
|
additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_GROUP);
|
||||||
|
additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_BROADCAST);
|
||||||
final boolean broadcastsEnabled = Prefs.isNewBroadcastAvailable(getContext());
|
|
||||||
if (broadcastsEnabled)
|
|
||||||
additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_BROADCAST);
|
|
||||||
|
|
||||||
if (!dcContext.isChatmail()) {
|
if (!dcContext.isChatmail()) {
|
||||||
additional_items =
|
additional_items =
|
||||||
|
|||||||
@@ -48,16 +48,14 @@ public class DcHelper {
|
|||||||
public static final String CONFIG_DISPLAY_NAME = "displayname";
|
public static final String CONFIG_DISPLAY_NAME = "displayname";
|
||||||
public static final String CONFIG_SELF_STATUS = "selfstatus";
|
public static final String CONFIG_SELF_STATUS = "selfstatus";
|
||||||
public static final String CONFIG_SELF_AVATAR = "selfavatar";
|
public static final String CONFIG_SELF_AVATAR = "selfavatar";
|
||||||
public static final String CONFIG_MVBOX_MOVE = "mvbox_move";
|
|
||||||
public static final String CONFIG_ONLY_FETCH_MVBOX = "only_fetch_mvbox";
|
|
||||||
public static final String CONFIG_BCC_SELF = "bcc_self";
|
public static final String CONFIG_BCC_SELF = "bcc_self";
|
||||||
public static final String CONFIG_SHOW_EMAILS = "show_emails";
|
|
||||||
public static final String CONFIG_MEDIA_QUALITY = "media_quality";
|
public static final String CONFIG_MEDIA_QUALITY = "media_quality";
|
||||||
public static final String CONFIG_PROXY_ENABLED = "proxy_enabled";
|
public static final String CONFIG_PROXY_ENABLED = "proxy_enabled";
|
||||||
public static final String CONFIG_PROXY_URL = "proxy_url";
|
public static final String CONFIG_PROXY_URL = "proxy_url";
|
||||||
public static final String CONFIG_PRIVATE_TAG = "private_tag";
|
public static final String CONFIG_PRIVATE_TAG = "private_tag";
|
||||||
public static final String CONFIG_STATS_SENDING = "stats_sending";
|
public static final String CONFIG_STATS_SENDING = "stats_sending";
|
||||||
public static final String CONFIG_STATS_ID = "stats_id";
|
public static final String CONFIG_STATS_ID = "stats_id";
|
||||||
|
public static final String CONFIG_FORCE_ENCRYPTION = "force_encryption";
|
||||||
|
|
||||||
public static DcContext getContext(@NonNull Context context) {
|
public static DcContext getContext(@NonNull Context context) {
|
||||||
return ApplicationContext.getInstance(context).getDcContext();
|
return ApplicationContext.getInstance(context).getDcContext();
|
||||||
|
|||||||
@@ -188,9 +188,8 @@ public class LocationStreamingService extends Service {
|
|||||||
NotificationChannel channel =
|
NotificationChannel channel =
|
||||||
new NotificationChannel(
|
new NotificationChannel(
|
||||||
CHANNEL_ID,
|
CHANNEL_ID,
|
||||||
getString(R.string.location_streaming_notification_title),
|
getString(R.string.pref_on_demand_location_streaming),
|
||||||
NotificationManager.IMPORTANCE_LOW);
|
NotificationManager.IMPORTANCE_LOW);
|
||||||
channel.setDescription(getString(R.string.location_streaming_channel_desc));
|
|
||||||
channel.setShowBadge(false);
|
channel.setShowBadge(false);
|
||||||
NotificationManager nm = getSystemService(NotificationManager.class);
|
NotificationManager nm = getSystemService(NotificationManager.class);
|
||||||
if (nm != null) nm.createNotificationChannel(channel);
|
if (nm != null) nm.createNotificationChannel(channel);
|
||||||
@@ -209,7 +208,7 @@ public class LocationStreamingService extends Service {
|
|||||||
PendingIntent.getService(this, 1, stopIntent, PendingIntent.FLAG_IMMUTABLE);
|
PendingIntent.getService(this, 1, stopIntent, PendingIntent.FLAG_IMMUTABLE);
|
||||||
|
|
||||||
return new NotificationCompat.Builder(this, CHANNEL_ID)
|
return new NotificationCompat.Builder(this, CHANNEL_ID)
|
||||||
.setContentTitle(getString(R.string.location_streaming_notification_title))
|
.setContentTitle(getString(R.string.pref_on_demand_location_streaming))
|
||||||
.setContentText(getString(R.string.location_streaming_notification_text))
|
.setContentText(getString(R.string.location_streaming_notification_text))
|
||||||
.setSmallIcon(R.drawable.ic_location_on_white_24dp)
|
.setSmallIcon(R.drawable.ic_location_on_white_24dp)
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class PlatformLocationSource implements LocationSource {
|
|||||||
registered = requestProvider(context, LocationManager.FUSED_PROVIDER, callback);
|
registered = requestProvider(context, LocationManager.FUSED_PROVIDER, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fall back (or complement) with individual providers
|
// Fall back with individual providers
|
||||||
if (!registered) {
|
if (!registered) {
|
||||||
requestProvider(context, LocationManager.GPS_PROVIDER, callback);
|
requestProvider(context, LocationManager.GPS_PROVIDER, callback);
|
||||||
requestProvider(context, LocationManager.NETWORK_PROVIDER, callback);
|
requestProvider(context, LocationManager.NETWORK_PROVIDER, callback);
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ public class AttachmentManager {
|
|||||||
removableMediaView.display(audioView, false);
|
removableMediaView.display(audioView, false);
|
||||||
removableMediaView.addRemoveClickListener(
|
removableMediaView.addRemoveClickListener(
|
||||||
v -> {
|
v -> {
|
||||||
playbackViewModel.stop(audioView.getMsgId(), audioView.getAudioUri());
|
playbackViewModel.stop(audioView.getMsgId());
|
||||||
});
|
});
|
||||||
result.set(true);
|
result.set(true);
|
||||||
} else if (slide.isVcard()) {
|
} else if (slide.isVcard()) {
|
||||||
|
|||||||
@@ -3,9 +3,6 @@ package org.thoughtcrime.securesms.preferences;
|
|||||||
import static android.app.Activity.RESULT_OK;
|
import static android.app.Activity.RESULT_OK;
|
||||||
import static android.text.InputType.TYPE_TEXT_VARIATION_URI;
|
import static android.text.InputType.TYPE_TEXT_VARIATION_URI;
|
||||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_BCC_SELF;
|
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_BCC_SELF;
|
||||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_MVBOX_MOVE;
|
|
||||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_ONLY_FETCH_MVBOX;
|
|
||||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SHOW_EMAILS;
|
|
||||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_STATS_SENDING;
|
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_STATS_SENDING;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -22,7 +19,6 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.preference.CheckBoxPreference;
|
import androidx.preference.CheckBoxPreference;
|
||||||
import androidx.preference.ListPreference;
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@@ -40,17 +36,13 @@ import org.thoughtcrime.securesms.relay.RelayListActivity;
|
|||||||
import org.thoughtcrime.securesms.util.Prefs;
|
import org.thoughtcrime.securesms.util.Prefs;
|
||||||
import org.thoughtcrime.securesms.util.ScreenLockUtil;
|
import org.thoughtcrime.securesms.util.ScreenLockUtil;
|
||||||
import org.thoughtcrime.securesms.util.StreamUtil;
|
import org.thoughtcrime.securesms.util.StreamUtil;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
|
||||||
|
|
||||||
public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
||||||
implements DcEventCenter.DcEventDelegate {
|
implements DcEventCenter.DcEventDelegate {
|
||||||
private static final String TAG = "AdvancedPreferenceFragment";
|
private static final String TAG = "AdvancedPreferenceFragment";
|
||||||
|
|
||||||
private ListPreference showEmails;
|
|
||||||
CheckBoxPreference selfReportingCheckbox;
|
CheckBoxPreference selfReportingCheckbox;
|
||||||
CheckBoxPreference multiDeviceCheckbox;
|
CheckBoxPreference multiDeviceCheckbox;
|
||||||
CheckBoxPreference mvboxMoveCheckbox;
|
|
||||||
CheckBoxPreference onlyFetchMvboxCheckbox;
|
|
||||||
private ActivityResultLauncher<Intent> screenLockLauncher;
|
private ActivityResultLauncher<Intent> screenLockLauncher;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -66,16 +58,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
showEmails = (ListPreference) this.findPreference("pref_show_emails");
|
|
||||||
if (showEmails != null) {
|
|
||||||
showEmails.setOnPreferenceChangeListener(
|
|
||||||
(preference, newValue) -> {
|
|
||||||
updateListSummary(preference, newValue);
|
|
||||||
dcContext.setConfigInt(CONFIG_SHOW_EMAILS, Util.objectToInt(newValue));
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
multiDeviceCheckbox = (CheckBoxPreference) this.findPreference("pref_bcc_self");
|
multiDeviceCheckbox = (CheckBoxPreference) this.findPreference("pref_bcc_self");
|
||||||
if (multiDeviceCheckbox != null) {
|
if (multiDeviceCheckbox != null) {
|
||||||
multiDeviceCheckbox.setOnPreferenceChangeListener(
|
multiDeviceCheckbox.setOnPreferenceChangeListener(
|
||||||
@@ -100,40 +82,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
mvboxMoveCheckbox = (CheckBoxPreference) this.findPreference("pref_mvbox_move");
|
|
||||||
if (mvboxMoveCheckbox != null) {
|
|
||||||
mvboxMoveCheckbox.setOnPreferenceChangeListener(
|
|
||||||
(preference, newValue) -> {
|
|
||||||
boolean enabled = (Boolean) newValue;
|
|
||||||
dcContext.setConfigInt(CONFIG_MVBOX_MOVE, enabled ? 1 : 0);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onlyFetchMvboxCheckbox = this.findPreference("pref_only_fetch_mvbox");
|
|
||||||
if (onlyFetchMvboxCheckbox != null) {
|
|
||||||
onlyFetchMvboxCheckbox.setOnPreferenceChangeListener(
|
|
||||||
((preference, newValue) -> {
|
|
||||||
final boolean enabled = (Boolean) newValue;
|
|
||||||
if (enabled) {
|
|
||||||
new AlertDialog.Builder(requireContext())
|
|
||||||
.setMessage(R.string.pref_imap_folder_warn_disable_defaults)
|
|
||||||
.setPositiveButton(
|
|
||||||
R.string.ok,
|
|
||||||
(dialogInterface, i) -> {
|
|
||||||
dcContext.setConfigInt(CONFIG_ONLY_FETCH_MVBOX, 1);
|
|
||||||
((CheckBoxPreference) preference).setChecked(true);
|
|
||||||
})
|
|
||||||
.setNegativeButton(R.string.cancel, null)
|
|
||||||
.show();
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
dcContext.setConfigInt(CONFIG_ONLY_FETCH_MVBOX, 0);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
Preference submitDebugLog = this.findPreference("pref_view_log");
|
Preference submitDebugLog = this.findPreference("pref_view_log");
|
||||||
if (submitDebugLog != null) {
|
if (submitDebugLog != null) {
|
||||||
submitDebugLog.setOnPreferenceClickListener(new ViewLogListener());
|
submitDebugLog.setOnPreferenceClickListener(new ViewLogListener());
|
||||||
@@ -189,10 +137,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
|||||||
return true;
|
return true;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dcContext.isChatmail()) {
|
|
||||||
findPreference("pref_category_legacy").setVisible(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -207,14 +151,8 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
|
|||||||
((ApplicationPreferencesActivity) requireActivity()).getSupportActionBar())
|
((ApplicationPreferencesActivity) requireActivity()).getSupportActionBar())
|
||||||
.setTitle(R.string.menu_advanced);
|
.setTitle(R.string.menu_advanced);
|
||||||
|
|
||||||
String value = Integer.toString(dcContext.getConfigInt("show_emails"));
|
|
||||||
showEmails.setValue(value);
|
|
||||||
updateListSummary(showEmails, value);
|
|
||||||
|
|
||||||
selfReportingCheckbox.setChecked(0 != dcContext.getConfigInt(CONFIG_STATS_SENDING));
|
selfReportingCheckbox.setChecked(0 != dcContext.getConfigInt(CONFIG_STATS_SENDING));
|
||||||
multiDeviceCheckbox.setChecked(0 != dcContext.getConfigInt(CONFIG_BCC_SELF));
|
multiDeviceCheckbox.setChecked(0 != dcContext.getConfigInt(CONFIG_BCC_SELF));
|
||||||
mvboxMoveCheckbox.setChecked(0 != dcContext.getConfigInt(CONFIG_MVBOX_MOVE));
|
|
||||||
onlyFetchMvboxCheckbox.setChecked(0 != dcContext.getConfigInt(CONFIG_ONLY_FETCH_MVBOX));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected File copyToCacheDir(Uri uri) throws IOException {
|
protected File copyToCacheDir(Uri uri) throws IOException {
|
||||||
|
|||||||
+12
@@ -39,6 +39,7 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme
|
|||||||
private CheckBoxPreference ignoreBattery;
|
private CheckBoxPreference ignoreBattery;
|
||||||
private CheckBoxPreference notificationsEnabled;
|
private CheckBoxPreference notificationsEnabled;
|
||||||
private CheckBoxPreference mentionNotifEnabled;
|
private CheckBoxPreference mentionNotifEnabled;
|
||||||
|
private CheckBoxPreference notifyCalls;
|
||||||
private CheckBoxPreference reliableService;
|
private CheckBoxPreference reliableService;
|
||||||
private ActivityResultLauncher<Intent> ringtonePickerLauncher;
|
private ActivityResultLauncher<Intent> ringtonePickerLauncher;
|
||||||
|
|
||||||
@@ -137,6 +138,16 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
notifyCalls = this.findPreference("pref_notify_calls");
|
||||||
|
if (notifyCalls != null) {
|
||||||
|
notifyCalls.setOnPreferenceChangeListener(
|
||||||
|
(preference, newValue) -> {
|
||||||
|
boolean enabled = (Boolean) newValue;
|
||||||
|
dcContext.setConfig("who_can_call_me", enabled ? "1" : "2");
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -156,6 +167,7 @@ public class NotificationsPreferenceFragment extends ListSummaryPreferenceFragme
|
|||||||
notificationsEnabled.setChecked(!dcContext.isMuted());
|
notificationsEnabled.setChecked(!dcContext.isMuted());
|
||||||
notificationsEnabled.setSummary(getSummary(getContext(), false));
|
notificationsEnabled.setSummary(getSummary(getContext(), false));
|
||||||
mentionNotifEnabled.setChecked(dcContext.isMentionsEnabled());
|
mentionNotifEnabled.setChecked(dcContext.isMentionsEnabled());
|
||||||
|
notifyCalls.setChecked(dcContext.getConfig("who_can_call_me") != "2");
|
||||||
|
|
||||||
// set without altering "unset" state of the preference
|
// set without altering "unset" state of the preference
|
||||||
reliableService.setOnPreferenceChangeListener(null);
|
reliableService.setOnPreferenceChangeListener(null);
|
||||||
|
|||||||
+6
-45
@@ -26,7 +26,6 @@ public class PrivacyPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
private CheckBoxPreference readReceiptsCheckbox;
|
private CheckBoxPreference readReceiptsCheckbox;
|
||||||
|
|
||||||
private ListPreference autoDelDevice;
|
private ListPreference autoDelDevice;
|
||||||
private ListPreference autoDelServer;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle paramBundle) {
|
public void onCreate(Bundle paramBundle) {
|
||||||
@@ -39,13 +38,7 @@ public class PrivacyPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
.setOnPreferenceClickListener(new BlockedContactsClickListener());
|
.setOnPreferenceClickListener(new BlockedContactsClickListener());
|
||||||
|
|
||||||
autoDelDevice = findPreference("autodel_device");
|
autoDelDevice = findPreference("autodel_device");
|
||||||
autoDelDevice.setOnPreferenceChangeListener(new AutodelChangeListener("delete_device_after"));
|
autoDelDevice.setOnPreferenceChangeListener(new AutodelChangeListener());
|
||||||
|
|
||||||
autoDelServer = findPreference("autodel_server");
|
|
||||||
autoDelServer.setOnPreferenceChangeListener(new AutodelChangeListener("delete_server_after"));
|
|
||||||
if (dcContext.isChatmail()) {
|
|
||||||
autoDelServer.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
Preference screenSecurity = this.findPreference(Prefs.SCREEN_SECURITY_PREF);
|
Preference screenSecurity = this.findPreference(Prefs.SCREEN_SECURITY_PREF);
|
||||||
screenSecurity.setOnPreferenceChangeListener(new ScreenShotSecurityListener());
|
screenSecurity.setOnPreferenceChangeListener(new ScreenShotSecurityListener());
|
||||||
@@ -68,16 +61,7 @@ public class PrivacyPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initAutodelFromCore() {
|
private void initAutodelFromCore() {
|
||||||
String value = Integer.toString(dcContext.getConfigInt("delete_server_after"));
|
String value = Integer.toString(dcContext.getConfigInt("delete_device_after"));
|
||||||
autoDelServer.setValue(value);
|
|
||||||
updateListSummary(
|
|
||||||
autoDelServer,
|
|
||||||
value,
|
|
||||||
(value.equals("0") || dcContext.isChatmail())
|
|
||||||
? null
|
|
||||||
: getString(R.string.autodel_server_enabled_hint));
|
|
||||||
|
|
||||||
value = Integer.toString(dcContext.getConfigInt("delete_device_after"));
|
|
||||||
autoDelDevice.setValue(value);
|
autoDelDevice.setValue(value);
|
||||||
updateListSummary(autoDelDevice, value);
|
updateListSummary(autoDelDevice, value);
|
||||||
}
|
}
|
||||||
@@ -109,19 +93,14 @@ public class PrivacyPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class AutodelChangeListener implements Preference.OnPreferenceChangeListener {
|
private class AutodelChangeListener implements Preference.OnPreferenceChangeListener {
|
||||||
private final String coreKey;
|
private final String coreKey = "delete_device_after";
|
||||||
|
|
||||||
AutodelChangeListener(String coreKey) {
|
|
||||||
this.coreKey = coreKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
int timeout = Util.objectToInt(newValue);
|
int timeout = Util.objectToInt(newValue);
|
||||||
Context context = preference.getContext();
|
Context context = preference.getContext();
|
||||||
boolean fromServer = coreKey.equals("delete_server_after");
|
if (timeout > 0) {
|
||||||
if (timeout > 0 && !(fromServer && dcContext.isChatmail())) {
|
int delCount = DcHelper.getContext(context).estimateDeletionCount(false, timeout);
|
||||||
int delCount = DcHelper.getContext(context).estimateDeletionCount(fromServer, timeout);
|
|
||||||
|
|
||||||
View gl = View.inflate(getActivity(), R.layout.dialog_with_checkbox, null);
|
View gl = View.inflate(getActivity(), R.layout.dialog_with_checkbox, null);
|
||||||
CheckBox confirmCheckbox = gl.findViewById(R.id.dialog_checkbox);
|
CheckBox confirmCheckbox = gl.findViewById(R.id.dialog_checkbox);
|
||||||
@@ -132,8 +111,7 @@ public class PrivacyPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
// "OK" and "Cancel" buttons would not be show. So, put the message into our custom view:
|
// "OK" and "Cancel" buttons would not be show. So, put the message into our custom view:
|
||||||
msg.setText(
|
msg.setText(
|
||||||
String.format(
|
String.format(
|
||||||
context.getString(
|
context.getString(R.string.autodel_device_ask),
|
||||||
fromServer ? R.string.autodel_server_ask : R.string.autodel_device_ask),
|
|
||||||
delCount,
|
delCount,
|
||||||
getSelectedSummary(preference, newValue)));
|
getSelectedSummary(preference, newValue)));
|
||||||
confirmCheckbox.setText(R.string.autodel_confirm);
|
confirmCheckbox.setText(R.string.autodel_confirm);
|
||||||
@@ -158,23 +136,6 @@ public class PrivacyPreferenceFragment extends ListSummaryPreferenceFragment {
|
|||||||
// :)
|
// :)
|
||||||
.setOnCancelListener(dialog -> initAutodelFromCore())
|
.setOnCancelListener(dialog -> initAutodelFromCore())
|
||||||
.show();
|
.show();
|
||||||
} else if (fromServer
|
|
||||||
&& timeout
|
|
||||||
== 1 /*at once, using a constant that cannot be used in .xml would weaken grep ability*/) {
|
|
||||||
new AlertDialog.Builder(context)
|
|
||||||
.setTitle(R.string.autodel_server_warn_multi_device_title)
|
|
||||||
.setMessage(R.string.autodel_server_warn_multi_device)
|
|
||||||
.setPositiveButton(
|
|
||||||
android.R.string.ok,
|
|
||||||
(dialog, whichButton) -> {
|
|
||||||
dcContext.setConfigInt(coreKey, timeout);
|
|
||||||
initAutodelFromCore();
|
|
||||||
})
|
|
||||||
.setNegativeButton(
|
|
||||||
android.R.string.cancel, (dialog, whichButton) -> initAutodelFromCore())
|
|
||||||
.setCancelable(true)
|
|
||||||
.setOnCancelListener(dialog -> initAutodelFromCore())
|
|
||||||
.show();
|
|
||||||
} else {
|
} else {
|
||||||
updateListSummary(preference, newValue);
|
updateListSummary(preference, newValue);
|
||||||
dcContext.setConfigInt(coreKey, timeout);
|
dcContext.setConfigInt(coreKey, timeout);
|
||||||
|
|||||||
@@ -15,10 +15,11 @@ import android.view.View;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||||
import androidx.viewpager.widget.ViewPager;
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
|
import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
import com.google.zxing.BinaryBitmap;
|
import com.google.zxing.BinaryBitmap;
|
||||||
import com.google.zxing.MultiFormatReader;
|
import com.google.zxing.MultiFormatReader;
|
||||||
import com.google.zxing.NotFoundException;
|
import com.google.zxing.NotFoundException;
|
||||||
@@ -48,7 +49,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
|
|||||||
private static final int TAB_SCAN = 1;
|
private static final int TAB_SCAN = 1;
|
||||||
|
|
||||||
private TabLayout tabLayout;
|
private TabLayout tabLayout;
|
||||||
private ViewPager viewPager;
|
private ViewPager2 viewPager;
|
||||||
private QrShowFragment qrShowFragment;
|
private QrShowFragment qrShowFragment;
|
||||||
private boolean scanRelay;
|
private boolean scanRelay;
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
|
|||||||
qrShowFragment = new QrShowFragment(this);
|
qrShowFragment = new QrShowFragment(this);
|
||||||
tabLayout = ViewUtil.findById(this, R.id.tab_layout);
|
tabLayout = ViewUtil.findById(this, R.id.tab_layout);
|
||||||
viewPager = ViewUtil.findById(this, R.id.pager);
|
viewPager = ViewUtil.findById(this, R.id.pager);
|
||||||
ProfilePagerAdapter adapter = new ProfilePagerAdapter(this, getSupportFragmentManager());
|
ProfilePagerAdapter adapter = new ProfilePagerAdapter(this);
|
||||||
viewPager.setAdapter(adapter);
|
viewPager.setAdapter(adapter);
|
||||||
|
|
||||||
setSupportActionBar(ViewUtil.findById(this, R.id.toolbar));
|
setSupportActionBar(ViewUtil.findById(this, R.id.toolbar));
|
||||||
@@ -76,29 +77,24 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
|
|||||||
getSupportActionBar().setTitle(scanRelay ? R.string.add_transport : R.string.menu_new_contact);
|
getSupportActionBar().setTitle(scanRelay ? R.string.add_transport : R.string.menu_new_contact);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
viewPager.setCurrentItem(scanRelay ? TAB_SCAN : TAB_SHOW);
|
viewPager.setCurrentItem(scanRelay ? TAB_SCAN : TAB_SHOW, false);
|
||||||
if (scanRelay) tabLayout.setVisibility(View.GONE);
|
if (scanRelay) tabLayout.setVisibility(View.GONE);
|
||||||
|
|
||||||
viewPager.addOnPageChangeListener(
|
viewPager.registerOnPageChangeCallback(
|
||||||
new ViewPager.OnPageChangeListener() {
|
new ViewPager2.OnPageChangeCallback() {
|
||||||
@Override
|
|
||||||
public void onPageScrolled(
|
|
||||||
int position, float positionOffset, int positionOffsetPixels) {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageSelected(int position) {
|
public void onPageSelected(int position) {
|
||||||
QrActivity.this.invalidateOptionsMenu();
|
QrActivity.this.invalidateOptionsMenu();
|
||||||
checkPermissions(position, adapter, viewPager);
|
checkPermissions(position, adapter, viewPager);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPageScrollStateChanged(int state) {}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
tabLayout.setupWithViewPager(viewPager);
|
new TabLayoutMediator(
|
||||||
|
tabLayout, viewPager, (tab, position) -> tab.setText(adapter.getPageTitle(position)))
|
||||||
|
.attach();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkPermissions(int position, ProfilePagerAdapter adapter, ViewPager viewPager) {
|
private void checkPermissions(int position, ProfilePagerAdapter adapter, ViewPager2 viewPager) {
|
||||||
if (position == TAB_SCAN) {
|
if (position == TAB_SCAN) {
|
||||||
Permissions.with(QrActivity.this)
|
Permissions.with(QrActivity.this)
|
||||||
.request(Manifest.permission.CAMERA)
|
.request(Manifest.permission.CAMERA)
|
||||||
@@ -106,7 +102,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
|
|||||||
.withPermanentDenialDialog(getString(R.string.perm_explain_access_to_camera_denied))
|
.withPermanentDenialDialog(getString(R.string.perm_explain_access_to_camera_denied))
|
||||||
.onAllGranted(
|
.onAllGranted(
|
||||||
() ->
|
() ->
|
||||||
((QrScanFragment) adapter.getItem(TAB_SCAN))
|
((QrScanFragment) adapter.createFragment(TAB_SCAN))
|
||||||
.handleQrScanWithPermissions(QrActivity.this))
|
.handleQrScanWithPermissions(QrActivity.this))
|
||||||
.onAnyDenied(
|
.onAnyDenied(
|
||||||
() -> {
|
() -> {
|
||||||
@@ -228,47 +224,28 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
|
|||||||
viewPager.setCurrentItem(TAB_SCAN);
|
viewPager.setCurrentItem(TAB_SCAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ProfilePagerAdapter extends FragmentStatePagerAdapter {
|
private class ProfilePagerAdapter extends FragmentStateAdapter {
|
||||||
|
ProfilePagerAdapter(FragmentActivity activity) {
|
||||||
private final QrActivity activity;
|
super(activity);
|
||||||
|
|
||||||
ProfilePagerAdapter(QrActivity activity, FragmentManager fragmentManager) {
|
|
||||||
super(fragmentManager, FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
|
|
||||||
this.activity = activity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Fragment getItem(int position) {
|
public Fragment createFragment(int position) {
|
||||||
Fragment fragment;
|
if (position == TAB_SHOW) {
|
||||||
|
qrShowFragment = new QrShowFragment(QrActivity.this);
|
||||||
switch (position) {
|
return qrShowFragment;
|
||||||
case TAB_SHOW:
|
|
||||||
fragment = activity.qrShowFragment;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
fragment = new QrScanFragment();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
return new QrScanFragment();
|
||||||
return fragment;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getItemCount() {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private CharSequence getPageTitle(int position) {
|
||||||
public CharSequence getPageTitle(int position) {
|
return getString(position == TAB_SHOW ? R.string.qrshow_title : R.string.qrscan_title);
|
||||||
switch (position) {
|
|
||||||
case TAB_SHOW:
|
|
||||||
return getString(R.string.qrshow_title);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return getString(R.string.qrscan_title);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import androidx.annotation.IdRes;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
|
import androidx.appcompat.widget.SwitchCompat;
|
||||||
import androidx.constraintlayout.widget.Group;
|
import androidx.constraintlayout.widget.Group;
|
||||||
import chat.delta.rpc.Rpc;
|
import chat.delta.rpc.Rpc;
|
||||||
import chat.delta.rpc.RpcException;
|
import chat.delta.rpc.RpcException;
|
||||||
@@ -75,6 +76,7 @@ public class EditRelayActivity extends BaseActionBarActivity
|
|||||||
Spinner imapSecurity;
|
Spinner imapSecurity;
|
||||||
Spinner smtpSecurity;
|
Spinner smtpSecurity;
|
||||||
Spinner certCheck;
|
Spinner certCheck;
|
||||||
|
private SwitchCompat enforceE2eeSwitch;
|
||||||
|
|
||||||
Rpc rpc;
|
Rpc rpc;
|
||||||
int accId;
|
int accId;
|
||||||
@@ -110,6 +112,7 @@ public class EditRelayActivity extends BaseActionBarActivity
|
|||||||
imapSecurity = findViewById(R.id.imap_security);
|
imapSecurity = findViewById(R.id.imap_security);
|
||||||
smtpSecurity = findViewById(R.id.smtp_security);
|
smtpSecurity = findViewById(R.id.smtp_security);
|
||||||
certCheck = findViewById(R.id.cert_check);
|
certCheck = findViewById(R.id.cert_check);
|
||||||
|
enforceE2eeSwitch = findViewById(R.id.enforce_e2ee_switch);
|
||||||
|
|
||||||
String addr = getIntent().getStringExtra(EXTRA_ADDR);
|
String addr = getIntent().getStringExtra(EXTRA_ADDR);
|
||||||
EnteredLoginParam config = null;
|
EnteredLoginParam config = null;
|
||||||
@@ -173,6 +176,10 @@ public class EditRelayActivity extends BaseActionBarActivity
|
|||||||
boolean expandAdvanced = false;
|
boolean expandAdvanced = false;
|
||||||
int intVal;
|
int intVal;
|
||||||
|
|
||||||
|
intVal = getContext(this).getConfigInt(DcHelper.CONFIG_FORCE_ENCRYPTION);
|
||||||
|
enforceE2eeSwitch.setChecked(intVal == 1);
|
||||||
|
expandAdvanced = expandAdvanced || intVal == 0;
|
||||||
|
|
||||||
if (config != null) { // configured
|
if (config != null) { // configured
|
||||||
emailInput.setText(config.addr);
|
emailInput.setText(config.addr);
|
||||||
if (!TextUtils.isEmpty(config.addr)) {
|
if (!TextUtils.isEmpty(config.addr)) {
|
||||||
@@ -500,9 +507,12 @@ public class EditRelayActivity extends BaseActionBarActivity
|
|||||||
param.smtpPassword = getParam(R.id.smtp_password_text, false);
|
param.smtpPassword = getParam(R.id.smtp_password_text, false);
|
||||||
param.certificateChecks = certificateChecksFromInt(certCheck.getSelectedItemPosition());
|
param.certificateChecks = certificateChecksFromInt(certCheck.getSelectedItemPosition());
|
||||||
|
|
||||||
|
final String forceEncryption = enforceE2eeSwitch.isChecked() ? "1" : "0";
|
||||||
|
|
||||||
new Thread(
|
new Thread(
|
||||||
() -> {
|
() -> {
|
||||||
try {
|
try {
|
||||||
|
rpc.setConfig(accId, DcHelper.CONFIG_FORCE_ENCRYPTION, forceEncryption);
|
||||||
rpc.addOrUpdateTransport(accId, param);
|
rpc.addOrUpdateTransport(accId, param);
|
||||||
DcHelper.getEventCenter(this).endCaptureNextError();
|
DcHelper.getEventCenter(this).endCaptureNextError();
|
||||||
progressDialog.dismiss();
|
progressDialog.dismiss();
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package org.thoughtcrime.securesms.search;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import com.b44t.messenger.DcContact;
|
||||||
|
import com.b44t.messenger.DcContext;
|
||||||
|
import com.b44t.messenger.DcLot;
|
||||||
|
import org.thoughtcrime.securesms.R;
|
||||||
|
|
||||||
|
public class QrInviteData {
|
||||||
|
|
||||||
|
private final String displayTitle;
|
||||||
|
private final String displaySubtitle;
|
||||||
|
private final String rawQrString;
|
||||||
|
private final int contactId;
|
||||||
|
|
||||||
|
private QrInviteData(
|
||||||
|
@NonNull String displayTitle,
|
||||||
|
@NonNull String displaySubtitle,
|
||||||
|
@NonNull String rawQrString,
|
||||||
|
int contactId) {
|
||||||
|
this.displayTitle = displayTitle;
|
||||||
|
this.displaySubtitle = displaySubtitle;
|
||||||
|
this.rawQrString = rawQrString;
|
||||||
|
this.contactId = contactId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static QrInviteData from(
|
||||||
|
@NonNull Context context,
|
||||||
|
@NonNull DcContext dcContext,
|
||||||
|
@NonNull DcLot qrParsed,
|
||||||
|
@NonNull String rawQrString) {
|
||||||
|
int state = qrParsed.getState();
|
||||||
|
String title;
|
||||||
|
String subtitle;
|
||||||
|
int contactId = 0;
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case DcContext.DC_QR_ASK_VERIFYCONTACT:
|
||||||
|
case DcContext.DC_QR_FPR_OK:
|
||||||
|
case DcContext.DC_QR_ADDR:
|
||||||
|
contactId = qrParsed.getId();
|
||||||
|
DcContact contact = dcContext.getContact(contactId);
|
||||||
|
title = contact.getDisplayName();
|
||||||
|
subtitle = context.getString(R.string.start_chat);
|
||||||
|
break;
|
||||||
|
case DcContext.DC_QR_ASK_VERIFYGROUP:
|
||||||
|
title = qrParsed.getText1();
|
||||||
|
subtitle = context.getString(R.string.join_group);
|
||||||
|
break;
|
||||||
|
case DcContext.DC_QR_ASK_JOIN_BROADCAST:
|
||||||
|
title = qrParsed.getText1();
|
||||||
|
subtitle = context.getString(R.string.join_channel);
|
||||||
|
break;
|
||||||
|
case DcContext.DC_QR_ACCOUNT:
|
||||||
|
case DcContext.DC_QR_LOGIN:
|
||||||
|
title = qrParsed.getText1();
|
||||||
|
subtitle = context.getString(R.string.add_transport);
|
||||||
|
break;
|
||||||
|
case DcContext.DC_QR_PROXY:
|
||||||
|
title = qrParsed.getText1();
|
||||||
|
subtitle = context.getString(R.string.proxy_use_proxy);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new QrInviteData(title, subtitle, rawQrString, contactId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public String getDisplayTitle() {
|
||||||
|
return displayTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public String getDisplaySubtitle() {
|
||||||
|
return displaySubtitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public String getRawQrString() {
|
||||||
|
return rawQrString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getContactId() {
|
||||||
|
return contactId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -200,6 +200,14 @@ public class SearchFragment extends BaseConversationListFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onInvitationClicked(@NonNull String rawQrString) {
|
||||||
|
ConversationListActivity conversationList = (ConversationListActivity) getActivity();
|
||||||
|
if (conversationList != null) {
|
||||||
|
conversationList.handleQrFromSearch(rawQrString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void updateSearchQuery(@NonNull String query) {
|
public void updateSearchQuery(@NonNull String query) {
|
||||||
if (viewModel != null) {
|
if (viewModel != null) {
|
||||||
viewModel.updateQuery(query);
|
viewModel.updateQuery(query);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
|
|||||||
class SearchListAdapter
|
class SearchListAdapter
|
||||||
extends BaseConversationListAdapter<SearchListAdapter.SearchResultViewHolder>
|
extends BaseConversationListAdapter<SearchListAdapter.SearchResultViewHolder>
|
||||||
implements StickyHeaderDecoration.StickyHeaderAdapter<SearchListAdapter.HeaderViewHolder> {
|
implements StickyHeaderDecoration.StickyHeaderAdapter<SearchListAdapter.HeaderViewHolder> {
|
||||||
|
private static final int TYPE_QR_INVITE = 0;
|
||||||
private static final int TYPE_CHATS = 1;
|
private static final int TYPE_CHATS = 1;
|
||||||
private static final int TYPE_CONTACTS = 2;
|
private static final int TYPE_CONTACTS = 2;
|
||||||
private static final int TYPE_MESSAGES = 3;
|
private static final int TYPE_MESSAGES = 3;
|
||||||
@@ -57,6 +58,14 @@ class SearchListAdapter
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull SearchResultViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull SearchResultViewHolder holder, int position) {
|
||||||
|
if (isQrInvitePosition(position)) {
|
||||||
|
QrInviteData inviteData = searchResult.getQrInviteData();
|
||||||
|
if (inviteData != null) {
|
||||||
|
holder.bind(inviteData, glideRequests, eventListener);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DcChatlist.Item conversationResult = getConversationResult(position);
|
DcChatlist.Item conversationResult = getConversationResult(position);
|
||||||
|
|
||||||
if (conversationResult != null) {
|
if (conversationResult != null) {
|
||||||
@@ -97,7 +106,9 @@ class SearchListAdapter
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getHeaderId(int position) {
|
public long getHeaderId(int position) {
|
||||||
if (getConversationResult(position) != null) {
|
if (isQrInvitePosition(position)) {
|
||||||
|
return TYPE_QR_INVITE;
|
||||||
|
} else if (getConversationResult(position) != null) {
|
||||||
return TYPE_CHATS;
|
return TYPE_CHATS;
|
||||||
} else if (getContactResult(position) != null) {
|
} else if (getContactResult(position) != null) {
|
||||||
return TYPE_CONTACTS;
|
return TYPE_CONTACTS;
|
||||||
@@ -116,33 +127,39 @@ class SearchListAdapter
|
|||||||
@Override
|
@Override
|
||||||
public void onBindHeaderViewHolder(HeaderViewHolder viewHolder, int position) {
|
public void onBindHeaderViewHolder(HeaderViewHolder viewHolder, int position) {
|
||||||
int headerType = (int) getHeaderId(position);
|
int headerType = (int) getHeaderId(position);
|
||||||
int textId = R.plurals.n_messages;
|
String title;
|
||||||
int count = 1;
|
|
||||||
boolean maybeLimitedTo1000 = false;
|
|
||||||
|
|
||||||
switch (headerType) {
|
if (headerType == TYPE_QR_INVITE) {
|
||||||
case TYPE_CHATS:
|
title = context.getString(R.string.link);
|
||||||
textId = R.plurals.n_chats;
|
} else {
|
||||||
count = searchResult.getChats().getCnt();
|
int textId = R.plurals.n_messages;
|
||||||
break;
|
int count = 1;
|
||||||
case TYPE_CONTACTS:
|
boolean maybeLimitedTo1000 = false;
|
||||||
textId = R.plurals.n_contacts;
|
|
||||||
count = searchResult.getContacts().length;
|
|
||||||
break;
|
|
||||||
case TYPE_MESSAGES:
|
|
||||||
textId = R.plurals.n_messages;
|
|
||||||
count = searchResult.getMessages().length;
|
|
||||||
maybeLimitedTo1000 =
|
|
||||||
count == 1000; // a count of 1000 results may be limited, see documentation of
|
|
||||||
// dc_search_msgs()
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
String title = context.getResources().getQuantityString(textId, count, count);
|
switch (headerType) {
|
||||||
if (maybeLimitedTo1000) {
|
case TYPE_CHATS:
|
||||||
title =
|
textId = R.plurals.n_chats;
|
||||||
title.replace(
|
count = searchResult.getChats().getCnt();
|
||||||
"000", "000+"); // skipping the first digit allows formattings as "1.000" or "1,000"
|
break;
|
||||||
|
case TYPE_CONTACTS:
|
||||||
|
textId = R.plurals.n_contacts;
|
||||||
|
count = searchResult.getContacts().length;
|
||||||
|
break;
|
||||||
|
case TYPE_MESSAGES:
|
||||||
|
textId = R.plurals.n_messages;
|
||||||
|
count = searchResult.getMessages().length;
|
||||||
|
maybeLimitedTo1000 =
|
||||||
|
count == 1000; // a count of 1000 results may be limited, see documentation of
|
||||||
|
// dc_search_msgs()
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
title = context.getResources().getQuantityString(textId, count, count);
|
||||||
|
if (maybeLimitedTo1000) {
|
||||||
|
title =
|
||||||
|
title.replace(
|
||||||
|
"000", "000+"); // skipping the first digit allows formattings as "1.000" or "1,000"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
viewHolder.bind(title);
|
viewHolder.bind(title);
|
||||||
}
|
}
|
||||||
@@ -160,10 +177,19 @@ class SearchListAdapter
|
|||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getQrInviteCount() {
|
||||||
|
return searchResult.getQrInviteData() != null ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isQrInvitePosition(int position) {
|
||||||
|
return position == 0 && searchResult.getQrInviteData() != null;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private DcChatlist.Item getConversationResult(int position) {
|
private DcChatlist.Item getConversationResult(int position) {
|
||||||
if (position < searchResult.getChats().getCnt()) {
|
int offset = position - getQrInviteCount();
|
||||||
return searchResult.getChats().getItem(position);
|
if (offset >= 0 && offset < searchResult.getChats().getCnt()) {
|
||||||
|
return searchResult.getChats().getItem(offset);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -185,7 +211,7 @@ class SearchListAdapter
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int getFirstContactIndex() {
|
private int getFirstContactIndex() {
|
||||||
return searchResult.getChats().getCnt();
|
return getQrInviteCount() + searchResult.getChats().getCnt();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getFirstMessageIndex() {
|
private int getFirstMessageIndex() {
|
||||||
@@ -200,6 +226,8 @@ class SearchListAdapter
|
|||||||
void onContactClicked(@NonNull DcContact contact);
|
void onContactClicked(@NonNull DcContact contact);
|
||||||
|
|
||||||
void onMessageClicked(@NonNull DcMsg message);
|
void onMessageClicked(@NonNull DcMsg message);
|
||||||
|
|
||||||
|
void onInvitationClicked(@NonNull String rawQrString);
|
||||||
}
|
}
|
||||||
|
|
||||||
static class SearchResultViewHolder extends RecyclerView.ViewHolder {
|
static class SearchResultViewHolder extends RecyclerView.ViewHolder {
|
||||||
@@ -257,9 +285,20 @@ class SearchListAdapter
|
|||||||
root.setOnClickListener(view -> eventListener.onMessageClicked(messageResult));
|
root.setOnClickListener(view -> eventListener.onMessageClicked(messageResult));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bind(
|
||||||
|
@NonNull QrInviteData inviteData,
|
||||||
|
@NonNull GlideRequests glideRequests,
|
||||||
|
@NonNull EventListener eventListener) {
|
||||||
|
root.bind(inviteData, glideRequests);
|
||||||
|
root.setOnClickListener(
|
||||||
|
view -> eventListener.onInvitationClicked(inviteData.getRawQrString()));
|
||||||
|
root.setOnLongClickListener(null);
|
||||||
|
}
|
||||||
|
|
||||||
void recycle() {
|
void recycle() {
|
||||||
root.unbind();
|
root.unbind();
|
||||||
root.setOnClickListener(null);
|
root.setOnClickListener(null);
|
||||||
|
root.setOnLongClickListener(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import androidx.lifecycle.ViewModel;
|
|||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import com.b44t.messenger.DcChatlist;
|
import com.b44t.messenger.DcChatlist;
|
||||||
import com.b44t.messenger.DcContext;
|
import com.b44t.messenger.DcContext;
|
||||||
|
import com.b44t.messenger.DcLot;
|
||||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
import org.thoughtcrime.securesms.search.model.SearchResult;
|
import org.thoughtcrime.securesms.search.model.SearchResult;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
@@ -18,13 +19,15 @@ class SearchViewModel extends ViewModel {
|
|||||||
private static final String TAG = "SearchViewModel";
|
private static final String TAG = "SearchViewModel";
|
||||||
private final ObservingLiveData searchResult;
|
private final ObservingLiveData searchResult;
|
||||||
private String lastQuery;
|
private String lastQuery;
|
||||||
|
private final Context appContext;
|
||||||
private final DcContext dcContext;
|
private final DcContext dcContext;
|
||||||
private boolean forwarding = false;
|
private boolean forwarding = false;
|
||||||
private boolean inBgSearch;
|
private boolean inBgSearch;
|
||||||
private boolean needsAnotherBgSearch;
|
private boolean needsAnotherBgSearch;
|
||||||
|
|
||||||
SearchViewModel(@NonNull Context context) {
|
SearchViewModel(@NonNull Context context) {
|
||||||
this.dcContext = DcHelper.getContext(context.getApplicationContext());
|
this.appContext = context.getApplicationContext();
|
||||||
|
this.dcContext = DcHelper.getContext(appContext);
|
||||||
this.searchResult = new ObservingLiveData();
|
this.searchResult = new ObservingLiveData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,6 +76,12 @@ class SearchViewModel extends ViewModel {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QrInviteData qrInviteData = null;
|
||||||
|
if (!forwarding && query.contains(":")) {
|
||||||
|
DcLot qrParsed = dcContext.checkQr(query);
|
||||||
|
qrInviteData = QrInviteData.from(appContext, dcContext, qrParsed, query);
|
||||||
|
}
|
||||||
|
|
||||||
// #1 search for chats
|
// #1 search for chats
|
||||||
long startMs = System.currentTimeMillis();
|
long startMs = System.currentTimeMillis();
|
||||||
DcChatlist conversations =
|
DcChatlist conversations =
|
||||||
@@ -83,7 +92,8 @@ class SearchViewModel extends ViewModel {
|
|||||||
// #2 search for contacts
|
// #2 search for contacts
|
||||||
if (!query.equals(lastQuery) && overallCnt > 0) {
|
if (!query.equals(lastQuery) && overallCnt > 0) {
|
||||||
Log.i(TAG, "... skipping getContacts() and searchMsgs(), more recent search pending");
|
Log.i(TAG, "... skipping getContacts() and searchMsgs(), more recent search pending");
|
||||||
callback.onResult(new SearchResult(query, new int[0], conversations, new int[0]));
|
callback.onResult(
|
||||||
|
new SearchResult(query, new int[0], conversations, new int[0], qrInviteData));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,19 +105,19 @@ class SearchViewModel extends ViewModel {
|
|||||||
// #3 search for messages
|
// #3 search for messages
|
||||||
if (forwarding) {
|
if (forwarding) {
|
||||||
Log.i(TAG, "... searchMsgs() disabled by caller");
|
Log.i(TAG, "... searchMsgs() disabled by caller");
|
||||||
callback.onResult(new SearchResult(query, contacts, conversations, new int[0]));
|
callback.onResult(new SearchResult(query, contacts, conversations, new int[0], qrInviteData));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query.length() <= 1) {
|
if (query.length() <= 1) {
|
||||||
Log.i(TAG, "... skipping searchMsgs(), string too short");
|
Log.i(TAG, "... skipping searchMsgs(), string too short");
|
||||||
callback.onResult(new SearchResult(query, contacts, conversations, new int[0]));
|
callback.onResult(new SearchResult(query, contacts, conversations, new int[0], qrInviteData));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!query.equals(lastQuery) && overallCnt > 0) {
|
if (!query.equals(lastQuery) && overallCnt > 0) {
|
||||||
Log.i(TAG, "... skipping searchMsgs(), more recent search pending");
|
Log.i(TAG, "... skipping searchMsgs(), more recent search pending");
|
||||||
callback.onResult(new SearchResult(query, contacts, conversations, new int[0]));
|
callback.onResult(new SearchResult(query, contacts, conversations, new int[0], qrInviteData));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +125,7 @@ class SearchViewModel extends ViewModel {
|
|||||||
int[] messages = dcContext.searchMsgs(0, query);
|
int[] messages = dcContext.searchMsgs(0, query);
|
||||||
Log.i(TAG, "⏰ searchMsgs(" + query + "): " + (System.currentTimeMillis() - startMs) + "ms");
|
Log.i(TAG, "⏰ searchMsgs(" + query + "): " + (System.currentTimeMillis() - startMs) + "ms");
|
||||||
|
|
||||||
callback.onResult(new SearchResult(query, contacts, conversations, messages));
|
callback.onResult(new SearchResult(query, contacts, conversations, messages, qrInviteData));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package org.thoughtcrime.securesms.search.model;
|
package org.thoughtcrime.securesms.search.model;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import com.b44t.messenger.DcChatlist;
|
import com.b44t.messenger.DcChatlist;
|
||||||
|
import org.thoughtcrime.securesms.search.QrInviteData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents an all-encompassing search result that can contain various result for different
|
* Represents an all-encompassing search result that can contain various result for different
|
||||||
@@ -16,16 +18,27 @@ public class SearchResult {
|
|||||||
private final int[] contacts;
|
private final int[] contacts;
|
||||||
private final DcChatlist conversations;
|
private final DcChatlist conversations;
|
||||||
private final int[] messages;
|
private final int[] messages;
|
||||||
|
private final QrInviteData qrInviteData;
|
||||||
|
|
||||||
public SearchResult(
|
public SearchResult(
|
||||||
@NonNull String query,
|
@NonNull String query,
|
||||||
@NonNull int[] contacts,
|
@NonNull int[] contacts,
|
||||||
@NonNull DcChatlist conversations,
|
@NonNull DcChatlist conversations,
|
||||||
@NonNull int[] messages) {
|
@NonNull int[] messages) {
|
||||||
|
this(query, contacts, conversations, messages, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SearchResult(
|
||||||
|
@NonNull String query,
|
||||||
|
@NonNull int[] contacts,
|
||||||
|
@NonNull DcChatlist conversations,
|
||||||
|
@NonNull int[] messages,
|
||||||
|
@Nullable QrInviteData qrInviteData) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.contacts = contacts;
|
this.contacts = contacts;
|
||||||
this.conversations = conversations;
|
this.conversations = conversations;
|
||||||
this.messages = messages;
|
this.messages = messages;
|
||||||
|
this.qrInviteData = qrInviteData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int[] getContacts() {
|
public int[] getContacts() {
|
||||||
@@ -44,8 +57,16 @@ public class SearchResult {
|
|||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public QrInviteData getQrInviteData() {
|
||||||
|
return qrInviteData;
|
||||||
|
}
|
||||||
|
|
||||||
public int size() {
|
public int size() {
|
||||||
return contacts.length + conversations.getCnt() + messages.length;
|
return (qrInviteData != null ? 1 : 0)
|
||||||
|
+ contacts.length
|
||||||
|
+ conversations.getCnt()
|
||||||
|
+ messages.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.service;
|
|||||||
|
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -10,15 +11,24 @@ import androidx.annotation.OptIn;
|
|||||||
import androidx.media3.common.AudioAttributes;
|
import androidx.media3.common.AudioAttributes;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
|
import androidx.media3.datasource.DefaultDataSource;
|
||||||
|
import androidx.media3.datasource.ResolvingDataSource;
|
||||||
import androidx.media3.exoplayer.ExoPlayer;
|
import androidx.media3.exoplayer.ExoPlayer;
|
||||||
|
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory;
|
||||||
|
import androidx.media3.exoplayer.source.MediaSource;
|
||||||
import androidx.media3.session.MediaSession;
|
import androidx.media3.session.MediaSession;
|
||||||
import androidx.media3.session.MediaSessionService;
|
import androidx.media3.session.MediaSessionService;
|
||||||
import androidx.media3.session.SessionCommand;
|
import androidx.media3.session.SessionCommand;
|
||||||
import androidx.media3.session.SessionCommands;
|
import androidx.media3.session.SessionCommands;
|
||||||
import androidx.media3.session.SessionResult;
|
import androidx.media3.session.SessionResult;
|
||||||
|
import com.b44t.messenger.DcContext;
|
||||||
|
import com.b44t.messenger.DcMsg;
|
||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import java.io.IOException;
|
||||||
import org.thoughtcrime.securesms.ConversationListActivity;
|
import org.thoughtcrime.securesms.ConversationListActivity;
|
||||||
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
|
import org.thoughtcrime.securesms.mms.AudioSlide;
|
||||||
|
|
||||||
public class AudioPlaybackService extends MediaSessionService {
|
public class AudioPlaybackService extends MediaSessionService {
|
||||||
|
|
||||||
@@ -27,6 +37,7 @@ public class AudioPlaybackService extends MediaSessionService {
|
|||||||
private ExoPlayer player;
|
private ExoPlayer player;
|
||||||
private MediaSession session;
|
private MediaSession session;
|
||||||
|
|
||||||
|
@OptIn(markerClass = UnstableApi.class)
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
@@ -37,10 +48,47 @@ public class AudioPlaybackService extends MediaSessionService {
|
|||||||
.setContentType(C.AUDIO_CONTENT_TYPE_SPEECH)
|
.setContentType(C.AUDIO_CONTENT_TYPE_SPEECH)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
ResolvingDataSource.Factory dataSourceFactory =
|
||||||
|
new ResolvingDataSource.Factory(
|
||||||
|
new DefaultDataSource.Factory(this),
|
||||||
|
dataSpec -> {
|
||||||
|
Uri uri = dataSpec.uri;
|
||||||
|
if (!"dcmsg".equals(uri.getScheme())) {
|
||||||
|
return dataSpec;
|
||||||
|
}
|
||||||
|
|
||||||
|
String host = uri.getHost();
|
||||||
|
String segment = uri.getLastPathSegment();
|
||||||
|
int accountId = 0;
|
||||||
|
int msgId = 0;
|
||||||
|
if (host != null && segment != null) {
|
||||||
|
try {
|
||||||
|
accountId = Integer.parseInt(host);
|
||||||
|
msgId = Integer.parseInt(segment);
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (accountId <= 0 || msgId <= 0) {
|
||||||
|
throw new IOException("Invalid dcmsg uri: " + uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
DcContext dcContext = DcHelper.getAccounts(this).getAccount(accountId);
|
||||||
|
DcMsg msg = dcContext.getMsg(msgId);
|
||||||
|
Uri resolved = new AudioSlide(this, msg).getUri();
|
||||||
|
if (resolved == null) {
|
||||||
|
throw new IOException("No file for msgId " + msgId + " in account " + accountId);
|
||||||
|
}
|
||||||
|
return dataSpec.withUri(resolved);
|
||||||
|
});
|
||||||
|
|
||||||
|
MediaSource.Factory mediaSourceFactory =
|
||||||
|
new DefaultMediaSourceFactory(this).setDataSourceFactory(dataSourceFactory);
|
||||||
|
|
||||||
player =
|
player =
|
||||||
new ExoPlayer.Builder(this)
|
new ExoPlayer.Builder(this)
|
||||||
.setAudioAttributes(audioAttributes, true)
|
.setAudioAttributes(audioAttributes, true)
|
||||||
.setHandleAudioBecomingNoisy(true)
|
.setHandleAudioBecomingNoisy(true)
|
||||||
|
.setMediaSourceFactory(mediaSourceFactory)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// This is for click on the notification to go back to app
|
// This is for click on the notification to go back to app
|
||||||
|
|||||||
@@ -194,10 +194,6 @@ public class Prefs {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isNewBroadcastAvailable(Context context) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ringtone
|
// ringtone
|
||||||
|
|
||||||
public static @NonNull Uri getNotificationRingtone(Context context) {
|
public static @NonNull Uri getNotificationRingtone(Context context) {
|
||||||
|
|||||||
@@ -151,7 +151,6 @@ public class SendRelayedMessageUtil {
|
|||||||
message = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
message = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||||
} else if ("sticker".equals(type)) {
|
} else if ("sticker".equals(type)) {
|
||||||
message = new DcMsg(dcContext, DcMsg.DC_MSG_STICKER);
|
message = new DcMsg(dcContext, DcMsg.DC_MSG_STICKER);
|
||||||
message.forceSticker();
|
|
||||||
} else if ("image".equals(type) || MediaUtil.isImageType(mimeType)) {
|
} else if ("image".equals(type) || MediaUtil.isImageType(mimeType)) {
|
||||||
message = new DcMsg(dcContext, DcMsg.DC_MSG_IMAGE);
|
message = new DcMsg(dcContext, DcMsg.DC_MSG_IMAGE);
|
||||||
} else if ("audio".equals(type) || MediaUtil.isAudioType(mimeType)) {
|
} else if ("audio".equals(type) || MediaUtil.isAudioType(mimeType)) {
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class ShareUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int[] getForwardedMessageIDs(Activity activity) {
|
public static int[] getForwardedMessageIDs(Activity activity) {
|
||||||
try {
|
try {
|
||||||
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS);
|
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS);
|
||||||
} catch (NullPointerException npe) {
|
} catch (NullPointerException npe) {
|
||||||
@@ -228,8 +228,4 @@ public class ShareUtil {
|
|||||||
public static void setSharedTitle(Intent composeIntent, String text) {
|
public static void setSharedTitle(Intent composeIntent, String text) {
|
||||||
composeIntent.putExtra(SHARED_TITLE, text);
|
composeIntent.putExtra(SHARED_TITLE, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setDirectSharing(Intent composeIntent, int chatId) {
|
|
||||||
composeIntent.putExtra(DIRECT_SHARING_CHAT_ID, chatId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:scaleType="centerCrop"
|
android:scaleType="centerCrop"
|
||||||
android:contentDescription="Contact photo"
|
android:importantForAccessibility="no"
|
||||||
app:shapeAppearanceOverlay="@style/ShapeAppearance.Material3.Corner.Full"
|
app:shapeAppearanceOverlay="@style/ShapeAppearance.Material3.Corner.Full"
|
||||||
app:layout_constraintWidth_percent="0.4"
|
app:layout_constraintWidth_percent="0.4"
|
||||||
app:layout_constraintDimensionRatio="1:1"
|
app:layout_constraintDimensionRatio="1:1"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
android:paddingEnd="16dp"
|
android:paddingEnd="16dp"
|
||||||
android:paddingTop="12dp"
|
android:paddingTop="12dp"
|
||||||
android:paddingBottom="12dp"
|
android:paddingBottom="12dp"
|
||||||
android:background="@color/calls_dark_surface"
|
android:background="@android:color/black"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
android:id="@+id/display_name_text"
|
android:id="@+id/display_name_text"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="@color/calls_dark_on_surface"
|
android:textColor="@android:color/white"
|
||||||
android:textSize="18sp"
|
android:textSize="18sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
tools:text="John Doe" />
|
tools:text="John Doe" />
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
android:id="@+id/status_text"
|
android:id="@+id/status_text"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="@color/calls_dark_on_surface_variant"
|
android:textColor="@android:color/white"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
tools:text="Connecting..." />
|
tools:text="Connecting..." />
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:scaleType="centerCrop"
|
android:scaleType="centerCrop"
|
||||||
android:contentDescription="Caller photo"
|
android:importantForAccessibility="no"
|
||||||
tools:src="@drawable/ic_person" />
|
tools:src="@drawable/ic_person" />
|
||||||
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
@@ -141,7 +141,7 @@
|
|||||||
style="?attr/materialButtonOutlinedStyle"
|
style="?attr/materialButtonOutlinedStyle"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Audio"
|
android:text="@string/audio"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
android:minWidth="100dp"
|
android:minWidth="100dp"
|
||||||
app:icon="@drawable/ic_call"
|
app:icon="@drawable/ic_call"
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
style="?attr/materialButtonOutlinedStyle"
|
style="?attr/materialButtonOutlinedStyle"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Video"
|
android:text="@string/video"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
android:minWidth="100dp"
|
android:minWidth="100dp"
|
||||||
app:icon="@drawable/ic_videocam_on"
|
app:icon="@drawable/ic_videocam_on"
|
||||||
@@ -185,7 +185,7 @@
|
|||||||
android:layout_height="56dp"
|
android:layout_height="56dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:text="Decline"
|
android:text="@string/end_call"
|
||||||
android:textSize="15sp"
|
android:textSize="15sp"
|
||||||
app:icon="@drawable/ic_call_end"
|
app:icon="@drawable/ic_call_end"
|
||||||
app:iconGravity="textStart"
|
app:iconGravity="textStart"
|
||||||
@@ -199,7 +199,7 @@
|
|||||||
android:layout_height="56dp"
|
android:layout_height="56dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
android:text="Answer"
|
android:text="@string/answer_call"
|
||||||
android:textSize="15sp"
|
android:textSize="15sp"
|
||||||
app:icon="@drawable/ic_call"
|
app:icon="@drawable/ic_call"
|
||||||
app:iconGravity="textStart"
|
app:iconGravity="textStart"
|
||||||
@@ -241,9 +241,9 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:src="@drawable/ic_mic_on"
|
android:src="@drawable/ic_mic_on"
|
||||||
android:contentDescription="Toggle microphone"
|
android:contentDescription="@string/mute"
|
||||||
app:tint="@color/calls_dark_on_surface"
|
app:tint="@color/calls_button_foreground"
|
||||||
app:backgroundTint="@color/calls_dark_surface_3"
|
app:backgroundTint="@color/calls_button_background"
|
||||||
app:fabSize="normal"
|
app:fabSize="normal"
|
||||||
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
||||||
app:borderWidth="0dp" />
|
app:borderWidth="0dp" />
|
||||||
@@ -263,9 +263,9 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:src="@drawable/ic_videocam_on"
|
android:src="@drawable/ic_videocam_on"
|
||||||
android:contentDescription="Toggle camera"
|
android:contentDescription="@string/toggle_camera"
|
||||||
app:tint="@color/calls_dark_on_surface"
|
app:tint="@color/calls_button_foreground"
|
||||||
app:backgroundTint="@color/calls_dark_surface_3"
|
app:backgroundTint="@color/calls_button_background"
|
||||||
app:fabSize="normal"
|
app:fabSize="normal"
|
||||||
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
||||||
app:borderWidth="0dp" />
|
app:borderWidth="0dp" />
|
||||||
@@ -285,8 +285,8 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:src="@drawable/ic_call_end"
|
android:src="@drawable/ic_call_end"
|
||||||
android:contentDescription="End call"
|
android:contentDescription="@string/end_call2"
|
||||||
app:tint="@android:color/white"
|
app:tint="@color/calls_button_foreground"
|
||||||
app:backgroundTint="@color/calls_red"
|
app:backgroundTint="@color/calls_red"
|
||||||
app:fabSize="normal"
|
app:fabSize="normal"
|
||||||
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
||||||
@@ -307,9 +307,9 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:src="@drawable/ic_volume_up"
|
android:src="@drawable/ic_volume_up"
|
||||||
android:contentDescription="Audio output"
|
android:contentDescription="@string/audio"
|
||||||
app:tint="@color/calls_dark_on_surface"
|
app:tint="@color/calls_button_foreground"
|
||||||
app:backgroundTint="@color/calls_dark_surface_3"
|
app:backgroundTint="@color/calls_button_background"
|
||||||
app:fabSize="normal"
|
app:fabSize="normal"
|
||||||
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
||||||
app:borderWidth="0dp" />
|
app:borderWidth="0dp" />
|
||||||
@@ -329,9 +329,9 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:src="@drawable/ic_switch_camera"
|
android:src="@drawable/ic_switch_camera"
|
||||||
android:contentDescription="Switch camera"
|
android:contentDescription="@string/switch_camera"
|
||||||
app:tint="@color/calls_dark_on_surface"
|
app:tint="@color/calls_button_foreground"
|
||||||
app:backgroundTint="@color/calls_dark_surface_3"
|
app:backgroundTint="@color/calls_button_background"
|
||||||
app:fabSize="normal"
|
app:fabSize="normal"
|
||||||
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
app:shapeAppearance="@style/ShapeAppearance.Material3.Corner.Full"
|
||||||
app:borderWidth="0dp" />
|
app:borderWidth="0dp" />
|
||||||
|
|||||||
@@ -129,7 +129,7 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
tools:visibility="visible"
|
||||||
app:constraint_referenced_ids="inbox, imap_login, imap_server, imap_port, imap_security_label, imap_security, outbox_view_spacer_top,
|
app:constraint_referenced_ids="inbox, imap_login, imap_server, imap_port, imap_security_label, imap_security, outbox_view_spacer_top,
|
||||||
outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, cert_check_label, cert_check, view_log_button" />
|
outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, cert_check_label, cert_check, view_log_button, enforce_e2ee_switch" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/advanced_icon"
|
android:id="@+id/advanced_icon"
|
||||||
@@ -362,6 +362,17 @@
|
|||||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||||
app:layout_constraintTop_toBottomOf="@id/cert_check_label" />
|
app:layout_constraintTop_toBottomOf="@id/cert_check_label" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.SwitchCompat
|
||||||
|
android:id="@+id/enforce_e2ee_switch"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:text="@string/enforce_e2ee"
|
||||||
|
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/cert_check" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/view_log_button"
|
android:id="@+id/view_log_button"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
@@ -375,7 +386,7 @@
|
|||||||
android:paddingBottom="32dp"
|
android:paddingBottom="32dp"
|
||||||
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
app:layout_constraintEnd_toEndOf="@id/guideline_root_end"
|
||||||
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
app:layout_constraintStart_toStartOf="@id/guideline_root_start"
|
||||||
app:layout_constraintTop_toBottomOf="@id/cert_check" />
|
app:layout_constraintTop_toBottomOf="@id/enforce_e2ee_switch" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
<androidx.viewpager.widget.ViewPager
|
<androidx.viewpager2.widget.ViewPager2
|
||||||
android:id="@+id/pager"
|
android:id="@+id/pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
<androidx.viewpager.widget.ViewPager
|
<androidx.viewpager2.widget.ViewPager2
|
||||||
android:id="@+id/pager"
|
android:id="@+id/pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
|||||||
@@ -126,6 +126,7 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/webxdc_linear_layout"
|
||||||
android:layout_width="90dp"
|
android:layout_width="90dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
android:background="@color/gray95">
|
android:background="@color/gray95">
|
||||||
|
|
||||||
<org.thoughtcrime.securesms.components.viewpager.HackyViewPager
|
<androidx.viewpager2.widget.ViewPager2
|
||||||
android:id="@+id/media_pager"
|
android:id="@+id/media_pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" />
|
android:layout_height="match_parent" />
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:title="@string/mark_all_as_read"
|
||||||
|
android:id="@+id/menu_mark_all_as_read" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:title="@string/menu_mute"
|
android:title="@string/menu_mute"
|
||||||
android:id="@+id/menu_mute_notifications" />
|
android:id="@+id/menu_mute_notifications" />
|
||||||
|
|||||||
@@ -184,6 +184,7 @@
|
|||||||
<string name="pref_other">أخرى</string>
|
<string name="pref_other">أخرى</string>
|
||||||
<!-- No need to translate "Wallpaper" literally. Chose what is common in your language for a "Wallpaper" or a "Background". Avoid adding the term "image" here, as the "Wallpaper" may also be just a single color. -->
|
<!-- No need to translate "Wallpaper" literally. Chose what is common in your language for a "Wallpaper" or a "Background". Avoid adding the term "image" here, as the "Wallpaper" may also be just a single color. -->
|
||||||
<string name="pref_background">الخلفية</string>
|
<string name="pref_background">الخلفية</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">كلها</string>
|
<string name="pref_show_emails_all">كلها</string>
|
||||||
<string name="qrscan_fingerprint_label">البصمة</string>
|
<string name="qrscan_fingerprint_label">البصمة</string>
|
||||||
<!-- notifications -->
|
<!-- notifications -->
|
||||||
|
|||||||
@@ -165,12 +165,14 @@
|
|||||||
<string name="mute_for_seven_days">7 günlük söndür</string>
|
<string name="mute_for_seven_days">7 günlük söndür</string>
|
||||||
<string name="mute_forever">Həmişə səssiz</string>
|
<string name="mute_forever">Həmişə səssiz</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">5 dəqiqə üçün</string>
|
<string name="share_location_for_5_minutes">5 dəqiqə üçün</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">30 qəqiqə üçün</string>
|
<string name="share_location_for_30_minutes">30 qəqiqə üçün</string>
|
||||||
<string name="share_location_for_one_hour">1 saat üçün</string>
|
<string name="share_location_for_one_hour">1 saat üçün</string>
|
||||||
<string name="share_location_for_two_hours">2 saat üçün </string>
|
<string name="share_location_for_two_hours">2 saat üçün </string>
|
||||||
<string name="share_location_for_six_hours">6 saat üçün</string>
|
<string name="share_location_for_six_hours">6 saat üçün</string>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Mesajları yönləndirin %1$sə-?</string>
|
<string name="ask_forward">Mesajları yönləndirin %1$sə-?</string>
|
||||||
<string name="ask_export_attachment">Faylı ixrac etmək? Faylların ixracı cihazınızdakı hər hansı digər tətbiqlərə daxil olmağa imkan verəcəkdir. \n\n Razısan?</string>
|
<string name="ask_export_attachment">Faylı ixrac etmək? Faylların ixracı cihazınızdakı hər hansı digər tətbiqlərə daxil olmağa imkan verəcəkdir. \n\n Razısan?</string>
|
||||||
<string name="ask_block_contact">Bu kontaktı bloklamaq? Bu kontaktdan artıq mesaj qəbul etməyəcəksiniz.</string>
|
<string name="ask_block_contact">Bu kontaktı bloklamaq? Bu kontaktdan artıq mesaj qəbul etməyəcəksiniz.</string>
|
||||||
@@ -317,11 +319,17 @@
|
|||||||
<string name="pref_background">Fon</string>
|
<string name="pref_background">Fon</string>
|
||||||
<string name="pref_background_btn_default">Hal hazırdaki şəkili istifadə edin</string>
|
<string name="pref_background_btn_default">Hal hazırdaki şəkili istifadə edin</string>
|
||||||
<string name="pref_background_btn_gallery">Fotoalbomdan götürün</string>
|
<string name="pref_background_btn_gallery">Fotoalbomdan götürün</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Bu seçimi ləğv etsəniz, serverinizin və digər müştərilərinizin müvafiq olaraq konfiqurasiya olunduğundan əmin olun. \n\nAyrıca şeylər işləməyəcəkdir.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Bu seçimi ləğv etsəniz, serverinizin və digər müştərilərinizin müvafiq olaraq konfiqurasiya olunduğundan əmin olun. \n\nAyrıca şeylər işləməyəcəkdir.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">DeltaChat qovluğuna avtomatik keçid</string>
|
<string name="pref_auto_folder_moves">DeltaChat qovluğuna avtomatik keçid</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Klassik e-poçtları göstər</string>
|
<string name="pref_show_emails">Klassik e-poçtları göstər</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Xeyir, ancaq çatlar</string>
|
<string name="pref_show_emails_no">Xeyir, ancaq çatlar</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Qəbul edilən kontaktlar üçün</string>
|
<string name="pref_show_emails_accepted_contacts">Qəbul edilən kontaktlar üçün</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Hamısı</string>
|
<string name="pref_show_emails_all">Hamısı</string>
|
||||||
<string name="pref_background_default">Özünəməxsus arxa fon</string>
|
<string name="pref_background_default">Özünəməxsus arxa fon</string>
|
||||||
<string name="pref_background_default_color">Özünəməxsus rəng</string>
|
<string name="pref_background_default_color">Özünəməxsus rəng</string>
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
<string name="always">Винаги</string>
|
<string name="always">Винаги</string>
|
||||||
<string name="always_load_remote_images">Винаги да се зареждат отдалечените изображения</string>
|
<string name="always_load_remote_images">Винаги да се зареждат отдалечените изображения</string>
|
||||||
<string name="once">Веднъж</string>
|
<string name="once">Веднъж</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Показване на предупреждение</string>
|
<string name="show_warning">Показване на предупреждение</string>
|
||||||
<string name="not_now">Не сега</string>
|
<string name="not_now">Не сега</string>
|
||||||
<string name="never">Никога</string>
|
<string name="never">Никога</string>
|
||||||
@@ -161,6 +162,7 @@
|
|||||||
<string name="camera">Камера</string>
|
<string name="camera">Камера</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Заснемане</string>
|
<string name="capture">Заснемане</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Превключване на камерата</string>
|
<string name="switch_camera">Превключване на камерата</string>
|
||||||
<string name="toggle_fullscreen">Включване/изключване на пълноекранния режим</string>
|
<string name="toggle_fullscreen">Включване/изключване на пълноекранния режим</string>
|
||||||
<string name="location">Местоположение</string>
|
<string name="location">Местоположение</string>
|
||||||
@@ -288,18 +290,20 @@
|
|||||||
<string name="mute_for_seven_days">Спиране на звука за 7 дни</string>
|
<string name="mute_for_seven_days">Спиране на звука за 7 дни</string>
|
||||||
<string name="mute_forever">Спиране на звука за постоянно</string>
|
<string name="mute_forever">Спиране на звука за постоянно</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">За 5 минути</string>
|
<string name="share_location_for_5_minutes">За 5 минути</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">За 30 минути</string>
|
<string name="share_location_for_30_minutes">За 30 минути</string>
|
||||||
<string name="share_location_for_one_hour">За 1 час</string>
|
<string name="share_location_for_one_hour">За 1 час</string>
|
||||||
<string name="share_location_for_two_hours">За 2 часа</string>
|
<string name="share_location_for_two_hours">За 2 часа</string>
|
||||||
<string name="share_location_for_six_hours">За 6 часа</string>
|
<string name="share_location_for_six_hours">За 6 часа</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Да бъде ли изпратен следният файл на%s?</item>
|
<item quantity="one">Да бъде ли изпратен следният файл на %s?</item>
|
||||||
<item quantity="other">Да бъдат ли изпратени следните %d файлове на %s?</item>
|
<item quantity="other">Да бъдат ли изпратени следните %d файлове на %s?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="file_saved_to">Файлът е записан в \"%1$s\"</string>
|
<string name="file_saved_to">Файлът е записан в \"%1$s\"</string>
|
||||||
|
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Да бъдат ли препратени съобщенията на %1$s?</string>
|
<string name="ask_forward">Да бъдат ли препратени съобщенията на %1$s?</string>
|
||||||
<string name="ask_forward_multiple">Да бъдат ли препратени съобщенията към %1$d чата?</string>
|
<string name="ask_forward_multiple">Да бъдат ли препратени съобщенията към %1$d чата?</string>
|
||||||
<string name="ask_export_attachment">Експортирането на прикачените файлове ще даде възможност други приложения на Вашето устройство да имат достъп до тях.\n\nИскате ли да продължите?</string>
|
<string name="ask_export_attachment">Експортирането на прикачените файлове ще даде възможност други приложения на Вашето устройство да имат достъп до тях.\n\nИскате ли да продължите?</string>
|
||||||
@@ -457,6 +461,7 @@
|
|||||||
<string name="connectivity_connected">Свързани сте</string>
|
<string name="connectivity_connected">Свързани сте</string>
|
||||||
<string name="sending">Изпращане…</string>
|
<string name="sending">Изпращане…</string>
|
||||||
<string name="last_msg_sent_successfully">Последното съобщение беше изпратено успешно.</string>
|
<string name="last_msg_sent_successfully">Последното съобщение беше изпратено успешно.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">Не се поддържа от Вашия доставчик.</string>
|
<string name="not_supported_by_provider">Не се поддържа от Вашия доставчик.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Съобщения</string>
|
<string name="messages">Съобщения</string>
|
||||||
@@ -560,6 +565,7 @@
|
|||||||
<string name="pref_notifications_priority">Приоритет</string>
|
<string name="pref_notifications_priority">Приоритет</string>
|
||||||
<string name="pref_notifications_explain">Да бъдат разрешени системните уведомления за нови съобщения</string>
|
<string name="pref_notifications_explain">Да бъдат разрешени системните уведомления за нови съобщения</string>
|
||||||
<string name="pref_show_notification_content">Да се показва в уведомлението съдържанието на съобщението</string>
|
<string name="pref_show_notification_content">Да се показва в уведомлението съдържанието на съобщението</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Да се показва в уведомлението подателят и първите думи на съобщението</string>
|
<string name="pref_show_notification_content_explain">Да се показва в уведомлението подателят и първите думи на съобщението</string>
|
||||||
<string name="pref_led_color">Цвят на LED светлината</string>
|
<string name="pref_led_color">Цвят на LED светлината</string>
|
||||||
<string name="pref_sound">Звук</string>
|
<string name="pref_sound">Звук</string>
|
||||||
@@ -598,12 +604,19 @@
|
|||||||
<string name="pref_background">Фон</string>
|
<string name="pref_background">Фон</string>
|
||||||
<string name="pref_background_btn_default">Да се използва подразбиращото се изображение</string>
|
<string name="pref_background_btn_default">Да се използва подразбиращото се изображение</string>
|
||||||
<string name="pref_background_btn_gallery">Избор от галерията</string>
|
<string name="pref_background_btn_gallery">Избор от галерията</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Ако промение тази опция, се уверете, че Вашият сървър и другите Ви клиенти са конфигурирани по съответен начин.\n\nВ противен случай е възможно нещата въобще да не работят.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Ако промение тази опция, се уверете, че Вашият сървър и другите Ви клиенти са конфигурирани по съответен начин.\n\nВ противен случай е възможно нещата въобще да не работят.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Автоматично преместване в папката DeltaChat</string>
|
<string name="pref_auto_folder_moves">Автоматично преместване в папката DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Да се извлича само от папката DeltaChat</string>
|
<string name="pref_only_fetch_mvbox_title">Да се извлича само от папката DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Да се показват класически e-mail съобщения</string>
|
<string name="pref_show_emails">Да се показват класически e-mail съобщения</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Не, само чатове</string>
|
<string name="pref_show_emails_no">Не, само чатове</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">За приетите контакти</string>
|
<string name="pref_show_emails_accepted_contacts">За приетите контакти</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Всички</string>
|
<string name="pref_show_emails_all">Всички</string>
|
||||||
<string name="pref_experimental_features">Експериментални възможности</string>
|
<string name="pref_experimental_features">Експериментални възможности</string>
|
||||||
<string name="pref_on_demand_location_streaming">Поточно излъчване на местоположението при поискване</string>
|
<string name="pref_on_demand_location_streaming">Поточно излъчване на местоположението при поискване</string>
|
||||||
@@ -649,12 +662,13 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Изтриване на старите съобщения</string>
|
<string name="delete_old_messages">Изтриване на старите съобщения</string>
|
||||||
<string name="autodel_device_title">Изтриване на съобщенията от устройството</string>
|
<string name="autodel_device_title">Изтриване на съобщенията от устройството</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Изтриване на съобщенията от сървъра</string>
|
<string name="autodel_server_title">Изтриване на съобщенията от сървъра</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">Искате ли да изтриете %1$d съобщения сега, както и всички съобщения \"%2$s\", които ще бъдат изтегляни в бъдеще?\n\n• Това включва всички медийни файлове\n\n• Съобщенията ще бъдат изтрити, независимо от това дали са видени или не\n\n• Съобщенията от \"Запазени съобщения\" няма да бъдат изтривани локално</string>
|
<string name="autodel_device_ask">Искате ли да изтриете %1$d съобщения сега, както и всички съобщения \"%2$s\", които ще бъдат изтегляни в бъдеще?\n\n• Това включва всички медийни файлове\n\n• Съобщенията ще бъдат изтрити, независимо от това дали са видени или не\n\n• Съобщенията от \"Запазени съобщения\" няма да бъдат изтривани локално</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">Искате ли да изтриете %1$d съобщения сега и всички съобщения \"%2$s\", които ще бъдат изтегляни в бъдеще?\n\n⚠️ Това включва електронна поща, медийни файлове и съобщенията от \"Записани съобщения\" във всички папки на сървъра\n\n⚠️ Не ползвайте тази функция, ако искате да запазите данните на сървъра\n\n⚠️ Не ползвайте тази функция, ако работите с други клиенти за електронна поща освен Delta Chat</string>
|
<string name="autodel_server_ask">Искате ли да изтриете %1$d съобщения сега и всички съобщения \"%2$s\", които ще бъдат изтегляни в бъдеще?\n\n⚠️ Това включва електронна поща, медийни файлове и съобщенията от \"Записани съобщения\" във всички папки на сървъра\n\n⚠️ Не ползвайте тази функция, ако искате да запазите данните на сървъра\n\n⚠️ Не ползвайте тази функция, ако работите с други клиенти за електронна поща освен Delta Chat</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Това включва електронна поща, медийни файлове и \"Запазени съобщения\" във всички папки на сървъра. Не ползвайте тази функция, ако искате да запазите данните на сървъра или ако работите с други клиенти за електронна поща освен Delta Chat.</string>
|
<string name="autodel_server_enabled_hint">Това включва електронна поща, медийни файлове и \"Запазени съобщения\" във всички папки на сървъра. Не ползвайте тази функция, ако искате да запазите данните на сървъра или ако работите с други клиенти за електронна поща освен Delta Chat.</string>
|
||||||
<string name="autodel_confirm">Разбирам. Всички тези съобщения да бъдат изтрити</string>
|
<string name="autodel_confirm">Разбирам. Всички тези съобщения да бъдат изтрити</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -733,7 +747,7 @@
|
|||||||
<string name="learn_more">Научете повече</string>
|
<string name="learn_more">Научете повече</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">Изтрихте чата \"Запазени съобщения\".\n\nℹ️ За да използвате възможността \"Запазени съобщения\" отново, създайте нов чат със себе си.</string>
|
<string name="devicemsg_self_deleted">Изтрихте чата \"Запазени съобщения\".\n\nℹ️ За да използвате възможността \"Запазени съобщения\" отново, създайте нов чат със себе си.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ Мястото за съхранение, предоставено от Вашия доставчик, скоро ще бъде изчерпано:%1$s%% вече са използвани.\n\nМоже да нямате възможност да получавате съобщения, ако мястото за съхранение е заето напълно.\n\n👉 Моля, проверете дали не бихте могли да изтриете стари данни през уеб интерфейса на доставчика и обмислете дали да не включите \"Настройки / Изтриване на старите съобщения\". Можете по всяко време да проверите текущо използваното място за съхранение в \"Настройки / Свързаност\".</string>
|
<string name="devicemsg_storage_exceeding">⚠️ Мястото за съхранение, предоставено от Вашия доставчик, скоро ще бъде изчерпано:%1$s%% вече са използвани.\n\nМоже да нямате възможност да получавате съобщения, ако мястото за съхранение е заето напълно.\n\n👉 Моля, проверете дали не бихте могли да изтриете стари данни през уеб интерфейса на доставчика и обмислете дали да не включите \"Настройки / Изтриване на старите съобщения\". Можете по всяко време да проверите текущо използваното място за съхранение в \"Настройки / Свързаност\".</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ Изглежда датата и часът на Вашето устройство са неточни (%1$s).\n\nНастройте часовника ⏰🔧, за да имате сигурност, че Вашите съобщения се получават правилно.</string>
|
<string name="devicemsg_bad_time">⚠️ Изглежда датата и часът на Вашето устройство са неточни (%1$s).\n\nНастройте часовника ⏰🔧, за да имате сигурност, че Вашите съобщения се получават правилно.</string>
|
||||||
@@ -884,7 +898,6 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Действия, свързани със съобщението</string>
|
<string name="a11y_message_context_menu_btn_label">Действия, свързани със съобщението</string>
|
||||||
<string name="a11y_background_preview_label">Предварителен преглед на тапет</string>
|
<string name="a11y_background_preview_label">Предварителен преглед на тапет</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Активирани са изчезващите съобщения</string>
|
<string name="a11y_disappearing_messages_activated">Активирани са изчезващите съобщения</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Споделянето на местоположението да бъде спряно</string>
|
<string name="stop_sharing_location">Споделянето на местоположението да бъде спряно</string>
|
||||||
<string name="a11y_voice_message_hint_ios">След като приключите със записа, докоснете двукратно, за да го изпратите. За да го отхвърлите, приплъзнете с два пръста.</string>
|
<string name="a11y_voice_message_hint_ios">След като приключите със записа, докоснете двукратно, за да го изпратите. За да го отхвърлите, приплъзнете с два пръста.</string>
|
||||||
|
|||||||
@@ -59,7 +59,9 @@
|
|||||||
<string name="media">وارسگر</string>
|
<string name="media">وارسگر</string>
|
||||||
<string name="apps_and_media">برنومه یل وو وارسگرا</string>
|
<string name="apps_and_media">برنومه یل وو وارسگرا</string>
|
||||||
<string name="profile">پوروفایل</string>
|
<string name="profile">پوروفایل</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">پوی پوروفایلا</string>
|
<string name="all_profiles">پوی پوروفایلا</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">پوروفایل هیم سکویی</string>
|
<string name="current_profile">پوروفایل هیم سکویی</string>
|
||||||
<string name="main_menu">نومگه ٱسلی</string>
|
<string name="main_menu">نومگه ٱسلی</string>
|
||||||
<string name="start_chat">ناڌن پا گوفت وو لوفت</string>
|
<string name="start_chat">ناڌن پا گوفت وو لوفت</string>
|
||||||
@@ -78,6 +80,7 @@
|
|||||||
<string name="always">همیشه</string>
|
<string name="always">همیشه</string>
|
||||||
<string name="always_load_remote_images">شؽواتا دیر ز دسرس هی بوگوئشن</string>
|
<string name="always_load_remote_images">شؽواتا دیر ز دسرس هی بوگوئشن</string>
|
||||||
<string name="once">هیم ی کرت</string>
|
<string name="once">هیم ی کرت</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">نشووݩ داڌن هوشدار</string>
|
<string name="show_warning">نشووݩ داڌن هوشدار</string>
|
||||||
<string name="not_now">سکو ن</string>
|
<string name="not_now">سکو ن</string>
|
||||||
<string name="never">هیچ</string>
|
<string name="never">هیچ</string>
|
||||||
@@ -179,6 +182,7 @@
|
|||||||
<string name="camera">شؽواتگر</string>
|
<string name="camera">شؽواتگر</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">گرؽڌن</string>
|
<string name="capture">گرؽڌن</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">آلشت شؽواتگر</string>
|
<string name="switch_camera">آلشت شؽواتگر</string>
|
||||||
<string name="toggle_fullscreen">آلشت وزیت پوی بلگه</string>
|
<string name="toggle_fullscreen">آلشت وزیت پوی بلگه</string>
|
||||||
<string name="location">جاگه</string>
|
<string name="location">جاگه</string>
|
||||||
@@ -314,12 +318,13 @@
|
|||||||
<string name="mute_for_seven_days">بؽ دونگ کردن سی 7 رۊ</string>
|
<string name="mute_for_seven_days">بؽ دونگ کردن سی 7 رۊ</string>
|
||||||
<string name="mute_forever">بؽ دونگ کردن سی همیشه</string>
|
<string name="mute_forever">بؽ دونگ کردن سی همیشه</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">سی 5 دؽقه</string>
|
<string name="share_location_for_5_minutes">سی 5 دؽقه</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">سی 30 دؽقه</string>
|
<string name="share_location_for_30_minutes">سی 30 دؽقه</string>
|
||||||
<string name="share_location_for_one_hour">سی 1 ساعت</string>
|
<string name="share_location_for_one_hour">سی 1 ساعت</string>
|
||||||
<string name="share_location_for_two_hours">سی 2 ساعت</string>
|
<string name="share_location_for_two_hours">سی 2 ساعت</string>
|
||||||
<string name="share_location_for_six_hours">سی 6 ساعت</string>
|
<string name="share_location_for_six_hours">سی 6 ساعت</string>
|
||||||
|
|
||||||
<string name="file_saved_to">فایل من «%1$s» زفت وابی.</string>
|
<string name="file_saved_to">فایل من «%1$s» زفت وابی.</string>
|
||||||
|
|
||||||
<plurals name="ask_delete_messages">
|
<plurals name="ask_delete_messages">
|
||||||
@@ -397,6 +402,7 @@
|
|||||||
<string name="pref_chats">گوفت وو لوفتا</string>
|
<string name="pref_chats">گوفت وو لوفتا</string>
|
||||||
<string name="pref_log_header">گوزارش</string>
|
<string name="pref_log_header">گوزارش</string>
|
||||||
<string name="pref_background_btn_gallery">پسند ز شؽوات مال</string>
|
<string name="pref_background_btn_gallery">پسند ز شؽوات مال</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">پوی</string>
|
<string name="pref_show_emails_all">پوی</string>
|
||||||
<!-- %1$s will be replaced by a human-readable number of bytes, eg. 32 KiB, 1 MiB -->
|
<!-- %1$s will be replaced by a human-readable number of bytes, eg. 32 KiB, 1 MiB -->
|
||||||
<string name="up_to_x">تا سقف %1$s</string>
|
<string name="up_to_x">تا سقف %1$s</string>
|
||||||
@@ -411,6 +417,7 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">پاک کردن پیوما قڌیمی</string>
|
<string name="delete_old_messages">پاک کردن پیوما قڌیمی</string>
|
||||||
<string name="autodel_device_title">پاک کردن پیوما ز دسگا</string>
|
<string name="autodel_device_title">پاک کردن پیوما ز دسگا</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">پاک کردن پیوما ز سرور</string>
|
<string name="autodel_server_title">پاک کردن پیوما ز سرور</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
<string name="autodel_at_once">ی کرت دیندا دانلود</string>
|
<string name="autodel_at_once">ی کرت دیندا دانلود</string>
|
||||||
|
|||||||
@@ -59,7 +59,9 @@
|
|||||||
<string name="media">Multimèdia</string>
|
<string name="media">Multimèdia</string>
|
||||||
<string name="apps_and_media">Apps & Multimèdia</string>
|
<string name="apps_and_media">Apps & Multimèdia</string>
|
||||||
<string name="profile">Perfil</string>
|
<string name="profile">Perfil</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">Tots els Perfils</string>
|
<string name="all_profiles">Tots els Perfils</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">Perfil Actual</string>
|
<string name="current_profile">Perfil Actual</string>
|
||||||
<string name="main_menu">Menú principal</string>
|
<string name="main_menu">Menú principal</string>
|
||||||
<string name="start_chat">Inicia un xat</string>
|
<string name="start_chat">Inicia un xat</string>
|
||||||
@@ -82,6 +84,7 @@
|
|||||||
<string name="always">Sempre</string>
|
<string name="always">Sempre</string>
|
||||||
<string name="always_load_remote_images">Carrega sempre les imatges remotes</string>
|
<string name="always_load_remote_images">Carrega sempre les imatges remotes</string>
|
||||||
<string name="once">Una vegada</string>
|
<string name="once">Una vegada</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Mostra l\'advertiment</string>
|
<string name="show_warning">Mostra l\'advertiment</string>
|
||||||
<string name="not_now">Ara no</string>
|
<string name="not_now">Ara no</string>
|
||||||
<string name="never">Mai</string>
|
<string name="never">Mai</string>
|
||||||
@@ -198,6 +201,7 @@
|
|||||||
<string name="camera">Càmera</string>
|
<string name="camera">Càmera</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Captura</string>
|
<string name="capture">Captura</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Canvia la càmera</string>
|
<string name="switch_camera">Canvia la càmera</string>
|
||||||
<string name="toggle_fullscreen">Alterna el mode de pantalla completa</string>
|
<string name="toggle_fullscreen">Alterna el mode de pantalla completa</string>
|
||||||
<string name="location">Ubicació</string>
|
<string name="location">Ubicació</string>
|
||||||
@@ -375,12 +379,13 @@
|
|||||||
<string name="mute_for_seven_days">Silencia 7 dies</string>
|
<string name="mute_for_seven_days">Silencia 7 dies</string>
|
||||||
<string name="mute_forever">Sempre silenciat</string>
|
<string name="mute_forever">Sempre silenciat</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">Durant 5 minuts</string>
|
<string name="share_location_for_5_minutes">Durant 5 minuts</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">Durant 30 minuts</string>
|
<string name="share_location_for_30_minutes">Durant 30 minuts</string>
|
||||||
<string name="share_location_for_one_hour">Durant 1 hora</string>
|
<string name="share_location_for_one_hour">Durant 1 hora</string>
|
||||||
<string name="share_location_for_two_hours">Durant 2 hores</string>
|
<string name="share_location_for_two_hours">Durant 2 hores</string>
|
||||||
<string name="share_location_for_six_hours">Durant 6 hores</string>
|
<string name="share_location_for_six_hours">Durant 6 hores</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Voleu enviar el següent fitxer a %s?</item>
|
<item quantity="one">Voleu enviar el següent fitxer a %s?</item>
|
||||||
<item quantity="other">Voleu enviar els següents %d fitxers a %s?</item>
|
<item quantity="other">Voleu enviar els següents %d fitxers a %s?</item>
|
||||||
@@ -432,6 +437,7 @@
|
|||||||
<item quantity="one">¿Esborra %d missatge de tots els teus dispositius?</item>
|
<item quantity="one">¿Esborra %d missatge de tots els teus dispositius?</item>
|
||||||
<item quantity="other">¿Esborra %d missatges de tots els teus dispositius?</item>
|
<item quantity="other">¿Esborra %d missatges de tots els teus dispositius?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Reenvia missatges a %1$s?</string>
|
<string name="ask_forward">Reenvia missatges a %1$s?</string>
|
||||||
<string name="ask_forward_multiple">Voleu reenviar els missatges a %1$d xats?</string>
|
<string name="ask_forward_multiple">Voleu reenviar els missatges a %1$d xats?</string>
|
||||||
<string name="ask_export_attachment">En exportar els adjunts permetreu que altres aplicacions del dispositiu hi puguin accedir.\n\nVoleu continuar?</string>
|
<string name="ask_export_attachment">En exportar els adjunts permetreu que altres aplicacions del dispositiu hi puguin accedir.\n\nVoleu continuar?</string>
|
||||||
@@ -601,6 +607,7 @@
|
|||||||
<string name="connectivity_connected">Connectat</string>
|
<string name="connectivity_connected">Connectat</string>
|
||||||
<string name="sending">Enviant...</string>
|
<string name="sending">Enviant...</string>
|
||||||
<string name="last_msg_sent_successfully">Últim missatge enviat bé.</string>
|
<string name="last_msg_sent_successfully">Últim missatge enviat bé.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">No suportat pel vostre proveïdor.</string>
|
<string name="not_supported_by_provider">No suportat pel vostre proveïdor.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Missatges</string>
|
<string name="messages">Missatges</string>
|
||||||
@@ -637,7 +644,6 @@
|
|||||||
<string name="welcome_chat_over_email">Xat segur i descentralitzat</string>
|
<string name="welcome_chat_over_email">Xat segur i descentralitzat</string>
|
||||||
<string name="scan_invitation_code">Escaneja el Codi d\'Invitació</string>
|
<string name="scan_invitation_code">Escaneja el Codi d\'Invitació</string>
|
||||||
<string name="login_title">Identifiqueu-vos</string>
|
<string name="login_title">Identifiqueu-vos</string>
|
||||||
<string name="login_advanced_hint">Aquest inici de sessió és per a usuaris avançats:\n\n• No feu servir una adreça que utilitzeu a una altra app.\n\n• Les adreces de correu tradicional admeten xats sense xifrar d\'extrem a extrem, indicades amb una icona de correu.</string>
|
|
||||||
<string name="login_inbox">Safata d\'entrada</string>
|
<string name="login_inbox">Safata d\'entrada</string>
|
||||||
<string name="login_imap_login">Nom d\'identificació IMAP</string>
|
<string name="login_imap_login">Nom d\'identificació IMAP</string>
|
||||||
<string name="login_imap_server">Servidor IMAP</string>
|
<string name="login_imap_server">Servidor IMAP</string>
|
||||||
@@ -752,6 +758,7 @@
|
|||||||
<string name="pref_notifications_priority">Prioritat</string>
|
<string name="pref_notifications_priority">Prioritat</string>
|
||||||
<string name="pref_notifications_explain">Habilita les notificacions del sistema per als missatges nous</string>
|
<string name="pref_notifications_explain">Habilita les notificacions del sistema per als missatges nous</string>
|
||||||
<string name="pref_show_notification_content">Mostra el contingut del missatge a la notificació</string>
|
<string name="pref_show_notification_content">Mostra el contingut del missatge a la notificació</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Mostra el remitent i les primeres paraules del missatge en les notificacions</string>
|
<string name="pref_show_notification_content_explain">Mostra el remitent i les primeres paraules del missatge en les notificacions</string>
|
||||||
<string name="pref_led_color">Color LED</string>
|
<string name="pref_led_color">Color LED</string>
|
||||||
<string name="pref_sound">So</string>
|
<string name="pref_sound">So</string>
|
||||||
@@ -792,16 +799,23 @@
|
|||||||
<string name="pref_background">Fons</string>
|
<string name="pref_background">Fons</string>
|
||||||
<string name="pref_background_btn_default">Usa la imatge per defecte</string>
|
<string name="pref_background_btn_default">Usa la imatge per defecte</string>
|
||||||
<string name="pref_background_btn_gallery">Trieu de la galeria</string>
|
<string name="pref_background_btn_gallery">Trieu de la galeria</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Si desactiveu aquesta opció, assegureu-vos que el vostre servidor i els altres programes estiguin configurats de la mateixa manera.\n\nAltrament podeu tenir problemes de funcionament.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Si desactiveu aquesta opció, assegureu-vos que el vostre servidor i els altres programes estiguin configurats de la mateixa manera.\n\nAltrament podeu tenir problemes de funcionament.</string>
|
||||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||||
<string name="pref_multidevice">Mode multidispositiu</string>
|
<string name="pref_multidevice">Mode multidispositiu</string>
|
||||||
<string name="pref_multidevice_explain">Sincronitza els vostres missatges amb els vostres altres dispositius. Activat automàticament quan s\'afegeix un segon dispositiu.</string>
|
<string name="pref_multidevice_explain">Sincronitza els vostres missatges amb els vostres altres dispositius. Activat automàticament quan s\'afegeix un segon dispositiu.</string>
|
||||||
<string name="pref_multidevice_change_warn">El mode multidispositiu ha d\'estar habilitat quan feu servir el mateix perfil des de diferents dispositius. Desactiva aquesta opció només si has esborrat aquest perfil de tots els altres dispositius.\n\nDesactivar aquesta opció mentre es fa servir el mateix perfil en múltiples dispositius farà que es perdin missatges i hi hagi altres problemes.</string>
|
<string name="pref_multidevice_change_warn">El mode multidispositiu ha d\'estar habilitat quan feu servir el mateix perfil des de diferents dispositius. Desactiva aquesta opció només si has esborrat aquest perfil de tots els altres dispositius.\n\nDesactivar aquesta opció mentre es fa servir el mateix perfil en múltiples dispositius farà que es perdin missatges i hi hagi altres problemes.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Moure automàticament a la carpeta de Delta Chat</string>
|
<string name="pref_auto_folder_moves">Moure automàticament a la carpeta de Delta Chat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Agafa només de la carpeta de DeltaChat</string>
|
<string name="pref_only_fetch_mvbox_title">Agafa només de la carpeta de DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Mostra els correus clàssics</string>
|
<string name="pref_show_emails">Mostra els correus clàssics</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">No, només xats</string>
|
<string name="pref_show_emails_no">No, només xats</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Per a contactes acceptats</string>
|
<string name="pref_show_emails_accepted_contacts">Per a contactes acceptats</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Tot</string>
|
<string name="pref_show_emails_all">Tot</string>
|
||||||
<string name="pref_experimental_features">Funcionalitats experimentals</string>
|
<string name="pref_experimental_features">Funcionalitats experimentals</string>
|
||||||
<string name="pref_experimental_features_explain">Aquestes funcionalitats poden ser inestables i poden canviar o ser suprimides</string>
|
<string name="pref_experimental_features_explain">Aquestes funcionalitats poden ser inestables i poden canviar o ser suprimides</string>
|
||||||
@@ -856,14 +870,17 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Esborra els missatges antics</string>
|
<string name="delete_old_messages">Esborra els missatges antics</string>
|
||||||
<string name="autodel_device_title">Esborra els missatges del dispositiu</string>
|
<string name="autodel_device_title">Esborra els missatges del dispositiu</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Esborra els missatges del servidor</string>
|
<string name="autodel_server_title">Esborra els missatges del servidor</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">Voleu esborrar ara %1$d missatges i tots els missatges \"%2$s\" futurs?\n\n• Això inclou tot el contingut multimèdia\n\n• S\'esborraran els missatges fins i tot si no s\'han llegit\n\n• Els \"Missatges desats\" no s\'esborraran de l\'emmagatzematge local</string>
|
<string name="autodel_device_ask">Voleu esborrar ara %1$d missatges i tots els missatges \"%2$s\" futurs?\n\n• Això inclou tot el contingut multimèdia\n\n• S\'esborraran els missatges fins i tot si no s\'han llegit\n\n• Els \"Missatges desats\" no s\'esborraran de l\'emmagatzematge local</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">Voleu esborrar ara %1$d missatges i tots els missatges nous \"%2$s\" futurs?\n\n⚠️ Això inclou els correus, contingut multimèdia i \"Missatges desats\" a totes les carpetes del servidor\n\n⚠️ No utilitzeu aquesta funció si voleu conservar les dades al servidor\n\n⚠️ No utilitzeu aquesta funció si feu servir un client de correu diferent a Delta Chat</string>
|
<string name="autodel_server_ask">Voleu esborrar ara %1$d missatges i tots els missatges nous \"%2$s\" futurs?\n\n⚠️ Això inclou els correus, contingut multimèdia i \"Missatges desats\" a totes les carpetes del servidor\n\n⚠️ No utilitzeu aquesta funció si voleu conservar les dades al servidor\n\n⚠️ No utilitzeu aquesta funció si feu servir un client de correu diferent a Delta Chat</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Això inclou els correus electrònics, contingut multimèdia i «Missatges desats» en totes les carpetes del servidor. No useu aquesta funció si voleu conservar dades al servidor o si useu altres clients de correu més enllà de Delta Chat.</string>
|
<string name="autodel_server_enabled_hint">Això inclou els correus electrònics, contingut multimèdia i «Missatges desats» en totes les carpetes del servidor. No useu aquesta funció si voleu conservar dades al servidor o si useu altres clients de correu més enllà de Delta Chat.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device_title">Activa l\'esborrament immediat</string>
|
<string name="autodel_server_warn_multi_device_title">Activa l\'esborrament immediat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device">Si habiliteu l\'esborrament immediat no podeu usar múltiples dispositius en aquest perfil.</string>
|
<string name="autodel_server_warn_multi_device">Si habiliteu l\'esborrament immediat no podeu usar múltiples dispositius en aquest perfil.</string>
|
||||||
<string name="autodel_confirm">Ho entenc, esborra tots aquests missatges</string>
|
<string name="autodel_confirm">Ho entenc, esborra tots aquests missatges</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -957,7 +974,7 @@
|
|||||||
<string name="learn_more">Més informació</string>
|
<string name="learn_more">Més informació</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">Heu esborrat el xat «Missatges desats».\n\nℹ️ Per a usar altre cop la funcionalitat de «Missatges desats», creeu un xat nou amb vós mateix.</string>
|
<string name="devicemsg_self_deleted">Heu esborrat el xat «Missatges desats».\n\nℹ️ Per a usar altre cop la funcionalitat de «Missatges desats», creeu un xat nou amb vós mateix.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ Esteu a punt de quedar-vos sense espai d\'emmagatzematge al vostre proveïdor: ja esteu utilitzant %1$s%% .\n\nPodríeu deixar de rebre missatges si s\'emplena.\n\n👉 Reviseu a la interfície web del proveïdor si podeu esborrar dades antigues i considereu habilitar \"Preferències / Xats i multimèdia / Esborra els missatges antics\". Podeu veure sempre el nivell d\'ocupació a \"Preferències / Connectivitat\".</string>
|
<string name="devicemsg_storage_exceeding">⚠️ Esteu a punt de quedar-vos sense espai d\'emmagatzematge al vostre proveïdor: ja esteu utilitzant %1$s%% .\n\nPodríeu deixar de rebre missatges si s\'emplena.\n\n👉 Reviseu a la interfície web del proveïdor si podeu esborrar dades antigues i considereu habilitar \"Preferències / Xats i multimèdia / Esborra els missatges antics\". Podeu veure sempre el nivell d\'ocupació a \"Preferències / Connectivitat\".</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ La data o l\'hora del vostre dispositiu no semblen correctes (%1$s).\n\nAdjusteu el rellotge ⏰🔧 per a assegurar que els missatges es reben correctament.</string>
|
<string name="devicemsg_bad_time">⚠️ La data o l\'hora del vostre dispositiu no semblen correctes (%1$s).\n\nAdjusteu el rellotge ⏰🔧 per a assegurar que els missatges es reben correctament.</string>
|
||||||
@@ -1120,7 +1137,6 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Accions de missatge</string>
|
<string name="a11y_message_context_menu_btn_label">Accions de missatge</string>
|
||||||
<string name="a11y_background_preview_label">Previsualització del fons de pantalla</string>
|
<string name="a11y_background_preview_label">Previsualització del fons de pantalla</string>
|
||||||
<string name="a11y_disappearing_messages_activated">S\'han activat els missatges efímers</string>
|
<string name="a11y_disappearing_messages_activated">S\'han activat els missatges efímers</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Deixa de compartir la ubicació</string>
|
<string name="stop_sharing_location">Deixa de compartir la ubicació</string>
|
||||||
<string name="a11y_voice_message_hint_ios">Després d\'enregistrar, feu doble toc per a enviar-lo. Per a descartar l\'enregistrament, fregueu amb dos dits.</string>
|
<string name="a11y_voice_message_hint_ios">Després d\'enregistrar, feu doble toc per a enviar-lo. Per a descartar l\'enregistrament, fregueu amb dos dits.</string>
|
||||||
|
|||||||
@@ -208,18 +208,20 @@
|
|||||||
<string name="mute_for_seven_days">بێدەنگ کردن بۆ ماوەی 7 ڕۆژ</string>
|
<string name="mute_for_seven_days">بێدەنگ کردن بۆ ماوەی 7 ڕۆژ</string>
|
||||||
<string name="mute_forever">بێدەنگ کردن بۆ هەمیشە</string>
|
<string name="mute_forever">بێدەنگ کردن بۆ هەمیشە</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">بۆ ماوەی 5 خولەک</string>
|
<string name="share_location_for_5_minutes">بۆ ماوەی 5 خولەک</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">بۆ ماوەی 30 خولەک</string>
|
<string name="share_location_for_30_minutes">بۆ ماوەی 30 خولەک</string>
|
||||||
<string name="share_location_for_one_hour">بۆ ماوەی 1 کاتژمێر</string>
|
<string name="share_location_for_one_hour">بۆ ماوەی 1 کاتژمێر</string>
|
||||||
<string name="share_location_for_two_hours">بۆ ماوەی 2 کاتژمێر</string>
|
<string name="share_location_for_two_hours">بۆ ماوەی 2 کاتژمێر</string>
|
||||||
<string name="share_location_for_six_hours">بۆ ماوەی 6 کاتژمێر</string>
|
<string name="share_location_for_six_hours">بۆ ماوەی 6 کاتژمێر</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">ئەم پەڕگەیە دەنێریت بۆ %s؟</item>
|
<item quantity="one">ئەم پەڕگەیە دەنێریت بۆ %s؟</item>
|
||||||
<item quantity="other">ئەم %d پەڕگەیە دەنێریت بۆ %s؟</item>
|
<item quantity="other">ئەم %d پەڕگەیە دەنێریت بۆ %s؟</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="file_saved_to">پەڕگەکە پاشەکەوت کرا لە \"%1$s\".</string>
|
<string name="file_saved_to">پەڕگەکە پاشەکەوت کرا لە \"%1$s\".</string>
|
||||||
|
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">ئەو پەیامانە دەنێریت بۆ %1$s؟</string>
|
<string name="ask_forward">ئەو پەیامانە دەنێریت بۆ %1$s؟</string>
|
||||||
<string name="ask_forward_multiple">ئەو پەیامانە دەنێریت بۆ نێو %1$dوتووێژ؟</string>
|
<string name="ask_forward_multiple">ئەو پەیامانە دەنێریت بۆ نێو %1$dوتووێژ؟</string>
|
||||||
<string name="ask_export_attachment">پێوەلکاوەکە هەناردە دەکەیت؟ هەناردەکردنی پێوەلکاوەکان وادەکات نەرمامێرەکانی دیکەی سەر مۆبایلەکەت بتوانن دەستیان بەو بەڵگە هەناردەکراوە بگات.\n\n بەردەوام دەبیت؟</string>
|
<string name="ask_export_attachment">پێوەلکاوەکە هەناردە دەکەیت؟ هەناردەکردنی پێوەلکاوەکان وادەکات نەرمامێرەکانی دیکەی سەر مۆبایلەکەت بتوانن دەستیان بەو بەڵگە هەناردەکراوە بگات.\n\n بەردەوام دەبیت؟</string>
|
||||||
@@ -354,6 +356,7 @@
|
|||||||
<string name="pref_notifications_priority">پێشترێتی</string>
|
<string name="pref_notifications_priority">پێشترێتی</string>
|
||||||
<string name="pref_notifications_explain">وریاکەرەوەکانی سیستەم بۆ پەیامە نوێکان چالاک بکە</string>
|
<string name="pref_notifications_explain">وریاکەرەوەکانی سیستەم بۆ پەیامە نوێکان چالاک بکە</string>
|
||||||
<string name="pref_show_notification_content">دەقی پەیامەکە لەنێو وریاکەرەوەکاندا پیشان بدە</string>
|
<string name="pref_show_notification_content">دەقی پەیامەکە لەنێو وریاکەرەوەکاندا پیشان بدە</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">ناوی پەیامنێرەکە و وشە سەرەتاییەکانی دەقی پەیامەکە لەناو وریاکەرەوەکەدا پیشان بدە</string>
|
<string name="pref_show_notification_content_explain">ناوی پەیامنێرەکە و وشە سەرەتاییەکانی دەقی پەیامەکە لەناو وریاکەرەوەکەدا پیشان بدە</string>
|
||||||
<string name="pref_led_color">ڕەنگی چرای LED</string>
|
<string name="pref_led_color">ڕەنگی چرای LED</string>
|
||||||
<string name="pref_sound">دەنگ</string>
|
<string name="pref_sound">دەنگ</string>
|
||||||
@@ -384,10 +387,15 @@
|
|||||||
<string name="pref_background">پشتخان</string>
|
<string name="pref_background">پشتخان</string>
|
||||||
<string name="pref_background_btn_default">بەکارهێنانی وێنەی بنەڕەتی</string>
|
<string name="pref_background_btn_default">بەکارهێنانی وێنەی بنەڕەتی</string>
|
||||||
<string name="pref_background_btn_gallery">هەڵبژاردن لە پیشانگا</string>
|
<string name="pref_background_btn_gallery">هەڵبژاردن لە پیشانگا</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">هەناردنی خۆکار بۆ بوخچەی دێڵتاچات</string>
|
<string name="pref_auto_folder_moves">هەناردنی خۆکار بۆ بوخچەی دێڵتاچات</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">پیشاندانی ئیمەیلە کلاسیکەکان</string>
|
<string name="pref_show_emails">پیشاندانی ئیمەیلە کلاسیکەکان</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">نا، بەس چاتەکان</string>
|
<string name="pref_show_emails_no">نا، بەس چاتەکان</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">بۆ بەردەنگە پەسندکراوەکان</string>
|
<string name="pref_show_emails_accepted_contacts">بۆ بەردەنگە پەسندکراوەکان</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">هەموو</string>
|
<string name="pref_show_emails_all">هەموو</string>
|
||||||
<string name="pref_experimental_features">ئەو تایبەتمەندییانەی بۆ تاقی کردنەوەن</string>
|
<string name="pref_experimental_features">ئەو تایبەتمەندییانەی بۆ تاقی کردنەوەن</string>
|
||||||
<string name="pref_background_default">پشتخانی بنەڕەتی</string>
|
<string name="pref_background_default">پشتخانی بنەڕەتی</string>
|
||||||
@@ -414,6 +422,7 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">سڕینەوەی پەیامە کۆنەکان</string>
|
<string name="delete_old_messages">سڕینەوەی پەیامە کۆنەکان</string>
|
||||||
<string name="autodel_device_title">سڕینەوەی پەیامەکان لەسەر مۆبایەلەکت</string>
|
<string name="autodel_device_title">سڕینەوەی پەیامەکان لەسەر مۆبایەلەکت</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">سڕینەوەی پەیامەکان لەسەر سێرڤەر</string>
|
<string name="autodel_server_title">سڕینەوەی پەیامەکان لەسەر سێرڤەر</string>
|
||||||
<string name="autodel_confirm">تێگەیشتم، هەموو ئەم پەیامانە بسڕەوە</string>
|
<string name="autodel_confirm">تێگەیشتم، هەموو ئەم پەیامانە بسڕەوە</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -506,7 +515,6 @@
|
|||||||
<string name="a11y_delivery_status_invalid">دۆخی گەیشتن ناڕەوایە</string>
|
<string name="a11y_delivery_status_invalid">دۆخی گەیشتن ناڕەوایە</string>
|
||||||
<string name="a11y_message_context_menu_btn_label">چالاکییەکانی پەیام</string>
|
<string name="a11y_message_context_menu_btn_label">چالاکییەکانی پەیام</string>
|
||||||
<string name="a11y_disappearing_messages_activated">پەیامە خۆشارەوەکان چالاک کرا</string>
|
<string name="a11y_disappearing_messages_activated">پەیامە خۆشارەوەکان چالاک کرا</string>
|
||||||
|
|
||||||
<!-- iOS permissions, copy from "deltachat-ios/Info.plist", which is used on missing translations in "deltachat-ios/LANG.lproj/InfoPlist.strings" -->
|
<!-- iOS permissions, copy from "deltachat-ios/Info.plist", which is used on missing translations in "deltachat-ios/LANG.lproj/InfoPlist.strings" -->
|
||||||
<string name="InfoPlist_NSCameraUsageDescription">دێڵتا چات بۆ گرتن و هەناردنی وێنە و فلیم و سکان کردنی کۆدی QR، کامێراکەت بەکاردەهێنێت.</string>
|
<string name="InfoPlist_NSCameraUsageDescription">دێڵتا چات بۆ گرتن و هەناردنی وێنە و فلیم و سکان کردنی کۆدی QR، کامێراکەت بەکاردەهێنێت.</string>
|
||||||
<string name="InfoPlist_NSMicrophoneUsageDescription">دێڵتا چات بۆ تۆمار کردن و هەناردنی دەنگ و هەروەها ڤیدیۆی دەنگدار، مایکەکەت بەکاردەهێنێت.</string>
|
<string name="InfoPlist_NSMicrophoneUsageDescription">دێڵتا چات بۆ تۆمار کردن و هەناردنی دەنگ و هەروەها ڤیدیۆی دەنگدار، مایکەکەت بەکاردەهێنێت.</string>
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
<string name="downloading">Stahování...</string>
|
<string name="downloading">Stahování...</string>
|
||||||
<string name="open_attachment">Otevřít přílohu</string>
|
<string name="open_attachment">Otevřít přílohu</string>
|
||||||
<string name="join">Připojit se</string>
|
<string name="join">Připojit se</string>
|
||||||
|
<string name="join_group">Připojit se ke skupině</string>
|
||||||
|
<string name="join_channel">Připojte se ke kanálu</string>
|
||||||
<string name="rejoin">Znovu se připojit</string>
|
<string name="rejoin">Znovu se připojit</string>
|
||||||
<string name="delete">Smazat</string>
|
<string name="delete">Smazat</string>
|
||||||
<string name="delete_for_me">Smazat pro mě</string>
|
<string name="delete_for_me">Smazat pro mě</string>
|
||||||
@@ -59,7 +61,9 @@
|
|||||||
<string name="media">Multimédia</string>
|
<string name="media">Multimédia</string>
|
||||||
<string name="apps_and_media">Aplikace a multimédia</string>
|
<string name="apps_and_media">Aplikace a multimédia</string>
|
||||||
<string name="profile">Profil</string>
|
<string name="profile">Profil</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">Všechny profily</string>
|
<string name="all_profiles">Všechny profily</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">Aktuální profil</string>
|
<string name="current_profile">Aktuální profil</string>
|
||||||
<string name="main_menu">Hlavní nabídka</string>
|
<string name="main_menu">Hlavní nabídka</string>
|
||||||
<string name="start_chat">Začít chatovat</string>
|
<string name="start_chat">Začít chatovat</string>
|
||||||
@@ -70,6 +74,10 @@
|
|||||||
<string name="mark_as_read">Označit jako přečtené</string>
|
<string name="mark_as_read">Označit jako přečtené</string>
|
||||||
<!-- Used beside an icon with very few space. Shortest text for "Mark as being read". In english, this could be "Read" (past tense of "to read"), in german, this could be "Gelesen". -->
|
<!-- Used beside an icon with very few space. Shortest text for "Mark as being read". In english, this could be "Read" (past tense of "to read"), in german, this could be "Gelesen". -->
|
||||||
<string name="mark_as_read_short">Přečteno</string>
|
<string name="mark_as_read_short">Přečteno</string>
|
||||||
|
<!-- Used as an menu entry or button -->
|
||||||
|
<string name="mark_as_unread">Označit jako nepřečtené</string>
|
||||||
|
<!-- Used beside an icon with very few space. Shortest text for "Mark as being unread". In english, this could be "Unread" (past tense of "to unread"), in german, this could be "Ungelesen". -->
|
||||||
|
<string name="mark_as_unread_short">Nepřečtené</string>
|
||||||
<!-- Placeholder text when something is loading -->
|
<!-- Placeholder text when something is loading -->
|
||||||
<string name="loading">Načítání...</string>
|
<string name="loading">Načítání...</string>
|
||||||
<string name="hide">Skrýt</string>
|
<string name="hide">Skrýt</string>
|
||||||
@@ -80,6 +88,7 @@
|
|||||||
<string name="always">Vždy</string>
|
<string name="always">Vždy</string>
|
||||||
<string name="always_load_remote_images">Vždy načítat vzdálené obrázky</string>
|
<string name="always_load_remote_images">Vždy načítat vzdálené obrázky</string>
|
||||||
<string name="once">Jednou</string>
|
<string name="once">Jednou</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Zobrazovat varování</string>
|
<string name="show_warning">Zobrazovat varování</string>
|
||||||
<string name="not_now">Teď ne</string>
|
<string name="not_now">Teď ne</string>
|
||||||
<string name="never">Nikdy</string>
|
<string name="never">Nikdy</string>
|
||||||
@@ -89,6 +98,7 @@
|
|||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<!-- For the next view or as "continue". Should be as short as possible. -->
|
<!-- For the next view or as "continue". Should be as short as possible. -->
|
||||||
<string name="next">Další</string>
|
<string name="next">Další</string>
|
||||||
|
<string name="warning">Varování</string>
|
||||||
<string name="error">Chyba</string>
|
<string name="error">Chyba</string>
|
||||||
<string name="error_x">Chyba: %1$s</string>
|
<string name="error_x">Chyba: %1$s</string>
|
||||||
<string name="no_app_to_handle_data">Aplikace pro tento typ dat nenalezena.</string>
|
<string name="no_app_to_handle_data">Aplikace pro tento typ dat nenalezena.</string>
|
||||||
@@ -116,6 +126,15 @@
|
|||||||
<!-- Refers to the time a contact was last seen. Shown below contact name in the profile. The placeholder will be replaced by a relative point in time as "3 minutes ago" (see https://momentjs.com for more examples and languages) -->
|
<!-- Refers to the time a contact was last seen. Shown below contact name in the profile. The placeholder will be replaced by a relative point in time as "3 minutes ago" (see https://momentjs.com for more examples and languages) -->
|
||||||
<string name="last_seen_relative">Naposledy viděni %1$s</string>
|
<string name="last_seen_relative">Naposledy viděni %1$s</string>
|
||||||
<string name="last_seen_unknown">Naposledy viděno: Neznámý</string>
|
<string name="last_seen_unknown">Naposledy viděno: Neznámý</string>
|
||||||
|
<!-- Call duration as shown in the call bubbles. There is some risk to mix with the sending time, so the word "Duration" may be helpful. Might also be "Duration: %d minutes", "%d-minute duration", "%d-minute length" or "%d-minute call" -->
|
||||||
|
<plurals name="call_duration_minutes">
|
||||||
|
<item quantity="one">%d minutové trvání</item>
|
||||||
|
<item quantity="few">%d minut trvání</item>
|
||||||
|
<item quantity="many">%d minut trvání</item>
|
||||||
|
<item quantity="other">%d minut trvání</item>
|
||||||
|
</plurals>
|
||||||
|
<!-- Call duration as shown in the call bubbles in case the call is less than one minute. If the context is not clear enough, one may want to add the word "Duration". -->
|
||||||
|
<string name="call_duration_less_than_a_minute">Méně než 1 minuta</string>
|
||||||
<!-- Shown beside messages that are "N minutes old". Prefer short strings, or well-known abbreviations. -->
|
<!-- Shown beside messages that are "N minutes old". Prefer short strings, or well-known abbreviations. -->
|
||||||
<plurals name="n_minutes">
|
<plurals name="n_minutes">
|
||||||
<item quantity="one">%d min.</item>
|
<item quantity="one">%d min.</item>
|
||||||
@@ -175,6 +194,7 @@
|
|||||||
<item quantity="other">%d vybráno</item>
|
<item quantity="other">%d vybráno</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="selected_colon">Vybráno:</string>
|
<string name="selected_colon">Vybráno:</string>
|
||||||
|
<string name="selected">Vybráno</string>
|
||||||
<string name="self">Já</string>
|
<string name="self">Já</string>
|
||||||
<string name="draft">Rozepsané</string>
|
<string name="draft">Rozepsané</string>
|
||||||
<string name="image">Obrázek</string>
|
<string name="image">Obrázek</string>
|
||||||
@@ -188,6 +208,9 @@
|
|||||||
<string name="add_stickers_instructions">Přejete-li si přidat nálepky, klepněte na „Otevřít složku nálepek“, vytvořte podsložku pro balíček nálepek a přetáhněte do ní soubory obrázků a nálepek</string>
|
<string name="add_stickers_instructions">Přejete-li si přidat nálepky, klepněte na „Otevřít složku nálepek“, vytvořte podsložku pro balíček nálepek a přetáhněte do ní soubory obrázků a nálepek</string>
|
||||||
<!-- deprecated -->
|
<!-- deprecated -->
|
||||||
<string name="open_sticker_folder">Otevřít složku nálepek</string>
|
<string name="open_sticker_folder">Otevřít složku nálepek</string>
|
||||||
|
<string name="ask_add_sticker_to_collection">Přidat tuto nálepku do své sbírky?</string>
|
||||||
|
<string name="ask_delete_sticker">Smazat tuto nálepku?</string>
|
||||||
|
<string name="sticker_picker_empty_hint">Klepnutím na nálepku ji sem přidáte.</string>
|
||||||
<string name="images">Obrázky</string>
|
<string name="images">Obrázky</string>
|
||||||
<!-- a noun, used for "Music" and other "Audio" files -->
|
<!-- a noun, used for "Music" and other "Audio" files -->
|
||||||
<string name="audio">Zvukové záznamy</string>
|
<string name="audio">Zvukové záznamy</string>
|
||||||
@@ -203,6 +226,7 @@
|
|||||||
<string name="camera">Fotoaparát</string>
|
<string name="camera">Fotoaparát</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Spoušť</string>
|
<string name="capture">Spoušť</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Přepnout kameru</string>
|
<string name="switch_camera">Přepnout kameru</string>
|
||||||
<string name="toggle_fullscreen">Přepnout režim celé obrazovky</string>
|
<string name="toggle_fullscreen">Přepnout režim celé obrazovky</string>
|
||||||
<string name="location">Poloha</string>
|
<string name="location">Poloha</string>
|
||||||
@@ -374,12 +398,13 @@
|
|||||||
<string name="mute_for_seven_days">Ztlumit na 7 dní</string>
|
<string name="mute_for_seven_days">Ztlumit na 7 dní</string>
|
||||||
<string name="mute_forever">Ztlumit navždy</string>
|
<string name="mute_forever">Ztlumit navždy</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">Na 5 minut</string>
|
<string name="share_location_for_5_minutes">Na 5 minut</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">Na 30 minut</string>
|
<string name="share_location_for_30_minutes">Na 30 minut</string>
|
||||||
<string name="share_location_for_one_hour">Na 1 hodinu</string>
|
<string name="share_location_for_one_hour">Na 1 hodinu</string>
|
||||||
<string name="share_location_for_two_hours">Na 2 hodiny</string>
|
<string name="share_location_for_two_hours">Na 2 hodiny</string>
|
||||||
<string name="share_location_for_six_hours">Na 6 hodin</string>
|
<string name="share_location_for_six_hours">Na 6 hodin</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Odeslat následující soubor do chatu %s?</item>
|
<item quantity="one">Odeslat následující soubor do chatu %s?</item>
|
||||||
<item quantity="few">Odeslat následující %d soubory do chatu %s?</item>
|
<item quantity="few">Odeslat následující %d soubory do chatu %s?</item>
|
||||||
@@ -414,6 +439,7 @@
|
|||||||
<item quantity="many">Smazat %d zpráv ze všech Vašich zařízení?</item>
|
<item quantity="many">Smazat %d zpráv ze všech Vašich zařízení?</item>
|
||||||
<item quantity="other">Smazat %d zpráv ze všech vašich zařízení?</item>
|
<item quantity="other">Smazat %d zpráv ze všech vašich zařízení?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Přejete si přeposlat zprávy do chatu %1$s?</string>
|
<string name="ask_forward">Přejete si přeposlat zprávy do chatu %1$s?</string>
|
||||||
<string name="ask_forward_multiple">Přejete si přeposlat zprávy do %1$d chatů?</string>
|
<string name="ask_forward_multiple">Přejete si přeposlat zprávy do %1$d chatů?</string>
|
||||||
<string name="ask_export_attachment">Uložením příloh je zpřístupníte ostatním aplikacím na tomto zařízení.\n\nPřejete si pokračovat?</string>
|
<string name="ask_export_attachment">Uložením příloh je zpřístupníte ostatním aplikacím na tomto zařízení.\n\nPřejete si pokračovat?</string>
|
||||||
@@ -589,6 +615,7 @@
|
|||||||
<string name="connectivity_connected">Připojeno</string>
|
<string name="connectivity_connected">Připojeno</string>
|
||||||
<string name="sending">Odesílání...</string>
|
<string name="sending">Odesílání...</string>
|
||||||
<string name="last_msg_sent_successfully">Poslední zpráva úspěšně odeslána.</string>
|
<string name="last_msg_sent_successfully">Poslední zpráva úspěšně odeslána.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">Nepodporováno vaším poskytovatelem.</string>
|
<string name="not_supported_by_provider">Nepodporováno vaším poskytovatelem.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Zprávy</string>
|
<string name="messages">Zprávy</string>
|
||||||
@@ -625,7 +652,6 @@
|
|||||||
<string name="welcome_chat_over_email">Zabezpečený decentralizovaný chat</string>
|
<string name="welcome_chat_over_email">Zabezpečený decentralizovaný chat</string>
|
||||||
<string name="scan_invitation_code">Naskenovat kód pozvánky</string>
|
<string name="scan_invitation_code">Naskenovat kód pozvánky</string>
|
||||||
<string name="login_title">Přihlaš se</string>
|
<string name="login_title">Přihlaš se</string>
|
||||||
<string name="login_advanced_hint">Toto přihlášení je určeno pro pokročilé uživatele: \n\n Nepoužívejte adresu, kterou používáte v jiné aplikaci. \n\n- Klasický e-mailový server umožňuje chatování bez koncového šifrování označeného ikonou pošty.</string>
|
|
||||||
<string name="login_inbox">Příchozí</string>
|
<string name="login_inbox">Příchozí</string>
|
||||||
<string name="login_imap_login">IMAP uživatelské jméno</string>
|
<string name="login_imap_login">IMAP uživatelské jméno</string>
|
||||||
<string name="login_imap_server">IMAP server</string>
|
<string name="login_imap_server">IMAP server</string>
|
||||||
@@ -727,6 +753,7 @@
|
|||||||
<string name="pref_notifications_priority">Priorita</string>
|
<string name="pref_notifications_priority">Priorita</string>
|
||||||
<string name="pref_notifications_explain">Povolit systémová oznámení nových zpráv</string>
|
<string name="pref_notifications_explain">Povolit systémová oznámení nových zpráv</string>
|
||||||
<string name="pref_show_notification_content">Zobrazit obsah zprávy uvnitř oznámení</string>
|
<string name="pref_show_notification_content">Zobrazit obsah zprávy uvnitř oznámení</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Zobrazit odesílatele a první slova zprávy uvnitř oznámení</string>
|
<string name="pref_show_notification_content_explain">Zobrazit odesílatele a první slova zprávy uvnitř oznámení</string>
|
||||||
<string name="pref_led_color">Barva diody</string>
|
<string name="pref_led_color">Barva diody</string>
|
||||||
<string name="pref_sound">Zvuk</string>
|
<string name="pref_sound">Zvuk</string>
|
||||||
@@ -767,16 +794,23 @@
|
|||||||
<string name="pref_background">Pozadí</string>
|
<string name="pref_background">Pozadí</string>
|
||||||
<string name="pref_background_btn_default">Použít výchozí obrázek</string>
|
<string name="pref_background_btn_default">Použít výchozí obrázek</string>
|
||||||
<string name="pref_background_btn_gallery">Vybrat z galerie</string>
|
<string name="pref_background_btn_gallery">Vybrat z galerie</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Při změně této volby se ujistěte, že váš server a ostatní klientské aplikace mají odpovídající nastavení.\n\nJinak může vše přestat fungovat.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Při změně této volby se ujistěte, že váš server a ostatní klientské aplikace mají odpovídající nastavení.\n\nJinak může vše přestat fungovat.</string>
|
||||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||||
<string name="pref_multidevice">Režim pro více zařízení</string>
|
<string name="pref_multidevice">Režim pro více zařízení</string>
|
||||||
<string name="pref_multidevice_explain">Synchronizujte zprávy s ostatními zařízeními. Automaticky povoleno při přidání druhého zařízení</string>
|
<string name="pref_multidevice_explain">Synchronizujte zprávy s ostatními zařízeními. Automaticky povoleno při přidání druhého zařízení</string>
|
||||||
<string name="pref_multidevice_change_warn">Při použití stejného profilu na více zařízeních musí být povolen \"režim více zařízení\". Toto nastavení zakažte pouze v případě, že jste tento profil odstranili ze všech ostatních zařízení. \n\n Zakázání režimu \"režim více zařízení\" při používání profilu na více zařízeních bude mít za následek zmeškané zprávy a další problémy.</string>
|
<string name="pref_multidevice_change_warn">Při použití stejného profilu na více zařízeních musí být povolen \"režim více zařízení\". Toto nastavení zakažte pouze v případě, že jste tento profil odstranili ze všech ostatních zařízení. \n\n Zakázání režimu \"režim více zařízení\" při používání profilu na více zařízeních bude mít za následek zmeškané zprávy a další problémy.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Automaticky přesouvat do složky DeltaChat </string>
|
<string name="pref_auto_folder_moves">Automaticky přesouvat do složky DeltaChat </string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Načítat pouze ze složky DeltaChat</string>
|
<string name="pref_only_fetch_mvbox_title">Načítat pouze ze složky DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Zobrazovat běžné e-maily</string>
|
<string name="pref_show_emails">Zobrazovat běžné e-maily</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Ne, pouze chaty</string>
|
<string name="pref_show_emails_no">Ne, pouze chaty</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Pro přijaté kontakty</string>
|
<string name="pref_show_emails_accepted_contacts">Pro přijaté kontakty</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Vše</string>
|
<string name="pref_show_emails_all">Vše</string>
|
||||||
<string name="pref_experimental_features">Experimentální funkce </string>
|
<string name="pref_experimental_features">Experimentální funkce </string>
|
||||||
<string name="pref_experimental_features_explain">Tyto funkce mohou být nestabilní a mohou být změněny nebo odstraněny.</string>
|
<string name="pref_experimental_features_explain">Tyto funkce mohou být nestabilní a mohou být změněny nebo odstraněny.</string>
|
||||||
@@ -825,14 +859,17 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Mazat staré zprávy</string>
|
<string name="delete_old_messages">Mazat staré zprávy</string>
|
||||||
<string name="autodel_device_title">Mazat zprávy ze zařízení</string>
|
<string name="autodel_device_title">Mazat zprávy ze zařízení</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Mazat zprávy ze serveru</string>
|
<string name="autodel_server_title">Mazat zprávy ze serveru</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">Skutečně smazat %1$d zpráv a všechny v budoucnu stažené zprávy \"%2$s\"?\n\n• Toto zahrnuje všechna multimédia\n\n• Zprávy budou smazány bez ohledu na jejich přečtení\n\n• \"Uložené zprávy\" budou ponechány</string>
|
<string name="autodel_device_ask">Skutečně smazat %1$d zpráv a všechny v budoucnu stažené zprávy \"%2$s\"?\n\n• Toto zahrnuje všechna multimédia\n\n• Zprávy budou smazány bez ohledu na jejich přečtení\n\n• \"Uložené zprávy\" budou ponechány</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">Skutečně smazat %1$d zprávy a všechny v budoucnu stažené zprávy \"%2$s\"?\n\n⚠️ Toto zahrnuje e-maily, multimédia a \"Uložené zprávy\" ve všech složkách na serveru\n\n⚠️ Nepoužívejte tuto funkci, pokud si přejete ponechat data na serveru\n\n⚠️ Nepoužívejte tuto funkci, pokud používáte i jiné e-mailové klienty mimo Delta Chat</string>
|
<string name="autodel_server_ask">Skutečně smazat %1$d zprávy a všechny v budoucnu stažené zprávy \"%2$s\"?\n\n⚠️ Toto zahrnuje e-maily, multimédia a \"Uložené zprávy\" ve všech složkách na serveru\n\n⚠️ Nepoužívejte tuto funkci, pokud si přejete ponechat data na serveru\n\n⚠️ Nepoužívejte tuto funkci, pokud používáte i jiné e-mailové klienty mimo Delta Chat</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Toto zahrnuje e-maily, multimédia a \"Uložené zprávy\" ve všech složkách na serveru. Nepoužívejte tuto funkci, pokud chcete ponechat data na serveru, nebo pokud používáte i jiné e-mailové programy mimo Delta Chat</string>
|
<string name="autodel_server_enabled_hint">Toto zahrnuje e-maily, multimédia a \"Uložené zprávy\" ve všech složkách na serveru. Nepoužívejte tuto funkci, pokud chcete ponechat data na serveru, nebo pokud používáte i jiné e-mailové programy mimo Delta Chat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device_title">Zapnout okamžité mazání</string>
|
<string name="autodel_server_warn_multi_device_title">Zapnout okamžité mazání</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device">Pokud zapnete okamžité mazání, nemůžete tento profil používat na více zařízeních.</string>
|
<string name="autodel_server_warn_multi_device">Pokud zapnete okamžité mazání, nemůžete tento profil používat na více zařízeních.</string>
|
||||||
<string name="autodel_confirm">Rozumím. Smazat všechny tyto zprávy</string>
|
<string name="autodel_confirm">Rozumím. Smazat všechny tyto zprávy</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -922,7 +959,7 @@
|
|||||||
<string name="learn_more">Další informace</string>
|
<string name="learn_more">Další informace</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">Smazali jste chat „Uložené zprávy“.\n\nℹ️ Chcete-li znovu použít funkci „Uložené zprávy“, založte nový chat sami se sebou.</string>
|
<string name="devicemsg_self_deleted">Smazali jste chat „Uložené zprávy“.\n\nℹ️ Chcete-li znovu použít funkci „Uložené zprávy“, založte nový chat sami se sebou.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ Úložiště u vašeho poskytovatele je téměř vyčerpané: %1$s %% je již využito.\n\nPokud se úložiště zaplní, nebudete moci přijímat zprávy.\n\n👉 Zkuste smazat stará data ve webovém prostředí poskytovatele a zvažte povolení volby \"Nastavení / Chaty a multimédia / Mazat staré zprávy\". Aktuální využití úložiště můžete kdykoliv zkontrolovat v \"Nastavení / Připojení\".</string>
|
<string name="devicemsg_storage_exceeding">⚠️ Úložiště u vašeho poskytovatele je téměř vyčerpané: %1$s %% je již využito.\n\nPokud se úložiště zaplní, nebudete moci přijímat zprávy.\n\n👉 Zkuste smazat stará data ve webovém prostředí poskytovatele a zvažte povolení volby \"Nastavení / Chaty a multimédia / Mazat staré zprávy\". Aktuální využití úložiště můžete kdykoliv zkontrolovat v \"Nastavení / Připojení\".</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ Datum a čas na vašem zařízení se zdají být nepřesné (%1$s).\n\nUpravte si čas ⏰🔧, abyste mohli přijímat své zprávy.</string>
|
<string name="devicemsg_bad_time">⚠️ Datum a čas na vašem zařízení se zdají být nepřesné (%1$s).\n\nUpravte si čas ⏰🔧, abyste mohli přijímat své zprávy.</string>
|
||||||
@@ -1084,7 +1121,6 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Akce zprávy</string>
|
<string name="a11y_message_context_menu_btn_label">Akce zprávy</string>
|
||||||
<string name="a11y_background_preview_label">Náhled tapety</string>
|
<string name="a11y_background_preview_label">Náhled tapety</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Mizející zprávy jsou zapnuty</string>
|
<string name="a11y_disappearing_messages_activated">Mizející zprávy jsou zapnuty</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Přestat sdílet polohu</string>
|
<string name="stop_sharing_location">Přestat sdílet polohu</string>
|
||||||
<string name="a11y_voice_message_hint_ios">Po ukončení nahrávání stiskněte dvakrát pro odeslání. Pro zahození nahrané zprávy, přejeďte dvěma prsty.</string>
|
<string name="a11y_voice_message_hint_ios">Po ukončení nahrávání stiskněte dvakrát pro odeslání. Pro zahození nahrané zprávy, přejeďte dvěma prsty.</string>
|
||||||
|
|||||||
@@ -125,6 +125,7 @@
|
|||||||
<string name="documents">Dokumenter</string>
|
<string name="documents">Dokumenter</string>
|
||||||
<string name="contact">Kontakt</string>
|
<string name="contact">Kontakt</string>
|
||||||
<string name="camera">Kamera</string>
|
<string name="camera">Kamera</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Skift kamera</string>
|
<string name="switch_camera">Skift kamera</string>
|
||||||
<string name="location">Placering</string>
|
<string name="location">Placering</string>
|
||||||
<string name="gallery">Galleri</string>
|
<string name="gallery">Galleri</string>
|
||||||
@@ -226,14 +227,15 @@
|
|||||||
<string name="mute_for_seven_days">Dæmp i 7 dage</string>
|
<string name="mute_for_seven_days">Dæmp i 7 dage</string>
|
||||||
<string name="mute_forever">Stille for altid</string>
|
<string name="mute_forever">Stille for altid</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">i 5 minutter</string>
|
<string name="share_location_for_5_minutes">i 5 minutter</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">i 30 minutter</string>
|
<string name="share_location_for_30_minutes">i 30 minutter</string>
|
||||||
<string name="share_location_for_one_hour">i 1 time</string>
|
<string name="share_location_for_one_hour">i 1 time</string>
|
||||||
<string name="share_location_for_two_hours">i 2 timer</string>
|
<string name="share_location_for_two_hours">i 2 timer</string>
|
||||||
<string name="share_location_for_six_hours">i 6 timer</string>
|
<string name="share_location_for_six_hours">i 6 timer</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Send den følgende fil til 2%s?</item>
|
<item quantity="one">Send den følgende fil til %s?</item>
|
||||||
<item quantity="other">Send de følgende %d filer til %s?</item>
|
<item quantity="other">Send de følgende %d filer til %s?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="file_saved_to">Fil gemt til \"%1$s\".</string>
|
<string name="file_saved_to">Fil gemt til \"%1$s\".</string>
|
||||||
@@ -242,6 +244,7 @@
|
|||||||
<item quantity="one">Slet %d besked?</item>
|
<item quantity="one">Slet %d besked?</item>
|
||||||
<item quantity="other">Slet %d beskeder?</item>
|
<item quantity="other">Slet %d beskeder?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Videresend beskeder til %1$s?</string>
|
<string name="ask_forward">Videresend beskeder til %1$s?</string>
|
||||||
<string name="ask_forward_multiple">Videresend beskeder til %1$d samtaler? </string>
|
<string name="ask_forward_multiple">Videresend beskeder til %1$d samtaler? </string>
|
||||||
<string name="ask_export_attachment">Eksportér vedhæftninger? Eksport af vedhæftninger vil tillade alle programmer på din enhed adgang til dem.\n\nFortsæt?</string>
|
<string name="ask_export_attachment">Eksportér vedhæftninger? Eksport af vedhæftninger vil tillade alle programmer på din enhed adgang til dem.\n\nFortsæt?</string>
|
||||||
@@ -406,6 +409,7 @@
|
|||||||
<string name="pref_notifications_priority">Prioritet</string>
|
<string name="pref_notifications_priority">Prioritet</string>
|
||||||
<string name="pref_notifications_explain">Aktivér systemnotifikationer for nye beskeder</string>
|
<string name="pref_notifications_explain">Aktivér systemnotifikationer for nye beskeder</string>
|
||||||
<string name="pref_show_notification_content">Vis beskedindhold i notifikationer</string>
|
<string name="pref_show_notification_content">Vis beskedindhold i notifikationer</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Viser afsender og første ord af beskeden i notifikationer</string>
|
<string name="pref_show_notification_content_explain">Viser afsender og første ord af beskeden i notifikationer</string>
|
||||||
<string name="pref_led_color">LED farve</string>
|
<string name="pref_led_color">LED farve</string>
|
||||||
<string name="pref_sound">Lyd</string>
|
<string name="pref_sound">Lyd</string>
|
||||||
@@ -440,11 +444,17 @@
|
|||||||
<string name="pref_background">Baggrund</string>
|
<string name="pref_background">Baggrund</string>
|
||||||
<string name="pref_background_btn_default">Brug standardbillede</string>
|
<string name="pref_background_btn_default">Brug standardbillede</string>
|
||||||
<string name="pref_background_btn_gallery">Vælg fra galleri</string>
|
<string name="pref_background_btn_gallery">Vælg fra galleri</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Ved deaktivering af denne indstiiling vær sikker på at server og andre klienter er indstillet tilsvarende.\n\nEllers fungerer det måske slet ikke.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Ved deaktivering af denne indstiiling vær sikker på at server og andre klienter er indstillet tilsvarende.\n\nEllers fungerer det måske slet ikke.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Flytter automatisk til DeltaChat mappe</string>
|
<string name="pref_auto_folder_moves">Flytter automatisk til DeltaChat mappe</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Vis klassisk e-mail</string>
|
<string name="pref_show_emails">Vis klassisk e-mail</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Nej, kun samtaler</string>
|
<string name="pref_show_emails_no">Nej, kun samtaler</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">For godkendte kontakter</string>
|
<string name="pref_show_emails_accepted_contacts">For godkendte kontakter</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Alle</string>
|
<string name="pref_show_emails_all">Alle</string>
|
||||||
<string name="pref_experimental_features">Eksperimentelle features</string>
|
<string name="pref_experimental_features">Eksperimentelle features</string>
|
||||||
<string name="pref_on_demand_location_streaming">On-demand lokationsstreaming</string>
|
<string name="pref_on_demand_location_streaming">On-demand lokationsstreaming</string>
|
||||||
@@ -472,12 +482,13 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Slet gamle beskeder</string>
|
<string name="delete_old_messages">Slet gamle beskeder</string>
|
||||||
<string name="autodel_device_title">Slet beskeder fra enhed</string>
|
<string name="autodel_device_title">Slet beskeder fra enhed</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Slet beskeder fra server</string>
|
<string name="autodel_server_title">Slet beskeder fra server</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">Vil du slette %1$d beskeder nu og alle nyligt hentede beskeder \"%2$s\" i fremtiden?\n\n• Dette inkluderer alle medier\n\n• Beskeder vil blive slettet uanset om de er set eller ej\n\n• \"Gemte beskeder\" vil ikke blive slettet lokalt</string>
|
<string name="autodel_device_ask">Vil du slette %1$d beskeder nu og alle nyligt hentede beskeder \"%2$s\" i fremtiden?\n\n• Dette inkluderer alle medier\n\n• Beskeder vil blive slettet uanset om de er set eller ej\n\n• \"Gemte beskeder\" vil ikke blive slettet lokalt</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">Vil du slette %1$d beskeder nu og alle nyligt hentede beskeder \"%2$s\" fremover?\n\n⚠️ Dette inkluderer e-mails, medier og \"Gemte beskeder\" i alle mapper på serveren\n\n⚠️ Brug ikke denne funktion hvis du vil beholde data på serveren\n\n⚠️ Brug ikke denne funktion hvis du benytter andre e-mail klienter end Delta Chat</string>
|
<string name="autodel_server_ask">Vil du slette %1$d beskeder nu og alle nyligt hentede beskeder \"%2$s\" fremover?\n\n⚠️ Dette inkluderer e-mails, medier og \"Gemte beskeder\" i alle mapper på serveren\n\n⚠️ Brug ikke denne funktion hvis du vil beholde data på serveren\n\n⚠️ Brug ikke denne funktion hvis du benytter andre e-mail klienter end Delta Chat</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Dette inkluderer email, medier og \"Gemte beskeder\" i alle server mapper. Brug ikke denne funktion hvis du vil beholde data på serveren eller hvis du bruger andre emailklienter end Delta Chat.</string>
|
<string name="autodel_server_enabled_hint">Dette inkluderer email, medier og \"Gemte beskeder\" i alle server mapper. Brug ikke denne funktion hvis du vil beholde data på serveren eller hvis du bruger andre emailklienter end Delta Chat.</string>
|
||||||
<string name="autodel_confirm">Jeg forstår, slet alle disse beskeder</string>
|
<string name="autodel_confirm">Jeg forstår, slet alle disse beskeder</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -636,7 +647,6 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Beskedhandlinger</string>
|
<string name="a11y_message_context_menu_btn_label">Beskedhandlinger</string>
|
||||||
<string name="a11y_background_preview_label">Baggrundsvisning</string>
|
<string name="a11y_background_preview_label">Baggrundsvisning</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Beskeder med tidsudløb aktiveret</string>
|
<string name="a11y_disappearing_messages_activated">Beskeder med tidsudløb aktiveret</string>
|
||||||
|
|
||||||
<!-- iOS permissions, copy from "deltachat-ios/Info.plist", which is used on missing translations in "deltachat-ios/LANG.lproj/InfoPlist.strings" -->
|
<!-- iOS permissions, copy from "deltachat-ios/Info.plist", which is used on missing translations in "deltachat-ios/LANG.lproj/InfoPlist.strings" -->
|
||||||
<string name="InfoPlist_NSCameraUsageDescription">Delta Chat bruger dit kamera til at sende billeder, videoer og skanne QR-koder</string>
|
<string name="InfoPlist_NSCameraUsageDescription">Delta Chat bruger dit kamera til at sende billeder, videoer og skanne QR-koder</string>
|
||||||
<string name="InfoPlist_NSMicrophoneUsageDescription">Delta Chat bruger din mikrofon til at optage og sende talebeskeder og videoer med lyd.</string>
|
<string name="InfoPlist_NSMicrophoneUsageDescription">Delta Chat bruger din mikrofon til at optage og sende talebeskeder og videoer med lyd.</string>
|
||||||
|
|||||||
@@ -61,7 +61,9 @@
|
|||||||
<string name="media">Medien</string>
|
<string name="media">Medien</string>
|
||||||
<string name="apps_and_media">Apps & Medien</string>
|
<string name="apps_and_media">Apps & Medien</string>
|
||||||
<string name="profile">Profil</string>
|
<string name="profile">Profil</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">Alle Profile</string>
|
<string name="all_profiles">Alle Profile</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">Aktuelles Profil</string>
|
<string name="current_profile">Aktuelles Profil</string>
|
||||||
<string name="main_menu">Hauptmenü</string>
|
<string name="main_menu">Hauptmenü</string>
|
||||||
<string name="start_chat">Chat starten</string>
|
<string name="start_chat">Chat starten</string>
|
||||||
@@ -86,6 +88,7 @@
|
|||||||
<string name="always">Immer</string>
|
<string name="always">Immer</string>
|
||||||
<string name="always_load_remote_images">Bilder immer nachladen</string>
|
<string name="always_load_remote_images">Bilder immer nachladen</string>
|
||||||
<string name="once">Einmal</string>
|
<string name="once">Einmal</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Warnung anzeigen</string>
|
<string name="show_warning">Warnung anzeigen</string>
|
||||||
<string name="not_now">Nicht jetzt</string>
|
<string name="not_now">Nicht jetzt</string>
|
||||||
<string name="never">Nie</string>
|
<string name="never">Nie</string>
|
||||||
@@ -203,7 +206,10 @@
|
|||||||
<string name="camera">Kamera</string>
|
<string name="camera">Kamera</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Aufnehmen</string>
|
<string name="capture">Aufnehmen</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Kamera wechseln</string>
|
<string name="switch_camera">Kamera wechseln</string>
|
||||||
|
<!-- Toggle camera on/off eg. during an video call -->
|
||||||
|
<string name="toggle_camera">Kamera wechseln</string>
|
||||||
<string name="toggle_fullscreen">Vollbildmodus umschalten</string>
|
<string name="toggle_fullscreen">Vollbildmodus umschalten</string>
|
||||||
<string name="location">Standort</string>
|
<string name="location">Standort</string>
|
||||||
<string name="locations">Standorte</string>
|
<string name="locations">Standorte</string>
|
||||||
@@ -380,11 +386,14 @@
|
|||||||
<string name="mute_for_seven_days">Stumm für 7 Tage</string>
|
<string name="mute_for_seven_days">Stumm für 7 Tage</string>
|
||||||
<string name="mute_forever">Stumm für immer</string>
|
<string name="mute_forever">Stumm für immer</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">für 5 Minuten</string>
|
<string name="share_location_for_5_minutes">für 5 Minuten</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">für 30 Minuten</string>
|
<string name="share_location_for_30_minutes">für 30 Minuten</string>
|
||||||
<string name="share_location_for_one_hour">für 1 Stunde</string>
|
<string name="share_location_for_one_hour">für 1 Stunde</string>
|
||||||
<string name="share_location_for_two_hours">für 2 Stunden</string>
|
<string name="share_location_for_two_hours">für 2 Stunden</string>
|
||||||
<string name="share_location_for_six_hours">für 6 Stunden</string>
|
<string name="share_location_for_six_hours">für 6 Stunden</string>
|
||||||
|
<string name="share_location_for_24_hours">für 24 Stunden</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Die folgende Datei an %s senden?</item>
|
<item quantity="one">Die folgende Datei an %s senden?</item>
|
||||||
@@ -402,6 +411,8 @@
|
|||||||
<string name="answer_call">Annehmen</string>
|
<string name="answer_call">Annehmen</string>
|
||||||
<!-- the action "to decline" a call, not: "the decline" -->
|
<!-- the action "to decline" a call, not: "the decline" -->
|
||||||
<string name="end_call">Ablehnen</string>
|
<string name="end_call">Ablehnen</string>
|
||||||
|
<!-- the action to end a call -->
|
||||||
|
<string name="end_call2">Anruf beenden</string>
|
||||||
<!-- Used in call bubbles, summaries, notifications -->
|
<!-- Used in call bubbles, summaries, notifications -->
|
||||||
<string name="audio_call">Sprachanruf</string>
|
<string name="audio_call">Sprachanruf</string>
|
||||||
<!-- Used in call bubbles, summaries, notifications -->
|
<!-- Used in call bubbles, summaries, notifications -->
|
||||||
@@ -425,7 +436,13 @@
|
|||||||
<string name="missed_call">Verpasster Anruf</string>
|
<string name="missed_call">Verpasster Anruf</string>
|
||||||
<string name="already_in_call">Bereits im Anruf</string>
|
<string name="already_in_call">Bereits im Anruf</string>
|
||||||
<string name="call_answered_elsewhere">Anruf auf einem anderen Gerät beantwortet</string>
|
<string name="call_answered_elsewhere">Anruf auf einem anderen Gerät beantwortet</string>
|
||||||
|
<string name="call_requires_camera_permission">Kamerazugriff für Videoanrufe erforderlich</string>
|
||||||
<string name="call_requires_mic_permission">Mikrofonzugriff für Anrufe erforderlich</string>
|
<string name="call_requires_mic_permission">Mikrofonzugriff für Anrufe erforderlich</string>
|
||||||
|
<string name="call_requires_connection">Anruf kann nicht gestartet werden. Stelle sicher, dass dein Gerät mit dem Internet verbunden ist, und versuche es erneut.</string>
|
||||||
|
<!-- Used e.g. in a notifications to describe an ongoing call. "Call" is a noun here, in the meaning of "This is the call with ..." where the placeholder is replaced by the name of the contact. -->
|
||||||
|
<string name="call_with">Anruf mit %1$s</string>
|
||||||
|
<!-- Use e.g. in a notifications during ringing. Placeholder is relaced by the name of the contact being called. -->
|
||||||
|
<string name="calling_person">%1$s anrufen…</string>
|
||||||
|
|
||||||
<!-- get confirmations -->
|
<!-- get confirmations -->
|
||||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||||
@@ -440,6 +457,12 @@
|
|||||||
<item quantity="one">%d Nachricht löschen?</item>
|
<item quantity="one">%d Nachricht löschen?</item>
|
||||||
<item quantity="other">%d Nachrichten löschen?</item>
|
<item quantity="other">%d Nachrichten löschen?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- First placeholder gets replaced by the number of messages to forward. Second placeholder gets replaced by the name of the destination chat -->
|
||||||
|
<plurals name="ask_forward_messages">
|
||||||
|
<item quantity="one">Nachricht an %2$s weiterleiten?</item>
|
||||||
|
<item quantity="other">%1$d Nachrichten an %2$s weiterleiten?</item>
|
||||||
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Nachricht weiterleiten an %1$s?</string>
|
<string name="ask_forward">Nachricht weiterleiten an %1$s?</string>
|
||||||
<string name="ask_forward_multiple">Nachrichten an %1$d Chats weiterleiten?</string>
|
<string name="ask_forward_multiple">Nachrichten an %1$d Chats weiterleiten?</string>
|
||||||
<string name="ask_export_attachment">Das Exportieren von Anhängen ermöglicht es allen anderen Anwendungen auf deinem Gerät, auf diese zuzugreifen.\n\nFortfahren? </string>
|
<string name="ask_export_attachment">Das Exportieren von Anhängen ermöglicht es allen anderen Anwendungen auf deinem Gerät, auf diese zuzugreifen.\n\nFortfahren? </string>
|
||||||
@@ -613,6 +636,7 @@
|
|||||||
<string name="connectivity_connected">Verbunden</string>
|
<string name="connectivity_connected">Verbunden</string>
|
||||||
<string name="sending">Sende…</string>
|
<string name="sending">Sende…</string>
|
||||||
<string name="last_msg_sent_successfully">Letzte Nachricht erfolgreich versandt.</string>
|
<string name="last_msg_sent_successfully">Letzte Nachricht erfolgreich versandt.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">Nicht unterstützt von deinem Anbieter.</string>
|
<string name="not_supported_by_provider">Nicht unterstützt von deinem Anbieter.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Nachrichten</string>
|
<string name="messages">Nachrichten</string>
|
||||||
@@ -649,7 +673,7 @@
|
|||||||
<string name="welcome_chat_over_email">Sicherer dezentraler Chat</string>
|
<string name="welcome_chat_over_email">Sicherer dezentraler Chat</string>
|
||||||
<string name="scan_invitation_code">Einladungscode scannen</string>
|
<string name="scan_invitation_code">Einladungscode scannen</string>
|
||||||
<string name="login_title">Login</string>
|
<string name="login_title">Login</string>
|
||||||
<string name="login_advanced_hint">Für fortgeschrittene Benutzer:\n\n• Verwende keine Adresse, die du bereits in einer anderen App nutzt.\n\n• Klassische E-Mail-Server ermöglichen Chats ohne Ende-zu-Ende-Verschlüsselung, gekennzeichnet durch ein E-Mail-Symbol.</string>
|
<string name="login_advanced_hint">Für fortgeschrittene Benutzer:\n\nVerwende keine Adresse, die du bereits in einer anderen App nutzt.</string>
|
||||||
<string name="login_inbox">Posteingang</string>
|
<string name="login_inbox">Posteingang</string>
|
||||||
<string name="login_imap_login">IMAP-Anmeldename</string>
|
<string name="login_imap_login">IMAP-Anmeldename</string>
|
||||||
<string name="login_imap_server">IMAP-Server</string>
|
<string name="login_imap_server">IMAP-Server</string>
|
||||||
@@ -684,6 +708,7 @@
|
|||||||
<string name="used_for_sending">Zum Senden verwendet</string>
|
<string name="used_for_sending">Zum Senden verwendet</string>
|
||||||
<string name="hide_from_contacts">Vor Kontakten verstecken</string>
|
<string name="hide_from_contacts">Vor Kontakten verstecken</string>
|
||||||
<string name="hidden_from_contacts">Vor Kontakten versteckt</string>
|
<string name="hidden_from_contacts">Vor Kontakten versteckt</string>
|
||||||
|
<string name="enforce_e2ee">Verschlüsselung für alle Relays erzwingen</string>
|
||||||
<!-- Hint for the list of relays -->
|
<!-- Hint for the list of relays -->
|
||||||
<string name="transport_list_hint">Nachrichten werden auf allen Relays empfangen.\n\n⚠️ Wenn Sie hier Änderungen vornehmen, stellen Sie sicher, dass auf allen Ihren Geräten mindestens Version 2.47.0 installiert ist. Andernfalls könnten auf älteren Versionen Nachrichten verloren gehen.</string>
|
<string name="transport_list_hint">Nachrichten werden auf allen Relays empfangen.\n\n⚠️ Wenn Sie hier Änderungen vornehmen, stellen Sie sicher, dass auf allen Ihren Geräten mindestens Version 2.47.0 installiert ist. Andernfalls könnten auf älteren Versionen Nachrichten verloren gehen.</string>
|
||||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||||
@@ -745,9 +770,9 @@
|
|||||||
<string name="pref_enter_sends">Enter-Taste sendet</string>
|
<string name="pref_enter_sends">Enter-Taste sendet</string>
|
||||||
<string name="pref_enter_sends_explain">Durch Drücken der Eingabetaste werden Textnachrichten gesendet.</string>
|
<string name="pref_enter_sends_explain">Durch Drücken der Eingabetaste werden Textnachrichten gesendet.</string>
|
||||||
<string name="pref_outgoing_media_quality">Medienqualität beim Senden</string>
|
<string name="pref_outgoing_media_quality">Medienqualität beim Senden</string>
|
||||||
<string name="pref_outgoing_media_quality_hint">Um Originalqualität zu senden, hänge Medien als „Datei“ an. Dies verbraucht deutlich mehr Datenvolumen für dich und die Empfänger.</string>
|
<string name="pref_outgoing_media_quality_hint">Um Originalqualität zu senden, hänge Medien als „Datei“ an. Dies verbraucht deutlich mehr Daten für dich und die Empfänger.</string>
|
||||||
<string name="pref_outgoing_balanced">Ausgewogen</string>
|
<string name="pref_outgoing_balanced">Ausgewogen</string>
|
||||||
<string name="pref_outgoing_worse">Schlechte Qualität, kleine Dateien</string>
|
<string name="pref_outgoing_worse">Schlechte Qualität, Daten sparen</string>
|
||||||
<string name="pref_vibrate">Vibrieren</string>
|
<string name="pref_vibrate">Vibrieren</string>
|
||||||
<string name="pref_screen_security">Bildschirmsicherheit</string>
|
<string name="pref_screen_security">Bildschirmsicherheit</string>
|
||||||
<!-- Translators: Must indicate that there is no guarantee as the system may not honor our request. -->
|
<!-- Translators: Must indicate that there is no guarantee as the system may not honor our request. -->
|
||||||
@@ -764,6 +789,7 @@
|
|||||||
<string name="pref_notifications_priority">Priorität</string>
|
<string name="pref_notifications_priority">Priorität</string>
|
||||||
<string name="pref_notifications_explain">System-Benachrichtigungen bei neuen Nachrichten aktivieren</string>
|
<string name="pref_notifications_explain">System-Benachrichtigungen bei neuen Nachrichten aktivieren</string>
|
||||||
<string name="pref_show_notification_content">Textinhalt in Benachrichtigungen anzeigen</string>
|
<string name="pref_show_notification_content">Textinhalt in Benachrichtigungen anzeigen</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Absender und Textbeginn in Benachrichtigungen anzeigen</string>
|
<string name="pref_show_notification_content_explain">Absender und Textbeginn in Benachrichtigungen anzeigen</string>
|
||||||
<string name="pref_led_color">LED-Farbe</string>
|
<string name="pref_led_color">LED-Farbe</string>
|
||||||
<string name="pref_sound">Ton</string>
|
<string name="pref_sound">Ton</string>
|
||||||
@@ -806,16 +832,23 @@
|
|||||||
<string name="pref_background">Hintergrund</string>
|
<string name="pref_background">Hintergrund</string>
|
||||||
<string name="pref_background_btn_default">Standard-Bild verwenden</string>
|
<string name="pref_background_btn_default">Standard-Bild verwenden</string>
|
||||||
<string name="pref_background_btn_gallery">Aus Galerie auswählen</string>
|
<string name="pref_background_btn_gallery">Aus Galerie auswählen</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Wenn du diese Option änderst, stelle sicher, dass der Server und die anderen Geräte entsprechend konfiguriert sind\n\nAndernfalls funktionieren Dinge möglicherweise nicht wie erwartet.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Wenn du diese Option änderst, stelle sicher, dass der Server und die anderen Geräte entsprechend konfiguriert sind\n\nAndernfalls funktionieren Dinge möglicherweise nicht wie erwartet.</string>
|
||||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||||
<string name="pref_multidevice">Mehrgerätemodus</string>
|
<string name="pref_multidevice">Mehrgerätemodus</string>
|
||||||
<string name="pref_multidevice_explain">Synchronisiere deine Nachrichten mit deinen anderen Geräten. Wird beim Hinzufügen eines zweiten Geräts automatisch aktiviert.</string>
|
<string name="pref_multidevice_explain">Synchronisiere deine Nachrichten mit deinen anderen Geräten. Wird beim Hinzufügen eines zweiten Geräts automatisch aktiviert.</string>
|
||||||
<string name="pref_multidevice_change_warn">Der Mehrgerätemodus muss aktiviert sein, wenn dasselbe Profil auf mehreren Geräten verwendet wird. Deaktiviere diese Einstellung nur, wenn du dieses Profil von allen anderen Geräten entfernt hast.\n\nDie Deaktivierung des Mehrgerätemodus bei Verwendung des Profils auf mehreren Geräten führt zu verlorenen Nachrichten und anderen Problemen.</string>
|
<string name="pref_multidevice_change_warn">Der Mehrgerätemodus muss aktiviert sein, wenn dasselbe Profil auf mehreren Geräten verwendet wird. Deaktiviere diese Einstellung nur, wenn du dieses Profil von allen anderen Geräten entfernt hast.\n\nDie Deaktivierung des Mehrgerätemodus bei Verwendung des Profils auf mehreren Geräten führt zu verlorenen Nachrichten und anderen Problemen.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Autom. Verschieben in den DeltaChat-Ordner</string>
|
<string name="pref_auto_folder_moves">Autom. Verschieben in den DeltaChat-Ordner</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Nur aus DeltaChat-Ordner lesen</string>
|
<string name="pref_only_fetch_mvbox_title">Nur aus DeltaChat-Ordner lesen</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Normale E-Mails anzeigen</string>
|
<string name="pref_show_emails">Normale E-Mails anzeigen</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Nein, nur Chats</string>
|
<string name="pref_show_emails_no">Nein, nur Chats</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Akzeptierte Kontakte</string>
|
<string name="pref_show_emails_accepted_contacts">Akzeptierte Kontakte</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Alle</string>
|
<string name="pref_show_emails_all">Alle</string>
|
||||||
<string name="pref_experimental_features">Experimentelle Features</string>
|
<string name="pref_experimental_features">Experimentelle Features</string>
|
||||||
<string name="pref_experimental_features_explain">Die Features können instabil sein und geändert oder entfernt werden</string>
|
<string name="pref_experimental_features_explain">Die Features können instabil sein und geändert oder entfernt werden</string>
|
||||||
@@ -870,14 +903,17 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Alte Nachrichten löschen</string>
|
<string name="delete_old_messages">Alte Nachrichten löschen</string>
|
||||||
<string name="autodel_device_title">Nachrichten vom Gerät löschen</string>
|
<string name="autodel_device_title">Nachrichten vom Gerät löschen</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Nachrichten vom Server löschen</string>
|
<string name="autodel_server_title">Nachrichten vom Server löschen</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">Wirklich %1$d Nachrichten jetzt und zukünftig alle neuen Nachrichten \"%2$s\" löschen?\n\n• Dies schliesst alle Medien mit ein\n\n• Nachrichten werden gelöscht, auch wenn sie nicht angesehen wurden\n\n• \"Gespeicherte Nachrichten\" werden nicht gelöscht</string>
|
<string name="autodel_device_ask">Wirklich %1$d Nachrichten jetzt und zukünftig alle neuen Nachrichten \"%2$s\" löschen?\n\n• Dies schliesst alle Medien mit ein\n\n• Nachrichten werden gelöscht, auch wenn sie nicht angesehen wurden\n\n• \"Gespeicherte Nachrichten\" werden nicht gelöscht</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">Wirklich %1$d Nachrichten jetzt und zukünftig alle neuen Nachrichten \"%2$s\" löschen?\n\n⚠️ Dies schließt E-Mails, Medien und \"Gespeicherte Nachrichten\" aus allen Server-Ordnern mit ein\n\n⚠️ Verwende diese Funktion nicht, wenn du Daten auf dem Server behalten möchtest oder auch klassische E-Mail-Clients verwendest</string>
|
<string name="autodel_server_ask">Wirklich %1$d Nachrichten jetzt und zukünftig alle neuen Nachrichten \"%2$s\" löschen?\n\n⚠️ Dies schließt E-Mails, Medien und \"Gespeicherte Nachrichten\" aus allen Server-Ordnern mit ein\n\n⚠️ Verwende diese Funktion nicht, wenn du Daten auf dem Server behalten möchtest oder auch klassische E-Mail-Clients verwendest</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Dies schließt E-Mails, Medien und \"Gespeicherte Nachrichten\" aus allen Server-Ordnern mit ein. Verwenden diese Funktion nicht, wenn du Daten auf dem Server behalten möchtest oder auch klassische E-Mail-Clients verwendest.</string>
|
<string name="autodel_server_enabled_hint">Dies schließt E-Mails, Medien und \"Gespeicherte Nachrichten\" aus allen Server-Ordnern mit ein. Verwenden diese Funktion nicht, wenn du Daten auf dem Server behalten möchtest oder auch klassische E-Mail-Clients verwendest.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device_title">Sofortiges Löschen einschalten</string>
|
<string name="autodel_server_warn_multi_device_title">Sofortiges Löschen einschalten</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device">Wenn sofortiges Löschen aktiviert ist, können nicht mehrere Geräte für dieses Profil verwendet werden.</string>
|
<string name="autodel_server_warn_multi_device">Wenn sofortiges Löschen aktiviert ist, können nicht mehrere Geräte für dieses Profil verwendet werden.</string>
|
||||||
<string name="autodel_confirm">Verstanden, all diese Nachrichten löschen</string>
|
<string name="autodel_confirm">Verstanden, all diese Nachrichten löschen</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -974,7 +1010,7 @@
|
|||||||
<string name="learn_more">Mehr erfahren</string>
|
<string name="learn_more">Mehr erfahren</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">Du hast den Chat \"Gespeicherte Nachrichten\" gelöscht.\n\nℹ️ Um die Funktion \"Gespeicherte Nachrichten\" erneut zu verwenden, erstelle einfach einen Chat mit dir selbst.</string>
|
<string name="devicemsg_self_deleted">Du hast den Chat \"Gespeicherte Nachrichten\" gelöscht.\n\nℹ️ Um die Funktion \"Gespeicherte Nachrichten\" erneut zu verwenden, erstelle einfach einen Chat mit dir selbst.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ Der Speicherplatz deines Anbieters ist bald erschöpft; bereits %1$s%% sind verbraucht.\n\nDu kannst möglicherweise keine Nachrichten mehr empfangen, wenn der Speicherplatz komplett verbraucht ist.\n\n👉 Bitte prüfe, ob du alte Daten im Webinterface des Anbieters löschen kannst, und erwäge, \"Einstellungen / Chats / Alte Nachrichten löschen\" zu aktivieren. Den aktuellen Speicherverbrauch kannst du jederzeit unter \"Einstellungen / Verbindungsstatus\" überprüfen.</string>
|
<string name="devicemsg_storage_exceeding">⚠️ Der Speicherplatz deines Anbieters ist bald erschöpft; bereits %1$s%% sind verbraucht.\n\nDu kannst möglicherweise keine Nachrichten mehr empfangen, wenn der Speicherplatz komplett verbraucht ist.\n\n👉 Bitte prüfe, ob du alte Daten im Webinterface des Anbieters löschen kannst, und erwäge, \"Einstellungen / Chats / Alte Nachrichten löschen\" zu aktivieren. Den aktuellen Speicherverbrauch kannst du jederzeit unter \"Einstellungen / Verbindungsstatus\" überprüfen.</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ Dein Gerät scheint ein falsches Datum oder eine falsche Uhrzeit (%1$s) zu verwenden.\n\nStelle deine Uhr ⏰🔧 richtig ein, um sicherzustellen, dass deine Nachrichten korrekt empfangen werden.</string>
|
<string name="devicemsg_bad_time">⚠️ Dein Gerät scheint ein falsches Datum oder eine falsche Uhrzeit (%1$s) zu verwenden.\n\nStelle deine Uhr ⏰🔧 richtig ein, um sicherzustellen, dass deine Nachrichten korrekt empfangen werden.</string>
|
||||||
@@ -1058,8 +1094,6 @@
|
|||||||
<string name="n_messages_in_m_chats">%1$d Nachrichten in %2$d Chats</string>
|
<string name="n_messages_in_m_chats">%1$d Nachrichten in %2$d Chats</string>
|
||||||
|
|
||||||
<!-- location streaming -->
|
<!-- location streaming -->
|
||||||
<string name="location_streaming_channel_desc">Kanal für Standortübertragung</string>
|
|
||||||
<string name="location_streaming_notification_title">Standardübertragung</string>
|
|
||||||
<string name="location_streaming_notification_text">Du teilst deinen Standort</string>
|
<string name="location_streaming_notification_text">Du teilst deinen Standort</string>
|
||||||
<string name="location_rationale">Damit du deinen aktuellen Standort teilen kannst, musst du Delta Chat die Nutzung deiner Standortdaten erlauben.\n\nDamit die Standortanzeige nahtlos funktioniert, werden Standortdaten auch dann verwendet, wenn die App geschlossen ist oder nicht genutzt wird.</string>
|
<string name="location_rationale">Damit du deinen aktuellen Standort teilen kannst, musst du Delta Chat die Nutzung deiner Standortdaten erlauben.\n\nDamit die Standortanzeige nahtlos funktioniert, werden Standortdaten auch dann verwendet, wenn die App geschlossen ist oder nicht genutzt wird.</string>
|
||||||
|
|
||||||
@@ -1155,6 +1189,8 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Nachrichtaktionen</string>
|
<string name="a11y_message_context_menu_btn_label">Nachrichtaktionen</string>
|
||||||
<string name="a11y_background_preview_label">Vorschau für Hintergrundbild</string>
|
<string name="a11y_background_preview_label">Vorschau für Hintergrundbild</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Verschwindende Nachrichten eingeschaltet</string>
|
<string name="a11y_disappearing_messages_activated">Verschwindende Nachrichten eingeschaltet</string>
|
||||||
|
<!-- The placeholder will be replaced by a link, eg. "Open https://delta.chat". Used e.g. in for accessibility. -->
|
||||||
|
<string name="open_link">Öffne %1$s</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Teilen des Standorts beenden</string>
|
<string name="stop_sharing_location">Teilen des Standorts beenden</string>
|
||||||
|
|||||||
@@ -145,6 +145,7 @@
|
|||||||
<string name="camera">Κάμερα</string>
|
<string name="camera">Κάμερα</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Λήψη</string>
|
<string name="capture">Λήψη</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Αλλαγή κάμερας</string>
|
<string name="switch_camera">Αλλαγή κάμερας</string>
|
||||||
<string name="toggle_fullscreen">Εναλλαγή Λειτουργίας Πλήρους Οθόνης</string>
|
<string name="toggle_fullscreen">Εναλλαγή Λειτουργίας Πλήρους Οθόνης</string>
|
||||||
<string name="location">Τοποθεσία</string>
|
<string name="location">Τοποθεσία</string>
|
||||||
@@ -259,12 +260,13 @@
|
|||||||
<string name="mute_for_seven_days">Σίγαση για 7 ημέρες</string>
|
<string name="mute_for_seven_days">Σίγαση για 7 ημέρες</string>
|
||||||
<string name="mute_forever">Μόνιμη Σίγαση</string>
|
<string name="mute_forever">Μόνιμη Σίγαση</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">Για 5 λεπτά</string>
|
<string name="share_location_for_5_minutes">Για 5 λεπτά</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">Για 30 λεπτά</string>
|
<string name="share_location_for_30_minutes">Για 30 λεπτά</string>
|
||||||
<string name="share_location_for_one_hour">Για 1 ώρα</string>
|
<string name="share_location_for_one_hour">Για 1 ώρα</string>
|
||||||
<string name="share_location_for_two_hours">Για 2 ώρες</string>
|
<string name="share_location_for_two_hours">Για 2 ώρες</string>
|
||||||
<string name="share_location_for_six_hours">Για 6 ώρες</string>
|
<string name="share_location_for_six_hours">Για 6 ώρες</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Αποστολή του παρακάτω αρχείου στο %s;</item>
|
<item quantity="one">Αποστολή του παρακάτω αρχείου στο %s;</item>
|
||||||
<item quantity="other">Αποστολή των παρακάτω %d αρχείων στο %s;</item>
|
<item quantity="other">Αποστολή των παρακάτω %d αρχείων στο %s;</item>
|
||||||
@@ -275,6 +277,7 @@
|
|||||||
<item quantity="one">Διαγραφή %d μηνύματος;</item>
|
<item quantity="one">Διαγραφή %d μηνύματος;</item>
|
||||||
<item quantity="other">Διαγραφή %d μηνυμάτων;</item>
|
<item quantity="other">Διαγραφή %d μηνυμάτων;</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Κοινοποίηση μηνύματος στο %1$s;</string>
|
<string name="ask_forward">Κοινοποίηση μηνύματος στο %1$s;</string>
|
||||||
<string name="ask_forward_multiple">Κοινοποίηση μηνύματος σε %1$d συνομιλίες;</string>
|
<string name="ask_forward_multiple">Κοινοποίηση μηνύματος σε %1$d συνομιλίες;</string>
|
||||||
<string name="ask_export_attachment">Η εξαγωγή συνημμένων θα επιτρέψει σε άλλες εφαρμογές της συσκευής σας να έχουν πρόσβαση σε αυτά.\n\nΣυνέχεια;</string>
|
<string name="ask_export_attachment">Η εξαγωγή συνημμένων θα επιτρέψει σε άλλες εφαρμογές της συσκευής σας να έχουν πρόσβαση σε αυτά.\n\nΣυνέχεια;</string>
|
||||||
@@ -398,6 +401,7 @@
|
|||||||
<string name="connectivity_connected">Συνδεδεμένο</string>
|
<string name="connectivity_connected">Συνδεδεμένο</string>
|
||||||
<string name="sending">Στέλνεται…</string>
|
<string name="sending">Στέλνεται…</string>
|
||||||
<string name="last_msg_sent_successfully">Το τελευταίο μήνυμα στάλθηκε με επιτυχία.</string>
|
<string name="last_msg_sent_successfully">Το τελευταίο μήνυμα στάλθηκε με επιτυχία.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">Δεν υποστηρίζεται από τον πάροχο σας.</string>
|
<string name="not_supported_by_provider">Δεν υποστηρίζεται από τον πάροχο σας.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Μηνύματα</string>
|
<string name="messages">Μηνύματα</string>
|
||||||
@@ -473,6 +477,7 @@
|
|||||||
<string name="pref_notifications_priority">Προτεραιότητα</string>
|
<string name="pref_notifications_priority">Προτεραιότητα</string>
|
||||||
<string name="pref_notifications_explain">Ενεργοποιήστε τις ειδοποιήσεις συστήματος για νέα μηνύματα</string>
|
<string name="pref_notifications_explain">Ενεργοποιήστε τις ειδοποιήσεις συστήματος για νέα μηνύματα</string>
|
||||||
<string name="pref_show_notification_content">Εμφάνιση περιεχομένου μηνύματος στην ειδοποίηση</string>
|
<string name="pref_show_notification_content">Εμφάνιση περιεχομένου μηνύματος στην ειδοποίηση</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Εμφανίζει τον αποστολέα και τις πρώτες λέξεις του μηνύματος στις ειδοποιήσεις</string>
|
<string name="pref_show_notification_content_explain">Εμφανίζει τον αποστολέα και τις πρώτες λέξεις του μηνύματος στις ειδοποιήσεις</string>
|
||||||
<string name="pref_led_color">Χρώμα LED</string>
|
<string name="pref_led_color">Χρώμα LED</string>
|
||||||
<string name="pref_sound">Ήχος</string>
|
<string name="pref_sound">Ήχος</string>
|
||||||
@@ -507,12 +512,19 @@
|
|||||||
<string name="pref_background">Ταπετσαρία συνομιλίας</string>
|
<string name="pref_background">Ταπετσαρία συνομιλίας</string>
|
||||||
<string name="pref_background_btn_default">Χρήση προκαθορισμένου</string>
|
<string name="pref_background_btn_default">Χρήση προκαθορισμένου</string>
|
||||||
<string name="pref_background_btn_gallery">Επιλογή</string>
|
<string name="pref_background_btn_gallery">Επιλογή</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Εάν αλλάξετε αυτήν την επιλογή, βεβαιωθείτε ότι ο διακομιστής σας και οι άλλοι πελάτες σας έχουν διαμορφωθεί ανάλογα.\n\nΔιαφορετικά, τα πράγματα ενδέχεται να μην λειτουργούν καθόλου.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Εάν αλλάξετε αυτήν την επιλογή, βεβαιωθείτε ότι ο διακομιστής σας και οι άλλοι πελάτες σας έχουν διαμορφωθεί ανάλογα.\n\nΔιαφορετικά, τα πράγματα ενδέχεται να μην λειτουργούν καθόλου.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Μετακίνηση αυτόματα στον φάκελο DeltaChat</string>
|
<string name="pref_auto_folder_moves">Μετακίνηση αυτόματα στον φάκελο DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Λήψη μόνο από τον φάκελο DeltaChat</string>
|
<string name="pref_only_fetch_mvbox_title">Λήψη μόνο από τον φάκελο DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Εμφάνιση κλασικών E-Mails</string>
|
<string name="pref_show_emails">Εμφάνιση κλασικών E-Mails</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Όχι, μόνο συνομιλίες</string>
|
<string name="pref_show_emails_no">Όχι, μόνο συνομιλίες</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Για αποδεκτές επαφές</string>
|
<string name="pref_show_emails_accepted_contacts">Για αποδεκτές επαφές</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Όλα</string>
|
<string name="pref_show_emails_all">Όλα</string>
|
||||||
<string name="pref_experimental_features">Πειραματικά Χαρακτηριστικά</string>
|
<string name="pref_experimental_features">Πειραματικά Χαρακτηριστικά</string>
|
||||||
<string name="pref_on_demand_location_streaming">Ροή τοποθεσίας κατ\' απαίτηση</string>
|
<string name="pref_on_demand_location_streaming">Ροή τοποθεσίας κατ\' απαίτηση</string>
|
||||||
@@ -548,12 +560,13 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Διαγραφή Παλιών Μηνυμάτων</string>
|
<string name="delete_old_messages">Διαγραφή Παλιών Μηνυμάτων</string>
|
||||||
<string name="autodel_device_title">Διαγραφή Μηνυμάτων από Συσκευή</string>
|
<string name="autodel_device_title">Διαγραφή Μηνυμάτων από Συσκευή</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Διαγραφή Μηνυμάτων από Διακομιστή</string>
|
<string name="autodel_server_title">Διαγραφή Μηνυμάτων από Διακομιστή</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">Θέλετε να διαγράψετε %1$d μηνύματα τώρα και όλα τα πρόσφατα ληφθέντα μηνύματα \"%2$s\" στο μέλλον;\n\n• Αυτό περιλαμβάνει όλα τα μέσα\n\n• Τα μηνύματα θα διαγραφούν είτε εμφανίστηκαν είτε όχι\n\n• \"Αποθηκευμένα μηνύματα \" θα παραλειφθεί από την τοπική διαγραφή</string>
|
<string name="autodel_device_ask">Θέλετε να διαγράψετε %1$d μηνύματα τώρα και όλα τα πρόσφατα ληφθέντα μηνύματα \"%2$s\" στο μέλλον;\n\n• Αυτό περιλαμβάνει όλα τα μέσα\n\n• Τα μηνύματα θα διαγραφούν είτε εμφανίστηκαν είτε όχι\n\n• \"Αποθηκευμένα μηνύματα \" θα παραλειφθεί από την τοπική διαγραφή</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">Θέλετε να διαγράψετε %1$d μηνύματα τώρα και όλα τα πρόσφατα ληφθέντα μηνύματα \"%2$s\" στο μέλλον;\n\n⚠️ Αυτό περιλαμβάνει μηνύματα ηλεκτρονικού ταχυδρομείου, πολυμέσα και τα \"Αποθηκευμένα μηνύματα\" σε όλους τους φακέλους διακομιστή\n\n⚠️ Μην χρησιμοποιείτε αυτήν τη λειτουργία εάν θέλετε να διατηρήσετε δεδομένα στο διακομιστή\n\n⚠️ Μην χρησιμοποιείτε αυτήν τη λειτουργία εάν χρησιμοποιείτε άλλους πελάτες ηλεκτρονικού ταχυδρομείου εκτός από το Delta Chat</string>
|
<string name="autodel_server_ask">Θέλετε να διαγράψετε %1$d μηνύματα τώρα και όλα τα πρόσφατα ληφθέντα μηνύματα \"%2$s\" στο μέλλον;\n\n⚠️ Αυτό περιλαμβάνει μηνύματα ηλεκτρονικού ταχυδρομείου, πολυμέσα και τα \"Αποθηκευμένα μηνύματα\" σε όλους τους φακέλους διακομιστή\n\n⚠️ Μην χρησιμοποιείτε αυτήν τη λειτουργία εάν θέλετε να διατηρήσετε δεδομένα στο διακομιστή\n\n⚠️ Μην χρησιμοποιείτε αυτήν τη λειτουργία εάν χρησιμοποιείτε άλλους πελάτες ηλεκτρονικού ταχυδρομείου εκτός από το Delta Chat</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Αυτό περιλαμβάνει e-mail, πολυμέσα και \"Αποθηκευμένα μηνύματα\" σε όλους τους φακέλους διακομιστή. Μην χρησιμοποιείτε αυτήν τη λειτουργία εάν θέλετε να διατηρήσετε δεδομένα στο διακομιστή ή εάν χρησιμοποιείτε άλλα προγράμματα-πελάτες ηλεκτρονικού ταχυδρομείου εκτός από το Delta Chat.</string>
|
<string name="autodel_server_enabled_hint">Αυτό περιλαμβάνει e-mail, πολυμέσα και \"Αποθηκευμένα μηνύματα\" σε όλους τους φακέλους διακομιστή. Μην χρησιμοποιείτε αυτήν τη λειτουργία εάν θέλετε να διατηρήσετε δεδομένα στο διακομιστή ή εάν χρησιμοποιείτε άλλα προγράμματα-πελάτες ηλεκτρονικού ταχυδρομείου εκτός από το Delta Chat.</string>
|
||||||
<string name="autodel_confirm">Καταλαβαίνω, διαγράψτε όλα αυτά τα μηνύματα</string>
|
<string name="autodel_confirm">Καταλαβαίνω, διαγράψτε όλα αυτά τα μηνύματα</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -624,7 +637,7 @@
|
|||||||
<!-- %1$s will be replaced by the number of weeks (always >1) the timer is set to, %2$s will be replaced by name of the contact -->
|
<!-- %1$s will be replaced by the number of weeks (always >1) the timer is set to, %2$s will be replaced by name of the contact -->
|
||||||
<string name="ephemeral_timer_weeks_by_other">Ο/Η %2$s όρισε το χρόνο εξαφάνισης των μηνυμάτων σε %1$s εβδομάδες.</string>
|
<string name="ephemeral_timer_weeks_by_other">Ο/Η %2$s όρισε το χρόνο εξαφάνισης των μηνυμάτων σε %1$s εβδομάδες.</string>
|
||||||
<string name="devicemsg_self_deleted">Διαγράψατε τη συνομιλία \"Αποθηκευμένα μηνύματα\".\n\nℹ️ Για να χρησιμοποιήσετε ξανά τη λειτουργία \"Αποθηκευμένα μηνύματα\", δημιουργήστε μια νέα συνομιλία με τον εαυτό σας.</string>
|
<string name="devicemsg_self_deleted">Διαγράψατε τη συνομιλία \"Αποθηκευμένα μηνύματα\".\n\nℹ️ Για να χρησιμοποιήσετε ξανά τη λειτουργία \"Αποθηκευμένα μηνύματα\", δημιουργήστε μια νέα συνομιλία με τον εαυτό σας.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ Ο αποθηκευτικός χώρος του παρόχου σας πρόκειται να εξαντληθεί: %1$s %% χρησιμοποιούνται ήδη.\n\nΕνδέχεται να μην μπορείτε να λαμβάνετε μηνύματα εάν ο χώρος αποθήκευσης είναι πλήρης.\n\n👉 Ελέγξτε εάν μπορείτε να διαγράψετε παλιά δεδομένα στη διεπαφή ιστού του παρόχου και εξετάστε το ενδεχόμενο ενεργοποίηση \"Ρυθμίσεις / Διαγραφή παλαιών μηνυμάτων\". Μπορείτε να ελέγξετε την τρέχουσα χρήση αποθηκευτικού χώρου ανά πάσα στιγμή στις \"Ρυθμίσεις / Συνδεσιμότητα\".</string>
|
<string name="devicemsg_storage_exceeding">⚠️ Ο αποθηκευτικός χώρος του παρόχου σας πρόκειται να εξαντληθεί: %1$s %% χρησιμοποιούνται ήδη.\n\nΕνδέχεται να μην μπορείτε να λαμβάνετε μηνύματα εάν ο χώρος αποθήκευσης είναι πλήρης.\n\n👉 Ελέγξτε εάν μπορείτε να διαγράψετε παλιά δεδομένα στη διεπαφή ιστού του παρόχου και εξετάστε το ενδεχόμενο ενεργοποίηση \"Ρυθμίσεις / Διαγραφή παλαιών μηνυμάτων\". Μπορείτε να ελέγξετε την τρέχουσα χρήση αποθηκευτικού χώρου ανά πάσα στιγμή στις \"Ρυθμίσεις / Συνδεσιμότητα\".</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ Η ημερομηνία ή η ώρα στη συσκευή σας φαίνεται να είναι μην είναι ακριβής (%1$s).\n\nΠροσαρμόστε το ρολόι σας ⏰🔧 για να βεβαιωθείτε ότι τα μηνύματά σας λαμβάνονται σωστά.</string>
|
<string name="devicemsg_bad_time">⚠️ Η ημερομηνία ή η ώρα στη συσκευή σας φαίνεται να είναι μην είναι ακριβής (%1$s).\n\nΠροσαρμόστε το ρολόι σας ⏰🔧 για να βεβαιωθείτε ότι τα μηνύματά σας λαμβάνονται σωστά.</string>
|
||||||
@@ -760,7 +773,6 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Ενέργειες μηνυμάτων</string>
|
<string name="a11y_message_context_menu_btn_label">Ενέργειες μηνυμάτων</string>
|
||||||
<string name="a11y_background_preview_label">Προεπισκόπηση φόντου</string>
|
<string name="a11y_background_preview_label">Προεπισκόπηση φόντου</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Τα εξαφανιζόμενα μηνύματα ενεργοποιήθηκαν</string>
|
<string name="a11y_disappearing_messages_activated">Τα εξαφανιζόμενα μηνύματα ενεργοποιήθηκαν</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Διακοπή κοινής χρήσης τοποθεσίας</string>
|
<string name="stop_sharing_location">Διακοπή κοινής χρήσης τοποθεσίας</string>
|
||||||
<string name="a11y_voice_message_hint_ios">Μετά την εγγραφή, πατήστε δύο φορές για αποστολή. Για να απορρίψετε την εγγραφή, τρίψτε με δύο δάχτυλα.</string>
|
<string name="a11y_voice_message_hint_ios">Μετά την εγγραφή, πατήστε δύο φορές για αποστολή. Για να απορρίψετε την εγγραφή, τρίψτε με δύο δάχτυλα.</string>
|
||||||
|
|||||||
@@ -54,7 +54,9 @@
|
|||||||
<string name="media">Aŭdovidaĵoj</string>
|
<string name="media">Aŭdovidaĵoj</string>
|
||||||
<string name="apps_and_media">Apoj kaj vidaĵoj</string>
|
<string name="apps_and_media">Apoj kaj vidaĵoj</string>
|
||||||
<string name="profile">Profilo</string>
|
<string name="profile">Profilo</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">Ĉiuj profiloj</string>
|
<string name="all_profiles">Ĉiuj profiloj</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">Aktuala profilo</string>
|
<string name="current_profile">Aktuala profilo</string>
|
||||||
<string name="main_menu">Ĉefa menuo</string>
|
<string name="main_menu">Ĉefa menuo</string>
|
||||||
<string name="start_chat">Komenci Babiladon</string>
|
<string name="start_chat">Komenci Babiladon</string>
|
||||||
@@ -75,6 +77,7 @@
|
|||||||
<string name="always">Ĉiam</string>
|
<string name="always">Ĉiam</string>
|
||||||
<string name="always_load_remote_images">Ĉiam ŝargu forajn bildojn</string>
|
<string name="always_load_remote_images">Ĉiam ŝargu forajn bildojn</string>
|
||||||
<string name="once">Unufoje</string>
|
<string name="once">Unufoje</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Afiŝu averton</string>
|
<string name="show_warning">Afiŝu averton</string>
|
||||||
<string name="not_now">Ne nun</string>
|
<string name="not_now">Ne nun</string>
|
||||||
<string name="never">Neniam</string>
|
<string name="never">Neniam</string>
|
||||||
@@ -173,6 +176,7 @@
|
|||||||
<string name="camera">Fotilo</string>
|
<string name="camera">Fotilo</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Kapti</string>
|
<string name="capture">Kapti</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Elektu alian kameraon</string>
|
<string name="switch_camera">Elektu alian kameraon</string>
|
||||||
<string name="toggle_fullscreen">Baskulu el/al la plena ekrano</string>
|
<string name="toggle_fullscreen">Baskulu el/al la plena ekrano</string>
|
||||||
<string name="location">Loko</string>
|
<string name="location">Loko</string>
|
||||||
@@ -285,14 +289,16 @@
|
|||||||
<string name="mute_for_seven_days">Silentigi por 7 tagoj</string>
|
<string name="mute_for_seven_days">Silentigi por 7 tagoj</string>
|
||||||
<string name="mute_forever">Silentigi por ĉiam</string>
|
<string name="mute_forever">Silentigi por ĉiam</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">por 5 minutoj</string>
|
<string name="share_location_for_5_minutes">por 5 minutoj</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">por 30 minutoj</string>
|
<string name="share_location_for_30_minutes">por 30 minutoj</string>
|
||||||
<string name="share_location_for_one_hour">por 1 horo</string>
|
<string name="share_location_for_one_hour">por 1 horo</string>
|
||||||
<string name="share_location_for_two_hours">por 2 horoj</string>
|
<string name="share_location_for_two_hours">por 2 horoj</string>
|
||||||
<string name="share_location_for_six_hours">por 6 horoj</string>
|
<string name="share_location_for_six_hours">por 6 horoj</string>
|
||||||
|
|
||||||
<string name="file_saved_to">Dosiero konservita kiel \"%1$s\".</string>
|
<string name="file_saved_to">Dosiero konservita kiel \"%1$s\".</string>
|
||||||
|
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Plusendi mesaĝojn al %1$s?</string>
|
<string name="ask_forward">Plusendi mesaĝojn al %1$s?</string>
|
||||||
<string name="ask_start_chat_with">Babili kun %1$s?</string>
|
<string name="ask_start_chat_with">Babili kun %1$s?</string>
|
||||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||||
@@ -425,6 +431,7 @@
|
|||||||
<string name="pref_background">Fono</string>
|
<string name="pref_background">Fono</string>
|
||||||
<string name="pref_background_btn_default">Uzi defaŭltan bildon</string>
|
<string name="pref_background_btn_default">Uzi defaŭltan bildon</string>
|
||||||
<string name="pref_background_btn_gallery">Elekti el galerio</string>
|
<string name="pref_background_btn_gallery">Elekti el galerio</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Ĉiuj</string>
|
<string name="pref_show_emails_all">Ĉiuj</string>
|
||||||
<!-- notifications -->
|
<!-- notifications -->
|
||||||
<string name="notify_reply_button">Respondi</string>
|
<string name="notify_reply_button">Respondi</string>
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
<string name="downloading">Descargando…</string>
|
<string name="downloading">Descargando…</string>
|
||||||
<string name="open_attachment">Abrir adjunto</string>
|
<string name="open_attachment">Abrir adjunto</string>
|
||||||
<string name="join">Unirse</string>
|
<string name="join">Unirse</string>
|
||||||
|
<string name="join_group">Unirse al grupo</string>
|
||||||
|
<string name="join_channel">Unirse al canal</string>
|
||||||
<string name="rejoin">Volver a unirse</string>
|
<string name="rejoin">Volver a unirse</string>
|
||||||
<string name="delete">Eliminar</string>
|
<string name="delete">Eliminar</string>
|
||||||
<string name="delete_for_me">Eliminar solo para mí</string>
|
<string name="delete_for_me">Eliminar solo para mí</string>
|
||||||
@@ -59,7 +61,9 @@
|
|||||||
<string name="media">Multimedia</string>
|
<string name="media">Multimedia</string>
|
||||||
<string name="apps_and_media">Apps y multimedia</string>
|
<string name="apps_and_media">Apps y multimedia</string>
|
||||||
<string name="profile">Perfil</string>
|
<string name="profile">Perfil</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">Todos perfiles</string>
|
<string name="all_profiles">Todos perfiles</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">Perfil actual</string>
|
<string name="current_profile">Perfil actual</string>
|
||||||
<string name="main_menu">Menú principal</string>
|
<string name="main_menu">Menú principal</string>
|
||||||
<string name="start_chat">Comenzar chat</string>
|
<string name="start_chat">Comenzar chat</string>
|
||||||
@@ -70,6 +74,8 @@
|
|||||||
<string name="mark_as_read">Marcar como leído</string>
|
<string name="mark_as_read">Marcar como leído</string>
|
||||||
<!-- Used beside an icon with very few space. Shortest text for "Mark as being read". In english, this could be "Read" (past tense of "to read"), in german, this could be "Gelesen". -->
|
<!-- Used beside an icon with very few space. Shortest text for "Mark as being read". In english, this could be "Read" (past tense of "to read"), in german, this could be "Gelesen". -->
|
||||||
<string name="mark_as_read_short">Leído</string>
|
<string name="mark_as_read_short">Leído</string>
|
||||||
|
<!-- Used as an menu entry or button -->
|
||||||
|
<string name="mark_as_unread">Marcar como leído</string>
|
||||||
<!-- Used beside an icon with very few space. Shortest text for "Mark as being unread". In english, this could be "Unread" (past tense of "to unread"), in german, this could be "Ungelesen". -->
|
<!-- Used beside an icon with very few space. Shortest text for "Mark as being unread". In english, this could be "Unread" (past tense of "to unread"), in german, this could be "Ungelesen". -->
|
||||||
<string name="mark_as_unread_short">No leído</string>
|
<string name="mark_as_unread_short">No leído</string>
|
||||||
<!-- Placeholder text when something is loading -->
|
<!-- Placeholder text when something is loading -->
|
||||||
@@ -82,6 +88,7 @@
|
|||||||
<string name="always">Siempre</string>
|
<string name="always">Siempre</string>
|
||||||
<string name="always_load_remote_images">Cargar siempre imágenes remotas</string>
|
<string name="always_load_remote_images">Cargar siempre imágenes remotas</string>
|
||||||
<string name="once">Una vez</string>
|
<string name="once">Una vez</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Mostrar advertencia</string>
|
<string name="show_warning">Mostrar advertencia</string>
|
||||||
<string name="not_now">Ahora no</string>
|
<string name="not_now">Ahora no</string>
|
||||||
<string name="never">Nunca</string>
|
<string name="never">Nunca</string>
|
||||||
@@ -91,6 +98,7 @@
|
|||||||
<string name="offline">Fuera de línea</string>
|
<string name="offline">Fuera de línea</string>
|
||||||
<!-- For the next view or as "continue". Should be as short as possible. -->
|
<!-- For the next view or as "continue". Should be as short as possible. -->
|
||||||
<string name="next">Siguiente</string>
|
<string name="next">Siguiente</string>
|
||||||
|
<string name="warning">Advertencia</string>
|
||||||
<string name="error">Error</string>
|
<string name="error">Error</string>
|
||||||
<string name="error_x">Error: %1$s</string>
|
<string name="error_x">Error: %1$s</string>
|
||||||
<string name="no_app_to_handle_data">No se puede encontrar una aplicación compatible con este tipo de contenido</string>
|
<string name="no_app_to_handle_data">No se puede encontrar una aplicación compatible con este tipo de contenido</string>
|
||||||
@@ -208,7 +216,10 @@
|
|||||||
<string name="camera">Cámara</string>
|
<string name="camera">Cámara</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Capturar</string>
|
<string name="capture">Capturar</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Alternar cámara</string>
|
<string name="switch_camera">Alternar cámara</string>
|
||||||
|
<!-- Toggle camera on/off eg. during an video call -->
|
||||||
|
<string name="toggle_camera">Alternar cámara</string>
|
||||||
<string name="toggle_fullscreen">Alternar modo pantalla completa</string>
|
<string name="toggle_fullscreen">Alternar modo pantalla completa</string>
|
||||||
<string name="location">Ubicación</string>
|
<string name="location">Ubicación</string>
|
||||||
<string name="locations">Ubicaciones</string>
|
<string name="locations">Ubicaciones</string>
|
||||||
@@ -386,11 +397,14 @@
|
|||||||
<string name="mute_for_seven_days">Silenciar por 7 días</string>
|
<string name="mute_for_seven_days">Silenciar por 7 días</string>
|
||||||
<string name="mute_forever">Silenciar por siempre</string>
|
<string name="mute_forever">Silenciar por siempre</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">Por 5 minutos </string>
|
<string name="share_location_for_5_minutes">Por 5 minutos </string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">Por 30 minutos</string>
|
<string name="share_location_for_30_minutes">Por 30 minutos</string>
|
||||||
<string name="share_location_for_one_hour">Por 1 hora</string>
|
<string name="share_location_for_one_hour">Por 1 hora</string>
|
||||||
<string name="share_location_for_two_hours">Por 2 horas</string>
|
<string name="share_location_for_two_hours">Por 2 horas</string>
|
||||||
<string name="share_location_for_six_hours">Por 6 horas</string>
|
<string name="share_location_for_six_hours">Por 6 horas</string>
|
||||||
|
<string name="share_location_for_24_hours">Por 24 horas</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">¿Enviar el archivo a %s?</item>
|
<item quantity="one">¿Enviar el archivo a %s?</item>
|
||||||
@@ -409,6 +423,8 @@
|
|||||||
<string name="answer_call">Contestar</string>
|
<string name="answer_call">Contestar</string>
|
||||||
<!-- the action "to decline" a call, not: "the decline" -->
|
<!-- the action "to decline" a call, not: "the decline" -->
|
||||||
<string name="end_call">Rechazar</string>
|
<string name="end_call">Rechazar</string>
|
||||||
|
<!-- the action to end a call -->
|
||||||
|
<string name="end_call2">Finalizar llamada</string>
|
||||||
<!-- Used in call bubbles, summaries, notifications -->
|
<!-- Used in call bubbles, summaries, notifications -->
|
||||||
<string name="audio_call">Llamada</string>
|
<string name="audio_call">Llamada</string>
|
||||||
<!-- Used in call bubbles, summaries, notifications -->
|
<!-- Used in call bubbles, summaries, notifications -->
|
||||||
@@ -431,6 +447,15 @@
|
|||||||
<string name="canceled_call">Llamada cancelada</string>
|
<string name="canceled_call">Llamada cancelada</string>
|
||||||
<string name="missed_call">Llamada perdida</string>
|
<string name="missed_call">Llamada perdida</string>
|
||||||
<string name="already_in_call">Ya estás en una llamada</string>
|
<string name="already_in_call">Ya estás en una llamada</string>
|
||||||
|
<string name="call_answered_elsewhere">Llamada contestada en otro dispositivo</string>
|
||||||
|
<string name="call_requires_camera_permission">Se requiere permiso de cámara para las videollamadas</string>
|
||||||
|
<string name="call_requires_mic_permission">Se requiere permiso de micrófono para las llamadas</string>
|
||||||
|
<string name="call_requires_connection">No se puede iniciar la llamada. Asegúrese de que su dispositivo tenga conexión a Internet e inténtelo de nuevo.</string>
|
||||||
|
<!-- Used e.g. in a notifications to describe an ongoing call. "Call" is a noun here, in the meaning of "This is the call with ..." where the placeholder is replaced by the name of the contact. -->
|
||||||
|
<string name="call_with">Llamada con %1$s</string>
|
||||||
|
<!-- Use e.g. in a notifications during ringing. Placeholder is relaced by the name of the contact being called. -->
|
||||||
|
<string name="calling_person">Llamando a %1$s</string>
|
||||||
|
|
||||||
<!-- get confirmations -->
|
<!-- get confirmations -->
|
||||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||||
<string name="ask_leave_group">¿Seguro que quieres abandonar este canal?</string>
|
<string name="ask_leave_group">¿Seguro que quieres abandonar este canal?</string>
|
||||||
@@ -446,6 +471,13 @@
|
|||||||
<item quantity="many">¿Eliminar %d mensajes de todos tus dispositivos?</item>
|
<item quantity="many">¿Eliminar %d mensajes de todos tus dispositivos?</item>
|
||||||
<item quantity="other">¿Eliminar %d mensajes de todos tus dispositivos?</item>
|
<item quantity="other">¿Eliminar %d mensajes de todos tus dispositivos?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- First placeholder gets replaced by the number of messages to forward. Second placeholder gets replaced by the name of the destination chat -->
|
||||||
|
<plurals name="ask_forward_messages">
|
||||||
|
<item quantity="one">¿Reenviar mensaje a %2$s?</item>
|
||||||
|
<item quantity="many">¿Reenviar %1$d mensajes a %2$s?</item>
|
||||||
|
<item quantity="other">¿Reenviar %1$d mensajes a %2$s?</item>
|
||||||
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">¿Reenviar mensajes a %1$s?</string>
|
<string name="ask_forward">¿Reenviar mensajes a %1$s?</string>
|
||||||
<string name="ask_forward_multiple">¿Reenviar mensajes a %1$d chats?</string>
|
<string name="ask_forward_multiple">¿Reenviar mensajes a %1$d chats?</string>
|
||||||
<string name="ask_export_attachment">Los adjuntos exportados serán accesibles desde cualquier otra aplicación en su dispositivo. ¿Continuar?</string>
|
<string name="ask_export_attachment">Los adjuntos exportados serán accesibles desde cualquier otra aplicación en su dispositivo. ¿Continuar?</string>
|
||||||
@@ -537,8 +569,11 @@
|
|||||||
<!-- search -->
|
<!-- search -->
|
||||||
<string name="search">Buscar</string>
|
<string name="search">Buscar</string>
|
||||||
<string name="search_in_chat">Buscar en el chat</string>
|
<string name="search_in_chat">Buscar en el chat</string>
|
||||||
|
<!-- Placeholder will be replaced by the chat name -->
|
||||||
|
<string name="search_in">Buscar en %1$s</string>
|
||||||
<string name="search_files">Buscar archivos</string>
|
<string name="search_files">Buscar archivos</string>
|
||||||
<string name="search_explain">Buscar chats, contactos, y mensajes</string>
|
<string name="search_explain">Buscar chats, contactos, y mensajes</string>
|
||||||
|
<string name="search_result_for_x">Resultado para \"%1$s\"</string>
|
||||||
<string name="search_no_result_for_x">No se encontraron resultados para \"%s\"</string>
|
<string name="search_no_result_for_x">No se encontraron resultados para \"%s\"</string>
|
||||||
<!-- Adjective, as in "Show Unread Messages" -->
|
<!-- Adjective, as in "Show Unread Messages" -->
|
||||||
<string name="search_unread">No leído</string>
|
<string name="search_unread">No leído</string>
|
||||||
@@ -551,6 +586,7 @@
|
|||||||
<string name="group_create_button">Crear grupo</string>
|
<string name="group_create_button">Crear grupo</string>
|
||||||
<!-- deprecated, use please_enter_chat_name -->
|
<!-- deprecated, use please_enter_chat_name -->
|
||||||
<string name="group_please_enter_group_name">Por favor introduzca un nombre para el grupo.</string>
|
<string name="group_please_enter_group_name">Por favor introduzca un nombre para el grupo.</string>
|
||||||
|
<string name="please_enter_chat_name">Por favor, introduce un nombre.</string>
|
||||||
<string name="group_add_members">Añadir miembros</string>
|
<string name="group_add_members">Añadir miembros</string>
|
||||||
<string name="group_self_not_in_group">Debes ser un miembro del grupo para realizar esta acción.</string>
|
<string name="group_self_not_in_group">Debes ser un miembro del grupo para realizar esta acción.</string>
|
||||||
<string name="profile_encryption">Cifrado</string>
|
<string name="profile_encryption">Cifrado</string>
|
||||||
@@ -618,6 +654,7 @@
|
|||||||
<string name="connectivity_connected">Conectado</string>
|
<string name="connectivity_connected">Conectado</string>
|
||||||
<string name="sending">Enviando…</string>
|
<string name="sending">Enviando…</string>
|
||||||
<string name="last_msg_sent_successfully">El último mensaje fue enviado satisfactoriamente.</string>
|
<string name="last_msg_sent_successfully">El último mensaje fue enviado satisfactoriamente.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">No soportado por tu proveedor.</string>
|
<string name="not_supported_by_provider">No soportado por tu proveedor.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Mensajes</string>
|
<string name="messages">Mensajes</string>
|
||||||
@@ -654,7 +691,7 @@
|
|||||||
<string name="welcome_chat_over_email">Chat seguro y descentralizado</string>
|
<string name="welcome_chat_over_email">Chat seguro y descentralizado</string>
|
||||||
<string name="scan_invitation_code">Escanear código de invitación</string>
|
<string name="scan_invitation_code">Escanear código de invitación</string>
|
||||||
<string name="login_title">Iniciar sesión</string>
|
<string name="login_title">Iniciar sesión</string>
|
||||||
<string name="login_advanced_hint">Este inicio de sesión es para usuarios avanzados:\n\n• No utilice una cuenta que esté usando en otra app.\n\n• El servidor de correo electrónico clásico permite chats sin cifrado de extremo a extremo, los cuales están marcados por un icono de correo.</string>
|
<string name="login_advanced_hint">Este inicio de sesión es para usuarios avanzados.\n\nNo utilice una dirección de correo que esté utilizando en otra aplicación.</string>
|
||||||
<string name="login_inbox">Bandeja de entrada</string>
|
<string name="login_inbox">Bandeja de entrada</string>
|
||||||
<string name="login_imap_login">Nombre de usuario IMAP</string>
|
<string name="login_imap_login">Nombre de usuario IMAP</string>
|
||||||
<string name="login_imap_server">Servidor IMAP</string>
|
<string name="login_imap_server">Servidor IMAP</string>
|
||||||
@@ -689,6 +726,7 @@
|
|||||||
<string name="used_for_sending">Usado para enviar</string>
|
<string name="used_for_sending">Usado para enviar</string>
|
||||||
<string name="hide_from_contacts">Ocultar de los contactos</string>
|
<string name="hide_from_contacts">Ocultar de los contactos</string>
|
||||||
<string name="hidden_from_contacts">Ocultado de los contactos</string>
|
<string name="hidden_from_contacts">Ocultado de los contactos</string>
|
||||||
|
<string name="enforce_e2ee">Exigir el cifrado para todos los retransmisores</string>
|
||||||
<!-- Hint for the list of relays -->
|
<!-- Hint for the list of relays -->
|
||||||
<string name="transport_list_hint">Los mensajes se reciben en todos los retransmisores.\n\n⚠️ Si cambias algo aquí, asegúrese de que todos sus dispositivos ejecutan al menos la versión 2.47.0. De lo contrario, los dispositivos más antiguos pueden perder algunos mensajes.</string>
|
<string name="transport_list_hint">Los mensajes se reciben en todos los retransmisores.\n\n⚠️ Si cambias algo aquí, asegúrese de que todos sus dispositivos ejecutan al menos la versión 2.47.0. De lo contrario, los dispositivos más antiguos pueden perder algunos mensajes.</string>
|
||||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||||
@@ -769,6 +807,7 @@
|
|||||||
<string name="pref_notifications_priority">Prioridad</string>
|
<string name="pref_notifications_priority">Prioridad</string>
|
||||||
<string name="pref_notifications_explain">Habilitar las notificaciones del sistema para nuevos mensajes</string>
|
<string name="pref_notifications_explain">Habilitar las notificaciones del sistema para nuevos mensajes</string>
|
||||||
<string name="pref_show_notification_content">Mostrar el contenido del mensaje en la notificación</string>
|
<string name="pref_show_notification_content">Mostrar el contenido del mensaje en la notificación</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Mostrar el remitente y las primeras palabras del mensaje en las notificaciones</string>
|
<string name="pref_show_notification_content_explain">Mostrar el remitente y las primeras palabras del mensaje en las notificaciones</string>
|
||||||
<string name="pref_led_color">Color de LED</string>
|
<string name="pref_led_color">Color de LED</string>
|
||||||
<string name="pref_sound">Sonido</string>
|
<string name="pref_sound">Sonido</string>
|
||||||
@@ -787,6 +826,8 @@
|
|||||||
<string name="pref_incognito_keyboard_explain">Solicitar al teclado deshabilitar el aprendizaje personalizado</string>
|
<string name="pref_incognito_keyboard_explain">Solicitar al teclado deshabilitar el aprendizaje personalizado</string>
|
||||||
<string name="pref_read_receipts">Notificaciones de lectura</string>
|
<string name="pref_read_receipts">Notificaciones de lectura</string>
|
||||||
<string name="pref_read_receipts_explain">Si las notificaciones de lectura están desactivadas, no podrás comprobar cuándo se han leído tus mensajes.</string>
|
<string name="pref_read_receipts_explain">Si las notificaciones de lectura están desactivadas, no podrás comprobar cuándo se han leído tus mensajes.</string>
|
||||||
|
<!-- Title above a list of contacts who read a message -->
|
||||||
|
<string name="read_by">Leído por</string>
|
||||||
<string name="pref_server">Servidor</string>
|
<string name="pref_server">Servidor</string>
|
||||||
<string name="pref_encryption">Cifrado</string>
|
<string name="pref_encryption">Cifrado</string>
|
||||||
<string name="pref_manage_keys">Administrar claves</string>
|
<string name="pref_manage_keys">Administrar claves</string>
|
||||||
@@ -809,16 +850,23 @@
|
|||||||
<string name="pref_background">Fondo</string>
|
<string name="pref_background">Fondo</string>
|
||||||
<string name="pref_background_btn_default">Usar imagen por defecto</string>
|
<string name="pref_background_btn_default">Usar imagen por defecto</string>
|
||||||
<string name="pref_background_btn_gallery">Seleccionar de la galería</string>
|
<string name="pref_background_btn_gallery">Seleccionar de la galería</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Si deshabilita esta opción, asegúrese de que su servidor y sus otros clientes estén configurados en consecuencia.\n\nDe lo contrario, las cosas pueden no funcionar en absoluto.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Si deshabilita esta opción, asegúrese de que su servidor y sus otros clientes estén configurados en consecuencia.\n\nDe lo contrario, las cosas pueden no funcionar en absoluto.</string>
|
||||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||||
<string name="pref_multidevice">Modo multidispositivo</string>
|
<string name="pref_multidevice">Modo multidispositivo</string>
|
||||||
<string name="pref_multidevice_explain">Sincroniza tus mensajes con tus otros dispositivos. Se activa automáticamente al añadir un segundo dispositivo</string>
|
<string name="pref_multidevice_explain">Sincroniza tus mensajes con tus otros dispositivos. Se activa automáticamente al añadir un segundo dispositivo</string>
|
||||||
<string name="pref_multidevice_change_warn">El modo multidispositivo debe estar activado cuando usas el mismo perfil en varios dispositivos. Desactiva este ajuste solo si has eliminado este perfil de todos tus demás dispositivos.\n\nSi desactivas el modo multidispositivo mientras usas el perfil en varios dispositivos, se perderán mensajes y se producirán otros problemas.</string>
|
<string name="pref_multidevice_change_warn">El modo multidispositivo debe estar activado cuando usas el mismo perfil en varios dispositivos. Desactiva este ajuste solo si has eliminado este perfil de todos tus demás dispositivos.\n\nSi desactivas el modo multidispositivo mientras usas el perfil en varios dispositivos, se perderán mensajes y se producirán otros problemas.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Mover automáticamente a la carpeta DeltaChat</string>
|
<string name="pref_auto_folder_moves">Mover automáticamente a la carpeta DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Solo obtener de la carpeta DeltaChat</string>
|
<string name="pref_only_fetch_mvbox_title">Solo obtener de la carpeta DeltaChat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Mostrar correos clásicos</string>
|
<string name="pref_show_emails">Mostrar correos clásicos</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">No, sólo chats</string>
|
<string name="pref_show_emails_no">No, sólo chats</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Para contactos aceptados</string>
|
<string name="pref_show_emails_accepted_contacts">Para contactos aceptados</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Todos</string>
|
<string name="pref_show_emails_all">Todos</string>
|
||||||
<string name="pref_experimental_features">Características experimentales</string>
|
<string name="pref_experimental_features">Características experimentales</string>
|
||||||
<string name="pref_experimental_features_explain">Estas funciones pueden ser inestables y pueden ser modificadas o eliminadas</string>
|
<string name="pref_experimental_features_explain">Estas funciones pueden ser inestables y pueden ser modificadas o eliminadas</string>
|
||||||
@@ -873,14 +921,17 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Borrar mensajes antiguos</string>
|
<string name="delete_old_messages">Borrar mensajes antiguos</string>
|
||||||
<string name="autodel_device_title">Borrar mensajes del dispositivo</string>
|
<string name="autodel_device_title">Borrar mensajes del dispositivo</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Borrar mensajes del servidor</string>
|
<string name="autodel_server_title">Borrar mensajes del servidor</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">¿Desea borrar %1$d mensajes ahora y todos los mensajes recientemente alcanzados \"%2$s\" en el futuro?\n\n• Esto incluye toda la multimedia\n\n• Los mensajes serán eliminados siendo vistos o no\n\n• \"Mensajes guardados\" serán saltados de este proceso local</string>
|
<string name="autodel_device_ask">¿Desea borrar %1$d mensajes ahora y todos los mensajes recientemente alcanzados \"%2$s\" en el futuro?\n\n• Esto incluye toda la multimedia\n\n• Los mensajes serán eliminados siendo vistos o no\n\n• \"Mensajes guardados\" serán saltados de este proceso local</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">¿Deseas borrar %1$d mensajes ahora y todos los mensajes recibidos en \"%2$s\" al futuro?\n\n⚠️ Esto incluye correos, multimedia y \"Mensajes guardados\" en todas las carpetas del servidor. No uses esta función si quieres mantener tus datos en el servidor o si estas usando otros clientes de correo más allá de Delta Chat\n\n⚠️ No uses esta función si deseas mantener tus datos en el servidor\n\n⚠️ No uses esta función si estás usando otros clientes de correo más allá de Delta Chat</string>
|
<string name="autodel_server_ask">¿Deseas borrar %1$d mensajes ahora y todos los mensajes recibidos en \"%2$s\" al futuro?\n\n⚠️ Esto incluye correos, multimedia y \"Mensajes guardados\" en todas las carpetas del servidor. No uses esta función si quieres mantener tus datos en el servidor o si estas usando otros clientes de correo más allá de Delta Chat\n\n⚠️ No uses esta función si deseas mantener tus datos en el servidor\n\n⚠️ No uses esta función si estás usando otros clientes de correo más allá de Delta Chat</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Esto incluye correos, multimedia y \"Mensajes guardados\" en todas las carpetas del servidor. No uses esta función si quieres mantener tus datos en el servidor o si estas usando otros clientes de correo además de Delta Chat</string>
|
<string name="autodel_server_enabled_hint">Esto incluye correos, multimedia y \"Mensajes guardados\" en todas las carpetas del servidor. No uses esta función si quieres mantener tus datos en el servidor o si estas usando otros clientes de correo además de Delta Chat</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device_title">Activar la eliminación inmediata</string>
|
<string name="autodel_server_warn_multi_device_title">Activar la eliminación inmediata</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device">Si habilita la eliminación inmediata, no podrá utilizar varios dispositivos en este perfil.</string>
|
<string name="autodel_server_warn_multi_device">Si habilita la eliminación inmediata, no podrá utilizar varios dispositivos en este perfil.</string>
|
||||||
<string name="autodel_confirm">Comprendo, borrar todos estos mensajes</string>
|
<string name="autodel_confirm">Comprendo, borrar todos estos mensajes</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -899,9 +950,12 @@
|
|||||||
<string name="group_name_changed_by_you">Cambiaste el nombre del grupo de \"%1$s\" a \"%2$s\".</string>
|
<string name="group_name_changed_by_you">Cambiaste el nombre del grupo de \"%1$s\" a \"%2$s\".</string>
|
||||||
<!-- %1$s will be replaced by the old group name, %2$s will be replaced by the new group name, %3$s will be replaced by name and address of the contact who did the action. -->
|
<!-- %1$s will be replaced by the old group name, %2$s will be replaced by the new group name, %3$s will be replaced by name and address of the contact who did the action. -->
|
||||||
<string name="group_name_changed_by_other">El nombre del grupo fue cambiado de \"%1$s\" a \"%2$s\" por %3$s.</string>
|
<string name="group_name_changed_by_other">El nombre del grupo fue cambiado de \"%1$s\" a \"%2$s\" por %3$s.</string>
|
||||||
|
<!-- %1$s will be replaced by the old channel name, %2$s will be replaced by the new channel name -->
|
||||||
|
<string name="channel_name_changed">Nombre del canal cambiado de \"%1$s\" a \"%2$s\".</string>
|
||||||
<string name="group_image_changed_by_you">Cambiaste la imagen del grupo.</string>
|
<string name="group_image_changed_by_you">Cambiaste la imagen del grupo.</string>
|
||||||
<!-- %1$s will be replaced by name of the contact who did the action -->
|
<!-- %1$s will be replaced by name of the contact who did the action -->
|
||||||
<string name="group_image_changed_by_other">Imagen del grupo cambiada por %1$s.</string>
|
<string name="group_image_changed_by_other">Imagen del grupo cambiada por %1$s.</string>
|
||||||
|
<string name="channel_image_changed">Imagen del canal cambiada.</string>
|
||||||
<string name="chat_description_changed_by_you">Cambiaste la descripción del chat.</string>
|
<string name="chat_description_changed_by_you">Cambiaste la descripción del chat.</string>
|
||||||
<!-- %1$s will be replaced by name of the contact who did the action -->
|
<!-- %1$s will be replaced by name of the contact who did the action -->
|
||||||
<string name="chat_description_changed_by_other">Descripción del chat modificada por %1$s.</string>
|
<string name="chat_description_changed_by_other">Descripción del chat modificada por %1$s.</string>
|
||||||
@@ -968,13 +1022,13 @@
|
|||||||
<string name="chat_unencrypted_explanation">Los mensajes en este chat usan el correo electrónico clásico y no están cifrados de extremo a extremo.</string>
|
<string name="chat_unencrypted_explanation">Los mensajes en este chat usan el correo electrónico clásico y no están cifrados de extremo a extremo.</string>
|
||||||
<string name="messages_are_e2ee">Los mensajes están cifrados de extremo a extremo.</string>
|
<string name="messages_are_e2ee">Los mensajes están cifrados de extremo a extremo.</string>
|
||||||
<string name="chat_protection_enabled_tap_to_learn_more">A partir de ahora se garantiza que los mensajes están cifrados de extremo a extremo . Toca para obtener más información.</string>
|
<string name="chat_protection_enabled_tap_to_learn_more">A partir de ahora se garantiza que los mensajes están cifrados de extremo a extremo . Toca para obtener más información.</string>
|
||||||
<string name="chat_protection_enabled_explanation">Ahora se garantiza que todos los mensajes en este chat están cifrados de extremo a extremo.\n\nEl cifrado de extremo a extremo mantiene los mensajes privados entre tú y tus compañeros de chat. Ni siquiera tu proveedor de correo electrónico puede leerlos.</string>
|
<string name="chat_protection_enabled_explanation">Todos los mensajes de este chat están cifrados de extremo a extremo.\n\nEl cifrado de extremo a extremo mantiene los mensajes privados entre tú y tus interlocutores. Ni siquiera los servidores, proveedores o retransmisores pueden leerlos.</string>
|
||||||
<string name="invalid_unencrypted_tap_to_learn_more">⚠️ %1$s requiere cifrado de extremo a extremo que aún no está configurado para este chat. Toca para obtener más información.</string>
|
<string name="invalid_unencrypted_tap_to_learn_more">⚠️ %1$s requiere cifrado de extremo a extremo que aún no está configurado para este chat. Toca para obtener más información.</string>
|
||||||
<string name="invalid_unencrypted_explanation">Para establecer un cifrado de extremo a extremo, puede reunirse con los contactos en persona y escanear su código QR.</string>
|
<string name="invalid_unencrypted_explanation">Para establecer un cifrado de extremo a extremo, puede reunirse con los contactos en persona y escanear su código QR.</string>
|
||||||
<string name="learn_more">Aprender más</string>
|
<string name="learn_more">Aprender más</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">Eliminaste los chats de los \"Mensajes guardados\". \n\nℹ️ Para volver a usar los\"Mensajes guardados\", debes crear un chat contigo mismo.</string>
|
<string name="devicemsg_self_deleted">Eliminaste los chats de los \"Mensajes guardados\". \n\nℹ️ Para volver a usar los\"Mensajes guardados\", debes crear un chat contigo mismo.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ El almacenamiento de tu proveedor está por excederse, ya tienes %1$s%% en uso.\n\nQuizás no puedas recibir mensajes cuando el almacenamiento esté al 100%% de uso.\n\n👉 Por favor chequea si puedes eliminar los datos antiguos en la página web del proveedor y considera habilitar \"Ajustes / Eliminar mensajes antiguos\". Puedes chequear tu almacenamiento actual en cualquier momento en \"Ajustes / Conectividad\".</string>
|
<string name="devicemsg_storage_exceeding">⚠️ El almacenamiento de tu proveedor está por excederse, ya tienes %1$s%% en uso.\n\nQuizás no puedas recibir mensajes cuando el almacenamiento esté al 100%% de uso.\n\n👉 Por favor chequea si puedes eliminar los datos antiguos en la página web del proveedor y considera habilitar \"Ajustes / Eliminar mensajes antiguos\". Puedes chequear tu almacenamiento actual en cualquier momento en \"Ajustes / Conectividad\".</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ Fecha y hora de tu dispositivo parecen ser inexactas (%1$s).\n\nAjusta tu reloj ⏰🔧 para asegurarte que los mensajes sean recibidos correctamente.</string>
|
<string name="devicemsg_bad_time">⚠️ Fecha y hora de tu dispositivo parecen ser inexactas (%1$s).\n\nAjusta tu reloj ⏰🔧 para asegurarte que los mensajes sean recibidos correctamente.</string>
|
||||||
@@ -1038,6 +1092,9 @@
|
|||||||
<!-- first placeholder is the name of the chat -->
|
<!-- first placeholder is the name of the chat -->
|
||||||
<string name="confirm_replace_draft">%1$s ya tiene un mensaje borrador, ¿quieres reemplazarlo?</string>
|
<string name="confirm_replace_draft">%1$s ya tiene un mensaje borrador, ¿quieres reemplazarlo?</string>
|
||||||
<string name="mailto_link_could_not_be_decoded">El enlace mailto no se pudo decodificar: %1$s</string>
|
<string name="mailto_link_could_not_be_decoded">El enlace mailto no se pudo decodificar: %1$s</string>
|
||||||
|
<string name="remove_quote">Eliminar cita</string>
|
||||||
|
<string name="remove_attachment">Eliminar adjunto</string>
|
||||||
|
|
||||||
<!-- notifications -->
|
<!-- notifications -->
|
||||||
<string name="notify_reply_button">Responder</string>
|
<string name="notify_reply_button">Responder</string>
|
||||||
<string name="notify_new_message">Nuevo mensaje</string>
|
<string name="notify_new_message">Nuevo mensaje</string>
|
||||||
@@ -1054,6 +1111,10 @@
|
|||||||
<string name="new_messages_body">Tienes mensajes nuevos</string>
|
<string name="new_messages_body">Tienes mensajes nuevos</string>
|
||||||
<string name="n_messages_in_m_chats">%1$d mensajes en %2$d chats</string>
|
<string name="n_messages_in_m_chats">%1$d mensajes en %2$d chats</string>
|
||||||
|
|
||||||
|
<!-- location streaming -->
|
||||||
|
<string name="location_streaming_notification_text">Estás compartiendo tu ubicación</string>
|
||||||
|
<string name="location_rationale">Para compartir tu ubicación en directo con los miembros del chat, permite que Delta Chat utilice tus datos de ubicación.\n\nPara que la ubicación en directo funcione sin interrupciones, los datos de ubicación se utilizan incluso cuando la aplicación está cerrada o no se está utilizando.</string>
|
||||||
|
|
||||||
<!-- permissions -->
|
<!-- permissions -->
|
||||||
<string name="perm_required_title">Permiso requerido</string>
|
<string name="perm_required_title">Permiso requerido</string>
|
||||||
<string name="perm_continue">Continuar</string>
|
<string name="perm_continue">Continuar</string>
|
||||||
@@ -1095,6 +1156,7 @@
|
|||||||
<string name="global_menu_help_about_desktop">Sobre Delta Chat</string>
|
<string name="global_menu_help_about_desktop">Sobre Delta Chat</string>
|
||||||
<string name="global_menu_file_open_desktop">Abrir Delta Chat</string>
|
<string name="global_menu_file_open_desktop">Abrir Delta Chat</string>
|
||||||
<string name="global_menu_minimize_to_tray">Minimizar</string>
|
<string name="global_menu_minimize_to_tray">Minimizar</string>
|
||||||
|
<string name="no_account_selected">Selecciona un perfil o crea uno nuevo</string>
|
||||||
<string name="no_chat_selected_suggestion_desktop">Selecciona un chat o crea uno nuevo</string>
|
<string name="no_chat_selected_suggestion_desktop">Selecciona un chat o crea uno nuevo</string>
|
||||||
<string name="write_message_desktop">Escribe un mensaje</string>
|
<string name="write_message_desktop">Escribe un mensaje</string>
|
||||||
<string name="encryption_info_title_desktop">Información de cifrado</string>
|
<string name="encryption_info_title_desktop">Información de cifrado</string>
|
||||||
@@ -1116,8 +1178,16 @@
|
|||||||
<!-- deprecated, used on desktop although there is not spell checker -->
|
<!-- deprecated, used on desktop although there is not spell checker -->
|
||||||
<string name="no_spellcheck_suggestions_found">No se encontraron sugerencias ortográficas.</string>
|
<string name="no_spellcheck_suggestions_found">No se encontraron sugerencias ortográficas.</string>
|
||||||
<string name="show_window">Mostrar ventana</string>
|
<string name="show_window">Mostrar ventana</string>
|
||||||
|
<string name="data_found_other_installation_message">Sus perfiles de otra instalación de Delta Chat no son accesibles - las diferentes instalaciones almacenan sus datos en ubicaciones separadas.\n\nPara mantener los perfiles existentes:\n1. Salga ahora\n2. Abra el otro Delta Chat - si es necesario, reinstálelo desde %1$s\n3. Haga una copia de seguridad de cada perfil en \"Configuración/Chats\"\n4. Vuelva a iniciar esta versión\n5. Restaura las copias de seguridad usando \"Ya tengo un perfil\"\n¿Continúas sin tus perfiles anteriores?</string>
|
||||||
|
|
||||||
<!-- title of the "keybindings" dialog (for the keybindings names as such, where possible the normal command strings are used) -->
|
<!-- title of the "keybindings" dialog (for the keybindings names as such, where possible the normal command strings are used) -->
|
||||||
<string name="keybindings">Atajos de tecla</string>
|
<string name="keybindings">Atajos de tecla</string>
|
||||||
|
<!-- subtitle in the "keybindings" dialog -->
|
||||||
|
<string name="navigation_shortcut_section">Navegación</string>
|
||||||
|
<!-- subtitle in the "keybindings" dialog -->
|
||||||
|
<string name="message_input_shortcut_section">Entrada de mensajes</string>
|
||||||
|
<!-- subtitle in the "keybindings" dialog -->
|
||||||
|
<string name="message_selected_shortcut_section">Mensaje seleccionado</string>
|
||||||
<string name="switch_between_chats">Alternar entre chats</string>
|
<string name="switch_between_chats">Alternar entre chats</string>
|
||||||
<string name="scroll_messages">Desplazarse por los mensajes</string>
|
<string name="scroll_messages">Desplazarse por los mensajes</string>
|
||||||
<!-- command to put the cursor to the search input field -->
|
<!-- command to put the cursor to the search input field -->
|
||||||
@@ -1137,6 +1207,8 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Acciones del mensaje</string>
|
<string name="a11y_message_context_menu_btn_label">Acciones del mensaje</string>
|
||||||
<string name="a11y_background_preview_label">Previsualización del fondo</string>
|
<string name="a11y_background_preview_label">Previsualización del fondo</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Desaparición de mensajes activada</string>
|
<string name="a11y_disappearing_messages_activated">Desaparición de mensajes activada</string>
|
||||||
|
<!-- The placeholder will be replaced by a link, eg. "Open https://delta.chat". Used e.g. in for accessibility. -->
|
||||||
|
<string name="open_link">Abrir %1$s</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Dejar de compartir ubicación</string>
|
<string name="stop_sharing_location">Dejar de compartir ubicación</string>
|
||||||
|
|||||||
@@ -61,7 +61,9 @@
|
|||||||
<string name="media">Meedia</string>
|
<string name="media">Meedia</string>
|
||||||
<string name="apps_and_media">Rakendused ja meedia</string>
|
<string name="apps_and_media">Rakendused ja meedia</string>
|
||||||
<string name="profile">Profiil</string>
|
<string name="profile">Profiil</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">Kõik profiilid</string>
|
<string name="all_profiles">Kõik profiilid</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">Praegune profiil</string>
|
<string name="current_profile">Praegune profiil</string>
|
||||||
<string name="main_menu">Põhimenüü</string>
|
<string name="main_menu">Põhimenüü</string>
|
||||||
<string name="start_chat">Alusta vestlust</string>
|
<string name="start_chat">Alusta vestlust</string>
|
||||||
@@ -86,6 +88,7 @@
|
|||||||
<string name="always">Alati</string>
|
<string name="always">Alati</string>
|
||||||
<string name="always_load_remote_images">Alati laadi kaugseadmes asuvaid pilte</string>
|
<string name="always_load_remote_images">Alati laadi kaugseadmes asuvaid pilte</string>
|
||||||
<string name="once">Vaid see kord</string>
|
<string name="once">Vaid see kord</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Näita hoiatust</string>
|
<string name="show_warning">Näita hoiatust</string>
|
||||||
<string name="not_now">Mitte praegu</string>
|
<string name="not_now">Mitte praegu</string>
|
||||||
<string name="never">Mitte kunagi</string>
|
<string name="never">Mitte kunagi</string>
|
||||||
@@ -203,7 +206,10 @@
|
|||||||
<string name="camera">Kaamera</string>
|
<string name="camera">Kaamera</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Salvesta pilt või video</string>
|
<string name="capture">Salvesta pilt või video</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Vaheta kaamerat</string>
|
<string name="switch_camera">Vaheta kaamerat</string>
|
||||||
|
<!-- Toggle camera on/off eg. during an video call -->
|
||||||
|
<string name="toggle_camera">Lülita kaamera sisse/välja</string>
|
||||||
<string name="toggle_fullscreen">Lülita täisekraanivaate sisse/välja</string>
|
<string name="toggle_fullscreen">Lülita täisekraanivaate sisse/välja</string>
|
||||||
<string name="location">Asukoht</string>
|
<string name="location">Asukoht</string>
|
||||||
<string name="locations">Asukohad</string>
|
<string name="locations">Asukohad</string>
|
||||||
@@ -380,11 +386,14 @@
|
|||||||
<string name="mute_for_seven_days">Summuta seitsmeks päevaks</string>
|
<string name="mute_for_seven_days">Summuta seitsmeks päevaks</string>
|
||||||
<string name="mute_forever">Summuta alatiseks</string>
|
<string name="mute_forever">Summuta alatiseks</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">Kestusega 5 minutit</string>
|
<string name="share_location_for_5_minutes">Kestusega 5 minutit</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">Kestusega 30 minutit</string>
|
<string name="share_location_for_30_minutes">Kestusega 30 minutit</string>
|
||||||
<string name="share_location_for_one_hour">Kestusega 1 tund</string>
|
<string name="share_location_for_one_hour">Kestusega 1 tund</string>
|
||||||
<string name="share_location_for_two_hours">Kestusega 2 tundi</string>
|
<string name="share_location_for_two_hours">Kestusega 2 tundi</string>
|
||||||
<string name="share_location_for_six_hours">Kestusega 6 tundi</string>
|
<string name="share_location_for_six_hours">Kestusega 6 tundi</string>
|
||||||
|
<string name="share_location_for_24_hours">Kestusega 24 tundi</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Kas saadame järgnevad faili kasutajale %s?</item>
|
<item quantity="one">Kas saadame järgnevad faili kasutajale %s?</item>
|
||||||
@@ -402,6 +411,8 @@
|
|||||||
<string name="answer_call">Vasta</string>
|
<string name="answer_call">Vasta</string>
|
||||||
<!-- the action "to decline" a call, not: "the decline" -->
|
<!-- the action "to decline" a call, not: "the decline" -->
|
||||||
<string name="end_call">Keeldu</string>
|
<string name="end_call">Keeldu</string>
|
||||||
|
<!-- the action to end a call -->
|
||||||
|
<string name="end_call2">Lõpeta kõne</string>
|
||||||
<!-- Used in call bubbles, summaries, notifications -->
|
<!-- Used in call bubbles, summaries, notifications -->
|
||||||
<string name="audio_call">Häälkõne</string>
|
<string name="audio_call">Häälkõne</string>
|
||||||
<!-- Used in call bubbles, summaries, notifications -->
|
<!-- Used in call bubbles, summaries, notifications -->
|
||||||
@@ -425,7 +436,13 @@
|
|||||||
<string name="missed_call">Märkamata kõne</string>
|
<string name="missed_call">Märkamata kõne</string>
|
||||||
<string name="already_in_call">Kõne juba on pooleli</string>
|
<string name="already_in_call">Kõne juba on pooleli</string>
|
||||||
<string name="call_answered_elsewhere">Kõne on vastatud muus seadmes</string>
|
<string name="call_answered_elsewhere">Kõne on vastatud muus seadmes</string>
|
||||||
|
<string name="call_requires_camera_permission">Videokõnede tegemiseks peab rakendusel olema õigus kasutada kaamerat</string>
|
||||||
<string name="call_requires_mic_permission">Helistamiseks peab rakendusel olema õigus kasutada mikrofoni</string>
|
<string name="call_requires_mic_permission">Helistamiseks peab rakendusel olema õigus kasutada mikrofoni</string>
|
||||||
|
<string name="call_requires_connection">Helistamine (kõne algatamine) ei õnnestu. Palun kontrolli, et sinu nutiseadme internetiühendus toimib ja proovi uuesti.</string>
|
||||||
|
<!-- Used e.g. in a notifications to describe an ongoing call. "Call" is a noun here, in the meaning of "This is the call with ..." where the placeholder is replaced by the name of the contact. -->
|
||||||
|
<string name="call_with">Kõne kasutajaga %1$s</string>
|
||||||
|
<!-- Use e.g. in a notifications during ringing. Placeholder is relaced by the name of the contact being called. -->
|
||||||
|
<string name="calling_person">Helistan kasutajale %1$s…</string>
|
||||||
|
|
||||||
<!-- get confirmations -->
|
<!-- get confirmations -->
|
||||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||||
@@ -440,6 +457,12 @@
|
|||||||
<item quantity="one">Kas kustutad %d sõnumi kõikidest oma seadmetest?</item>
|
<item quantity="one">Kas kustutad %d sõnumi kõikidest oma seadmetest?</item>
|
||||||
<item quantity="other">Kas kustutad %d sõnumit kõikidest oma seadmetest?</item>
|
<item quantity="other">Kas kustutad %d sõnumit kõikidest oma seadmetest?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- First placeholder gets replaced by the number of messages to forward. Second placeholder gets replaced by the name of the destination chat -->
|
||||||
|
<plurals name="ask_forward_messages">
|
||||||
|
<item quantity="one">Kas edastad sõnumi vestlusesse „%2$s“?</item>
|
||||||
|
<item quantity="other">Kas edastad %1$d sõnumit vestlusesse „%2$s“?</item>
|
||||||
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Kas edastad sõnumi kasutajale %1$s?</string>
|
<string name="ask_forward">Kas edastad sõnumi kasutajale %1$s?</string>
|
||||||
<string name="ask_forward_multiple">Kas edastad sõnumid %1$d vestlusesse?</string>
|
<string name="ask_forward_multiple">Kas edastad sõnumid %1$d vestlusesse?</string>
|
||||||
<string name="ask_export_attachment">Kui ekspordid manused, siis sinu nutiseadme muud rakendused saavad neile ligi.\n\nKas soovid jätkata?</string>
|
<string name="ask_export_attachment">Kui ekspordid manused, siis sinu nutiseadme muud rakendused saavad neile ligi.\n\nKas soovid jätkata?</string>
|
||||||
@@ -613,6 +636,7 @@
|
|||||||
<string name="connectivity_connected">Ühendatud</string>
|
<string name="connectivity_connected">Ühendatud</string>
|
||||||
<string name="sending">Saadan…</string>
|
<string name="sending">Saadan…</string>
|
||||||
<string name="last_msg_sent_successfully">Viimase sõnumi saatmine õnnestus.</string>
|
<string name="last_msg_sent_successfully">Viimase sõnumi saatmine õnnestus.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">Sinu teenusepakkuja ei toeta seda võimalust.</string>
|
<string name="not_supported_by_provider">Sinu teenusepakkuja ei toeta seda võimalust.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Sõnumid</string>
|
<string name="messages">Sõnumid</string>
|
||||||
@@ -649,7 +673,7 @@
|
|||||||
<string name="welcome_chat_over_email">Turvaline hajutatud vestluslahendus</string>
|
<string name="welcome_chat_over_email">Turvaline hajutatud vestluslahendus</string>
|
||||||
<string name="scan_invitation_code">Skaneeri kutsekoodi</string>
|
<string name="scan_invitation_code">Skaneeri kutsekoodi</string>
|
||||||
<string name="login_title">Logi sisse</string>
|
<string name="login_title">Logi sisse</string>
|
||||||
<string name="login_advanced_hint">See sisselogimine sobib oskuskasutajatele:\n\n• Ära kasuta kontot, mis juba on kasutusel mõnes muus rakenduses.\n\n• Klassikaline e-posti server võimaldab vestlemist vaid ilma läbiva krüptimiseta ja seda märgistab kirja ikoon.</string>
|
<string name="login_advanced_hint">See sisselogimise viis on mõeldud oskuskasutajatele.\n\nPalun ära kasuta aadressi, mida kasutad juba teises rakenduses.</string>
|
||||||
<string name="login_inbox">Saabuvad kirjad</string>
|
<string name="login_inbox">Saabuvad kirjad</string>
|
||||||
<string name="login_imap_login">IMAP-i kasutajanimi</string>
|
<string name="login_imap_login">IMAP-i kasutajanimi</string>
|
||||||
<string name="login_imap_server">IMAP-i server</string>
|
<string name="login_imap_server">IMAP-i server</string>
|
||||||
@@ -684,6 +708,7 @@
|
|||||||
<string name="used_for_sending">Kasutatud saatmiseks</string>
|
<string name="used_for_sending">Kasutatud saatmiseks</string>
|
||||||
<string name="hide_from_contacts">Peida kontaktidest</string>
|
<string name="hide_from_contacts">Peida kontaktidest</string>
|
||||||
<string name="hidden_from_contacts">Peidetud kontaktidest</string>
|
<string name="hidden_from_contacts">Peidetud kontaktidest</string>
|
||||||
|
<string name="enforce_e2ee">Kasuta kõikide alusühenduste (edastusserverite) puhul krüptimist</string>
|
||||||
<!-- Hint for the list of relays -->
|
<!-- Hint for the list of relays -->
|
||||||
<string name="transport_list_hint">Sõnumid saavad kõik alusühendused (edastusserverid).\n\n⚠️ Kui muudad siin midagi, siis palun kontrolli, et kõikides sinu seadmetes on kasutusel vähemalt versioon 2.47.0. Vastasel juhul võivad vanema tarkvaraga seadmetes jääda sõnumid saabumata.</string>
|
<string name="transport_list_hint">Sõnumid saavad kõik alusühendused (edastusserverid).\n\n⚠️ Kui muudad siin midagi, siis palun kontrolli, et kõikides sinu seadmetes on kasutusel vähemalt versioon 2.47.0. Vastasel juhul võivad vanema tarkvaraga seadmetes jääda sõnumid saabumata.</string>
|
||||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||||
@@ -764,6 +789,7 @@
|
|||||||
<string name="pref_notifications_priority">Prioriteet</string>
|
<string name="pref_notifications_priority">Prioriteet</string>
|
||||||
<string name="pref_notifications_explain">Kasuta uute sõnumite puhul süsteemi teavitusi</string>
|
<string name="pref_notifications_explain">Kasuta uute sõnumite puhul süsteemi teavitusi</string>
|
||||||
<string name="pref_show_notification_content">Näita teavituses sõnumi sisu</string>
|
<string name="pref_show_notification_content">Näita teavituses sõnumi sisu</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Näitab teavituses sõnumi saatjat ja esimesi sõnu</string>
|
<string name="pref_show_notification_content_explain">Näitab teavituses sõnumi saatjat ja esimesi sõnu</string>
|
||||||
<string name="pref_led_color">LED-värv</string>
|
<string name="pref_led_color">LED-värv</string>
|
||||||
<string name="pref_sound">Heli</string>
|
<string name="pref_sound">Heli</string>
|
||||||
@@ -806,16 +832,23 @@
|
|||||||
<string name="pref_background">Taustapilt</string>
|
<string name="pref_background">Taustapilt</string>
|
||||||
<string name="pref_background_btn_default">Kasuta vaikimisi pilti</string>
|
<string name="pref_background_btn_default">Kasuta vaikimisi pilti</string>
|
||||||
<string name="pref_background_btn_gallery">Vali galeriist</string>
|
<string name="pref_background_btn_gallery">Vali galeriist</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Kui sa seda eelistust muudad, siis palun kontrolli, et server ja muud kliendid on vastavalt seadistatud.\n\nVastasel juhul võib minna nii, et mitte miski ei toimi.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Kui sa seda eelistust muudad, siis palun kontrolli, et server ja muud kliendid on vastavalt seadistatud.\n\nVastasel juhul võib minna nii, et mitte miski ei toimi.</string>
|
||||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||||
<string name="pref_multidevice">Mitme seadme tugi</string>
|
<string name="pref_multidevice">Mitme seadme tugi</string>
|
||||||
<string name="pref_multidevice_explain">Sünkrooni oma sõnumid oma muude seadmetega. Teise seadme lisamisel lülitatakse automaatselt sisse.</string>
|
<string name="pref_multidevice_explain">Sünkrooni oma sõnumid oma muude seadmetega. Teise seadme lisamisel lülitatakse automaatselt sisse.</string>
|
||||||
<string name="pref_multidevice_change_warn">Kui kasutad sama profiili mitmes seadmes, siis peab mitme seadme režiimi sisse lülitama. Lülita see seadistus välja vaid siis, kui oled selle profiili eemaldanud kõikidest muudest oma seadmetest.\n\nKui aga lülitad välja siis, kui profiil on kasutusel mitmes seadmes, on tulemuseks kadunud sõnumid ja muud imelikud juhtumised.</string>
|
<string name="pref_multidevice_change_warn">Kui kasutad sama profiili mitmes seadmes, siis peab mitme seadme režiimi sisse lülitama. Lülita see seadistus välja vaid siis, kui oled selle profiili eemaldanud kõikidest muudest oma seadmetest.\n\nKui aga lülitad välja siis, kui profiil on kasutusel mitmes seadmes, on tulemuseks kadunud sõnumid ja muud imelikud juhtumised.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Tõsta automaatselt DeltaChati kausta</string>
|
<string name="pref_auto_folder_moves">Tõsta automaatselt DeltaChati kausta</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Laadi vaid DeltaChati kasutast</string>
|
<string name="pref_only_fetch_mvbox_title">Laadi vaid DeltaChati kasutast</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Näita klassikalisi e-kirju</string>
|
<string name="pref_show_emails">Näita klassikalisi e-kirju</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Ei, vaid vestlustele</string>
|
<string name="pref_show_emails_no">Ei, vaid vestlustele</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Kinnitatud kontaktidele</string>
|
<string name="pref_show_emails_accepted_contacts">Kinnitatud kontaktidele</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Kõik</string>
|
<string name="pref_show_emails_all">Kõik</string>
|
||||||
<string name="pref_experimental_features">Katselised funktsionaalsused</string>
|
<string name="pref_experimental_features">Katselised funktsionaalsused</string>
|
||||||
<string name="pref_experimental_features_explain">Need funktsionaalsused ei pruugi korralikult toimida ning nad võivad tulevikus muutuda või sootuks olla eemaldatud</string>
|
<string name="pref_experimental_features_explain">Need funktsionaalsused ei pruugi korralikult toimida ning nad võivad tulevikus muutuda või sootuks olla eemaldatud</string>
|
||||||
@@ -870,14 +903,17 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Kustuta vanad sõnumid</string>
|
<string name="delete_old_messages">Kustuta vanad sõnumid</string>
|
||||||
<string name="autodel_device_title">Kustuta sõnumid seadmest</string>
|
<string name="autodel_device_title">Kustuta sõnumid seadmest</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Kustuta sõnumid serverist</string>
|
<string name="autodel_server_title">Kustuta sõnumid serverist</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">Kas soovid kustutada %1$d sõnumit kohe ja kõik uued sõnumid ajavahemikus „%2$s“\n\n• Sealhulgas saavad olema kõik meediafailid\n\n• Sõnumid saavad kustutatud sõltumata sellest, kas oled neid näinud või mitte\n\n• „Salvestatud sõnumid“ ei kuulu kohalikus seadmes kustutamisele</string>
|
<string name="autodel_device_ask">Kas soovid kustutada %1$d sõnumit kohe ja kõik uued sõnumid ajavahemikus „%2$s“\n\n• Sealhulgas saavad olema kõik meediafailid\n\n• Sõnumid saavad kustutatud sõltumata sellest, kas oled neid näinud või mitte\n\n• „Salvestatud sõnumid“ ei kuulu kohalikus seadmes kustutamisele</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">Kas soovid kustutada %1$d sõnumit kohe ja kõik uued sõnumid ajavahemikus „%2$s“\n\n⚠️ Sealhulgas e-kirjad, meediafailid ja „Salvestatud sõnumid“ kõikides serveri kasutades.\n\n⚠️ Ära kasuta seda võimalust, kui tahad andmeid hoida serveris või pruugid ka klassikalisi e-posti kliente</string>
|
<string name="autodel_server_ask">Kas soovid kustutada %1$d sõnumit kohe ja kõik uued sõnumid ajavahemikus „%2$s“\n\n⚠️ Sealhulgas e-kirjad, meediafailid ja „Salvestatud sõnumid“ kõikides serveri kasutades.\n\n⚠️ Ära kasuta seda võimalust, kui tahad andmeid hoida serveris või pruugid ka klassikalisi e-posti kliente</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Sealhulgas e-kirjad, meediafailid ja „Salvestatud sõnumid“ kõikides serveri kasutades. Ära kasuta seda võimalust, kui tahad andmeid hoida serveris või pruugid ka klassikalisi e-posti kliente</string>
|
<string name="autodel_server_enabled_hint">Sealhulgas e-kirjad, meediafailid ja „Salvestatud sõnumid“ kõikides serveri kasutades. Ära kasuta seda võimalust, kui tahad andmeid hoida serveris või pruugid ka klassikalisi e-posti kliente</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device_title">Lülita kohene kustutamine sisse</string>
|
<string name="autodel_server_warn_multi_device_title">Lülita kohene kustutamine sisse</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device">Kui lülitad kohese kustutamise sisse, siis sa ei saa selles profiilis kasutada mitut seadet.</string>
|
<string name="autodel_server_warn_multi_device">Kui lülitad kohese kustutamise sisse, siis sa ei saa selles profiilis kasutada mitut seadet.</string>
|
||||||
<string name="autodel_confirm">Ma saan aru, kustuta kõik need sõnumid</string>
|
<string name="autodel_confirm">Ma saan aru, kustuta kõik need sõnumid</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -974,7 +1010,7 @@
|
|||||||
<string name="learn_more">Lisateave</string>
|
<string name="learn_more">Lisateave</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">Sa kustutasid vestluse nimega „Salvestatud sõnumid“.\n\nℹ️ Kui tahad uuesti kasutada võimalust „Salvestatud sõnumid“, siis lisa vestlus iseendaga.</string>
|
<string name="devicemsg_self_deleted">Sa kustutasid vestluse nimega „Salvestatud sõnumid“.\n\nℹ️ Kui tahad uuesti kasutada võimalust „Salvestatud sõnumid“, siis lisa vestlus iseendaga.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ Sinu poolt teenusepakkuja juures kasutatav andmeruum hakkab täis saama: %1$s%% on juba kasutusel.\n\nKui andmeruum on täis, siis sa ilmselt ei pruugi enam sõnumeid saada.\n\n👉 Palun kontrolli, kas sul on võimalik teenusepakkuja veebiliidesest vanu sõnumeid kustutada või veelgi parem on, kui kasutad automaatse kustutamise võimalust: „Seadistused“ → „Vestlused“ → „Kustuta vanad sõnumid“. Hetkel kasutatavat andmeruumi mahutu saad alati kontrollida siit: „Seadistused“ → „Ühenduvus“.</string>
|
<string name="devicemsg_storage_exceeding">⚠️ Sinu poolt teenusepakkuja juures kasutatav andmeruum hakkab täis saama: %1$s%% on juba kasutusel.\n\nKui andmeruum on täis, siis sa ilmselt ei pruugi enam sõnumeid saada.\n\n👉 Palun kontrolli, kas sul on võimalik teenusepakkuja veebiliidesest vanu sõnumeid kustutada või veelgi parem on, kui kasutad automaatse kustutamise võimalust: „Seadistused“ → „Vestlused“ → „Kustuta vanad sõnumid“. Hetkel kasutatavat andmeruumi mahutu saad alati kontrollida siit: „Seadistused“ → „Ühenduvus“.</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ Sinu seadme kuupäev või kellaaeg tundub olema ebatäpne (%1$s).\n\nPalun seadista kella ⏰🔧 ja taga, et sõnumivahetus, sh selle krüptimine toimib korrektselt.</string>
|
<string name="devicemsg_bad_time">⚠️ Sinu seadme kuupäev või kellaaeg tundub olema ebatäpne (%1$s).\n\nPalun seadista kella ⏰🔧 ja taga, et sõnumivahetus, sh selle krüptimine toimib korrektselt.</string>
|
||||||
@@ -1058,8 +1094,6 @@
|
|||||||
<string name="n_messages_in_m_chats">%1$d sõnumit %2$d-s vestluses</string>
|
<string name="n_messages_in_m_chats">%1$d sõnumit %2$d-s vestluses</string>
|
||||||
|
|
||||||
<!-- location streaming -->
|
<!-- location streaming -->
|
||||||
<string name="location_streaming_channel_desc">Kanal asukoha jagamiseks vastavalt tellimisele.</string>
|
|
||||||
<string name="location_streaming_notification_title">Asukoha jagamine</string>
|
|
||||||
<string name="location_streaming_notification_text">Sa jada oma asukohta teistega</string>
|
<string name="location_streaming_notification_text">Sa jada oma asukohta teistega</string>
|
||||||
<string name="location_rationale">Jagamaks reaalajas oma asukohta teiste vestluse liikmetega, palun luba Delta Chatil kasutada sinu asukohaandmeid.\n\nEt asukoha edastamine toimiks sujuvalt, on asukohaandmed kasutusel ka siis, kui rakendus on suletud või pole kasutusel.</string>
|
<string name="location_rationale">Jagamaks reaalajas oma asukohta teiste vestluse liikmetega, palun luba Delta Chatil kasutada sinu asukohaandmeid.\n\nEt asukoha edastamine toimiks sujuvalt, on asukohaandmed kasutusel ka siis, kui rakendus on suletud või pole kasutusel.</string>
|
||||||
|
|
||||||
@@ -1155,6 +1189,8 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Tegevused sõnumiga</string>
|
<string name="a11y_message_context_menu_btn_label">Tegevused sõnumiga</string>
|
||||||
<string name="a11y_background_preview_label">Taustapildi eelvaade</string>
|
<string name="a11y_background_preview_label">Taustapildi eelvaade</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Isekustuvad sõnumid on kasutusel</string>
|
<string name="a11y_disappearing_messages_activated">Isekustuvad sõnumid on kasutusel</string>
|
||||||
|
<!-- The placeholder will be replaced by a link, eg. "Open https://delta.chat". Used e.g. in for accessibility. -->
|
||||||
|
<string name="open_link">Ava %1$s</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Lõpeta asukoha jagamine</string>
|
<string name="stop_sharing_location">Lõpeta asukoha jagamine</string>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
<string name="later">Geroago</string>
|
<string name="later">Geroago</string>
|
||||||
<!-- "Resend" means "Sending the selected message(s) again to the same chat". The string is used in a menu and should be as short as possible. Resending may be needed after failures or to repost old messages to new members. -->
|
<!-- "Resend" means "Sending the selected message(s) again to the same chat". The string is used in a menu and should be as short as possible. Resending may be needed after failures or to repost old messages to new members. -->
|
||||||
<string name="resend">Berriro bidali</string>
|
<string name="resend">Berriro bidali</string>
|
||||||
<string name="edited">Editatu egin da</string>
|
<string name="edited">Editatu egin da:</string>
|
||||||
<string name="edit_message">Mezua editatu</string>
|
<string name="edit_message">Mezua editatu</string>
|
||||||
<!-- Verb "to archive", as in "put a chat in the archive", not a noun "The Archive". -->
|
<!-- Verb "to archive", as in "put a chat in the archive", not a noun "The Archive". -->
|
||||||
<string name="archive">Artxibatu</string>
|
<string name="archive">Artxibatu</string>
|
||||||
@@ -59,7 +59,9 @@
|
|||||||
<string name="media">Multimedia</string>
|
<string name="media">Multimedia</string>
|
||||||
<string name="apps_and_media">Aplikazioak eta multimedia</string>
|
<string name="apps_and_media">Aplikazioak eta multimedia</string>
|
||||||
<string name="profile">Kontua</string>
|
<string name="profile">Kontua</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">Kontu guztiak</string>
|
<string name="all_profiles">Kontu guztiak</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">Oraingo kontua</string>
|
<string name="current_profile">Oraingo kontua</string>
|
||||||
<string name="main_menu">Menu nagusia</string>
|
<string name="main_menu">Menu nagusia</string>
|
||||||
<string name="start_chat">Hasi txata</string>
|
<string name="start_chat">Hasi txata</string>
|
||||||
@@ -82,6 +84,7 @@
|
|||||||
<string name="always">Beti</string>
|
<string name="always">Beti</string>
|
||||||
<string name="always_load_remote_images">Kargatu urrutiko irudiak beti</string>
|
<string name="always_load_remote_images">Kargatu urrutiko irudiak beti</string>
|
||||||
<string name="once">Behin</string>
|
<string name="once">Behin</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">Erakutsi abisua</string>
|
<string name="show_warning">Erakutsi abisua</string>
|
||||||
<string name="not_now">Orain ez</string>
|
<string name="not_now">Orain ez</string>
|
||||||
<string name="never">Inoiz ez</string>
|
<string name="never">Inoiz ez</string>
|
||||||
@@ -198,6 +201,7 @@
|
|||||||
<string name="camera">Kamera</string>
|
<string name="camera">Kamera</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">Harrapatu</string>
|
<string name="capture">Harrapatu</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">Aldatu kamera</string>
|
<string name="switch_camera">Aldatu kamera</string>
|
||||||
<string name="toggle_fullscreen">Aldatu pantaila osoa modua</string>
|
<string name="toggle_fullscreen">Aldatu pantaila osoa modua</string>
|
||||||
<string name="location">Kokalekua</string>
|
<string name="location">Kokalekua</string>
|
||||||
@@ -347,7 +351,7 @@
|
|||||||
<string name="menu_learn_spelling">Ikasi ortografia</string>
|
<string name="menu_learn_spelling">Ikasi ortografia</string>
|
||||||
<string name="jump_to_message">Joan mezura</string>
|
<string name="jump_to_message">Joan mezura</string>
|
||||||
<string name="replace_draft">Ordeztu zirriborroa</string>
|
<string name="replace_draft">Ordeztu zirriborroa</string>
|
||||||
<string name="title_share_location">Partekatu kokalekua taldeko kide guztiak</string>
|
<string name="title_share_location">Partekatu kokalekua kide guztiekin</string>
|
||||||
<string name="device_talk">Gailuaren mezuak</string>
|
<string name="device_talk">Gailuaren mezuak</string>
|
||||||
<string name="device_talk_subtitle">Lokalki sortutako mezuak</string>
|
<string name="device_talk_subtitle">Lokalki sortutako mezuak</string>
|
||||||
<string name="device_talk_explain">Txat honetako mezuak zure Delta Chat aplikazioak sortu ditu lokalki. Egileek aplikazioaren eguneraketei buruz eta erabileran arazoei buruz informatzeko erabiltzen dute.</string>
|
<string name="device_talk_explain">Txat honetako mezuak zure Delta Chat aplikazioak sortu ditu lokalki. Egileek aplikazioaren eguneraketei buruz eta erabileran arazoei buruz informatzeko erabiltzen dute.</string>
|
||||||
@@ -375,12 +379,13 @@
|
|||||||
<string name="mute_for_seven_days">Mututu 7 egun</string>
|
<string name="mute_for_seven_days">Mututu 7 egun</string>
|
||||||
<string name="mute_forever">Mututu betirako</string>
|
<string name="mute_forever">Mututu betirako</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">5 minutuz</string>
|
<string name="share_location_for_5_minutes">5 minutuz</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">30 minutuz</string>
|
<string name="share_location_for_30_minutes">30 minutuz</string>
|
||||||
<string name="share_location_for_one_hour">Ordu 1</string>
|
<string name="share_location_for_one_hour">Ordubetez</string>
|
||||||
<string name="share_location_for_two_hours">2 orduz</string>
|
<string name="share_location_for_two_hours">2 orduz</string>
|
||||||
<string name="share_location_for_six_hours">6 orduz</string>
|
<string name="share_location_for_six_hours">6 orduz</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">Bidali hurrengo fitxategia %s-(e)ra?</item>
|
<item quantity="one">Bidali hurrengo fitxategia %s-(e)ra?</item>
|
||||||
<item quantity="other">Bidali hurrengo %d fitxategiak %s(e)ra?</item>
|
<item quantity="other">Bidali hurrengo %d fitxategiak %s(e)ra?</item>
|
||||||
@@ -432,6 +437,7 @@
|
|||||||
<item quantity="one">Ezabatu mezu %d?</item>
|
<item quantity="one">Ezabatu mezu %d?</item>
|
||||||
<item quantity="other">Ezabatu %d mezu?</item>
|
<item quantity="other">Ezabatu %d mezu?</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">Birbidali mezuak %1$s erabiltzaileari?</string>
|
<string name="ask_forward">Birbidali mezuak %1$s erabiltzaileari?</string>
|
||||||
<string name="ask_forward_multiple">Bidali mezuak %1$d txatetara?</string>
|
<string name="ask_forward_multiple">Bidali mezuak %1$d txatetara?</string>
|
||||||
<string name="ask_export_attachment">Esportatu eranskina? Eranskinak esportatzeak zure beste gailuko beste aplikazioek atzitzea ahalbidetuko du.\n\nJarraitu?</string>
|
<string name="ask_export_attachment">Esportatu eranskina? Eranskinak esportatzeak zure beste gailuko beste aplikazioek atzitzea ahalbidetuko du.\n\nJarraitu?</string>
|
||||||
@@ -601,6 +607,7 @@
|
|||||||
<string name="connectivity_connected">Konektatuta</string>
|
<string name="connectivity_connected">Konektatuta</string>
|
||||||
<string name="sending">Bidaltzen...</string>
|
<string name="sending">Bidaltzen...</string>
|
||||||
<string name="last_msg_sent_successfully">Azken mezua ondo bidali da.</string>
|
<string name="last_msg_sent_successfully">Azken mezua ondo bidali da.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">Zure hornitzaileak ez du onartzen.</string>
|
<string name="not_supported_by_provider">Zure hornitzaileak ez du onartzen.</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">Mezuak</string>
|
<string name="messages">Mezuak</string>
|
||||||
@@ -637,7 +644,6 @@
|
|||||||
<string name="welcome_chat_over_email">Txat deszentralizatu segurua</string>
|
<string name="welcome_chat_over_email">Txat deszentralizatu segurua</string>
|
||||||
<string name="scan_invitation_code">Eskaneatu gonbidapen kodea</string>
|
<string name="scan_invitation_code">Eskaneatu gonbidapen kodea</string>
|
||||||
<string name="login_title">Hasi saioa</string>
|
<string name="login_title">Hasi saioa</string>
|
||||||
<string name="login_advanced_hint">Saio-hasiera hau erabiltzaile aurreratuentzat da:\n\n• Ez erabili beste aplikazio batean erabiltzen ari zaren helbiderik.\n\n• Posta elektronikoko zerbitzari klasikoak txatak baimentzen ditu, muturretik muturrera zifratu gabe, posta-ikono batek markatuta.</string>
|
|
||||||
<string name="login_inbox">Sarrera ontzia</string>
|
<string name="login_inbox">Sarrera ontzia</string>
|
||||||
<string name="login_imap_login">IMAP erabiltzaile-izena</string>
|
<string name="login_imap_login">IMAP erabiltzaile-izena</string>
|
||||||
<string name="login_imap_server">IMAP zerbitzaria</string>
|
<string name="login_imap_server">IMAP zerbitzaria</string>
|
||||||
@@ -752,6 +758,7 @@
|
|||||||
<string name="pref_notifications_priority">Lehentasuna</string>
|
<string name="pref_notifications_priority">Lehentasuna</string>
|
||||||
<string name="pref_notifications_explain">Gaitu sistemaren jakinarazpenak mezu berrientzat</string>
|
<string name="pref_notifications_explain">Gaitu sistemaren jakinarazpenak mezu berrientzat</string>
|
||||||
<string name="pref_show_notification_content">Erakutsi mezuaren edukia jakinarazpenean</string>
|
<string name="pref_show_notification_content">Erakutsi mezuaren edukia jakinarazpenean</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">Erakutsi bidaltzailea eta mezuaren lehen hitza jakinarazpenetan</string>
|
<string name="pref_show_notification_content_explain">Erakutsi bidaltzailea eta mezuaren lehen hitza jakinarazpenetan</string>
|
||||||
<string name="pref_led_color">LED kolorea</string>
|
<string name="pref_led_color">LED kolorea</string>
|
||||||
<string name="pref_sound">Soinua</string>
|
<string name="pref_sound">Soinua</string>
|
||||||
@@ -792,16 +799,23 @@
|
|||||||
<string name="pref_background">Atzealdea</string>
|
<string name="pref_background">Atzealdea</string>
|
||||||
<string name="pref_background_btn_default">Erabili irudi lehenetsia</string>
|
<string name="pref_background_btn_default">Erabili irudi lehenetsia</string>
|
||||||
<string name="pref_background_btn_gallery">Hautatu galeriatik</string>
|
<string name="pref_background_btn_gallery">Hautatu galeriatik</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">Aukera hau desaktibatuz gero, egiaztatu zure zerbitzaria eta beste bezeroen konfigurazioa bat datorrela.\n\nBestela agian gauzak ez dabiltza.</string>
|
<string name="pref_imap_folder_warn_disable_defaults">Aukera hau desaktibatuz gero, egiaztatu zure zerbitzaria eta beste bezeroen konfigurazioa bat datorrela.\n\nBestela agian gauzak ez dabiltza.</string>
|
||||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||||
<string name="pref_multidevice">Gailu anitzeko modua</string>
|
<string name="pref_multidevice">Gailu anitzeko modua</string>
|
||||||
<string name="pref_multidevice_explain">Sinkronizatu zure mezuak zure beste gailuekin. Automatikoki gaitzen da bigarren gailu bat gehitzean.</string>
|
<string name="pref_multidevice_explain">Sinkronizatu zure mezuak zure beste gailuekin. Automatikoki gaitzen da bigarren gailu bat gehitzean.</string>
|
||||||
<string name="pref_multidevice_change_warn">Gailu anitzeko moduak gaituta egon behar du kontu bera hainbat gailutan erabiltzean. Desaktibatu ezarpen hau soilik kontu hau beste gailu guztietatik kendu baduzu.\n\nGailu anitzeko modua desaktibatzeak kontua hainbat gailutan erabiltzen ari den bitartean, mezuak galtzea eta bestelako arazoak eragingo ditu.</string>
|
<string name="pref_multidevice_change_warn">Gailu anitzeko moduak gaituta egon behar du kontu bera hainbat gailutan erabiltzean. Desaktibatu ezarpen hau soilik kontu hau beste gailu guztietatik kendu baduzu.\n\nGailu anitzeko modua desaktibatzeak kontua hainbat gailutan erabiltzen ari den bitartean, mezuak galtzea eta bestelako arazoak eragingo ditu.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">Automatikoki mugitzen du DeltaChat karpetara</string>
|
<string name="pref_auto_folder_moves">Automatikoki mugitzen du DeltaChat karpetara</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">Delta Chat karpetatik soilik berreskuratu</string>
|
<string name="pref_only_fetch_mvbox_title">Delta Chat karpetatik soilik berreskuratu</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">Erakutsi ohiko e-mailak</string>
|
<string name="pref_show_emails">Erakutsi ohiko e-mailak</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">Ez, txatak besterik ez</string>
|
<string name="pref_show_emails_no">Ez, txatak besterik ez</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">Onartutako kontaktuena</string>
|
<string name="pref_show_emails_accepted_contacts">Onartutako kontaktuena</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">Denak</string>
|
<string name="pref_show_emails_all">Denak</string>
|
||||||
<string name="pref_experimental_features">Ezaugarri esperimentalak</string>
|
<string name="pref_experimental_features">Ezaugarri esperimentalak</string>
|
||||||
<string name="pref_experimental_features_explain">Baliteke ezaugarri hauek ezegonkorrak izatea eta gerora aldatzea edo kentzea.</string>
|
<string name="pref_experimental_features_explain">Baliteke ezaugarri hauek ezegonkorrak izatea eta gerora aldatzea edo kentzea.</string>
|
||||||
@@ -856,14 +870,17 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">Ezabatu mezu zaharrak</string>
|
<string name="delete_old_messages">Ezabatu mezu zaharrak</string>
|
||||||
<string name="autodel_device_title">Ezabatu mezuak gailutik</string>
|
<string name="autodel_device_title">Ezabatu mezuak gailutik</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">Ezabatu mezuak zerbitzaritik</string>
|
<string name="autodel_server_title">Ezabatu mezuak zerbitzaritik</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">%1$d mezu ezabatu nahi dituzu orain eta \"%2$s\" etorkizunean jasotako mezuak ere?\n\n• Honek multimedia ere barne hartzen du\n\n• Mezuak ikusi ala ez ezabatuko dira\n\n• \"Gordetako mezuak\" ez dira lokalki ezabatuko</string>
|
<string name="autodel_device_ask">%1$d mezu ezabatu nahi dituzu orain eta \"%2$s\" etorkizunean jasotako mezuak ere?\n\n• Honek multimedia ere barne hartzen du\n\n• Mezuak ikusi ala ez ezabatuko dira\n\n• \"Gordetako mezuak\" ez dira lokalki ezabatuko</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">%1$d mezu ezabatu nahi dituzu orain eta \"%2$s\" etorkizunean jasotako mezuak ere?\n\n⚠️ Honek mezu elektronikoak, multimedia eta \"Gordetako mezuak\" barne hartzen ditu zerbitzariko karpeta guztietan\n\n⚠️ Ez erabili funtzio hau datuak zerbitzarian gorde nahi badituzu edo posta bezero klasikoak ere erabiltzen badituzu</string>
|
<string name="autodel_server_ask">%1$d mezu ezabatu nahi dituzu orain eta \"%2$s\" etorkizunean jasotako mezuak ere?\n\n⚠️ Honek mezu elektronikoak, multimedia eta \"Gordetako mezuak\" barne hartzen ditu zerbitzariko karpeta guztietan\n\n⚠️ Ez erabili funtzio hau datuak zerbitzarian gorde nahi badituzu edo posta bezero klasikoak ere erabiltzen badituzu</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">Honek barne hartzen ditu mezu elektronikoak, multimedia eta \"Gordetako mezuak\" zerbitzariko karpeta guztietan. Ez erabili funtzio hau datuak zerbitzarian gorde nahi badituzu edo mezu elektronikoen bezero klasikoak ere erabiltzen badituzu.</string>
|
<string name="autodel_server_enabled_hint">Honek barne hartzen ditu mezu elektronikoak, multimedia eta \"Gordetako mezuak\" zerbitzariko karpeta guztietan. Ez erabili funtzio hau datuak zerbitzarian gorde nahi badituzu edo mezu elektronikoen bezero klasikoak ere erabiltzen badituzu.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device_title">Berehalako ezabatzea aktibatu</string>
|
<string name="autodel_server_warn_multi_device_title">Berehalako ezabatzea aktibatu</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device">Berehalako ezabaketa gaitzen baduzu, ezin izango dituzu gailu anitz erabili profil honetan.</string>
|
<string name="autodel_server_warn_multi_device">Berehalako ezabaketa gaitzen baduzu, ezin izango dituzu gailu anitz erabili profil honetan.</string>
|
||||||
<string name="autodel_confirm">Ulertzen dut, ezabatu mezuk guzti hauek</string>
|
<string name="autodel_confirm">Ulertzen dut, ezabatu mezuk guzti hauek</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -957,7 +974,7 @@
|
|||||||
<string name="learn_more">Ikasi gehiago</string>
|
<string name="learn_more">Ikasi gehiago</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">\"Gordetako mezuak\" txata ezabatu duzu.\n\nℹ️ \"Gordetako mezuak\" funtzioa berriro erabiltzeko, sortu txat berri bat zure buruarekin.</string>
|
<string name="devicemsg_self_deleted">\"Gordetako mezuak\" txata ezabatu duzu.\n\nℹ️ \"Gordetako mezuak\" funtzioa berriro erabiltzeko, sortu txat berri bat zure buruarekin.</string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding">⚠️ Zure hornitzailearen biltegiratzea agortzear dago: %%-tik %1$s erabili dituzu dagoeneko.\n\nLitekeena da mezuak jaso ezin izatea biltegiratzea beteta badago.\n\n👉 Mesedez, egiaztatu datu zaharrak hornitzailearen web-interfazean ezaba ditzakezun eta kontuan hartu \"Ezarpenak / Txatak / Ezabatu mezu zaharrak\" aukera aktibatzea. Zure uneko biltegiratze-erabilera edozein unetan egiaztatu dezakezu \"Ezarpenak / Konektibitatea\" atalean.</string>
|
<string name="devicemsg_storage_exceeding">⚠️ Zure hornitzailearen biltegiratzea agortzear dago: %%-tik %1$s erabili dituzu dagoeneko.\n\nLitekeena da mezuak jaso ezin izatea biltegiratzea beteta badago.\n\n👉 Mesedez, egiaztatu datu zaharrak hornitzailearen web-interfazean ezaba ditzakezun eta kontuan hartu \"Ezarpenak / Txatak / Ezabatu mezu zaharrak\" aukera aktibatzea. Zure uneko biltegiratze-erabilera edozein unetan egiaztatu dezakezu \"Ezarpenak / Konektibitatea\" atalean.</string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">⚠️ Zure gailuko data edo ordua okerra dela dirudi (%1$s).\n\nEgokitu zure erlojua ⏰🔧 zure mezuak zuzen jasotzen direla ziurtatzeko.</string>
|
<string name="devicemsg_bad_time">⚠️ Zure gailuko data edo ordua okerra dela dirudi (%1$s).\n\nEgokitu zure erlojua ⏰🔧 zure mezuak zuzen jasotzen direla ziurtatzeko.</string>
|
||||||
@@ -1120,7 +1137,6 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">Mezu-ekintzak</string>
|
<string name="a11y_message_context_menu_btn_label">Mezu-ekintzak</string>
|
||||||
<string name="a11y_background_preview_label">Atzealdearen aurrebista</string>
|
<string name="a11y_background_preview_label">Atzealdearen aurrebista</string>
|
||||||
<string name="a11y_disappearing_messages_activated">Desagertzen diren mezuak aktibatu dira</string>
|
<string name="a11y_disappearing_messages_activated">Desagertzen diren mezuak aktibatu dira</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">Utzi kokapena partekatzeari</string>
|
<string name="stop_sharing_location">Utzi kokapena partekatzeari</string>
|
||||||
<string name="a11y_voice_message_hint_ios">Grabatu ondoren, sakatu bi aldiz bidaltzeko. Grabazioa baztertzeko, pasatu bi hatz gainetik.</string>
|
<string name="a11y_voice_message_hint_ios">Grabatu ondoren, sakatu bi aldiz bidaltzeko. Grabazioa baztertzeko, pasatu bi hatz gainetik.</string>
|
||||||
|
|||||||
@@ -59,7 +59,9 @@
|
|||||||
<string name="media">رسانه</string>
|
<string name="media">رسانه</string>
|
||||||
<string name="apps_and_media">برنامهها و رسانهها</string>
|
<string name="apps_and_media">برنامهها و رسانهها</string>
|
||||||
<string name="profile">نمایه</string>
|
<string name="profile">نمایه</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="all_profiles">تمام نمایهها</string>
|
<string name="all_profiles">تمام نمایهها</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="current_profile">نمایهٔ فعلی</string>
|
<string name="current_profile">نمایهٔ فعلی</string>
|
||||||
<string name="main_menu">فهرست اصلی</string>
|
<string name="main_menu">فهرست اصلی</string>
|
||||||
<string name="start_chat">شروع گپ</string>
|
<string name="start_chat">شروع گپ</string>
|
||||||
@@ -80,6 +82,7 @@
|
|||||||
<string name="always">همیشه</string>
|
<string name="always">همیشه</string>
|
||||||
<string name="always_load_remote_images">تصاویر با منبع بیرونی همیشه بارگیری شوند</string>
|
<string name="always_load_remote_images">تصاویر با منبع بیرونی همیشه بارگیری شوند</string>
|
||||||
<string name="once">همین یک بار</string>
|
<string name="once">همین یک بار</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="show_warning">نمایش هشدار</string>
|
<string name="show_warning">نمایش هشدار</string>
|
||||||
<string name="not_now">اکنون نه</string>
|
<string name="not_now">اکنون نه</string>
|
||||||
<string name="never">هرگز</string>
|
<string name="never">هرگز</string>
|
||||||
@@ -185,6 +188,7 @@
|
|||||||
<string name="camera">دوربین</string>
|
<string name="camera">دوربین</string>
|
||||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||||
<string name="capture">گرفتن</string>
|
<string name="capture">گرفتن</string>
|
||||||
|
<!-- Switch eg. from front to back camera -->
|
||||||
<string name="switch_camera">تغییر دوربین</string>
|
<string name="switch_camera">تغییر دوربین</string>
|
||||||
<string name="toggle_fullscreen">تغییر وضعیت تمام صفحه</string>
|
<string name="toggle_fullscreen">تغییر وضعیت تمام صفحه</string>
|
||||||
<string name="location">موقعیت مکانی</string>
|
<string name="location">موقعیت مکانی</string>
|
||||||
@@ -356,12 +360,13 @@
|
|||||||
<string name="mute_for_seven_days">ساکت کردن به مدت۷ روز</string>
|
<string name="mute_for_seven_days">ساکت کردن به مدت۷ روز</string>
|
||||||
<string name="mute_forever">ساکت کردن دائمی</string>
|
<string name="mute_forever">ساکت کردن دائمی</string>
|
||||||
|
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="share_location_for_5_minutes">به مدت ۵ دقیقه</string>
|
<string name="share_location_for_5_minutes">به مدت ۵ دقیقه</string>
|
||||||
|
|
||||||
<string name="share_location_for_30_minutes">به مدت ۳۰ دقیقه</string>
|
<string name="share_location_for_30_minutes">به مدت ۳۰ دقیقه</string>
|
||||||
<string name="share_location_for_one_hour">به مدت ۱ ساعت</string>
|
<string name="share_location_for_one_hour">به مدت ۱ ساعت</string>
|
||||||
<string name="share_location_for_two_hours">به مدت ۲ ساعت</string>
|
<string name="share_location_for_two_hours">به مدت ۲ ساعت</string>
|
||||||
<string name="share_location_for_six_hours">به مدت ۶ ساعت</string>
|
<string name="share_location_for_six_hours">به مدت ۶ ساعت</string>
|
||||||
|
|
||||||
<plurals name="ask_send_following_n_files_to">
|
<plurals name="ask_send_following_n_files_to">
|
||||||
<item quantity="one">ارسال این پرونده به %s؟</item>
|
<item quantity="one">ارسال این پرونده به %s؟</item>
|
||||||
<item quantity="other">ارسال این %d پرونده به %s؟</item>
|
<item quantity="other">ارسال این %d پرونده به %s؟</item>
|
||||||
@@ -402,6 +407,7 @@
|
|||||||
<item quantity="one">آیا میخواهید از روی تمام دستگاههایتان %d پیام را حذف کنید؟</item>
|
<item quantity="one">آیا میخواهید از روی تمام دستگاههایتان %d پیام را حذف کنید؟</item>
|
||||||
<item quantity="other">حذف %dپیام؟</item>
|
<item quantity="other">حذف %dپیام؟</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- deprecated, use ask_forward_messages -->
|
||||||
<string name="ask_forward">پیامها به %1$s هدایت شوند؟</string>
|
<string name="ask_forward">پیامها به %1$s هدایت شوند؟</string>
|
||||||
<string name="ask_forward_multiple">انتقال پیامها به %1$d گپ؟</string>
|
<string name="ask_forward_multiple">انتقال پیامها به %1$d گپ؟</string>
|
||||||
<string name="ask_export_attachment">ضمیمه صادر شود؟ صادر کردن ضمیمه باعث میشود دیگر نرمافزارهای روی دستگاه شما بتوانند به آن دسترسی داشته باشند. \n\nادامه میدهید؟</string>
|
<string name="ask_export_attachment">ضمیمه صادر شود؟ صادر کردن ضمیمه باعث میشود دیگر نرمافزارهای روی دستگاه شما بتوانند به آن دسترسی داشته باشند. \n\nادامه میدهید؟</string>
|
||||||
@@ -571,6 +577,7 @@
|
|||||||
<string name="connectivity_connected">متصل شد</string>
|
<string name="connectivity_connected">متصل شد</string>
|
||||||
<string name="sending">در حال ارسال...</string>
|
<string name="sending">در حال ارسال...</string>
|
||||||
<string name="last_msg_sent_successfully">آخرین پیام با موفقیت ارسال شد.</string>
|
<string name="last_msg_sent_successfully">آخرین پیام با موفقیت ارسال شد.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="not_supported_by_provider">ارائه دهنده شما از این پشتیبانی نمیکند</string>
|
<string name="not_supported_by_provider">ارائه دهنده شما از این پشتیبانی نمیکند</string>
|
||||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||||
<string name="messages">پیامها</string>
|
<string name="messages">پیامها</string>
|
||||||
@@ -607,7 +614,6 @@
|
|||||||
<string name="welcome_chat_over_email">گفتگو غیرمتمرکز و ایمن</string>
|
<string name="welcome_chat_over_email">گفتگو غیرمتمرکز و ایمن</string>
|
||||||
<string name="scan_invitation_code">اسکن کردن کد دعوت</string>
|
<string name="scan_invitation_code">اسکن کردن کد دعوت</string>
|
||||||
<string name="login_title">ورود</string>
|
<string name="login_title">ورود</string>
|
||||||
<string name="login_advanced_hint">این برای کاربرهای حرفهای است:\n\n • از یک آدرس که در برنامهای دیگر استفاده میکنید استفاده نکنید.\n\n • ارائهدهندهٔ رایانامه کلاسیک اجازه خواهد داد که گپها بدون رمزنگاری سراسری باشند. این گپها به وسیلهٔ یک نماد نامه نشانهگذاری میشوند.</string>
|
|
||||||
<string name="login_inbox">ورودی</string>
|
<string name="login_inbox">ورودی</string>
|
||||||
<string name="login_imap_login">IMAP Login Name</string>
|
<string name="login_imap_login">IMAP Login Name</string>
|
||||||
<string name="login_imap_server">IMAP Server</string>
|
<string name="login_imap_server">IMAP Server</string>
|
||||||
@@ -709,6 +715,7 @@
|
|||||||
<string name="pref_notifications_priority">اولویت</string>
|
<string name="pref_notifications_priority">اولویت</string>
|
||||||
<string name="pref_notifications_explain">فعال کردن اعلانهای سیستم برای پیامهای جدید</string>
|
<string name="pref_notifications_explain">فعال کردن اعلانهای سیستم برای پیامهای جدید</string>
|
||||||
<string name="pref_show_notification_content">نمایش محتوای پیام در اعلان</string>
|
<string name="pref_show_notification_content">نمایش محتوای پیام در اعلان</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_notification_content_explain">نمایش ارسال کننده و اولین کلمات پیام در اعلان</string>
|
<string name="pref_show_notification_content_explain">نمایش ارسال کننده و اولین کلمات پیام در اعلان</string>
|
||||||
<string name="pref_led_color"> LED رنگ</string>
|
<string name="pref_led_color"> LED رنگ</string>
|
||||||
<string name="pref_sound">صدا</string>
|
<string name="pref_sound">صدا</string>
|
||||||
@@ -749,16 +756,23 @@
|
|||||||
<string name="pref_background">پسزمینه</string>
|
<string name="pref_background">پسزمینه</string>
|
||||||
<string name="pref_background_btn_default">استفاده از تصویر پیشفرض</string>
|
<string name="pref_background_btn_default">استفاده از تصویر پیشفرض</string>
|
||||||
<string name="pref_background_btn_gallery">انتخاب از گالری</string>
|
<string name="pref_background_btn_gallery">انتخاب از گالری</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_imap_folder_warn_disable_defaults">اگر این گزینه را غیر فعال میکنید از اینکه سرور شما و حسابهایتان هم بر این اساس تنظیم شده باشند.\n\n در غیر این صورت ممکن است هیچ چیز کار نکند. </string>
|
<string name="pref_imap_folder_warn_disable_defaults">اگر این گزینه را غیر فعال میکنید از اینکه سرور شما و حسابهایتان هم بر این اساس تنظیم شده باشند.\n\n در غیر این صورت ممکن است هیچ چیز کار نکند. </string>
|
||||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||||
<string name="pref_multidevice">حالت چند دستگاهی</string>
|
<string name="pref_multidevice">حالت چند دستگاهی</string>
|
||||||
<string name="pref_multidevice_explain">همگامسازی پیامهای شما با دیگر دستگاههایتان. در صورت اضافه کردن دستگاه دوم به صورت خودکار فعال میشود.</string>
|
<string name="pref_multidevice_explain">همگامسازی پیامهای شما با دیگر دستگاههایتان. در صورت اضافه کردن دستگاه دوم به صورت خودکار فعال میشود.</string>
|
||||||
<string name="pref_multidevice_change_warn">حالت چند دستگاهی زمانی که از یک نمایه روی چند دستگاه استفاده میکنید باید فعال شود. تنها در صورتی این تنظیم را غیرفعال کنید که این نمایه را از روی همهٔ دیگر دستگاههایتان حذف کردهاید. \n\n غیرفعال کردن حالت چند دستگاهی زمانی که یک نمایه را روی چند دستگاه دارید باعث میشود که بعضی پیامها گم شوند و همچنین مشکلهای دیگری به وجود میآورد.</string>
|
<string name="pref_multidevice_change_warn">حالت چند دستگاهی زمانی که از یک نمایه روی چند دستگاه استفاده میکنید باید فعال شود. تنها در صورتی این تنظیم را غیرفعال کنید که این نمایه را از روی همهٔ دیگر دستگاههایتان حذف کردهاید. \n\n غیرفعال کردن حالت چند دستگاهی زمانی که یک نمایه را روی چند دستگاه دارید باعث میشود که بعضی پیامها گم شوند و همچنین مشکلهای دیگری به وجود میآورد.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_auto_folder_moves">انتقال خودکار به پوشه دلتاچت</string>
|
<string name="pref_auto_folder_moves">انتقال خودکار به پوشه دلتاچت</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_only_fetch_mvbox_title">فقط پوشه دلتاچت را بررسی کن</string>
|
<string name="pref_only_fetch_mvbox_title">فقط پوشه دلتاچت را بررسی کن</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails">نمایش رایانامههای معمولی</string>
|
<string name="pref_show_emails">نمایش رایانامههای معمولی</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_no">نه، فقط گپها</string>
|
<string name="pref_show_emails_no">نه، فقط گپها</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_accepted_contacts">برای مخاطبین پذیرفته شده</string>
|
<string name="pref_show_emails_accepted_contacts">برای مخاطبین پذیرفته شده</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="pref_show_emails_all">همه</string>
|
<string name="pref_show_emails_all">همه</string>
|
||||||
<string name="pref_experimental_features">ویژگیهای آزمایشی</string>
|
<string name="pref_experimental_features">ویژگیهای آزمایشی</string>
|
||||||
<string name="pref_experimental_features_explain">این ویژگیها ممکن است ناپایدار باشند و همچنین ممکن است بعدا تغییر کنند یا حذف شوند</string>
|
<string name="pref_experimental_features_explain">این ویژگیها ممکن است ناپایدار باشند و همچنین ممکن است بعدا تغییر کنند یا حذف شوند</string>
|
||||||
@@ -813,14 +827,17 @@
|
|||||||
<!-- automatically delete message -->
|
<!-- automatically delete message -->
|
||||||
<string name="delete_old_messages">پاک کردن پیامهای قدیمی</string>
|
<string name="delete_old_messages">پاک کردن پیامهای قدیمی</string>
|
||||||
<string name="autodel_device_title">پاک کردن پیامها از دستگاه</string>
|
<string name="autodel_device_title">پاک کردن پیامها از دستگاه</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_title">پاک کردن پیامها از سرور</string>
|
<string name="autodel_server_title">پاک کردن پیامها از سرور</string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||||
<string name="autodel_device_ask">آیا میخواهید %1$d پیام جدید و دریافت شده را در زمان%2$s در آینده پاک کنید؟\n\n• این شامل همه رسانهها هم میشود\n\n• پیامها جدای از اینکه دیده شده باشند یا نه پاک میشوند. \"پیام های ذخیره شده\" شامل این پاک کردن محلی نمیشوند. </string>
|
<string name="autodel_device_ask">آیا میخواهید %1$d پیام جدید و دریافت شده را در زمان%2$s در آینده پاک کنید؟\n\n• این شامل همه رسانهها هم میشود\n\n• پیامها جدای از اینکه دیده شده باشند یا نه پاک میشوند. \"پیام های ذخیره شده\" شامل این پاک کردن محلی نمیشوند. </string>
|
||||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_ask">آیا میخواهید %1$d پیام را اکنون و تمام پیامهای آیندهٔ «%2$s» را پاک کنید؟/n/n⚠️ این شامل رایانامهها، رسانه و «پیامهای ذخیره شده» در همه پوشههای کارساز(سرور) میشود/n/n⚠️ اگر میخواهید دادهها در کارساز باقی بمانند از این قابلیت استفاده نکنید/n/n⚠️ اگر بهجز دلتاچت از دیگر نرمافزارهای رایانامه هم استفاده میکنید این قابلیت را به کار نگیرید.</string>
|
<string name="autodel_server_ask">آیا میخواهید %1$d پیام را اکنون و تمام پیامهای آیندهٔ «%2$s» را پاک کنید؟/n/n⚠️ این شامل رایانامهها، رسانه و «پیامهای ذخیره شده» در همه پوشههای کارساز(سرور) میشود/n/n⚠️ اگر میخواهید دادهها در کارساز باقی بمانند از این قابلیت استفاده نکنید/n/n⚠️ اگر بهجز دلتاچت از دیگر نرمافزارهای رایانامه هم استفاده میکنید این قابلیت را به کار نگیرید.</string>
|
||||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_enabled_hint">این شامل رایانامهها، رسانهها و «پیامهای ذخیره شده» در تمام پوشههای کارساز(سرور) میشود. اگر میخواهید دادهها را در کارساز نگه دارید از این قابلیت استفاده نکنید. اگر از دیگر نرمافزارهای رایانامه بهجز دلتاچت استفاده میکنید هم از این قابلیت استفاده نکنید.</string>
|
<string name="autodel_server_enabled_hint">این شامل رایانامهها، رسانهها و «پیامهای ذخیره شده» در تمام پوشههای کارساز(سرور) میشود. اگر میخواهید دادهها را در کارساز نگه دارید از این قابلیت استفاده نکنید. اگر از دیگر نرمافزارهای رایانامه بهجز دلتاچت استفاده میکنید هم از این قابلیت استفاده نکنید.</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device_title">فعالسازی حذف بلافاصله</string>
|
<string name="autodel_server_warn_multi_device_title">فعالسازی حذف بلافاصله</string>
|
||||||
|
<!-- deprecated -->
|
||||||
<string name="autodel_server_warn_multi_device">اگر حذف بلافاصله را فعال کنید، نمیتوانید این نمایه را روی چند دستگاه داشته باشید.</string>
|
<string name="autodel_server_warn_multi_device">اگر حذف بلافاصله را فعال کنید، نمیتوانید این نمایه را روی چند دستگاه داشته باشید.</string>
|
||||||
<string name="autodel_confirm">متوجه هستم، همه پیامها حذف شوند</string>
|
<string name="autodel_confirm">متوجه هستم، همه پیامها حذف شوند</string>
|
||||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||||
@@ -910,7 +927,7 @@
|
|||||||
<string name="learn_more">بیشتر بدانید</string>
|
<string name="learn_more">بیشتر بدانید</string>
|
||||||
|
|
||||||
<string name="devicemsg_self_deleted">شما گپ «پیامهای ذخیره شده» را پاک کردید.\n\nℹ️ برای استفادهٔ دوباره از «پیامهای ذخیره شده» کافی است یک گپ جدید با خودتان درست کنید. </string>
|
<string name="devicemsg_self_deleted">شما گپ «پیامهای ذخیره شده» را پاک کردید.\n\nℹ️ برای استفادهٔ دوباره از «پیامهای ذخیره شده» کافی است یک گپ جدید با خودتان درست کنید. </string>
|
||||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
<!-- deprecated -->
|
||||||
<string name="devicemsg_storage_exceeding"> ⚠️ میزان فضای در دسترس کارساز رایانامه شما در حال تمام شدن است. %1$s از %% استفاده شده است. اگر فضا کاملا پر شده باشد دیگر امکان دریافت پیام را نخواهید داشت. 👈 لطفا پیامهای قدیمی در رایانامه خود را از طریق نسخهٔ وب رایانامه پاک کنید. همچنین میتوانید گزینه پاک کردن پیامهای قدیمی در دلتاچت را فعال نمایید. هروقت خواستید میتوانید فضای در دسترس را از «تنظیمها / اتصالها» بررسی کنید. </string>
|
<string name="devicemsg_storage_exceeding"> ⚠️ میزان فضای در دسترس کارساز رایانامه شما در حال تمام شدن است. %1$s از %% استفاده شده است. اگر فضا کاملا پر شده باشد دیگر امکان دریافت پیام را نخواهید داشت. 👈 لطفا پیامهای قدیمی در رایانامه خود را از طریق نسخهٔ وب رایانامه پاک کنید. همچنین میتوانید گزینه پاک کردن پیامهای قدیمی در دلتاچت را فعال نمایید. هروقت خواستید میتوانید فضای در دسترس را از «تنظیمها / اتصالها» بررسی کنید. </string>
|
||||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||||
<string name="devicemsg_bad_time">هشدار⚠️ به نظر میرسد زمان و تاریخ دستگاه شما دقیق نیست(%1$s). ساعت دستگاه خود را تنظیم کنید ⏰🔧 تا پیامها به درستی دریافت شوند. </string>
|
<string name="devicemsg_bad_time">هشدار⚠️ به نظر میرسد زمان و تاریخ دستگاه شما دقیق نیست(%1$s). ساعت دستگاه خود را تنظیم کنید ⏰🔧 تا پیامها به درستی دریافت شوند. </string>
|
||||||
@@ -1073,7 +1090,6 @@
|
|||||||
<string name="a11y_message_context_menu_btn_label">عملیاتهای پیام</string>
|
<string name="a11y_message_context_menu_btn_label">عملیاتهای پیام</string>
|
||||||
<string name="a11y_background_preview_label">پیشنمایش پسزمینه</string>
|
<string name="a11y_background_preview_label">پیشنمایش پسزمینه</string>
|
||||||
<string name="a11y_disappearing_messages_activated">پیامهای ناپدید شونده فعال شدند</string>
|
<string name="a11y_disappearing_messages_activated">پیامهای ناپدید شونده فعال شدند</string>
|
||||||
|
|
||||||
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
<!-- iOS specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||||
<string name="stop_sharing_location">توقف اشتراک موقعیت مکانی</string>
|
<string name="stop_sharing_location">توقف اشتراک موقعیت مکانی</string>
|
||||||
<string name="a11y_voice_message_hint_ios">پس از ضبط کردن برای ارسال دوبار ضربه بزنید. برای حذف و رد ضبط کردن با دو انگشت خود بکشید. </string>
|
<string name="a11y_voice_message_hint_ios">پس از ضبط کردن برای ارسال دوبار ضربه بزنید. برای حذف و رد ضبط کردن با دو انگشت خود بکشید. </string>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user