Compare commits

...

119 Commits

Author SHA1 Message Date
adbenitez e1c92712a0 Merge remote-tracking branch 'upstream/main' 2025-02-04 16:18:00 +01:00
adb 6ec0f1bfce Merge pull request #3580 from deltachat/adb/issue-3566
align avatar to message bubble instead of parent bottom
2025-02-03 23:41:12 +01:00
adbenitez db410d8b44 align avatar to message bubble instead of parent bottom 2025-02-03 23:08:32 +01:00
B. Petersen cd07f3de96 update translations 2025-02-03 11:58:06 +01:00
B. Petersen 12072a0342 'exiting' may be misleading as others can create new groups with blocked contacts. try to clarify that aspect 2025-02-03 11:51:58 +01:00
B. Petersen c6f3761bb9 simplify unblock wording, it is somehow clear it is the opposite, other apps do not even clarify one way 2025-02-03 11:51:58 +01:00
B. Petersen 673f0e78b1 be more clear about the impact of blocked contacts 2025-02-03 11:51:58 +01:00
B. Petersen 65c8960ec8 update translations 2025-02-03 11:45:19 +01:00
adb 089ecc67d1 Merge pull request #3576 from deltachat/r10s/empty-apps-wording
tweak wording in empty "all apps" and "all files" views
2025-02-03 00:49:01 +01:00
B. Petersen 0f84af5b32 adapt empty-hint also for 'files' 2025-02-02 18:52:31 +01:00
B. Petersen 710ed6dd56 in 'All Apps' tap, do not say 'Media will be shared here', but 'Apps will be shown here' 2025-02-02 18:37:49 +01:00
adb 335aabd4ff Merge pull request #3570 from deltachat/adb/update-changelog-31/1/25
update changelog header for v1.52.1
2025-02-01 00:24:47 +01:00
adbenitez 98c97a8aed update changelog header for v1.52.1 2025-01-31 22:24:44 +01:00
adbenitez 23d18d2ac5 Merge remote-tracking branch 'upstream/main' 2025-01-31 21:28:47 +01:00
adbenitez a136b8b1e5 update version 2025-01-31 21:28:08 +01:00
adbenitez 7f8b71cf28 tweak attachment selector layout temporarily 2025-01-31 21:27:19 +01:00
adbenitez 9e5f2b18b9 update .github/FUNDING.yml 2025-01-31 19:50:37 +01:00
adbenitez bdfeddecd5 add "get it on google play" 2025-01-31 14:19:32 +01:00
B. Petersen 23cbe63cd4 update translations 2025-01-31 12:37:57 +01:00
B. Petersen f0f53455a5 do not deprecate string for smoother adaption of other OS 2025-01-31 12:26:09 +01:00
B. Petersen d8b49f57a9 always colorize 'Reset' as destructive-red 2025-01-31 12:26:09 +01:00
B. Petersen 7eaaf3bbb4 refine QR reset wording 2025-01-31 12:26:09 +01:00
adbenitez d4f83cd38b Merge remote-tracking branch 'upstream/main' 2025-01-30 02:03:47 +01:00
adbenitez 9eca5f518e disable location streaming for now 2025-01-30 02:02:42 +01:00
B. Petersen d17bed02e6 update translations 2025-01-29 14:47:03 +01:00
B. Petersen b4b194a59b add app-picker-strings needed for iOS 2025-01-29 14:47:03 +01:00
adb c6f62a2b81 Merge pull request #3565 from deltachat/prep-1.52.1
Prep 1.52.1
2025-01-28 17:24:22 +01:00
adbenitez e3a9f42a56 update changelog 2025-01-28 17:23:56 +01:00
adb 323bcef1fe Update CHANGELOG.md
Co-authored-by: Hocuri <hocuri@gmx.de>
2025-01-28 17:13:54 +01:00
adbenitez 095b92b498 bump version number 2025-01-28 16:50:46 +01:00
adbenitez 18c2ccd66c update changelog 2025-01-28 16:36:39 +01:00
adb 28fdeac01c Merge pull request #3564 from deltachat/update-core-and-stuff-28/1/25
Update translations and core to 1.155.1
2025-01-28 16:31:11 +01:00
adbenitez a7e4267b9b update translations 2025-01-28 16:28:24 +01:00
adbenitez d6837aa121 update deltachat-core-rust to 'chore(release): prepare for 1.155.1' of 'v1.155.1' 2025-01-28 16:25:23 +01:00
adbenitez 5a2913b36f delete unused file 2025-01-28 02:37:25 +01:00
adbenitez 20180fa89c Merge remote-tracking branch 'upstream/main' 2025-01-27 22:06:04 +01:00
Hocuri c6b89055d8 File deduplication, Android part (#3513) 2025-01-27 18:40:44 +01:00
adb bfda7ab2c3 Merge pull request #3562 from deltachat/adb/remove-android-crop-dep
remove unused com.soundcloud.android:android-crop dependency
2025-01-27 18:13:04 +01:00
adb 953ce32bea Merge branch 'main' into adb/remove-android-crop-dep 2025-01-27 17:40:34 +01:00
adbenitez 961fa5ffe6 remove unused com.soundcloud.android:android-crop dependency 2025-01-27 17:37:14 +01:00
adbenitez b1b2959bcb add .github/FUNDING.yml 2025-01-26 05:23:27 +01:00
link2xt 70ef715dc6 build(nix): update build tools from 33.0.1 to 34.0.0 2025-01-25 13:48:41 +00:00
adbenitez ffa58aae34 update bots index 2025-01-24 22:09:54 +01:00
adbenitez 24f5209c03 always create protected groups 2025-01-24 20:34:49 +01:00
adbenitez 7fd96732d6 Merge remote-tracking branch 'upstream/main' 2025-01-24 20:27:40 +01:00
adb 6e0759f719 Merge pull request #3560 from deltachat/prep-1.52.0
prepare 1.52.0
2025-01-23 23:37:01 +01:00
adbenitez 63434e1e2f prepare 1.52.0 2025-01-23 20:03:59 +01:00
adb 9c17bc412a Merge pull request #3559 from deltachat/update-core-and-stuff-23/1/25
Update core and stuff 23/1/25
2025-01-23 19:21:15 +01:00
adb d40144d50c Merge branch 'main' into update-core-and-stuff-23/1/25 2025-01-23 19:19:43 +01:00
adbenitez 131c0f5a37 update strings 2025-01-23 19:17:18 +01:00
adbenitez 7086314d8b update deltachat-core-rust to 'chore(release): prepare for 1.155.0' of 'v1.155.0' 2025-01-23 19:11:11 +01:00
adb d75b2c2bb7 Merge pull request #3558 from deltachat/adb/issue-3557
pass account ID in chat shortcuts and properly switch to account
2025-01-23 13:23:00 +01:00
adbenitez c46d174869 update strings 2025-01-23 05:37:55 +01:00
adbenitez 17e03f2903 update buid.gradle 2025-01-23 04:38:58 +01:00
adbenitez 2c12a34051 improve instant onboarding 2025-01-23 04:33:23 +01:00
adbenitez 2d3dde2101 pass account ID in chat shortcuts and properly switch to account 2025-01-23 03:45:57 +01:00
adbenitez d539f5ecf2 Merge remote-tracking branch 'upstream/main' 2025-01-23 02:45:56 +01:00
adbenitez b17d6be4fc update build.gradle 2025-01-23 00:52:48 +01:00
B. Petersen 3c737f2360 streamline help menu
- use clear "Delta Chat Homepage" for opening our homepage
  (instead of unclear "Learn more about Delta Chat",
  which is esp. weird, when used from inside the help)

- do not "promote" GitHub in our menu entry,
  instead of "Contribute on GitHub", just say "Contribute".
  destination URL is our contribute page then -
  that is also more useful for ppl doing eg. translations
2025-01-23 00:51:06 +01:00
adb 9ac5e714b8 Merge pull request #3555 from deltachat/adb/update-deps-22/1/25
update some dependencies
2025-01-22 13:40:08 +01:00
adbenitez 94defa3091 update some dependencies 2025-01-22 01:43:21 +01:00
adbenitez 052ada221e update some deps 2025-01-22 01:42:21 +01:00
adbenitez 1d5e4cf2a9 update README 2025-01-22 00:54:00 +01:00
adbenitez c46aef3ea0 Merge remote-tracking branch 'upstream/main' 2025-01-22 00:52:57 +01:00
adb d30e141693 Merge pull request #3554 from deltachat/adb/issue-3542
avoid crash in MediaPreviewActivity.onPageUnselected
2025-01-21 20:09:51 +01:00
adb 305940396e Merge branch 'main' into adb/issue-3542 2025-01-21 19:39:33 +01:00
adbenitez 2ab567a9d3 use Log instead of stack trace 2025-01-21 19:38:43 +01:00
adb a9c488ff03 Merge pull request #3365 from deltachat/adb/issue-3361
revert #3177
2025-01-21 19:01:18 +01:00
adbenitez 8817b50c95 avoid crash in MediaPreviewActivity.onPageUnselected 2025-01-21 18:56:59 +01:00
adb 84c3710a35 Merge pull request #3553 from deltachat/adb/issue-3550
avoid ANR in ConversationFragment.manageMessageSeenState()
2025-01-21 18:51:00 +01:00
adbenitez be7be9bba4 avoid ANR in ConversationFragment.manageMessageSeenState() 2025-01-21 18:13:54 +01:00
adb b50ae284fb Merge pull request #3551 from deltachat/adb/issue-3549
fix: make animated webp animated again
2025-01-21 17:38:52 +01:00
adbenitez 97716d5c26 fix: make animated webp animated again 2025-01-21 16:57:03 +01:00
bjoern e77253c843 update translations (#3548)
* add string 'Unsave'

* pull translations
2025-01-20 15:14:54 +01:00
adbenitez 6aed8d003f deprecate string 2025-01-18 20:53:56 +01:00
adbenitez 0083e60c49 revert #3177 2025-01-18 20:53:56 +01:00
adbenitez 0fc79fd845 Merge remote-tracking branch 'upstream/main' 2025-01-18 20:39:03 +01:00
B. Petersen a7c3bc7ac5 add missing desktop strings 2025-01-17 17:40:35 +01:00
B. Petersen 83b16e5f4b do not force ppl to create blank issues
see https://github.com/deltachat/deltachat-ios/pull/2525
for screenshots and reasoning
2025-01-17 10:39:10 +01:00
adbenitez ee17c6d75e Merge remote-tracking branch 'upstream/main' 2025-01-16 21:10:25 +01:00
adb c0525ac69c Merge pull request #3544 from deltachat/adb/issue-3543
avoid null in attachment filename
2025-01-16 20:42:41 +01:00
adbenitez e9d2a39098 avoid null in attachment filename 2025-01-16 20:03:43 +01:00
adb 4d6fd16767 Merge pull request #3541 from deltachat/adb/issue-3540
avoid race condition in onPlayerStateChanged inside AudioSlidePlayer.requestDuration
2025-01-16 14:55:07 +01:00
adb b398870823 Merge pull request #3535 from deltachat/adb/issue-3534
fix IntentUtils.showBrowserIntent() and use it everywhere
2025-01-15 21:02:01 +01:00
adbenitez e68c50d614 avoid race condition in onPlayerStateChanged inside AudioSlidePlayer.requestDuration 2025-01-15 20:56:32 +01:00
adbenitez f6a27718a2 rename showBrowserIntent to showInBrowser 2025-01-15 20:33:16 +01:00
Hocuri f136fa3e3a Update the core submodule so that we can have nightlies again (#3539)
* Remove jsonrpc feature

* Update submodule to latest main
2025-01-15 16:18:43 +00:00
Hocuri 8e55a3dbf3 fix: Use getFilename() instead of the actual filename on disk (#3521)
* fix: Use msg.getFilename() instead of the file's name in some cases

* fix: Use msg.getFilename() instead of the file's name in initializeDraft()

* fix: Use msg.getFilename() instead of the file's name in MediaItem

* fix: Use the correct file name in MediaView

* refactor: `msg` param of `getManuallyCalculatedSlideInfo()` was always null

* Improve comment

* Revert "refactor: `msg` param of `getManuallyCalculatedSlideInfo()` was always null"

We will unfortunately need getManuallyCalculatedSlideInfo() with `msg`
param

This reverts commit 60e8248db32dc22812d3f23da194bab644802045.

* fix: Fix drafting images

This fixes a bug introduced in 14f69f87e8b11a7d0568e58593946a1f1c01e75e:
When you drafted an image, pressed Back, and opened the chat again, then
the height of the drafted image was wrong and tapping the image opened a
preview for the wrong image.

I do think that theoretically it would be nicer to use getSlideForMsg
here, because we already have a DcMsg, but this didn't work because a)
the width and height wasn't gotten from the msg and instead 0 was passed
and b) the code tries to save a msgId instead of the message instead,
and loading the message from the database fails later since it's just a
draft.

I didn't want to try and fix these things, because they might be bigger
refactorings and I don't know the code.

* fix: Use the original message's filemime if there is one

...instead of trying to guess the mimetype from the uri
2025-01-15 16:40:23 +01:00
B. Petersen 923227a0e8 update translations 2025-01-14 11:49:07 +01:00
adbenitez 14ecafe0e2 fix IntentUtils.showBrowserIntent() and use it everywhere 2025-01-11 19:45:37 +01:00
adb b93f8323ab Merge pull request #3532 from deltachat/prep-1.50.5
prepare 1.50.5 release
2025-01-10 19:37:38 +01:00
adbenitez 77f43cde9a prepare 1.50.5 release 2025-01-10 18:48:53 +01:00
adb e4d018393d Merge pull request #3531 from deltachat/adb/update-translations-10/01/25
update translations
2025-01-10 18:44:58 +01:00
adbenitez 9a816090de Merge remote-tracking branch 'upstream/main' 2025-01-10 18:44:47 +01:00
adbenitez 4b04aa65be update translations 2025-01-10 18:42:31 +01:00
B. Petersen 489bb55788 detach Android and iOS releases 2025-01-10 17:26:16 +01:00
adb 9d244611bc Merge pull request #3526 from deltachat/adb/issue-3525
use synchronized block to avoid IllegalMonitorStateException
2025-01-10 16:06:13 +01:00
Hocuri 3533916149 Put the synchronized around the whole while loop 2025-01-10 11:05:44 +01:00
adbenitez 46bc3e7f72 Merge remote-tracking branch 'upstream/main' 2025-01-10 01:36:50 +01:00
adbenitez ed0f0107e3 update to new gplay app id and key 2025-01-10 01:31:42 +01:00
adbenitez a855d7043a fix FetchForegroundService 2025-01-10 00:49:30 +01:00
adbenitez 66fd795763 try to fix CI 2025-01-09 19:06:15 +01:00
B. Petersen 05da43484f remove deprecated strings 2025-01-09 19:03:21 +01:00
adbenitez a58de2278b use synchronized block to avoid IllegalMonitorStateException 2025-01-09 18:36:12 +01:00
adbenitez 6743df23e9 update google-services.json 2025-01-09 18:01:16 +01:00
bjoern 35ec0d05e2 update translations (#3524)
* add new iOS notification strings

* update translations
2025-01-09 16:08:18 +01:00
bjoern 6ead7207ec update translations (#3522)
* update translations

* add new iOS widget strings

* add hints for terms 'Shortcut' and 'Widget'

* update translations
2025-01-09 15:26:42 +01:00
adbenitez 0d5223036d Merge remote-tracking branch 'upstream/main' 2025-01-07 16:36:45 +01:00
adbenitez 640fc433b8 add gdpr.md 2025-01-07 16:29:03 +01:00
adb 3390b865e0 Merge pull request #3519 from deltachat/prep-1.50.4
Prep 1.50.4
2025-01-06 15:40:55 +01:00
adbenitez 883486da9c tweak changelog 2025-01-06 15:26:49 +01:00
adbenitez d048203f45 update version number 2025-01-06 15:19:17 +01:00
adbenitez f9d70d1196 update changelog 2025-01-06 15:18:54 +01:00
adb 4413b7b4fb Merge pull request #3518 from deltachat/update-core-and-stuff-6/1/25
Update translations and core to v1.153.0
2025-01-06 14:58:14 +01:00
adbenitez 7a4f263a62 update translations 2025-01-06 14:55:55 +01:00
adbenitez 1a360d5282 update deltachat-core-rust to 'chore(release): prepare for 1.153.0' of 'v1.153.0' 2025-01-06 14:16:09 +01:00
Hocuri dc785fc116 fix: Remove long stacktrace that flooded the logcat (#3512)
Everytime I attached an image, I got a super long stacktrace in the
logcat. I found it to be [this problem](https://stackoverflow.com/questions/71746801/getting-failed-to-inflate-colorstatelist-leaving-it-to-the-framework-when-usi)
and applied the fix described there.
2025-01-04 19:13:45 +01:00
adb 884be3a93e Merge pull request #3516 from deltachat/adb/avoid-npe-in-reactions
avoid NullPointerException when using result of Rpc.getMsgReactions
2025-01-04 16:02:49 +01:00
adbenitez 9a25328787 avoid NullPointerException when using result of Rpc.getMsgReactions 2025-01-04 12:50:25 +01:00
128 changed files with 1796 additions and 1637 deletions
+3
View File
@@ -0,0 +1,3 @@
ko_fi: adbenitez
liberapay: adbenitez
custom: "https://arcanechat.me/#contribute"
+1 -1
View File
@@ -1 +1 @@
blank_issues_enabled: true
blank_issues_enabled: false
+1 -1
View File
@@ -51,7 +51,7 @@ jobs:
run: ./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
- name: Upload APK
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: app-preview.apk
path: 'build/outputs/apk/foss/debug/*.apk'
+7 -6
View File
@@ -49,11 +49,12 @@ jobs:
- name: Build APK
run: |
mkdir -p ~/.gradle
echo -n ${{ secrets.SIGNING_KEY }} | base64 -d >> ~/app.keystore
echo "DC_RELEASE_STORE_FILE=$HOME/app.keystore" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_STORE_PASSWORD=${{ secrets.KEY_STORE_PASSWORD }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS=${{ secrets.ALIAS }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_PASSWORD=${{ secrets.KEY_PASSWORD }}" >> ~/.gradle/gradle.properties
echo -n ${{ secrets.KEYSTORE_FILE }} | base64 -d >> ~/keystore.jks
echo "DC_RELEASE_STORE_FILE=$HOME/keystore.jks" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_STORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS_FDROID=${{ secrets.ALIAS_FDROID }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS_GPLAY=${{ secrets.ALIAS_GPLAY }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> ~/.gradle/gradle.properties
./gradlew assembleFossRelease
rm build/outputs/apk/foss/release/*universal*
./gradlew assembleGplayRelease
@@ -63,7 +64,7 @@ jobs:
uses: softprops/action-gh-release@v1
with:
token: "${{ secrets.GITHUB_TOKEN }}"
body: '[<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-IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="48">](https://apt.izzysoft.de/fdroid/index/apk/chat.delta.lite) [<img src="store/get-it-on-apklis.png" alt="Disponible en Apklis" height="48">](https://www.apklis.cu/application/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-IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="48">](https://apt.izzysoft.de/fdroid/index/apk/chat.delta.lite) [<img src="store/get-it-on-apklis.png" alt="Disponible en Apklis" height="48">](https://www.apklis.cu/application/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)'
prerelease: ${{ contains(github.event.ref, '-beta') }}
fail_on_unmatched_files: true
files: build/outputs/apk/foss/release/*.apk
+43
View File
@@ -1,5 +1,48 @@
# ArcaneChat Android Changelog
## v1.52.1
2025-01
* the app now requires less storage on your SD card by deduplicating newly received/sent files
* some small bug fixes
* update translations
* update to core 1.155.1
## v1.52.0
2025-01
* new group consistency algorithm
* fix: don't show animated .webp stickers as static stickers
* fix the chat shortcuts (created via long-press in launcher) to properly support multi-profile
* fix some small bugs in certain android versions and special situations
* avoid the app freezing in slow phones in some situations
* improve menu in the help screen
* update translations
* update to core 1.155.0
## v1.50.5
2025-01
* fix push-notifications handling for certain devices where it was not working correctly
* update translations
* using core 1.153.0
## v1.50.4
2025-01
* properly send as animated stickers GIF files selected from keyboard
* improve emoji picker in landscape mode and when changing from landscape to portrait
* avoid crash when receiving push notifications if the user restricted the app from working in background
* improve UI when attaching a file or image to easily recognize it is attached but not sent yet
* avoid slow loading of in-chat apps in some devices when quickly re-opening an app after closing it
* allow to select multiple images at once in the media picker via "Gallery" button
* mark holiday notice messages as bot-generated
* don't mark contacts as bot when receiving location-only and sync messages
* prefer to encrypt even if peers have their preference to "no preference"
* start ephemeral messages timers when the chat is archived or noticed
* several bug fixes and updated translations
* update to core 1.153.0
## v1.50.3
2024-12
+2 -1
View File
@@ -1,7 +1,8 @@
## ArcaneChat Android Client
A [Delta Chat](https://delta.chat/) client for Android.
A [Delta Chat](https://delta.chat/) client for Android. Learn more at: https://arcanechat.me
[<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-IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="48">](https://apt.izzysoft.de/fdroid/index/apk/chat.delta.lite)
[<img src="store/get-it-on-apklis.png" alt="Disponible en Apklis" height="48">](https://www.apklis.cu/application/chat.delta.lite)
+43 -25
View File
@@ -1,5 +1,5 @@
plugins {
id 'com.android.application' version '8.1.4'
id 'com.android.application' version '8.5.2'
id 'com.google.gms.google-services' version '4.4.1'
}
@@ -33,8 +33,8 @@ android {
useLibrary 'org.apache.http.legacy'
defaultConfig {
versionCode 30000702
versionName "1.50.6"
versionCode 30000708
versionName "1.52.2"
applicationId "chat.delta.lite"
multiDexEnabled true
@@ -87,15 +87,45 @@ android {
storeFile file(DC_DEBUG_STORE_FILE )
}
}
release {
releaseFdroid {
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
storeFile file(DC_RELEASE_STORE_FILE)
storePassword DC_RELEASE_STORE_PASSWORD
keyAlias DC_RELEASE_KEY_ALIAS
keyAlias DC_RELEASE_KEY_ALIAS_FDROID
keyPassword DC_RELEASE_KEY_PASSWORD
}
}
releaseApk {
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
storeFile file(DC_RELEASE_STORE_FILE)
storePassword DC_RELEASE_STORE_PASSWORD
keyAlias DC_RELEASE_KEY_ALIAS_GPLAY
keyPassword DC_RELEASE_KEY_PASSWORD
}
}
releaseBundle {
if(project.hasProperty("DC_BUNDLE_STORE_FILE")) {
storeFile file(DC_BUNDLE_STORE_FILE)
storePassword DC_BUNDLE_STORE_PASSWORD
keyAlias DC_BUNDLE_KEY_ALIAS
keyPassword DC_BUNDLE_STORE_PASSWORD
}
}
}
productFlavors {
foss {
dimension "none"
buildConfigField "boolean", "USE_PLAY_SERVICES", "false"
}
gplay {
dimension "none"
apply plugin: "com.google.gms.google-services"
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
applicationId "com.github.arcanechat"
}
}
buildTypes {
@@ -114,23 +144,12 @@ android {
// nb: it is highly recommended to use the same settings in debug+release -
// otherwise problems might be noticed delayed only
minifyEnabled true
signingConfig signingConfigs.release
productFlavors.foss.signingConfig signingConfigs.releaseFdroid
productFlavors.gplay.signingConfig signingConfigs.releaseApk
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
productFlavors {
foss {
dimension "none"
buildConfigField "boolean", "USE_PLAY_SERVICES", "false"
}
gplay {
dimension "none"
apply plugin: "com.google.gms.google-services"
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
}
}
if(!project.hasProperty("ABI_FILTER")) {
splits {
abi {
@@ -190,7 +209,7 @@ dependencies {
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
implementation 'androidx.sharetarget:sharetarget:1.2.0'
implementation 'androidx.webkit:webkit:1.11.0'
implementation 'androidx.webkit:webkit:1.12.1'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'com.google.android.material:material:1.12.0'
@@ -210,7 +229,7 @@ dependencies {
implementation 'com.google.guava:guava:31.1-android'
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // plays video and audio
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
implementation 'com.google.zxing:core:3.3.0' // fixed version to support SDK<24
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library
@@ -218,14 +237,13 @@ dependencies {
implementation "me.leolin:ShortcutBadger:1.1.16" // display messagecount on the home screen icon.
implementation 'com.jpardogo.materialtabstrip:library:1.0.9' // used in the emoji selector for the tab selection.
implementation 'com.github.chrisbanes:PhotoView:2.1.3' // does the zooming on photos / media
implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.25.0' // APNG & animated webp support.
implementation 'com.github.penfeizhou.android.animation:glide-plugin:3.0.2' // APNG & animated webp support.
implementation 'com.caverock:androidsvg-aar:1.4' // SVG support.
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
annotationProcessor 'androidx.annotation:annotation:1.8.2'
annotationProcessor 'androidx.annotation:annotation:1.9.1'
implementation 'com.makeramen:roundedimageview:2.1.0' // crops the avatars to circles
implementation 'com.pnikosis:materialish-progress:1.5' // used only in the "Progress Wheel" in Share Activity.
implementation 'com.soundcloud.android:android-crop:1.0.1@aar' // used for profile and group avatar selection in Android SDK<19
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
// the one-letter circle for the contacts (when there is not avatar) and a white background.
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
@@ -240,7 +258,7 @@ dependencies {
// <https://github.com/cketti/SafeContentResolver>
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v14:1.0.0'
gplayImplementation('com.google.firebase:firebase-messaging:24.0.0') { // for PUSH notifications
gplayImplementation('com.google.firebase:firebase-messaging:24.1.0') { // for PUSH notifications
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
@@ -254,7 +272,7 @@ dependencies {
testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1'
testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1'
androidTestImplementation 'androidx.test:runner:1.6.1'
androidTestImplementation 'androidx.test:runner:1.6.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.6.1'
androidTestImplementation 'androidx.test:rules:1.6.1'
+1 -1
View File
@@ -15,7 +15,7 @@
pkgs = import nixpkgs { inherit system overlays; };
android-sdk = android.sdk.${system} (sdkPkgs:
with sdkPkgs; [
build-tools-33-0-1
build-tools-34-0-0
cmdline-tools-latest
platform-tools
platforms-android-34
+4 -4
View File
@@ -28,7 +28,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:6f54e2c4e49405673e2bb9",
"android_client_info": {
"package_name": "chat.delta.lite.beta"
"package_name": "com.github.arcanechat.beta"
}
},
"oauth_client": [],
@@ -47,7 +47,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:aff82fbc40c8172e3e2bb9",
"android_client_info": {
"package_name": "chat.delta.lite"
"package_name": "com.github.arcanechat"
}
},
"oauth_client": [],
@@ -66,7 +66,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:92b4cf12669cc2083e2bb9",
"android_client_info": {
"package_name": "com.github.arcanechat"
"package_name": "chat.delta.lite"
}
},
"oauth_client": [],
@@ -85,7 +85,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:228a205b8aa2bacc3e2bb9",
"android_client_info": {
"package_name": "com.github.arcanechat.beta"
"package_name": "chat.delta.lite.beta"
}
},
"oauth_client": [],
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+12
View File
@@ -1667,6 +1667,18 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobj
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setFileAndDeduplicate(JNIEnv *env, jobject obj, jstring file, jstring name, jstring filemime)
{
CHAR_REF(file);
CHAR_REF(name);
CHAR_REF(filemime);
dc_msg_set_file_and_deduplicate(get_dc_msg(env, obj), filePtr, namePtr, filemimePtr);
CHAR_UNREF(filemime);
CHAR_UNREF(name);
CHAR_UNREF(file);
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setDimension(JNIEnv *env, jobject obj, int width, int height)
{
dc_msg_set_dimension(get_dc_msg(env, obj), width, height);
+4 -4
View File
@@ -126,7 +126,7 @@ if test -z $1 || test $1 = armeabi-v7a; then
TARGET_CC="$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi --features jsonrpc
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi
cp $CARGO_TARGET_DIR/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
fi
@@ -135,7 +135,7 @@ if test -z $1 || test $1 = arm64-v8a; then
TARGET_CC="$TOOLCHAIN/bin/aarch64-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi --features jsonrpc
cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
fi
@@ -144,7 +144,7 @@ if test -z $1 || test $1 = x86; then
TARGET_CC="$TOOLCHAIN/bin/i686-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi --features jsonrpc
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
fi
@@ -153,7 +153,7 @@ fi
TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi --features jsonrpc
cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
fi
-1
View File
@@ -30,7 +30,6 @@ echo ""
echo "and now: here is Delta Chat $VERSION - choose your flavour and mind your backups:"
echo "- 🍋 https://download.delta.chat/android/beta/deltachat-gplay-release-$VERSION.apk (google play candidate, overwrites existing installs, should keep data)"
echo "- 🍉 https://download.delta.chat/android/beta/deltachat-foss-debug-$VERSION.apk (f-droid candidate, can be installed beside google play)"
echo "- 🍏 https://testflight.apple.com/join/uEMc1NxS (ios, update to $VERSION may take a day or so)"
echo ""
echo "what to test: PLEASE_FILL_OUT"
@@ -93,7 +93,7 @@ public class SharingTest {
}
}
Uri uri = Uri.parse("content://" + BuildConfig.APPLICATION_ID + ".attachments/" + Uri.encode(pngImage));
DcHelper.sharedFiles.put("/" + pngImage, 1);
DcHelper.sharedFiles.put(pngImage, 1);
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("image/png");
-3
View File
@@ -20,7 +20,6 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
@@ -329,8 +328,6 @@
android:theme="@style/TextSecure.ScribbleTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
<activity android:name=".InstantOnboardingActivity"
android:theme="@style/TextSecure.LightTheme"
android:windowSoftInputMode="stateHidden|adjustResize"
+9 -8
View File
@@ -599,16 +599,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -621,14 +621,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+8 -8
View File
@@ -557,16 +557,15 @@ an irgendein System, das an der Zustellung von Push-Benachrichtigungen beteiligt
<ul>
<li>
<p>Eine Delta-Chat-Anwendung erhält lokal ein „Geräte-Token“ (eine zufällige Zahl) und speichert es
<p>Eine Delta-Chat-Anwendung erhält lokal ein „Geräte-Token“, verschlüsselt und speichert es
auf dem <a href="https://delta.chat/chatmail">Chatmail</a>-Server.</p>
</li>
<li>
<p>Wenn ein <a href="https://delta.chat/chatmail">Chatmail</a>-Server eine E-Mail für einen Delta-Chat-Benutzer erhält
erhält, leitet er den „Geräte-Token an den zentralen Delta-Chat-Benachrichtigungs-Proxy weiter.</p>
erhält, leitet er das verschlüsselte Geräte-Token an den zentralen Delta-Chat-Benachrichtigungs-Proxy weiter.</p>
</li>
<li>
<p>Der zentrale Delta-Chat-Benachrichtigungs-Proxy leitet
das „Geräte-Token“ an den jeweiligen Push-Dienst (Apple, Google, etc.) weiter,
<p>Der zentrale Delta-Chat-Benachrichtigungs-Proxy entschlüsselt das Geräte-Token und leitet es an den jeweiligen Push-Dienst (Apple, Google, etc.) weiter,
ohne jemals die IP- oder E-Mail-Adresse des Delta-Chat-Benutzers zu kennen.</p>
</li>
<li>
@@ -578,14 +577,15 @@ und auch nie den Inhalt einer Nachricht (auch nicht in verschlüsselter Form).</
</li>
</ul>
<p>Stand Mai 2024 kennen die Chatmail-Server die Geräte-Token,
aber wir planen, diese Informationen an den Benachrichtigungs-Proxy zu verschlüsseln
zu verschlüsseln, so dass der Chatmail-Server niemals das „Geräte-Token“ erfährt.</p>
<p>Der zentrale Delta-Chat-Benachrichtigungs-Proxy <a href="https://github.com/deltachat/notifiers">ist klein und vollständig in Rust implementiert</a>
und vergisst die Geräte-Token, sobald Apple/Google/etc. sie verarbeitet hat,
normalerweise innerhalb weniger Millisekunden.</p>
<p>Beachten Sie, dass das Geräte-Token zwischen Anwendungen und dem Benachrichtigungs-Proxy verschlüsselt,
aber nicht signiert ist.
Der Benachrichtigungs-Proxy sieht also niemals E-Mail-Adressen, IP-Adressen oder
irgendwelche kryptografischen Identitätsinformationen, die mit dem Gerät oder dem Geräte-Token eines Nutzers verbunden sind.</p>
<p>Aufgrund dieses umfassenden Datenschutzkonzepts würde sogar die Beschlagnahmung eines Chatmail-Servers,
oder die vollständige Beschlagnahmung des zentralen Delta-Chat-Benachrichtigungsproxys
keine privaten Informationen preisgeben, die den zentralen Push-Diensten nicht bereits vorliegen.</p>
+9 -8
View File
@@ -603,16 +603,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -625,14 +625,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+9 -8
View File
@@ -597,16 +597,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -619,14 +619,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+40 -39
View File
@@ -8,7 +8,7 @@
<li><a href="#delta-chat-prend-il-en-charge-les-images-vidéos-et-autres-pièces-jointes-">Delta Chat prend-il en charge les images, vidéos et autres pièces jointes ?</a></li>
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
<li><a href="#qui-peut-voir-ma-photo-de-profil-">Qui peut voir ma photo de profil ?</a></li>
<li><a href="#signature">Can I set a Bio/Signature/Status/Motto with Delta Chat?</a></li>
<li><a href="#signature">Puis-je afficher une Bio/Signature ou un Status/Motto avec Delta Chat?</a></li>
<li><a href="#que-signifient-épingler-sourdine-et-archiver-">Que signifient “épingler”, “sourdine” et “archiver” ?</a></li>
<li><a href="#que-signifie-le-point-vert-">Que signifie le point vert ?</a></li>
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
@@ -115,14 +115,14 @@
</h2>
<p>Delta Chat is a reliable, decentralized and secure messaging app,
available for mobile and desktop platforms.</p>
<p>Delta Chat est une application de messagerie fiable, décentralisée et sécurisée,
Disponible pour les plateformes smartphone et ordinateurs de bureau.</p>
<p>Delta Chat feels like Whatsapp or Telegram but you can also use and regard it as an e-mail app.
You can signup anonymously to a variety of <a href="https://delta.chat/chatmail">interoperable chatmail servers</a>
which are minimal e-mail servers optimized for fast and secure operations.
Or you may use classic e-mail servers and an existing e-mail account
in which case Delta Chat acts as an e-mail app.</p>
<p>Delta Chat ressemble à Whatsapp ou Telegram mais vous pouvez aussi lutiliser et la considérer comme une application e-mail.
Vous pouvez vous inscrire anonymement à une variété <a href="https://delta.chat/chatmail">de serveurs chatmail interéopérables</a>
Qui sont des serveurs e-mails minimalistes optimisés pour des opérations rapides et sécurisées.
Ou vous pouvez utiliser des serveurs e-mail classiques et utiliser votre compte e-mail
dans ce cas Delta Chat agit comme une application de courriel.</p>
<p><img style="float:right; width:50%; max-width:360%; margin:1em;" src="../delta-what-optim.png" /></p>
@@ -134,15 +134,15 @@ in which case Delta Chat acts as an e-mail app.</p>
</h3>
<p>To securely setup contact with others <a href="#howtoe2ee">scan an invite QR code
or share an invite link</a>.
This is required when using a (default) chatmail-based chat profile
because chatmail servers reject un-encrypted outgoing messages.</p>
<p>Pour établir un contact en toute sécurité avec dautres personnes <a href="#howtoe2ee">scanner un code QR dinvitation
ou partager un lien dinvitation</a>.
Cette opération est nécessaire lors de lutilisation dun profil de discussion basé sur le chatmail (par défaut).
car les serveurs de chatmail rejettent les messages sortants non chiffrés.</p>
<p>If you create a chat profile with a classic e-mail address
you may manually create a contact if you know their e-mail address
and then write a message to them
even if the recipient is not using Delta Chat.</p>
<p>Si vous créez un profil discussion avec une adresse courriel classique
vous pouvez créer manuellement un contact si vous connaissez son adresse courriel
et lui écrire un message
même si le destinataire nutilise pas Delta Chat.</p>
<h3 id="quels-sont-les-avantages-de-delta-chat-par-rapport-aux-autres-messageries-">
@@ -154,23 +154,23 @@ even if the recipient is not using Delta Chat.</p>
<ul>
<li>
<p>Anonymous chat profiles with fast, secure and interoperable <a href="https://delta.chat/chatmail">chatmail servers</a>
which offer instant Push Notifications for iOS and Android devices.</p>
<p>Profils anonymes de discussion avec des <a href="https://delta.chat/chatmail">serveurs de chatmail</a> rapides, sécurisés et interopérables
qui offrent des notifications push instantanées pour les appareils iOS et Android.</p>
</li>
<li>
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and multi-device support on all platforms.</p>
<p>Fonctionnalités de <a href="#multiple-accounts">multi-profil</a> et de multi-appareil supportées sur toutes les plateformes.</p>
</li>
<li>
<p>Interactive <a href="https://webxdc.org/apps">web apps in chats</a> for gaming and collaboration</p>
<p><a href="https://webxdc.org/apps">web apps dans les chats</a> interactifs pour le gaming et la collaboration</p>
</li>
<li>
<p><a href="#security-audits">Audited end-to-end encryption</a>
safe against network and server attacks.</p>
<p><a href="#security-audits">Chiffrement de bout en bout audité</a>
contre les attaques ciblées sur le réseau et les serveurs.</p>
</li>
<li>
<p>Free and Open Source software, both app and server side.
Built on <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">E-mail and Web Internet Standards</a>,
<a href="https://xkcd.com/927/">to avoid “yet another standard syndrome (xkcd 927)</a></p>
<p>Logiciel libre et open source, à la fois appli et côté serveur.
Construit sur des <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">Standards dInternet et de-mail</a>,
<a href="https://xkcd.com/927/">pour éviter le syndrome du “standard de plus” (xkcd 927)</a></p>
</li>
</ul>
@@ -256,16 +256,16 @@ that tend to cause unsolicited messages (“spam”) sooner or later.</p>
<h3 id="signature">
Can I set a Bio/Signature/Status/Motto with Delta Chat? <a href="#signature" class="anchor"></a>
Puis-je afficher une Bio/Signature ou un Status/Motto avec Delta Chat? <a href="#signature" class="anchor"></a>
</h3>
<p>Yes,
you can do so under <strong>Settings → Profile → Bio</strong>.
Your contacts who use Delta Chat will see it
when they view your contact details.
Moreover, it will appear as a classic e-mail signature.</p>
<p>Oui,
vous pouvez le faire sous <strong>Paramètres → Profil → Bio</strong>.
Vos contacts qui utilisent Delta Chat le verront
lorsquils consulteront vos coordonnées.
De plus, elle apparaîtra sous la forme dune signature classique sur vos courriels.</p>
<h3 id="que-signifient-épingler-sourdine-et-archiver-">
@@ -578,16 +578,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -600,14 +600,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+9 -8
View File
@@ -603,16 +603,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -625,14 +625,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+12 -11
View File
@@ -597,17 +597,17 @@ a qualsiasi sistema coinvolto nella consegna di Notifiche Push.</p>
<ul>
<li>
<p>Unapp Delta Chat ottiene un “gettone del dispositivo” localmente e lo memorizza
sul server <a href="https://delta.chat/chatmail">chatmail</a>.</p>
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>Quando un server <a href="https://delta.chat/chatmail">chatmail</a> riceve une-mail per un utente Delta Chat
inoltra il “gettone del dispositivo” al proxy di notifica centrale di Delta Chat.</p>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>Il proxy di notifica centrale di Delta Chat inoltra
il “gettone del dispositivo” al rispettivo servizio Push (Apple, Google, ecc.),
senza mai conoscere lIP o lindirizzo e-mail degli utenti Delta Chat.</p>
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
<p>Il Servizio Push centrale (Apple, Google, ecc.)
@@ -619,14 +619,15 @@ e inoltre non vedono mai il contenuto del messaggio (anche non in forma crittogr
</li>
</ul>
<p>A partire da Maggio 2024, i server chatmail conoscono i “gettoni del dispositivo”
ma prevediamo di crittografare queste informazioni nel proxy di notifica
in modo tale che il server chatmail non apprenda mai il gettone del dispositivo.</p>
<p>Il proxy di notifica centrale di Delta Chat <a href="https://github.com/deltachat/notifiers">è piccolo e completamente implementato in Rust</a>
e si dimentica dei gettoni del dispositivo non appena Apple/Google/ecc li elabora,
di solito nel giro di pochi millisecondi.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Come risultato di questo disegno complessivo sulla riservatezza, anche il sequestro di un server chatmail,
o il sequestro totale del proxy di notifica centrale di Delta Chat
non rivelerebbe informazioni private che i servizi Push non abbiano già.</p>
+9 -8
View File
@@ -597,16 +597,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -619,14 +619,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+6 -6
View File
@@ -494,23 +494,23 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<ul>
<li>
<p>Aplikacja Delta Chat uzyskuje lokalnie „token urządzenia” i przechowuje go na serwerze <a href="https://delta.chat/chatmail">chatmail</a>.</p>
<p>Aplikacja Delta Chat uzyskuje lokalnie „token urządzenia”, szyfruje i przechowuje go na serwerze <a href="https://delta.chat/chatmail">chatmail</a>.</p>
</li>
<li>
<p>Kiedy serwer <a href="https://delta.chat/chatmail">chatmail</a> odbierze wiadomość e-mail od użytkownika Delta Chat, przekazuje token urządzenia do centralnego serwera proxy powiadomień Delta Chat.</p>
<p>Kiedy serwer <a href="https://delta.chat/chatmail">chatmail</a> odbierze wiadomość e-mail od użytkownika Delta Chat, przekazuje zaszyfrowany token urządzenia do centralnego serwera proxy powiadomień Delta Chat.</p>
</li>
<li>
<p>Centralny serwer proxy powiadomień Delta Chat przekazuje token urządzenia do odpowiedniej usługi Push (Apple, Google itp.), nie znając nawet adresu IP ani adresu e-mail użytkowników Delta Chat.</p>
<p>Centralny serwer proxy powiadomień Delta Chat deszyfruje token urządzenia i przekazuje go do odpowiedniej usługi Push (Apple, Google itp.), nie znając nawet adresu IP ani adresu e-mail użytkowników Delta Chat.</p>
</li>
<li>
<p>Centralna usługa Push (Apple, Google itp.) budzi aplikację Delta Chat na twoim urządzeniu, aby sprawdzić w tle nowe wiadomości. Nie zna chatmaila ani adresu e-mail urządzenia, na którym się budzi. Centralne usługi push Apple/Google nigdy nie widzą adresu e-mail (nadawcy ani odbiorcy), a także nigdy nie widzą treści wiadomości (również w formie zaszyfrowanej).</p>
</li>
</ul>
<p>Od maja 2024 r. serwery chatmail znają „tokeny urządzenia”, ale planujemy szyfrować te informacje na serwerze proxy powiadomień, tak aby serwer chatmail nigdy nie poznał tokena urządzenia.</p>
<p>Centralny serwer proxy powiadomień Delta Chat <a href="https://github.com/deltachat/notifiers">jest mały i w pełni zaimplementowany w Rust</a> i zapomina o tokenach urządzeń zaraz po ich przetworzeniu przez Apple/Google/itp, zwykle w ciągu kilku milisekund.</p>
<p>Pamiętaj, że token urządzenia jest szyfrowany między aplikacjami a serwerem proxy powiadomień, ale nie jest podpisany. Serwer proxy powiadomień nigdy nie widzi adresów e-mail, adresów IP ani żadnych kryptograficznych informacji identyfikujących powiązanych z urządzeniem użytkownika (tokenem).</p>
<p>W wyniku tego ogólnego projektu ochrony prywatności nawet przejęcie serwera chatmail lub pełne przejęcie centralnego serwera proxy powiadomień Delta Chat nie spowodowałoby ujawnienia prywatnych informacji, których usługi Push jeszcze nie posiadają.</p>
<h3 id="dlaczego-delta-chat-integruje-się-ze-scentralizowanymi-zastrzeżonymi-usługami-push-applegoogle">
@@ -945,7 +945,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</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>
</li>
<li>
<p>W systemie <strong>macOS</strong> włącz „Ustawienia systemowe » Prywatność i bezpieczeństwo » <strong>Sieć lokalna</strong> » Delta Chat”</p>
<p>W systemie <strong>macOS</strong> włącz „Preferencje systemowe » Ochrona i prywatność » <strong>Sieć lokalna</strong> » Delta Chat”</p>
</li>
<li>
<p>Twój system może mieć „zaporę ogniową”, o której wiadomo, że powoduje problemy (szczególnie w systemie Windows).
+9 -8
View File
@@ -597,16 +597,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -619,14 +619,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+9 -8
View File
@@ -600,16 +600,16 @@ Push-уведомления недоступны.</p>
<ul>
<li>
<p>Приложение Delta Chat локально получает “токен устройства” и сохраняет его
<p>Приложение Delta Chat локально получает “токен устройства” шифрует его и сохраняет
на сервере <a href="https://delta.chat/chatmail">chatmail</a>.</p>
</li>
<li>
<p>Когда сервер <a href="https://delta.chat/chatmail">chatmail</a> получает электронную почту для пользователя Delta Chat
он пересылает “токен устройства” центральному прокси-серверу уведомлений Delta Chat.</p>
он пересылает “зашифрованный токен устройства” центральному прокси-серверу уведомлений Delta Chat.</p>
</li>
<li>
<p>Центральный прокси-сервер уведомлений Delta Chat пересылает
“токен устройства” в соответствующую службу Push (Apple, Google и т. д.),
<p>Центральный прокси-сервер уведомлений Delta Chat расшифровывает “токен устройства” и
пересылает его в соответствующую службу Push (Apple, Google и т. д.),
даже не зная IP-адрес или адрес электронной почты пользователей Delta Chat.</p>
</li>
<li>
@@ -622,14 +622,15 @@ Push-уведомления недоступны.</p>
</li>
</ul>
<p>По состоянию на май 2024 года серверы chatmail знают о “токенах устройства”,
но мы планируем зашифровать эту информацию для прокси-сервера уведомлений
так, чтобы сервер chatmail не смог получить доступ к токену устройства.</p>
<p>Центральный прокси-сервер уведомлений Delta Chat <a href="https://github.com/deltachat/notifiers">небольшой и полностью реализован на Rust</a>
забывает о токенах устройств, как только Apple/Google/и т. д. обработали их,
обычно за несколько миллисекунд.</p>
<p>Обратите внимание, что токен устройства шифруется между приложениями и прокси-сервером уведомлений,
но не подписывается.
Прокси-сервер уведомлений не получает доступ к адресам электронной почты, IP-адресам
или криптографическим идентификационным данным устройства пользователя (токену).</p>
<p>В результате такого общего подхода к обеспечению конфиденциальности, даже захват почтового сервера chatmail,
или полный захват центрального прокси-сервера уведомлений Delta Chat
не раскроет конфиденциальную информацию, которой сервисы Push уже не обладают.</p>
+9 -8
View File
@@ -603,16 +603,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -625,14 +625,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+9 -8
View File
@@ -605,16 +605,16 @@ to any system involved in the delivery of Push Notifications.</p>
<ul>
<li>
<p>A Delta Chat app obtains a “device token” locally and stores it
<p>A Delta Chat app obtains a “device token” locally, encrypts it and stores it
on the <a href="https://delta.chat/chatmail">chatmail</a> server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives an e-mail for a Delta Chat user
it forwards the device token to the central Delta Chat notification proxy.</p>
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
</li>
<li>
<p>The central Delta Chat notification proxy forwards
the “device token” to the respective Push service (Apple, Google, etc.),
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or e-mail address of Delta Chat users.</p>
</li>
<li>
@@ -627,14 +627,15 @@ and also never see any message content (also not in encrypted forms).</p>
</li>
</ul>
<p>As of May 2024, chatmail servers know about “device tokens”
but we plan to encrypt this information to the notification proxy
such that the chatmail server never learns the device token.</p>
<p>The central Delta Chat notification proxy <a href="https://github.com/deltachat/notifiers">is small and fully implemented in Rust</a>
and forgets about device-tokens as soon as Apple/Google/etc processed them,
usually in a matter of milliseconds.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees e-mail addresses, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Resulting from this overall privacy design, even the seizure of a chatmail server,
or the full seizure of the central Delta Chat notification proxy
would not reveal private information that Push services do not already have.</p>
+5 -5
View File
@@ -498,23 +498,23 @@ Push-сповіщення автоматично активуються для
<ul>
<li>
<p>Додаток Delta Chat отримує “токен пристрою” локально і зберігає його на сервері <a href="https://delta.chat/chatmail">chatmail</a>.</p>
<p>Додаток Delta Chat отримує “токен пристрою” локально, шифрує його і зберігає на сервері <a href="https://delta.chat/chatmail">chatmail</a>.</p>
</li>
<li>
<p>Коли <a href="https://delta.chat/chatmail">chatmail</a>-сервер отримує електронний лист від користувача Delta Chat він пересилає токен пристрою до центрального проксі-сповіщення Delta Chat.</p>
<p>Коли сервер <a href="https://delta.chat/chatmail">chatmail</a> отримує електронний лист від користувача Delta Chat він пересилає зашифрований токен пристрою до центрального проксі-сервера сповіщень Delta Chat.</p>
</li>
<li>
<p>Центральний проксі-сервер сповіщень Delta Chat пересилає токен пристрою до відповідного Push-сервісу (Apple, Google тощо), навіть не знаючи IP-адреси чи електронної пошти користувачів Delta Chat.</p>
<p>Центральний проксі-сервер сповіщень Delta Chat розшифровує токен пристрою і пересилає його до відповідного Push-сервісу (Apple, Google тощо), навіть не знаючи IP-адреси або електронної пошти користувачів Delta Chat.</p>
</li>
<li>
<p>Центральний Push-сервіс (Apple, Google тощо) запускає додаток Delta Chat на вашому пристрої щоб перевірити наявність нових повідомлень у фоновому режимі. Він не знає про пошту чату або адресу електронної пошти пристрою, який він пробуджує. Центральні служби Apple/Google Push ніколи не бачать адресу електронної пошти (відправника або одержувача) а також ніколи не бачать жодного вмісту повідомлення (навіть в зашифрованому вигляді).</p>
</li>
</ul>
<p>Станом на травень 2024 року chatmail-сервери знають про “токени пристроїв” але ми плануємо зашифрувати цю інформацію для проксі-сповіщень таким чином, щоб сервер чату ніколи не дізнався токен пристрою.</p>
<p>Центральний проксі для сповіщень Delta Chat <a href="https://github.com/deltachat/notifiers">невеликий і повністю реалізований на Rust</a> забуває про токени пристроїв, як тільки Apple/Google/etc обробили їх, зазвичай за лічені мілісекунди.</p>
<p>Зверніть увагу, що токен пристрою шифрується між програмами та проксі-сповіщеннями але не підписується. Таким чином, проксі-служба сповіщень ніколи не бачить адреси електронної пошти, IP-адреси або будь-яку криптографічну ідентифікаційну інформацію, пов’язану з пристроєм користувача (токеном).</p>
<p>В результаті цього загального дизайну конфіденційності, навіть захоплення chatmail-сервера, або повне вилучення центрального проксі-сервера повідомлень Delta Chat не призведе до розкриття приватної інформації, якої ще не мають Push-сервіси.</p>
<h3 id="чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle">
File diff suppressed because it is too large Load Diff
@@ -161,6 +161,7 @@ public class DcMsg {
public native void setHtml (String text);
public native void setFile (String file, String filemime);
public native void forceSticker ();
public native void setFileAndDeduplicate(String file, String name, String filemime);
public native void setDimension (int width, int height);
public native void setDuration (int duration);
public native void setLocation (float latitude, float longitude);
@@ -120,7 +120,6 @@ import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener;
import org.thoughtcrime.securesms.util.guava.Optional;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
import org.thoughtcrime.securesms.util.views.Stub;
import org.thoughtcrime.securesms.video.recode.VideoRecoder;
import org.thoughtcrime.securesms.videochat.VideochatUtil;
@@ -740,8 +739,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
handleReplyMessage(quote);
}
String filename = draft.getFile();
if (filename.isEmpty() || !new File(filename).exists()) {
String file = draft.getFile();
if (file.isEmpty() || !new File(file).exists()) {
future.set(!text.isEmpty());
updateToggleButtonState();
return future;
@@ -761,26 +760,21 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
};
File file = new File(filename);
Uri uri = Uri.fromFile(file);
switch (draft.getType()) {
case DcMsg.DC_MSG_IMAGE:
setMedia(uri, MediaType.IMAGE).addListener(listener);
setMedia(draft, MediaType.IMAGE).addListener(listener);
break;
case DcMsg.DC_MSG_GIF:
setMedia(uri, MediaType.GIF).addListener(listener);
setMedia(draft, MediaType.GIF).addListener(listener);
break;
case DcMsg.DC_MSG_AUDIO:
setMedia(uri, MediaType.AUDIO).addListener(listener);
setMedia(draft, MediaType.AUDIO).addListener(listener);
break;
case DcMsg.DC_MSG_VIDEO:
setMedia(uri, MediaType.VIDEO).addListener(listener);
break;
case DcMsg.DC_MSG_WEBXDC:
setMedia(draft, MediaType.DOCUMENT).addListener(listener);
setMedia(draft, MediaType.VIDEO).addListener(listener);
break;
default:
setMedia(uri, MediaType.DOCUMENT).addListener(listener);
setMedia(draft, MediaType.DOCUMENT).addListener(listener);
break;
}
@@ -1034,7 +1028,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
msg = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
}
String path = attachment.getRealPath(this);
msg.setFile(path, null);
msg.setFileAndDeduplicate(path, attachment.getFileName(), null);
}
}
msg.setText(body);
@@ -1287,7 +1281,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
if (quote.isPresent()) {
msg.setQuote(quote.get().getQuotedMsg());
}
msg.setFile(path, null);
msg.setFileAndDeduplicate(path, null, null);
msg.forceSticker();
dcContext.sendMsg(chatId, msg);
}
@@ -704,7 +704,7 @@ public class ConversationFragment extends MessageSelectorFragment
index++;
}
}
dcContext.markseenMsgs(ids);
Util.runOnAnyBackgroundThread(() -> dcContext.markseenMsgs(ids));
}
@@ -89,7 +89,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
public static final String CLEAR_NOTIFICATIONS = "clear_notifications";
public static final String ACCOUNT_ID_EXTRA = "account_id";
public static final String FROM_WELCOME = "from_welcome";
public static final String WARN_CANNOT_ENCRYPT = "warn_cannot_encrypt";
private ConversationListFragment conversationListFragment;
public TextView title;
@@ -278,11 +277,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
AccountManager.getInstance().switchAccountAndStartActivity(this, accountId);
}
String warnAddr = getIntent().getStringExtra(WARN_CANNOT_ENCRYPT);
if (!TextUtils.isEmpty(warnAddr)) {
DcHelper.showEncryptionRequiredDialog(this, warnAddr);
}
refreshAvatar();
refreshUnreadIndicator();
refreshTitle();
@@ -463,7 +457,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
startActivity(new Intent(this, ProfileActivity.class));
return true;
case R.id.menu_public_bots:
handleShowBot("puente@buzon.uy", "OPENPGP4FPR:4B41E5AFAF78A0C71DB56138D5BEFED00A45F97A#a=puente%40buzon.uy&n=Public%20Bots&i=ZC_oaJtuvJP&s=5SE96rRovsK");
handleShowBot("botsindex@arcanechat.me", "https://i.delta.chat/#67889B0362BEDBFEE05ACD92C1D737FA632A9582&a=botsindex%40arcanechat.me&n=Public%20Bots&i=336MTEz38EH-RJxM9OKWygYK&s=TpVVGK6C4KrJmRG0bwHLalXt");
return true;
}
@@ -30,7 +30,6 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.google.android.material.textfield.TextInputLayout;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.components.AvatarSelector;
import org.thoughtcrime.securesms.components.InputAwareLayout;
@@ -147,10 +146,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
case ScribbleActivity.SCRIBBLE_REQUEST_CODE:
setAvatarView(data.getData());
break;
case Crop.REQUEST_CROP:
setAvatarView(Crop.getOutput(data));
break;
}
}
@@ -17,7 +17,6 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.loader.app.LoaderManager;
import com.b44t.messenger.DcChat;
@@ -26,7 +25,6 @@ import com.b44t.messenger.DcContext;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.components.AvatarSelector;
import org.thoughtcrime.securesms.connect.DcHelper;
@@ -221,22 +219,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
updateGroup(groupName);
} else {
verified = !broadcast && allMembersVerified();
if (verified && getAdapter().getContacts().size() == 1) {
new AlertDialog.Builder(this)
.setMessage(R.string.create_verified_group_ask)
.setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(this, "#e2eeguarantee"))
.setPositiveButton(R.string.yes, (d, w) -> {
createGroup(groupName);
})
.setNegativeButton(R.string.no, (d, w) -> {
verified = false;
createGroup(groupName);
})
.setCancelable(true)
.show();
} else {
createGroup(groupName);
}
createGroup(groupName);
}
return true;
@@ -360,10 +343,6 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
case ScribbleActivity.SCRIBBLE_REQUEST_CODE:
setAvatarView(data.getData());
break;
case Crop.REQUEST_CROP:
setAvatarView(Crop.getOutput(data));
break;
}
}
@@ -41,7 +41,6 @@ import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.components.AvatarSelector;
import org.thoughtcrime.securesms.connect.AccountManager;
@@ -56,6 +55,7 @@ import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints;
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
@@ -71,7 +71,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
private static final String DCACCOUNT = "dcaccount";
private static final String DCLOGIN = "dclogin";
private static final String INSTANCES_URL = "https://delta.chat/chatmail";
private static final String DEFAULT_CHATMAIL_HOST = "nine.testrun.org";
private static final String DEFAULT_CHATMAIL_HOST = "arcanechat.me";
public static final String QR_ACCOUNT_EXTRA = "qr_account_extra";
public static final String FROM_WELCOME = "from_welcome";
@@ -191,10 +191,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
setAvatarView(data.getData());
break;
case Crop.REQUEST_CROP:
setAvatarView(Crop.getOutput(data));
break;
case IntentIntegrator.REQUEST_CODE:
String qrRaw = data.getStringExtra(RegistrationQrActivity.QRDATA_EXTRA);
if (qrRaw == null) {
@@ -333,14 +329,14 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
privacyPolicyBtn.setOnClickListener(view -> {
if (!isDcLogin) {
WebViewActivity.openUrlInBrowser(this, "https://" + providerHost + "/privacy.html");
IntentUtils.showInBrowser(this, "https://" + providerHost + "/privacy.html");
}
});
signUpBtn.setOnClickListener(view -> createProfile());
findViewById(R.id.use_other_server).setOnClickListener((v) -> {
WebViewActivity.openUrlInBrowser(this, INSTANCES_URL);
IntentUtils.showInBrowser(this, INSTANCES_URL);
});
findViewById(R.id.login_button).setOnClickListener((v) -> {
startRegistrationActivity();
@@ -62,16 +62,16 @@ public class LocalHelpActivity extends WebViewActivity
webView.scrollTo(0, 0);
return true;
case R.id.learn_more:
openOnlineUrl("https://delta.chat");
openOnlineUrl("https://arcanechat.me");
return true;
case R.id.privacy_policy:
openOnlineUrl("https://delta.chat/gdpr");
openOnlineUrl("https://arcanechat.me/privacy.html");
return true;
case R.id.contribute:
openOnlineUrl("https://github.com/deltachat/deltachat-android");
openOnlineUrl("https://arcanechat.me/#contribute");
return true;
case R.id.report_issue:
openOnlineUrl("https://github.com/deltachat/deltachat-android/issues");
openOnlineUrl("https://github.com/ArcaneChat/android/issues");
return true;
}
return false;
@@ -207,7 +207,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
messageRecord = null;
long date = getIntent().getLongExtra(DATE_EXTRA, 0);
long size = getIntent().getLongExtra(SIZE_EXTRA, 0);
initialMedia = new MediaItem(null, getIntent().getData(), getIntent().getType(),
initialMedia = new MediaItem(null, getIntent().getData(), null, getIntent().getType(),
DcMsg.DC_MSG_NO_ID, date, size, false);
if (address != null) {
@@ -218,7 +218,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
} else {
messageRecord = dcContext.getMsg(msgId);
initialMedia = new MediaItem(Recipient.fromChat(context, msgId), Uri.fromFile(messageRecord.getFileAsFile()),
messageRecord.getFilemime(), messageRecord.getId(), messageRecord.getDateReceived(),
messageRecord.getFilename(), messageRecord.getFilemime(), messageRecord.getId(), messageRecord.getDateReceived(),
messageRecord.getFilebytes(), messageRecord.isOutgoing());
conversationRecipient = Recipient.fromChat(context, msgId);
}
@@ -232,12 +232,11 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
// if you search for the place where the media are loaded, go to 'onCreateLoader'.
Log.w(TAG, "Loading Part URI: " + initialMedia);
if (messageRecord != null) {
getSupportLoaderManager().restartLoader(0, null, this);
} else {
mediaPager.setAdapter(new SingleItemPagerAdapter(this, GlideApp.with(this),
getWindow(), initialMedia.uri, initialMedia.type, initialMedia.size));
getWindow(), initialMedia.uri, initialMedia.name, initialMedia.type, initialMedia.size));
}
}
@@ -313,7 +312,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private void performSavetoDisk(@NonNull MediaItem mediaItem) {
SaveAttachmentTask saveTask = new SaveAttachmentTask(MediaPreviewActivity.this);
long saveDate = (mediaItem.date > 0) ? mediaItem.date : System.currentTimeMillis();
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Attachment(mediaItem.uri, mediaItem.type, saveDate, null));
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Attachment(mediaItem.uri, mediaItem.type, saveDate, mediaItem.name));
}
private void showInChat() {
@@ -473,9 +472,12 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
MediaItemAdapter adapter = (MediaItemAdapter)mediaPager.getAdapter();
if (adapter != null) {
MediaItem item = adapter.getMediaItemFor(position);
if (item.recipient != null) item.recipient.removeListener(MediaPreviewActivity.this);
try {
MediaItem item = adapter.getMediaItemFor(position);
if (item.recipient != null) item.recipient.removeListener(MediaPreviewActivity.this);
} catch (IllegalArgumentException e) {
Log.w(TAG, "Ignoring invalid position index");
}
adapter.pause(position);
}
}
@@ -486,18 +488,20 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private final GlideRequests glideRequests;
private final Window window;
private final Uri uri;
private final String name;
private final String mediaType;
private final long size;
private final LayoutInflater inflater;
SingleItemPagerAdapter(@NonNull Context context, @NonNull GlideRequests glideRequests,
@NonNull Window window, @NonNull Uri uri, @NonNull String mediaType,
@NonNull Window window, @NonNull Uri uri, @Nullable String name, @NonNull String mediaType,
long size)
{
this.glideRequests = glideRequests;
this.window = window;
this.uri = uri;
this.name = name;
this.mediaType = mediaType;
this.size = size;
this.inflater = LayoutInflater.from(context);
@@ -519,7 +523,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
MediaView mediaView = itemView.findViewById(R.id.media_view);
try {
mediaView.set(glideRequests, window, uri, mediaType, size, true);
mediaView.set(glideRequests, window, uri, name, mediaType, size, true);
} catch (IOException e) {
Log.w(TAG, e);
}
@@ -539,7 +543,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
@Override
public MediaItem getMediaItemFor(int position) {
return new MediaItem(null, uri, mediaType, DcMsg.DC_MSG_NO_ID, -1, -1, true);
return new MediaItem(null, uri, name, mediaType, DcMsg.DC_MSG_NO_ID, -1, -1, true);
}
@Override
@@ -604,7 +608,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
try {
//noinspection ConstantConditions
mediaView.set(glideRequests, window, Uri.fromFile(msg.getFileAsFile()),
mediaView.set(glideRequests, window, Uri.fromFile(msg.getFileAsFile()), msg.getFilename(),
msg.getFilemime(), msg.getFilebytes(), autoplay);
} catch (IOException e) {
Log.w(TAG, e);
@@ -633,6 +637,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
return new MediaItem(Recipient.fromChat(context, msg.getId()),
Uri.fromFile(msg.getFileAsFile()),
msg.getFilename(),
msg.getFilemime(),
msg.getId(),
msg.getDateReceived(),
@@ -655,6 +660,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private static class MediaItem {
private final @Nullable Recipient recipient;
private final @NonNull Uri uri;
private final @Nullable String name;
private final @NonNull String type;
private final int msgId;
private final long date;
@@ -663,6 +669,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private MediaItem(@Nullable Recipient recipient,
@NonNull Uri uri,
@Nullable String name,
@NonNull String type,
int msgId,
long date,
@@ -671,6 +678,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
{
this.recipient = recipient;
this.uri = uri;
this.name = name;
this.type = type;
this.msgId = msgId;
this.date = date;
@@ -111,8 +111,6 @@ public class NewConversationActivity extends ContactSelectionActivity {
int contactId = dcContext.lookupContactIdByAddr(addr);
if (contactId!=0 && dcContext.getChatIdByContactId(contactId)!=0) {
openConversation(dcContext.getChatIdByContactId(contactId));
} else if (contactId == 0 && dcContext.isChatmail()) {
DcHelper.showEncryptionRequiredDialog(this, addr);
} else {
String nameNAddr = contactId == 0 ? addr : dcContext.getContact(contactId).getNameNAddr();
new AlertDialog.Builder(this)
@@ -122,7 +122,13 @@ public class ProfileDocumentsFragment
noMedia.setVisibility(recyclerView.getAdapter().getItemCount() > 0 ? View.GONE : View.VISIBLE);
if (chatId == DC_CHAT_NO_CHAT) {
noMedia.setText(R.string.tab_all_media_empty_hint);
if (showWebxdc) {
noMedia.setText(R.string.all_apps_empty_hint);
} else if (!showAudio){
noMedia.setText(R.string.all_files_empty_hint);
} else {
noMedia.setText(R.string.tab_all_media_empty_hint);
}
} else if (showAudio) {
noMedia.setText(R.string.tab_audio_empty_hint);
} else if (showWebxdc) {
@@ -16,7 +16,6 @@ import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
import static org.thoughtcrime.securesms.connect.DcHelper.getContext;
import static org.thoughtcrime.securesms.service.IPCAddAccountsService.ACCOUNT_DATA;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
@@ -438,7 +437,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
.setPositiveButton(R.string.perm_continue, (dialog, which)-> {
// pass control to browser, we'll be back in business at (**)
activity.oauth2Requested = System.currentTimeMillis();
IntentUtils.showBrowserIntent(activity, oauth2url);
IntentUtils.showInBrowser(activity, oauth2url);
oauth2started.set(true);
})
.setCancelable(false)
@@ -493,11 +492,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
if (provider!=null) {
String url = provider.getOverviewPage();
if(!url.isEmpty()) {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.no_browser_installed, Toast.LENGTH_LONG).show();
}
IntentUtils.showInBrowser(this, url);
} else {
// this should normally not happen
Toast.makeText(this, "ErrProviderWithoutUrl", Toast.LENGTH_LONG).show();
@@ -58,6 +58,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
{
private static final String TAG = ShareActivity.class.getSimpleName();
public static final String EXTRA_ACC_ID = "acc_id";
public static final String EXTRA_CHAT_ID = "chat_id";
public static final String EXTRA_MSG_TYPE = "msg_type";
public static final String EXTRA_MSG_SUBJECT = "msg_subject";
@@ -213,14 +214,10 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
}
private void handleResolvedMedia(Intent intent) {
int accId = intent.getIntExtra(EXTRA_ACC_ID, -1);
int chatId = intent.getIntExtra(EXTRA_CHAT_ID, -1);
String msgType = intent.getStringExtra(EXTRA_MSG_TYPE);
String shortcutId = intent.getStringExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID);
if (chatId == -1 && shortcutId != null) {
chatId = Integer.parseInt(shortcutId);
}
String[] extraEmail = getIntent().getStringArrayExtra(Intent.EXTRA_EMAIL);
/*
usually, external app will try to start "e-mail sharing" intent, providing it:
@@ -259,28 +256,21 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
}
*/
String addr = null;
if(chatId == -1 && extraEmail != null && extraEmail.length > 0) {
addr = extraEmail[0];
final String addr = extraEmail[0];
int contactId = dcContext.lookupContactIdByAddr(addr);
if(contactId != 0 || !dcContext.isChatmail()) {
if(contactId == 0) {
contactId = dcContext.createContact(null, addr);
}
chatId = dcContext.createChatByContactId(contactId);
addr = null;
if(contactId == 0) {
contactId = dcContext.createContact(null, addr);
}
chatId = dcContext.createChatByContactId(contactId);
}
Intent composeIntent;
if (addr != null) {
composeIntent = new Intent(this, ConversationListActivity.class);
composeIntent.putExtra(ConversationListActivity.WARN_CANNOT_ENCRYPT, addr);
startActivity(composeIntent);
} else if (chatId != -1) {
if (accId != -1 && chatId != -1) {
composeIntent = getBaseShareIntent(ConversationActivity.class);
composeIntent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId);
composeIntent.putExtra(ConversationActivity.ACCOUNT_ID_EXTRA, accId);
RelayUtil.setSharedType(composeIntent, msgType);
RelayUtil.setSharedUris(composeIntent, resolvedExtras);
startActivity(composeIntent);
@@ -26,6 +26,7 @@ import androidx.webkit.ProxyController;
import androidx.webkit.ProxyConfig;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.IntentUtils;
public class WebViewActivity extends PassphraseRequiredActionBarActivity
implements SearchView.OnQueryTextListener,
@@ -278,16 +279,8 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
// onBackPressed() can be overwritten by derived classes as needed.
// the default behavior (close the activity) is just fine eg. for Webxdc, Connectivity, HTML-mails
public static void openUrlInBrowser(Context context, String url) {
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
} catch (ActivityNotFoundException e) {
Toast.makeText(context, R.string.no_browser_installed, Toast.LENGTH_LONG).show();
}
}
protected boolean openOnlineUrl(String url) {
openUrlInBrowser(this, url);
IntentUtils.showInBrowser(this, url);
// returning `true` causes the WebView to abort loading
return true;
}
@@ -9,7 +9,6 @@ import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Base64;
@@ -46,6 +45,7 @@ import org.json.JSONObject;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.JsonUtils;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Prefs;
@@ -294,7 +294,7 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
addToHomeScreen(this, dcAppMsg.getId());
return true;
case R.id.source_code:
openUrlInBrowser(this, sourceCodeUrl);
IntentUtils.showInBrowser(this, sourceCodeUrl);
return true;
case R.id.show_in_chat:
showInChat();
@@ -23,6 +23,7 @@ import com.b44t.messenger.rpc.RpcException;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
@@ -68,7 +69,7 @@ public class WebxdcStoreActivity extends PassphraseRequiredActionBarActivity {
}
});
} else {
WebViewActivity.openUrlInBrowser(WebxdcStoreActivity.this, url);
IntentUtils.showInBrowser(WebxdcStoreActivity.this, url);
}
return true;
}
@@ -93,7 +93,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
boolean canGoBack = AccountManager.getInstance().canRollbackAccountCreation(this);
supportActionBar.setDisplayHomeAsUpEnabled(canGoBack);
getSupportActionBar().setTitle(canGoBack? R.string.add_account : R.string.welcome_desktop);
getSupportActionBar().setTitle(canGoBack? R.string.add_account : R.string.app_name);
}
private void registerForEvents() {
@@ -48,7 +48,7 @@ public class AudioRecorder {
ParcelFileDescriptor fds[] = ParcelFileDescriptor.createPipe();
captureUri = blobProvider.create(context, new ParcelFileDescriptor.AutoCloseInputStream(fds[0]),
MediaUtil.AUDIO_AAC, null, null);
MediaUtil.AUDIO_AAC, "voice.aac", null);
audioCodec = new AudioCodec(context);
audioCodec.start(new ParcelFileDescriptor.AutoCloseOutputStream(fds[1]));
@@ -87,11 +87,14 @@ public class AudioSlidePlayer {
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == Player.STATE_READY) {
Util.runOnMain(() -> {
Log.d(TAG, "request duration " + durationCalculator.getDuration());
getListener().onReceivedDuration(Long.valueOf(durationCalculator.getDuration()).intValue());
durationCalculator.release();
durationCalculator.removeListener(this);
durationCalculator = null;
synchronized (AudioSlidePlayer.this) {
if (durationCalculator == null) return;
Log.d(TAG, "request duration " + durationCalculator.getDuration());
getListener().onReceivedDuration(Long.valueOf(durationCalculator.getDuration()).intValue());
durationCalculator.release();
durationCalculator.removeListener(this);
durationCalculator = null;
}
});
}
}
@@ -3,10 +3,8 @@ package org.thoughtcrime.securesms.components;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;
import android.view.Window;
@@ -55,6 +53,7 @@ public class MediaView extends FrameLayout {
public void set(@NonNull GlideRequests glideRequests,
@NonNull Window window,
@NonNull Uri source,
@Nullable String fileName,
@NonNull String mediaType,
long size,
boolean autoplay)
@@ -68,7 +67,7 @@ public class MediaView extends FrameLayout {
imageView.setVisibility(View.GONE);
videoView.get().setVisibility(View.VISIBLE);
videoView.get().setWindow(window);
videoView.get().setVideoSource(new VideoSlide(getContext(), source, size), autoplay);
videoView.get().setVideoSource(new VideoSlide(getContext(), source, fileName, size), autoplay);
} else {
throw new IOException("Unsupported media type: " + mediaType);
}
@@ -29,7 +29,12 @@ public class AttachmentsContentProvider extends ContentProvider {
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
DcContext dcContext = DcHelper.getContext(getContext());
String path = uri.getPath();
// `uri` originally comes from DcHelper.openForViewOrShare() and
// looks like `content://chat.delta.attachments/ef39a39/text.txt`
// where ef39a39 is the file in the blob directory
// and text.txt is the original name of the file, as returned by `msg.getFilename()`.
// `uri.getPathSegments()` returns ["ef39a39", "text.txt"] in this example.
String path = uri.getPathSegments().get(0);
if (!DcHelper.sharedFiles.containsKey(path)) {
throw new FileNotFoundException("File was not shared before.");
}
@@ -284,6 +284,7 @@ public class DcHelper {
DcMsg msg = dcContext.getMsg(msg_id);
String path = msg.getFile();
String filename = msg.getFilename();
String mimeType = msg.getFilemime();
try {
File file = new File(path);
@@ -294,8 +295,11 @@ public class DcHelper {
Uri uri;
if (path.startsWith(dcContext.getBlobdir())) {
uri = Uri.parse("content://" + BuildConfig.APPLICATION_ID + ".attachments/" + Uri.encode(file.getName()));
sharedFiles.put("/" + file.getName(), 1); // as different Android version handle uris in putExtra differently, we also check them on our own
// Build a Uri that will later be passed to AttachmentsContentProvider.openFile().
// The last part needs to be `filename`, i.e. the original, user-visible name of the file,
// so that the external apps show the name of the file correctly.
uri = Uri.parse("content://" + BuildConfig.APPLICATION_ID + ".attachments/" + Uri.encode(file.getName()) + "/" + Uri.encode(filename));
sharedFiles.put(file.getName(), 1); // as different Android version handle uris in putExtra differently, we also check them on our own
} else {
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".fileprovider", file);
@@ -305,7 +309,7 @@ public class DcHelper {
}
if (cmd.equals(Intent.ACTION_VIEW)) {
mimeType = checkMime(path, mimeType);
mimeType = checkMime(filename, mimeType);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, mimeType);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -377,6 +381,13 @@ public class DcHelper {
return mimeType;
}
/**
* Return the path of a not-yet-existing file in the blobdir with roughly the given filename
* and the given extension.
* In many cases, since we're using setFileAndDeduplicate now, this wouldn't be necessary anymore
* and we could just create a file with a random filename,
* but there are a few usages that still need the current behavior (like `openMaps()`).
*/
public static String getBlobdirFile(DcContext dcContext, String filename, String ext) {
filename = FileUtils.sanitizeFilename(filename);
ext = FileUtils.sanitizeFilename(ext);
@@ -494,16 +505,6 @@ public class DcHelper {
.show();
}
public static void showEncryptionRequiredDialog(Context context, String addr) {
new AlertDialog.Builder(context)
.setMessage(context.getString(R.string.encryption_required_for_new_contact, addr))
.setNeutralButton(R.string.learn_more, (d, w) -> openHelp(context, "#howtoe2ee"))
.setNegativeButton(R.string.qrscan_title, (d, w) -> context.startActivity(new Intent(context, QrActivity.class)))
.setPositiveButton(R.string.ok, null)
.setCancelable(true)
.show();
}
public static void openWebxdc(Context context, DcMsg dcMsg) {
JSONObject info = dcMsg.getWebxdcInfo();
if (JsonUtils.optBoolean(info, "community")) {
@@ -125,6 +125,7 @@ public class DirectShareUtil {
Intent intent = new Intent(context, ShareActivity.class);
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(ShareActivity.EXTRA_ACC_ID, dcContext.getAccountId());
intent.putExtra(ShareActivity.EXTRA_CHAT_ID, chat.getId());
Recipient recipient = new Recipient(context, chat);
@@ -23,7 +23,6 @@ import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
@@ -67,7 +66,6 @@ import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.guava.Optional;
import org.thoughtcrime.securesms.util.views.Stub;
@@ -256,11 +254,11 @@ public class AttachmentManager {
return new DocumentSlide(context, msg);
}
else if (PartAuthority.isLocalUri(uri)) {
return getManuallyCalculatedSlideInfo(uri, width, height);
return getManuallyCalculatedSlideInfo(uri, width, height, msg);
} else {
Slide result = getContentResolverSlideInfo(uri, width, height, chatId);
if (result == null) return getManuallyCalculatedSlideInfo(uri, width, height);
if (result == null) return getManuallyCalculatedSlideInfo(uri, width, height, msg);
else return result;
}
} catch (IOException e) {
@@ -361,16 +359,21 @@ public class AttachmentManager {
return null;
}
private @NonNull Slide getManuallyCalculatedSlideInfo(Uri uri, int width, int height) throws IOException {
private @NonNull Slide getManuallyCalculatedSlideInfo(Uri uri, int width, int height, @Nullable DcMsg msg) throws IOException {
long start = System.currentTimeMillis();
Long mediaSize = null;
String fileName = null;
String mimeType = null;
if (msg != null) {
fileName = msg.getFilename();
mimeType = msg.getFilemime();
}
if (PartAuthority.isLocalUri(uri)) {
mediaSize = PartAuthority.getAttachmentSize(context, uri);
fileName = PartAuthority.getAttachmentFileName(context, uri);
mimeType = PartAuthority.getAttachmentContentType(context, uri);
if (fileName == null) fileName = PartAuthority.getAttachmentFileName(context, uri);
if (mimeType == null) mimeType = PartAuthority.getAttachmentContentType(context, uri);
}
if (mediaSize == null) {
@@ -675,10 +678,10 @@ public class AttachmentManager {
}
switch (this) {
case IMAGE: return new ImageSlide(context, uri, dataSize, width, height);
case GIF: return new GifSlide(context, uri, dataSize, width, height);
case IMAGE: return new ImageSlide(context, uri, fileName, dataSize, width, height);
case GIF: return new GifSlide(context, uri, fileName, dataSize, width, height);
case AUDIO: return new AudioSlide(context, uri, dataSize, false, fileName);
case VIDEO: return new VideoSlide(context, uri, dataSize);
case VIDEO: return new VideoSlide(context, uri, fileName, dataSize);
case DOCUMENT:
// We have to special-case Webxdc slides: The user can interact with them as soon as a draft
// is set. Therefore we need to create a DcMsg already now.
@@ -687,7 +690,7 @@ public class AttachmentManager {
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_WEBXDC);
Attachment attachment = new UriAttachment(uri, null, MediaUtil.WEBXDC, AttachmentDatabase.TRANSFER_PROGRESS_STARTED, 0, 0, 0, fileName, null, false);
String path = attachment.getRealPath(context);
msg.setFile(path, MediaUtil.WEBXDC);
msg.setFileAndDeduplicate(path, fileName, MediaUtil.WEBXDC);
dcContext.setDraft(chatId, msg);
return new DocumentSlide(context, msg);
}
@@ -14,8 +14,8 @@ public class GifSlide extends ImageSlide {
super(context, dcMsg);
}
public GifSlide(Context context, Uri uri, long size, int width, int height) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.IMAGE_GIF, size, width, height, uri, null, false));
public GifSlide(Context context, Uri uri, String fileName, long size, int width, int height) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.IMAGE_GIF, size, width, height, uri, fileName, false));
}
@Override
@@ -39,8 +39,8 @@ public class ImageSlide extends Slide {
super(context, attachment);
}
public ImageSlide(Context context, Uri uri, long size, int width, int height) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.IMAGE_JPEG, size, width, height, uri, null, false));
public ImageSlide(Context context, Uri uri, String fileName, long size, int width, int height) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.IMAGE_JPEG, size, width, height, uri, fileName, false));
}
@Override
@@ -15,8 +15,6 @@ import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.model.UnitModelLoader;
import com.bumptech.glide.module.AppGlideModule;
import com.bumptech.glide.request.RequestOptions;
import com.github.penfeizhou.animation.glide.AnimationDecoderOption;
import com.caverock.androidsvg.SVG;
@@ -42,7 +40,6 @@ public class SignalGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setLogLevel(Log.ERROR);
builder.setDefaultRequestOptions(new RequestOptions().set(AnimationDecoderOption.DISABLE_ANIMATION_APNG_DECODER, true));
// builder.setDiskCache(new NoopDiskCacheFactory());
}
@@ -30,16 +30,16 @@ import java.io.File;
public class VideoSlide extends Slide {
private static Attachment constructVideoAttachment(Context context, Uri uri, long dataSize)
private static Attachment constructVideoAttachment(Context context, Uri uri, String fileName, long dataSize)
{
Uri thumbnailUri = Uri.fromFile(new File(DcHelper.getBlobdirFile(DcHelper.getContext(context), "temp-preview.jpg")));
MediaUtil.ThumbnailSize retWh = new MediaUtil.ThumbnailSize(0, 0);
MediaUtil.createVideoThumbnailIfNeeded(context, uri, thumbnailUri, retWh);
return constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, retWh.width, retWh.height, thumbnailUri, null, false);
return constructAttachmentFromUri(context, uri, MediaUtil.VIDEO_UNSPECIFIED, dataSize, retWh.width, retWh.height, thumbnailUri, fileName, false);
}
public VideoSlide(Context context, Uri uri, long dataSize) {
super(context, constructVideoAttachment(context, uri, dataSize));
public VideoSlide(Context context, Uri uri, String fileName, long dataSize) {
super(context, constructVideoAttachment(context, uri, fileName, dataSize));
}
public VideoSlide(Context context, DcMsg dcMsg) {
@@ -12,7 +12,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.b44t.messenger.DcContext;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
@@ -72,6 +72,9 @@ public class PersistentBlobProvider {
@Nullable String fileName)
{
final long id = System.currentTimeMillis();
if (fileName == null) {
fileName = "file." + MediaUtil.getExtensionFromMimeType(mimeType);
}
return create(context, new ByteArrayInputStream(blobBytes), id, mimeType, fileName, (long) blobBytes.length);
}
@@ -81,6 +84,9 @@ public class PersistentBlobProvider {
@Nullable String fileName,
@Nullable Long fileSize)
{
if (fileName == null) {
fileName = "file." + MediaUtil.getExtensionFromMimeType(mimeType);
}
return create(context, input, System.currentTimeMillis(), mimeType, fileName, fileSize);
}
@@ -113,9 +113,12 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
menu.clear();
getMenuInflater().inflate(R.menu.qr_show, menu);
menu.findItem(R.id.new_classic_contact).setVisible(!DcHelper.getContext(this).isChatmail());
Util.redMenuItem(menu, R.id.withdraw);
if(tabLayout.getSelectedTabPosition() == TAB_SCAN) {
menu.findItem(R.id.withdraw).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
@@ -99,7 +99,7 @@ public class QrCodeHandler {
showDoneToast(activity);
});
if (rawString.toLowerCase().startsWith("http")) {
builder.setNeutralButton(R.string.open, (d, b) -> IntentUtils.showBrowserIntent(activity, rawString));
builder.setNeutralButton(R.string.open, (d, b) -> IntentUtils.showInBrowser(activity, rawString));
}
builder.setNegativeButton(R.string.cancel, null);
builder.setCancelable(false);
@@ -115,35 +115,27 @@ public class QrCodeHandler {
break;
case DcContext.DC_QR_WITHDRAW_VERIFYCONTACT:
builder.setMessage(activity.getString(R.string.withdraw_verifycontact_explain));
builder.setPositiveButton(R.string.withdraw_qr_code, (dialog, which) -> {
case DcContext.DC_QR_WITHDRAW_VERIFYGROUP:
String message = qrParsed.getState() == DcContext.DC_QR_WITHDRAW_VERIFYCONTACT ? activity.getString(R.string.withdraw_verifycontact_explain)
: activity.getString(R.string.withdraw_verifygroup_explain, qrParsed.getText1());
builder.setTitle(R.string.qrshow_title);
builder.setMessage(message);
builder.setNeutralButton(R.string.reset, (dialog, which) -> {
dcContext.setConfigFromQr(rawString);
});
builder.setNegativeButton(R.string.cancel, null);
break;
builder.setPositiveButton(R.string.ok, null);
AlertDialog withdrawDialog = builder.show();
Util.redButton(withdrawDialog, AlertDialog.BUTTON_NEUTRAL);
return;
case DcContext.DC_QR_REVIVE_VERIFYCONTACT:
builder.setMessage(activity.getString(R.string.revive_verifycontact_explain));
builder.setPositiveButton(R.string.revive_qr_code, (dialog, which) -> {
dcContext.setConfigFromQr(rawString);
});
builder.setNegativeButton(R.string.cancel, null);
break;
case DcContext.DC_QR_WITHDRAW_VERIFYGROUP:
builder.setMessage(activity.getString(R.string.withdraw_verifygroup_explain, qrParsed.getText1()));
builder.setPositiveButton(R.string.withdraw_qr_code, (dialog, which) -> {
dcContext.setConfigFromQr(rawString);
});
builder.setNegativeButton(R.string.cancel, null);
break;
case DcContext.DC_QR_REVIVE_VERIFYGROUP:
builder.setMessage(activity.getString(R.string.revive_verifygroup_explain, qrParsed.getText1()));
builder.setPositiveButton(R.string.revive_qr_code, (dialog, which) -> {
builder.setTitle(R.string.qrshow_title);
builder.setMessage(activity.getString(R.string.revive_verifycontact_explain));
builder.setNeutralButton(R.string.revive_qr_code, (dialog, which) -> {
dcContext.setConfigFromQr(rawString);
});
builder.setNegativeButton(R.string.cancel, null);
builder.setPositiveButton(R.string.ok, null);
break;
default:
@@ -182,7 +174,7 @@ public class QrCodeHandler {
final String url = qrParsed.getText1();
String msg = String.format(activity.getString(R.string.qrscan_contains_url), url);
builder.setMessage(msg);
builder.setPositiveButton(R.string.open, (dialog, which) -> IntentUtils.showBrowserIntent(activity, url));
builder.setPositiveButton(R.string.open, (dialog, which) -> IntentUtils.showInBrowser(activity, url));
builder.setNegativeButton(android.R.string.cancel, null);
builder.setNeutralButton(R.string.menu_copy_to_clipboard, (dialog, which) -> {
Util.writeTextToClipboard(activity, url);
@@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Util;
public class QrShowActivity extends AppCompatActivity {
@@ -68,6 +69,7 @@ public class QrShowActivity extends AppCompatActivity {
menu.findItem(R.id.new_classic_contact).setVisible(false);
menu.findItem(R.id.paste).setVisible(false);
menu.findItem(R.id.load_from_image).setVisible(false);
Util.redMenuItem(menu, R.id.withdraw);
return super.onCreateOptionsMenu(menu);
}
@@ -139,15 +139,19 @@ public class QrShowFragment extends Fragment implements DcEventCenter.DcEventDel
public void withdrawQr() {
Activity activity = getActivity();
String message = chatId == 0 ? activity.getString(R.string.withdraw_verifycontact_explain)
: activity.getString(R.string.withdraw_verifygroup_explain, dcContext.getChat(chatId).getName());
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage(activity.getString(R.string.withdraw_verifycontact_explain));
builder.setPositiveButton(R.string.withdraw_qr_code, (dialog, which) -> {
builder.setTitle(R.string.withdraw_qr_code);
builder.setMessage(message);
builder.setPositiveButton(R.string.reset, (dialog, which) -> {
DcContext dcContext = DcHelper.getContext(activity);
dcContext.setConfigFromQr(dcContext.getSecurejoinQr(chatId));
activity.finish();
});
builder.setNegativeButton(R.string.cancel, null);
builder.create().show();
AlertDialog dialog = builder.show();
Util.redPositiveButton(dialog);
}
public void showInviteLinkDialog() {
@@ -16,6 +16,7 @@ import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcMsg;
import com.b44t.messenger.rpc.Reactions;
import com.b44t.messenger.rpc.Rpc;
import com.b44t.messenger.rpc.RpcException;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcHelper;
@@ -124,12 +125,14 @@ public class AddReactionView extends LinearLayout {
String result = null;
try {
final Reactions reactions = rpc.getMsgReactions(dcContext.getAccountId(), msgToReactTo.getId());
final Map<Integer, String[]> reactionsByContact = reactions.getReactionsByContact();
final String [] selfReactions = reactionsByContact.get(DcContact.DC_CONTACT_ID_SELF);
if (selfReactions != null && selfReactions.length > 0) {
result = selfReactions[0];
if (reactions != null) {
final Map<Integer, String[]> reactionsByContact = reactions.getReactionsByContact();
final String [] selfReactions = reactionsByContact.get(DcContact.DC_CONTACT_ID_SELF);
if (selfReactions != null && selfReactions.length > 0) {
result = selfReactions[0];
}
}
} catch(Exception e) {
} catch(RpcException e) {
e.printStackTrace();
}
return result;
@@ -16,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
import com.b44t.messenger.rpc.Reactions;
import com.b44t.messenger.rpc.RpcException;
import org.thoughtcrime.securesms.ProfileActivity;
@@ -85,17 +86,20 @@ public class ReactionsDetailsFragment extends DialogFragment implements DcEventC
int accId = DcHelper.getContext(requireActivity()).getAccountId();
try {
Map<Integer, String[]> reactionsByContact = DcHelper.getRpc(requireActivity()).getMsgReactions(accId, msgId).getReactionsByContact();
final Reactions reactions = DcHelper.getRpc(requireActivity()).getMsgReactions(accId, msgId);
ArrayList<Pair<Integer, String>> contactsReactions = new ArrayList<>();
String[] selfReactions = reactionsByContact.remove(DcContact.DC_CONTACT_ID_SELF);
for (Integer contact: reactionsByContact.keySet()) {
for (String reaction: reactionsByContact.get(contact)) {
contactsReactions.add(new Pair<>(contact, reaction));
if (reactions != null) {
Map<Integer, String[]> reactionsByContact = reactions.getReactionsByContact();
String[] selfReactions = reactionsByContact.remove(DcContact.DC_CONTACT_ID_SELF);
for (Integer contact: reactionsByContact.keySet()) {
for (String reaction: reactionsByContact.get(contact)) {
contactsReactions.add(new Pair<>(contact, reaction));
}
}
}
if (selfReactions != null) {
for (String reaction: selfReactions) {
contactsReactions.add(new Pair<>(DcContact.DC_CONTACT_ID_SELF, reaction));
if (selfReactions != null) {
for (String reaction: selfReactions) {
contactsReactions.add(new Pair<>(DcContact.DC_CONTACT_ID_SELF, reaction));
}
}
}
adapter.changeData(contactsReactions);
@@ -49,12 +49,14 @@ public final class FetchForegroundService extends Service {
// The background fetch was successful, but we need to wait until all events were processed.
// After all events were processed, we will get DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE,
// and stop() will be called.
while (fetchingSynchronously) {
try {
// The `wait()` needs to be enclosed in a while loop because there may be
// "spurious wake-ups", i.e. `wait()` may return even though `notifyAll()` wasn't called.
STOP_NOTIFIER.wait();
} catch (InterruptedException ex) { }
synchronized (STOP_NOTIFIER) {
while (fetchingSynchronously) {
try {
// The `wait()` needs to be enclosed in a while loop because there may be
// "spurious wake-ups", i.e. `wait()` may return even though `notifyAll()` wasn't called.
STOP_NOTIFIER.wait();
} catch (InterruptedException ex) {}
}
}
}
}
@@ -63,7 +65,9 @@ public final class FetchForegroundService extends Service {
public static void stop(Context context) {
if (fetchingSynchronously) {
fetchingSynchronously = false;
STOP_NOTIFIER.notifyAll();
synchronized (STOP_NOTIFIER) {
STOP_NOTIFIER.notifyAll();
}
}
synchronized (SERVICE_LOCK) {
@@ -2,14 +2,18 @@ package org.thoughtcrime.securesms.util;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.widget.Toast;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.R;
import java.util.List;
public class IntentUtils {
@@ -19,9 +23,13 @@ public class IntentUtils {
return resolveInfoList != null && resolveInfoList.size() > 1;
}
public static void showBrowserIntent(Context context, String url) {
public static void showInBrowser(Context context, String url) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
context.startActivity(browserIntent);
try {
context.startActivity(browserIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, R.string.no_browser_installed, Toast.LENGTH_LONG).show();
}
}
public static int FLAG_MUTABLE() {
@@ -58,18 +58,14 @@ public class LongClickCopySpan extends ClickableSpan {
String addr = prepareUrl(url);
Activity activity = (Activity) widget.getContext();
DcContext dcContext = DcHelper.getContext(activity);
int contactId = dcContext.lookupContactIdByAddr(addr);
DcContact contact = (contactId != 0)? dcContext.getContact(contactId) : null;
if (contact != null && !contact.isBlocked() && dcContext.getChatIdByContactId(contactId) != 0) {
DcContact contact = dcContext.getContact(dcContext.createContact(null, addr));
if (contact.getId() != 0 && !contact.isBlocked() && dcContext.getChatIdByContactId(contact.getId()) != 0) {
openChat(activity, contact);
} else if (contact == null && dcContext.isChatmail()) {
DcHelper.showEncryptionRequiredDialog(activity, addr);
} else {
String nameNAddr = contact != null ? contact.getNameNAddr() : addr;
new AlertDialog.Builder(activity)
.setMessage(activity.getString(R.string.ask_start_chat_with, nameNAddr))
.setMessage(activity.getString(R.string.ask_start_chat_with, contact.getNameNAddr()))
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
openChat(activity, contact == null? dcContext.getContact(dcContext.createContact(null, addr)) : contact);
openChat(activity, contact);
})
.setNegativeButton(R.string.cancel, null)
.show();
@@ -87,7 +83,7 @@ public class LongClickCopySpan extends ClickableSpan {
QrCodeHandler qrCodeHandler = new QrCodeHandler(activity);
qrCodeHandler.handleQrData(url);
} else {
IntentUtils.showBrowserIntent(widget.getContext(), url);
IntentUtils.showInBrowser(widget.getContext(), url);
}
}
}
@@ -172,7 +172,7 @@ public class Prefs {
}
public static boolean isLocationStreamingEnabled(Context context) {
return true;
return false;
}
public static boolean isDeveloperModeEnabled(Context context) {
@@ -122,7 +122,7 @@ public class SendRelayedMessageUtil {
}
if (uri != null) {
message.setFile(getRealPathFromUri(context, uri), mimeType);
setFileFromUri(context, uri, message, mimeType);
}
if (html != null) {
message.setHtml(html);
@@ -136,11 +136,12 @@ public class SendRelayedMessageUtil {
return message;
}
private static String getRealPathFromUri(Context context, Uri uri) throws NullPointerException {
private static void setFileFromUri(Context context, Uri uri, DcMsg message, String mimeType) {
String path;
DcContext dcContext = DcHelper.getContext(context);
String filename = "cannot-resolve.jpg"; // best guess, this still leads to most images being workable if OS does weird things
try {
String filename = "cannot-resolve.jpg"; // best guess, this still leads to most images being workable if OS does weird things
if (PartAuthority.isLocalUri(uri)) {
filename = uri.getPathSegments().get(PersistentBlobProvider.FILENAME_PATH_SEGMENT);
} else if (uri.getScheme().equals("content")) {
@@ -158,14 +159,7 @@ public class SendRelayedMessageUtil {
}
}
String ext = "";
int i = filename.lastIndexOf(".");
if (i >= 0) {
ext = filename.substring(i);
filename = filename.substring(0, i);
}
String path = DcHelper.getBlobdirFile(dcContext, filename, ext);
path = DcHelper.getBlobdirFile(dcContext, filename, "temp");
// copy content to this file
if (path != null) {
@@ -173,12 +167,11 @@ public class SendRelayedMessageUtil {
OutputStream outputStream = new FileOutputStream(path);
Util.copy(inputStream, outputStream);
}
return path;
} catch (Exception e) {
e.printStackTrace();
return null;
path = null;
}
message.setFileAndDeduplicate(path, filename, mimeType);
}
private static String getHtml(Context context, Uri uri) {
@@ -108,8 +108,12 @@ public class Util {
}
public static void redPositiveButton(AlertDialog dialog) {
redButton(dialog, AlertDialog.BUTTON_POSITIVE);
}
public static void redButton(AlertDialog dialog, int whichButton) {
try {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(redDestructiveColor);
dialog.getButton(whichButton).setTextColor(redDestructiveColor);
} catch (Exception e) {
e.printStackTrace();
}
@@ -640,10 +640,7 @@ public class VideoRecoder {
return false;
}
if (!Util.moveFile(tempPath, inPath)) {
alert(context, String.format("Recoding failed for %s: cannot move temporary file %s", inPath, tempPath));
return false;
}
msg.setFileAndDeduplicate(tempPath, msg.getFilename(), msg.getFilemime());
Log.i(TAG, String.format("recoding for %s done", inPath));
}
@@ -35,7 +35,7 @@ public class VideochatUtil {
DcContext dcContext = DcHelper.getContext(activity);
DcMsg dcMsg = dcContext.getMsg(msgId);
String videochatUrl = dcMsg.getVideochatUrl();
IntentUtils.showBrowserIntent(activity, videochatUrl);
IntentUtils.showInBrowser(activity, videochatUrl);
}
}
+10
View File
@@ -0,0 +1,10 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<gradient
android:angle="0"
android:startColor="@color/gray50"
android:endColor="@color/transparent"
android:type="linear" />
</shape>
+10
View File
@@ -0,0 +1,10 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<gradient
android:angle="0"
android:startColor="@color/transparent"
android:endColor="@color/gray50"
android:type="linear" />
</shape>
@@ -161,6 +161,30 @@
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<org.thoughtcrime.securesms.components.CircleColorImageView
android:id="@+id/invite_video_chat_button"
android:layout_width="53dp"
android:layout_height="53dp"
android:src="@drawable/baseline_call_24"
android:scaleType="center"
android:contentDescription="@string/videochat"
app:circleColor="@color/audio_icon"/>
<TextView android:layout_marginTop="10dp"
android:id="@+id/invite_video_chat_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AttachmentTypeLabel"
android:text="@string/videochat"/>
</LinearLayout>
<LinearLayout android:id="@+id/location_linear_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -188,30 +212,6 @@
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<org.thoughtcrime.securesms.components.CircleColorImageView
android:id="@+id/invite_video_chat_button"
android:layout_width="53dp"
android:layout_height="53dp"
android:src="@drawable/baseline_call_24"
android:scaleType="center"
android:contentDescription="@string/videochat"
app:circleColor="@color/audio_icon"/>
<TextView android:layout_marginTop="10dp"
android:id="@+id/invite_video_chat_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AttachmentTypeLabel"
android:text="@string/videochat"/>
</LinearLayout>
<!-- fill the gap -->
<LinearLayout
android:layout_width="match_parent"
@@ -43,7 +43,7 @@
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true">
android:layout_alignBottom="@id/body_bubble">
<org.thoughtcrime.securesms.components.AvatarImageView
android:id="@+id/contact_photo"
@@ -68,6 +68,41 @@
android:layout_marginTop="20dp"
android:text="@string/instant_onboarding_create"/>
<LinearLayout
android:id="@+id/or_divider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="30dp"
android:paddingBottom="30dp"
android:gravity="center"
android:orientation="horizontal">
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_weight="1"
android:background="@drawable/divider_start"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_weight="0"
android:gravity="center"
android:text="@string/or_separator"
android:textSize="14sp"
android:fontFamily="sans-serif"
android:textColor="@color/gray50"/>
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_weight="1"
android:background="@drawable/divider_end"/>
</LinearLayout>
<Button
style="@style/ButtonSecondary"
android:id="@+id/use_other_server"
@@ -75,7 +110,6 @@
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_marginTop="16dp"
android:text="@string/instant_onboarding_other_server"/>
<Button
+1
View File
@@ -20,6 +20,7 @@
android:layout_width="128dp"
android:layout_height="128dp"
android:scaleType="centerCrop"
app:strokeColor="@null"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize10Percent" />
<TextView android:id="@+id/webxdc_app_name"
+2 -2
View File
@@ -5,7 +5,7 @@
<item android:title="@string/menu_scroll_to_top"
android:id="@+id/log_scroll_up" />
<item android:title="@string/global_menu_help_learn_desktop"
<item android:title="@string/delta_chat_homepage"
android:id="@+id/learn_more"
app:showAsAction="never"/>
@@ -13,7 +13,7 @@
android:id="@+id/privacy_policy"
app:showAsAction="never"/>
<item android:title="@string/global_menu_help_contribute_desktop"
<item android:title="@string/contribute"
android:id="@+id/contribute"
app:showAsAction="never"/>
+2 -3
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">موافق</string>
<string name="cancel">إلغاء</string>
<string name="yes">نعم</string>
<string name="yes">نعم</string>
<string name="no">لا</string>
<string name="on">يعمل</string>
<string name="off">معطّل</string>
@@ -194,14 +194,13 @@
<string name="pref_app_access">دخول البرنامج</string>
<string name="pref_chats">المحادثات</string>
<string name="pref_in_chat_sounds">أصوات خلال الدردش</string>
<!-- deprecated -->
<string name="pref_message_text_size">حجم الخط في الرسائل</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. -->
<string name="pref_background">الخلفية</string>
<string name="pref_show_emails_all">كلها</string>
<string name="autocrypt_continue_transfer_retry">أعد المحاولة</string>
<string name="qrscan_fingerprint_label">البصمة</string>
<!-- notifications -->
<string name="notify_reply_button">رد</string>
<string name="notify_new_message">رسالة جديدة</string>
<string name="notify_priority_high">عالي</string>
+3 -3
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Imtina</string>
<string name="yes">Bəli</string>
<string name="yes">Bəli</string>
<string name="no">Xeyir</string>
<string name="on">Açıq</string>
<string name="off">Bağlı</string>
@@ -332,8 +332,6 @@
<string name="pref_app_access">Daxil oldu</string>
<string name="pref_chats">Çatlar</string>
<string name="pref_in_chat_sounds">Çatda olan səslər</string>
<!-- deprecated -->
<string name="pref_message_text_size">Mətnin ölçüsü</string>
<string name="pref_view_log">Log-a bax</string>
<string name="pref_saved_log">Loqi Yükləmələr qovluğuna saxlanıldı</string>
<string name="pref_save_log_failed">Loqu saxlaya bilmədi</string>
@@ -428,6 +426,7 @@
<string name="contact_not_verified">%1$sDoğrula bilmir</string>
<!-- translators: "setup" is the "encryption setup" here, as in "Autocrypt Setup Message" -->
<string name="contact_setup_changed">%1$süçün quraşdırma dəyişdirildi</string>
<!-- notifications -->
<string name="notify_reply_button">Cavab ver</string>
<string name="notify_new_message">Yeni mesaj</string>
<string name="notify_background_connection_enabled">Arxa fon əlaqəsi aktivdir</string>
@@ -460,6 +459,7 @@
<string name="global_menu_view_developer_desktop">İnkişaf etdirici</string>
<string name="global_menu_view_developer_tools_desktop">İnkişaf etdirici alətləri</string>
<string name="global_menu_help_desktop">Kömək</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">GitHub-da kömək et</string>
<string name="global_menu_help_report_desktop">Problemi bildirin</string>
<string name="no_chat_selected_suggestion_desktop">Bir çat seçin və ya yeni bir çat yaradın</string>
+3 -17
View File
@@ -4,8 +4,6 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Отказ</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">или</string>
<string name="clear_search">Изчистване на търсенето</string>
<string name="yes">Да</string>
<string name="no">Не</string>
@@ -478,6 +476,7 @@
<string name="tab_audio_empty_hint">Аудио файловете и гласовите съобщения, споделени в този чат, ще се появяват тук.</string>
<string name="tab_webxdc_empty_hint">Приложенията, споделени в този чат, ще се появяват тук.</string>
<string name="tab_all_media_empty_hint">Медийните файлове, споделени в кой да е чат, ще се появяват тук.</string>
<string name="all_apps_empty_hint">Приложенията, получени или изпратени в кой да е чат, ще се появяват тук.</string>
<string name="media_preview">Предварителен преглед на медия файл</string>
<!-- option to show images in the gallery with the correct width/height aspect (instead of square); other gallery apps may be a source of inspiration for translation :) -->
<string name="aspect_ratio_grid">Мрежа, запазваща съотношенията</string>
@@ -509,10 +508,6 @@
<string name="multidevice_transfer_done_devicemsg">ℹ️ Акаунтът е прехвърлен на второто Ви устройство.</string>
<!-- Shown beside progress bar, stay short -->
<string name="preparing_account">Акаунтът се подготвя...</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="waiting_for_receiver">Изчаква се свързване от получателя...</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="receiver_connected">Получателят е свързан...</string>
<!-- Shown beside progress bar, stay short -->
<string name="transferring">Прехвърляне...</string>
<string name="troubleshooting">Отстраняване на проблеми</string>
@@ -690,8 +685,6 @@
<string name="pref_app_access">Достъп до приложението</string>
<string name="pref_chats">Чатове</string>
<string name="pref_in_chat_sounds">Звуци в чата</string>
<!-- deprecated -->
<string name="pref_message_text_size">Размер на шрифта на съобщението</string>
<string name="pref_view_log">Разглеждане на дневника</string>
<string name="pref_saved_log">Дневникът е записан в папката \"Свалени\"</string>
<string name="pref_save_log_failed">Неуспешен запис на дневника</string>
@@ -928,9 +921,7 @@
<string name="withdraw_verifycontact_explain">Чрез сканиране на този QR код други хора могат да се свързват с Вас.\n\nМожете да деактивирате QR кода тук и повторно да го активирате, като го сканирате отново.</string>
<string name="withdraw_verifygroup_explain">Чрез сканиране на този QR код други хора могат да се присъединяват към крупата \"%1$s\".\n\nМожете да деактивирате QR кода тук и повторно да го активирате, като го сканирате отново.</string>
<string name="withdraw_qr_code">Деактивиране на QR кода</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">Чрез сканиране на този QR код други хора могат да се свързват с Вас.\n\nQR кодът не е активен на това устройство.</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">Този QR код е давал възможност други да се присъединяват към групата \"%1$s\" чрез сканирането му.\n\nQR кодът не е активен на това устройство.</string>
<string name="revive_qr_code">Активиране на QR кода</string>
<string name="qrshow_title">QR код за покана</string>
@@ -974,8 +965,6 @@
<string name="mailto_link_could_not_be_decoded">Неуспешно декодиране на mailto връзка: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">Затваряне</string>
<string name="notify_reply_button">Отговор</string>
<string name="notify_new_message">Ново съобщение</string>
<string name="notify_background_connection_enabled">Връзката във фонов режим е разрешена</string>
@@ -1031,7 +1020,9 @@
<string name="global_menu_view_developer_desktop">Разработчик</string>
<string name="global_menu_view_developer_tools_desktop">Инструменти за разработчици</string>
<string name="global_menu_help_desktop">Помощ</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Научете повече за Delta Chat</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Допринесете в GitHub</string>
<string name="global_menu_help_report_desktop">Съобщаване за проблем</string>
<string name="global_menu_help_about_desktop">Относно Delta Chat</string>
@@ -1104,11 +1095,6 @@
<string name="notifications_avg_minutes">Средно всеки %1$d минути</string>
<string name="notifications_avg_hours">Средно всеки %1$d часа</string>
<string name="last_check_at">Проверено на %1$s</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">Приложенията, получени или изпратени в кой да е чат, ще се появяват тук. \"Файлове\" показва току-що свалените приложения.</string>
<!-- iOS webxdc shortcut page -->
<string name="shortcut_step1_tap_share_btn">Натиснете бутона \"Споделяне\"</string>
<string name="shortcut_step2_tap_add_to_home_screen">Изберете \"Добавяне към началния екран\", за да добавите приложението към началния екран. </string>
<!-- 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 използва Вашата камера, за да прави и изпраща снимки и видеоклипове, както и да сканира QR кодове.</string>
<string name="InfoPlist_NSContactsUsageDescription">Delta Chat използва Вашите контакти, за да показва списък на e-mail адресите, до които можете да пишете. Delta Chat няма собствен сървър, Вашите контакти не се пращат никъде.</string>
+1 -4
View File
@@ -4,8 +4,6 @@
<string name="app_name">دلتا چت</string>
<string name="ok">خا</string>
<string name="cancel">رڌ</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">یا</string>
<string name="clear_search">روفتن پیتینیڌن</string>
<string name="yes">هری</string>
<string name="no">ن</string>
@@ -318,8 +316,6 @@
<string name="pref_notifications_show">نشۉ داڌن</string>
<string name="pref_language">زۉݩ</string>
<string name="pref_chats">گوفت ۉ لوفتا</string>
<!-- deprecated -->
<string name="pref_message_text_size">هندا هؽلا پیوم</string>
<string name="pref_log_header">گوزارش</string>
<string name="pref_background_btn_gallery">پسند ز شؽوات مال</string>
<string name="pref_show_emails_all">پوی</string>
@@ -358,6 +354,7 @@
<string name="contact_verified">%1$s تاییڌ وابی.</string>
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
<string name="verified_by">تاییڌ وابیڌه و دس %1$s</string>
<!-- notifications -->
<string name="notify_reply_button">ولوم</string>
<string name="notify_new_message">پیوم نۊ</string>
<string name="notify_name_and_message">نوم وو پیوم</string>
+13 -4
View File
@@ -4,8 +4,6 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Cancel·la</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">o</string>
<string name="clear_search">Neteja la cerca</string>
<!-- a noun, used on a button, short for "show link" -->
<string name="link">Enllaç</string>
@@ -129,6 +127,10 @@
<item quantity="one">%d missatge</item>
<item quantity="other">%d missatges</item>
</plurals>
<plurals name="n_reactions">
<item quantity="one">%d reacció</item>
<item quantity="other">%d reaccions</item>
</plurals>
<plurals name="n_members">
<item quantity="one">%d membre</item>
<item quantity="other">%d membres</item>
@@ -580,8 +582,6 @@
<string name="pref_app_access">Accés a l\'aplicació</string>
<string name="pref_chats">Xats</string>
<string name="pref_in_chat_sounds">Sons d\'entrada</string>
<!-- deprecated -->
<string name="pref_message_text_size">Mida de la font del missatge</string>
<string name="pref_view_log">Veure el registre</string>
<string name="pref_other">Altres</string>
<string name="pref_backup">Còpia de seguretat</string>
@@ -609,9 +609,16 @@
<string name="pref_show_emails_no">No, només xats</string>
<string name="pref_show_emails_accepted_contacts">Per a contactes acceptats</string>
<string name="pref_show_emails_all">Tot</string>
<string name="pref_edit_profile">Edita el perfil</string>
<string name="send_stats_to_devs">Envia estadístiques als desenvolupadors del Delta Chat</string>
<!-- Reactions -->
<string name="reactions">Reaccions</string>
<!-- Verb, the action of adding a "Reaction" to a message. Used eg. in context menus, similar to "Reply" or "Forward" -->
<string name="react">Reacciona</string>
<!-- %1$s will be replaced by an emoji. %2$s will be replaced by message summary (the summary is often long and whole string gets truncated; words after %2$s will often not being visible). Eg. 'You reacted 👍 to "Found my suitcase"'. Use less than 20 characters, otherwise the string will be truncated too soon and too few information are shown. Do not try to translate "reacted to" too strict. Depending on the language, "added 👍 to" or "gave 👍 to" or just "👍 to" may be shorter and/or clearer and work as well. -->
<string name="reaction_by_you">Heu reaccionat amb %1$s a «%2$s»</string>
<!-- autocrypt -->
<string name="autocrypt_send_asm_title">Envia el missatge de configuració Autocrypt</string>
<string name="autocrypt_send_asm_explain_before">Un \"missatge de configuració Autocrypt\" comparteix de forma segura la vostra configuració d\'extrem a extrem amb altres aplicacions compatibles amb Autocrypt.\n\nLa configuració es xifrarà amb un codi de configuració que es mostrarà aquí i que haureu d\'escriure a laltre dispositiu.</string>
@@ -673,6 +680,7 @@
<string name="contact_not_verified">No es pot verificar%1$s</string>
<!-- translators: "setup" is the "encryption setup" here, as in "Autocrypt Setup Message" -->
<string name="contact_setup_changed">Configuració canviada per %1$s</string>
<!-- notifications -->
<string name="notify_reply_button">Respondre</string>
<string name="notify_new_message">Missatge nou</string>
<string name="notify_background_connection_enabled">Connexió habilitada en segon pla</string>
@@ -705,6 +713,7 @@
<string name="global_menu_view_developer_desktop">Desenvolupador</string>
<string name="global_menu_view_developer_tools_desktop">Eines de desenvolupador</string>
<string name="global_menu_help_desktop">Ajuda</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Col·labora a GitHub</string>
<string name="global_menu_help_report_desktop">Informa d\'un problema</string>
<string name="no_chat_selected_suggestion_desktop">Tria un xat o crea\'n un de nou</string>
+3 -3
View File
@@ -4,7 +4,7 @@
<string name="app_name">دێڵتا چات</string>
<string name="ok">باشە</string>
<string name="cancel">وازبێنە</string>
<string name="yes">بەڵێ</string>
<string name="yes">بەڵێ</string>
<string name="no">نا</string>
<string name="select">هەڵبژاردن</string>
<string name="on">چالاک</string>
@@ -420,8 +420,6 @@
<string name="pref_app_access">ڕێگەپێدان</string>
<string name="pref_chats">وتووێژەکان</string>
<string name="pref_in_chat_sounds">دەنگەکانی نێو-وتووێژی</string>
<!-- deprecated -->
<string name="pref_message_text_size">قەبارەی فۆنتی پەیامەکان</string>
<string name="pref_other">کەسانی دی</string>
<string name="pref_backup">یەدەک</string>
<string name="pref_backup_explain">یەدەک گرتن لە وتووێژەکان و دانانی لەسەر بیرگەی دەرەکی</string>
@@ -524,6 +522,7 @@
<!-- translators: "setup" is the "encryption setup" here, as in "Autocrypt Setup Message" -->
<string name="contact_setup_changed">ڕێکخستن بۆ %1$s گۆڕا.</string>
<string name="copy_qr_data_success">ناونیشانی وێبی QRەکە ڕوونووس کرا.</string>
<!-- notifications -->
<string name="notify_reply_button">وەڵام دانەوە</string>
<string name="notify_new_message">پەیامی نوێ</string>
<string name="notify_background_connection_enabled">پەیوەندی پشتخان چالاک کرا</string>
@@ -556,6 +555,7 @@
<string name="global_menu_edit_paste_desktop">لکاندن</string>
<string name="global_menu_view_desktop">دیتن</string>
<string name="global_menu_help_desktop">یارمەتی</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">زۆرتر سەبارەت بە دێڵتاچات_ەوە بزانە</string>
<string name="global_menu_help_report_desktop">کێشەیەک گوزارشت بکە</string>
<string name="global_menu_help_about_desktop">سەبارەت بە دێڵتا چات</string>
+4 -6
View File
@@ -4,8 +4,6 @@
<string name="app_name">Delta Chat</string>
<string name="ok">Souhlas</string>
<string name="cancel">Zrušit</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">nebo</string>
<string name="clear_search">Vyčistit vyhledávání</string>
<string name="yes">Ano</string>
<string name="no">Ne</string>
@@ -446,6 +444,7 @@
<string name="tab_audio_empty_hint">Zde se zobrazí zvukové soubory a hlasové zprávy sdílené v tomto chatu.</string>
<string name="tab_webxdc_empty_hint">Zde se zobrazí aplikace sdílené v tomto chatu.</string>
<string name="tab_all_media_empty_hint">Zde se zobrazí média sdílená v jakémkoli chatu.</string>
<string name="all_apps_empty_hint">Zde se zobrazí aplikace přijaté nebo odeslané v libovolném chatu.</string>
<string name="media_preview">Náhled multimedia</string>
<string name="send_message">Pošli zprávu</string>
<string name="multidevice_install_dc_on_other_device">Nainstalujte si Delta Chat do druhého zařízení (https://get.delta.chat)</string>
@@ -554,8 +553,6 @@
<string name="pref_app_access">Přístup aplikace</string>
<string name="pref_chats">Chaty</string>
<string name="pref_in_chat_sounds">Zvuky v rámci chatu</string>
<!-- deprecated -->
<string name="pref_message_text_size">Velikost písma zprávy</string>
<string name="pref_view_log">Zobrazit záznam běhu</string>
<string name="pref_saved_log">Záznam běhu uložen do složky \"Downloads\"</string>
<string name="pref_save_log_failed">Uložení záznamu běhu selhalo</string>
@@ -750,6 +747,7 @@
<string name="contact_setup_changed">Změněné nastavení pro %1$s.</string>
<string name="copy_qr_data_success">URL z QR kódu zkopírováno do mezipaměti</string>
<string name="mailto_dialog_header_select_chat">Vyberte chat, kterému chcete zprávu odeslat </string>
<!-- notifications -->
<string name="notify_reply_button">Odpověď</string>
<string name="notify_new_message">Nová zpráva</string>
<string name="notify_background_connection_enabled">Spojení na pozadí je zapnuto</string>
@@ -793,7 +791,9 @@
<string name="global_menu_view_developer_desktop">Vývojář</string>
<string name="global_menu_view_developer_tools_desktop">Nástroje pro vývojáře</string>
<string name="global_menu_help_desktop">Nápověda</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Víc podrobností o Delta Chatu</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Přispěj na GitHubu</string>
<string name="global_menu_help_report_desktop">Nahlaš problém</string>
<string name="global_menu_help_about_desktop">O aplikaci Delta Chat</string>
@@ -830,8 +830,6 @@
<string name="a11y_disappearing_messages_activated">Samomazací zprávy jsou zapnuty</string>
<string name="import_device_contacts_hint">Chcete-li chatovat s kontakty ze svého zařízení, otevřete Nastavení a povolte „Kontakty“.</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">Zde se zobrazí aplikace přijaté nebo odeslané v libovolném chatu. „Soubory“ zobrazuje právě stažené aplikace. </string>
<!-- 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 využívá kameru k focení, filmování a snímání QR kódů.</string>
<string name="InfoPlist_NSContactsUsageDescription">Delta Chat používá tvé kontakty k zobrazení e-mailů na které můžeš psát. Delta Chat nemá žádné vlastní servery - tvé kontakty se nikam noposílají.</string>
+4 -3
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Annuller</string>
<string name="clear_search">Ryd søgning</string>
<string name="clear_search">Ryd søgning</string>
<string name="yes">Ja</string>
<string name="no">Nej</string>
<string name="select">Vælg</string>
@@ -488,8 +488,6 @@
<string name="pref_app_access">Programadgang</string>
<string name="pref_chats">Samtaler</string>
<string name="pref_in_chat_sounds">In-chat-lyde</string>
<!-- deprecated -->
<string name="pref_message_text_size">Besked tekststørrelse</string>
<string name="pref_view_log">Visningslog</string>
<string name="pref_saved_log">Gem loggen til \"Downloads\" mappen</string>
<string name="pref_save_log_failed">Forsøg på at gemme loggen mislykkedes</string>
@@ -677,6 +675,7 @@
<!-- translators: "setup" is the "encryption setup" here, as in "Autocrypt Setup Message" -->
<string name="contact_setup_changed">Ændret opsætning for %1$s</string>
<string name="copy_qr_data_success">Kopieret QR url til udklipsholder</string>
<!-- notifications -->
<string name="notify_reply_button">Svar</string>
<string name="notify_new_message">Ny besked</string>
<string name="notify_background_connection_enabled">Baggrundsforbindelse aktiveret</string>
@@ -717,7 +716,9 @@
<string name="global_menu_view_developer_desktop">Udvikler</string>
<string name="global_menu_view_developer_tools_desktop">Udvikler værktøj</string>
<string name="global_menu_help_desktop">Hjælp</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Lær mere om Delta Chat</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Bidrag på GitHub</string>
<string name="global_menu_help_report_desktop">Rapporter en sag</string>
<string name="global_menu_help_about_desktop">Om Delta Chat</string>
+42 -25
View File
@@ -4,8 +4,6 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Abbruch</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">oder</string>
<string name="clear_search">Suche löschen</string>
<!-- a noun, used on a button, short for "show link" -->
<string name="link">Link</string>
@@ -39,6 +37,7 @@
<string name="close_window">Fenster schließen</string>
<string name="forward">Weiterleiten</string>
<string name="create">Erstellen</string>
<string name="reset">Zurücksetzen</string>
<string name="later">Später</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. -->
<string name="resend">Erneut senden</string>
@@ -47,6 +46,7 @@
<!-- Verb "to unarchive", as in "remove a chat from the archive", opposite of the previous string -->
<string name="unarchive">Dearchivieren</string>
<string name="mute">Stumm</string>
<string name="muted">Stumm</string>
<string name="ephemeral_messages">Verschwindende Nachrichten</string>
<string name="ephemeral_messages_hint">Gilt für alle Gruppenmitglieder, die Delta Chat verwenden. Nachrichten können kopiert, gespeichert und weitergeleitet werden oder es können andere E-Mail-Clients verwendet werden.</string>
<string name="save">Speichern</string>
@@ -186,6 +186,14 @@
<string name="webxdc_apps">Apps</string>
<string name="webxdc_store_url">App-Picker-URL</string>
<string name="webxdc_store_url_explain">Wenn gesetzt, wird diese URL als App-Picker anstelle der Voreinstellung verwendet.</string>
<string name="home">Start</string>
<string name="games">Spiele</string>
<string name="tools">Tools</string>
<string name="app_size">Größe</string>
<string name="app_date_published">Veröffentlicht</string>
<string name="add_to_chat">Zum Chat hinzufügen</string>
<!-- short for "Browse through the App Picker/Store/Catalogue"; could also be translated as "Discover" or "Search" -->
<string name="browse">Entdecken</string>
<string name="unknown">Unbekannt</string>
<string name="green">Grün</string>
@@ -369,8 +377,8 @@
<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_export_attachment">Das Exportieren von Anhängen ermöglicht es allen anderen Anwendungen auf Ihrem Gerät, auf diese zuzugreifen.\n\nFortfahren? </string>
<string name="ask_block_contact">Diesen Kontakt blockieren? Sie werden keine Nachrichten mehr von diesem Kontakt erhalten.</string>
<string name="ask_unblock_contact">Diesen Kontakt nicht mehr blockieren? Nachrichten von diesem Kontakt werden dann wieder angezeigt.</string>
<string name="ask_block_contact">Diesen Kontakt blockieren?\n\nDirektnachrichten oder Gruppen, die von blockierten Kontakten erstellt wurden, werden nicht angezeigt.\n\nIn anderen Gruppen mit blockierten Kontakten werden deren Nachrichten weiterhin angezeigt.</string>
<string name="ask_unblock_contact">Diesen Kontakt nicht mehr blockieren?</string>
<string name="ask_delete_contacts">Kontakte dauerhaft löschen?\n\nKontakte mit laufenden Chats und Kontakte aus dem Adressbuch des Systems können nicht dauerhaft gelöscht werden.</string>
<string name="ask_delete_contact">Kontakt %1$s dauerhaft löschen?\n\nKontakte mit laufenden Chats und Kontakte aus dem Adressbuch des Systems können nicht dauerhaft gelöscht werden.</string>
<string name="cannot_delete_contacts_in_use">Kontakte mit laufenden Chats können nicht gelöscht werden.</string>
@@ -507,6 +515,8 @@
<string name="tab_audio_empty_hint">In diesem Chat geteilte Audiodateien und Sprachnachrichten werden hier angezeigt.</string>
<string name="tab_webxdc_empty_hint">In diesem Chat geteilte Apps werden hier angezeigt.</string>
<string name="tab_all_media_empty_hint">Medien aus allen Chats werden hier angezeigt.</string>
<string name="all_files_empty_hint">Dokumente und Dateien aus allen Chats werden hier angezeigt.</string>
<string name="all_apps_empty_hint">Apps aus allen Chats werden hier angezeigt.</string>
<string name="media_preview">Medien-Vorschau</string>
<!-- option to show images in the gallery with the correct width/height aspect (instead of square); other gallery apps may be a source of inspiration for translation :) -->
<string name="aspect_ratio_grid">Raster im Seitenverhältnis</string>
@@ -538,10 +548,6 @@
<string name="multidevice_transfer_done_devicemsg">️ Profil wurde auf Ihr Zweitgerät übertragen.</string>
<!-- Shown beside progress bar, stay short -->
<string name="preparing_account">Profil vorbereiten…</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="waiting_for_receiver">Warte auf Empfänger…</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="receiver_connected">Empfänger verbunden…</string>
<!-- Shown beside progress bar, stay short -->
<string name="transferring">Transfer…</string>
<string name="troubleshooting">Fehlersuche</string>
@@ -581,7 +587,7 @@
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
<string name="instant_onboarding_title">Ihr Profil</string>
<!-- The placeholder will be replaced by the default onboarding server -->
<string name="instant_onboarding_agree_default2">Datenschutzerklärung für %1$s</string>
<string name="instant_onboarding_agree_default2">Nutzungsbedingungen und Datenschutzerklärung für %1$s</string>
<!-- The placeholder will be replaced by instance name, the whole text will link to the instance page -->
<string name="instant_onboarding_agree_instance">Infos zu Profilen auf %1$s</string>
<!-- Confirmation button on the instant onboarding screen -->
@@ -660,6 +666,8 @@
<string name="profile_tag">Private Bezeichnung</string>
<string name="profile_tag_hint">z.B. Familie, Arbeit, Freunde</string>
<string name="profile_tag_explain">Die Bezeichnung ist nur für Sie sichtbar um zwischen Profilen zu unterscheiden.</string>
<!-- Menu entry to sort an item to the beginning of a list. Only "To Top" may do as well in some translations, if that helps to stay shorter. -->
<string name="move_to_top">Nach oben</string>
<string name="delete_account">Profil löschen</string>
<string name="delete_account_ask">Möchten Sie das Profil und alle Daten wirklich von diesem Gerät löschen?</string>
<string name="delete_account_explain_with_name">Alle Daten des Profils \"%s\" werden von diesem Gerät gelöscht, dies schließt Ihre Ende-zu-Ende Autocrypt-Einstellungen, Kontakte, Chats, Nachrichten und Medien mit ein. Diese Aktion kann nicht rückgängig gemacht werden.</string>
@@ -724,6 +732,7 @@
<string name="pref_appearance">Darstellung</string>
<string name="pref_theme">Design</string>
<string name="pref_language">Sprache</string>
<string name="pref_use_system_ui_font">Systemschrift verwenden</string>
<string name="pref_incognito_keyboard">Inkognito-Tastatur</string>
<!-- Translators: Must indicate that there is no guarantee as the system may not honor our request. -->
<string name="pref_incognito_keyboard_explain">Deaktivierung des personalisierten Lernens der Tastatur anfordern.</string>
@@ -741,8 +750,6 @@
<string name="pref_app_access">App-Zugriff</string>
<string name="pref_chats">Chats</string>
<string name="pref_in_chat_sounds">In-Chat-Klänge</string>
<!-- deprecated -->
<string name="pref_message_text_size">Schriftgröße</string>
<string name="pref_view_log">Protokoll anzeigen</string>
<string name="pref_saved_log">Die Logdatei wurde im Downloads Ordner gespeichert.</string>
<string name="pref_save_log_failed">Logdatei konnte nicht gespeichert werden.</string>
@@ -953,6 +960,7 @@
<string name="chat_protection_broken_explanation">Die Ende-zu-Ende-Verschlüsselung kann nicht mehr garantiert werden, wahrscheinlich weil %1$s Delta Chat neu installiert oder eine Nachricht von einem anderen Gerät gesendet hat.\n\nSie können sich persönlich treffen und den QR-Code erneut scannen, um die garantierte Ende-zu-Ende-Verschlüsselung wiederherzustellen.</string>
<string name="invalid_unencrypted_tap_to_learn_more">⚠️ %1$s verlangt eine Ende-zu-Ende-Verschlüsselung, die für diesen Chat noch nicht hergestellt wurde. Tippen, um mehr zu erfahren.</string>
<string name="invalid_unencrypted_explanation">Um eine Ende-zu-Ende-Verschlüsselung herzustellen, können Sie Kontakte persönlich treffen und ihren QR-Code scannen.</string>
<!-- deprecated -->
<string name="encryption_required_for_new_contact">Ende-zu-Ende-Verschlüsselung ist notwendig, aber für %1$s nicht eingerichtet.\n\nZum Herstellen der Ende-zu-Ende-Verschlüsselung, können Sie Ihren Einladungslink teilen oder den Kontakt persönlich zum QR-Code-Scannen treffen.</string>
<string name="learn_more">Mehr erfahren</string>
@@ -979,13 +987,11 @@
<string name="qrscan_contains_text">Gescannter QR-Code text:\n\n%1$s</string>
<string name="qrscan_contains_url">Gescannter QR-Code URL:\n\n%1$s</string>
<string name="qrscan_fingerprint_label">Fingerabdruck</string>
<string name="withdraw_verifycontact_explain">Dieser QR-Code kann von anderen gescannt werden, um Sie zu kontaktieren.\n\n Sie können den QR-Code hier deaktivieren und durch erneutes Scannen wieder aktivieren.</string>
<string name="withdraw_verifygroup_explain">Dieser QR-Code kann von anderen gescannt werden, um der Gruppe \"%1$s\" beizutreten.\n\n Sie können den QR-Code hier deaktivieren und durch erneutes Scannen wieder aktivieren.</string>
<string name="withdraw_qr_code">QR-Code deaktivieren</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">Dieser QR-Code konnte von anderen gescannt werden, um Sie zu kontaktieren.\n\nDer QR-Code ist auf diesem Gerät nicht aktiv.</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">Dieser QR-Code konnte von anderen gescannt werden, um der Gruppe \"%1$s\" bezutreten.\n\nDer QR-Code ist auf diesem Gerät nicht aktiv.</string>
<string name="withdraw_verifycontact_explain">Dieser QR-Code kann von anderen gescannt werden, um Sie zu kontaktieren.\n\nSie können den QR-Code zurücksetzen; der bestehende QR-Code oder Einladungslink wird dann nicht mehr funktionieren.</string>
<string name="withdraw_verifygroup_explain">Dieser QR-Code kann von anderen gescannt werden, um der Gruppe \"%1$s\" beizutreten.\n\nSie können den QR-Code zurücksetzen; der bestehende QR-Code oder Einladungslink wird dann nicht mehr funktionieren.</string>
<string name="withdraw_qr_code">QR-Code zurücksetzen</string>
<string name="revive_verifycontact_explain">Dieser QR-Code wurde zurückgesetzt und ist nicht mehr aktiv.</string>
<string name="revive_verifygroup_explain">Dieser QR-Code für die Gruppe \"%1$s\" wurde zurückgesetzt und ist nicht mehr aktiv.</string>
<string name="revive_qr_code">QR-Code aktivieren</string>
<string name="qrshow_title">QR-Einladungscode</string>
<string name="qrshow_x_joining">%1$s beigetreten.</string>
@@ -1028,8 +1034,6 @@
<string name="mailto_link_could_not_be_decoded">Mailto-Link konnte nicht dekodiert werden: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">Verwerfen</string>
<string name="notify_reply_button">Antworten</string>
<string name="notify_new_message">Neue Nachricht</string>
<string name="notify_background_connection_enabled">Hintergrundverbindung aktiviert</string>
@@ -1085,8 +1089,12 @@
<string name="global_menu_view_developer_desktop">EntwicklerIn</string>
<string name="global_menu_view_developer_tools_desktop">Entwicklungswerkzeug</string>
<string name="global_menu_help_desktop">Hilfe</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Mehr über Delta Chat erfahren</string>
<string name="delta_chat_homepage">Delta Chat Homepage</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Auf GitHub mitwirken</string>
<string name="contribute">Mitwirken</string>
<string name="global_menu_help_report_desktop">Ein Problem melden</string>
<string name="global_menu_help_about_desktop">Über Delta Chat</string>
<string name="global_menu_file_open_desktop">Delta Chat öffnen</string>
@@ -1099,6 +1107,8 @@
<string name="timestamp_format_m_desktop">D MMM</string>
<string name="remove_desktop">Entfernen</string>
<string name="save_desktop">Speichern</string>
<!-- Opposite of "Save". Undo a "Save" action. Similar to "Unmute", "Unpin". Could also be worded as "Save no longer" or so. -->
<string name="unsave">Nicht mehr speichern</string>
<string name="name_desktop">Name</string>
<string name="select_group_image_desktop">Gruppenbild auswählen</string>
<string name="export_backup_desktop">Backup exportieren</string>
@@ -1158,11 +1168,18 @@
<string name="notifications_avg_minutes">Im Mittel alle %1$d Minuten</string>
<string name="notifications_avg_hours">Im Mittel alle %1$d Stunden</string>
<string name="last_check_at">Überprüft um %1$s</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">Empfangene oder gesendete Apps werden hier angezeigt. Unter \"Dateien\" können Sie auf heruntergeladene Apps zugreifen.</string>
<!-- iOS webxdc shortcut page -->
<string name="shortcut_step1_tap_share_btn">\"Teilen\" anklicken</string>
<string name="shortcut_step2_tap_add_to_home_screen">\"Zum Home-Bildschirm\" auswählen, um die App zum Startbildschirm hinzuzufügen</string>
<string name="system_settings">Systemeinstellungen</string>
<!-- shown below the button "System Settings" on the notification screen. this is a hint about what can be edited on System Settings' Notification page - eg. the notification type (banner, lock screen, notification centre), sound, badges and so on. no need to be exhaustive here, it is only to give the user an idea. -->
<string name="system_settings_notify_explain_ios">Töne, Vorschau, Stil und mehr bearbeiten</string>
<!-- iOS shortcut widget -->
<!-- use the same translation for "Shortcuts" as the system is using, often the term "Shortcut" stays untranslated; check eg. how the "Shortcuts" system app is called in your locale -->
<string name="shortcuts_widget_title">Shortcuts</string>
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
<string name="shortcuts_widget_description">Delta Chat\'s \"Zum Widget hinzufügen\" fügt Chats hinzu</string>
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
<string name="remove_from_widget">Aus Widget entfernen</string>
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
<string name="add_to_widget">Zum Widget hinzufügen</string>
<!-- 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 verwendet die Kamera, um Fotos aufzunehmen und zu versenden und um QR-Codes zu scannen.</string>
<string name="InfoPlist_NSContactsUsageDescription">Delta Chat verwendet die Kontakte, um eine Liste von E-Mail-Adressen anzuzeigen, an die Sie schreiben können. Delta Chat hat keine Server; das Adressbuch wird nicht versandt.</string>
+4 -12
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">Εντάξει</string>
<string name="cancel">Ακύρωση</string>
<string name="clear_search">Αναζήτηση</string>
<string name="clear_search">Αναζήτηση</string>
<string name="yes">Ναι</string>
<string name="no">Όχι</string>
<string name="select">Επιλογή</string>
@@ -437,6 +437,7 @@
<string name="tab_video_empty_hint">Τα βίντεο που κοινοποιούνται σε αυτήν τη συνομιλία θα εμφανίζονται εδώ.</string>
<string name="tab_audio_empty_hint">Τα αρχεία ήχου και τα φωνητικά μηνύματα που κοινοποιούνται σε αυτήν τη συνομιλία θα εμφανίζονται εδώ.</string>
<string name="tab_webxdc_empty_hint">Οι ιδιωτικές εφαρμογές που κοινοποιούνται σε αυτήν τη συνομιλία θα εμφανίζονται εδώ.</string>
<string name="all_apps_empty_hint">Οι ιδιωτικές εφαρμογές που λαμβάνονται ή αποστέλλονται σε οποιαδήποτε συνομιλία θα εμφανίζονται εδώ.</string>
<string name="media_preview">Προεπισκόπιση</string>
<string name="send_message">Αποστολή μηνύματος</string>
<!-- Placeholder %1$s will be replaced by the name of the contact changing their address. Placeholders %2$s and %3$s will be replaced by old/new email addresses. -->
@@ -584,8 +585,6 @@
<string name="pref_app_access">Πρόσβαση εφαρμογής</string>
<string name="pref_chats">Συνομιλίες</string>
<string name="pref_in_chat_sounds">Ήχοι μέσα στη συνομιλία</string>
<!-- deprecated -->
<string name="pref_message_text_size">Μέγεθος γραμματοσειράς μηνύματος</string>
<string name="pref_view_log">Προβολή Αρχείου Καταγραφής</string>
<string name="pref_saved_log">ΤΟ αρχείο καταγραφής αποθηκεύτηκε στο φάκελο \"Λήψεις\".</string>
<string name="pref_save_log_failed">Αποτυχία αποθήκευσης του αρχείου καταγραφής</string>
@@ -790,9 +789,7 @@
<string name="withdraw_verifycontact_explain">Αυτός ο κωδικός QR μπορεί να σαρωθεί από άλλους για να επικοινωνήσουν μαζί σας.\n\nΜπορείτε να απενεργοποιήσετε τον κωδικό QR εδώ και να τον ξαναενεργοποιήσετε ξανασαρώνοντάς τον.</string>
<string name="withdraw_verifygroup_explain">Αυτός ο κωδικός QR μπορεί να σαρωθεί από άλλους για να συμμετάσχουν στην ομάδα \"%1$s\".\n\nΜπορείτε να απενεργοποιήσετε τον κωδικό QR εδώ και να τον ξαναενεργοποιήσετε ξανασαρώνοντάς τον.</string>
<string name="withdraw_qr_code">Απενεργοποίηση του κωδικού QR</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">Αυτός ο κωδικός QR θα μπορούσε να σαρωθεί από άλλους για να επικοινωνήσουν μαζί σας.\n\nΟ κωδικός QR δεν είναι ενεργός σε αυτήν τη συσκευή.</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">Αυτός ο κωδικός QR θα μπορούσε να σαρωθεί από άλλους για να συμμετάσχουν στην ομάδα \"%1$s\".\n\nΟ κωδικός QR δεν είναι ενεργός σε αυτήν τη συσκευή.</string>
<string name="revive_qr_code">Ενεργοποίηση του κωδικού QR</string>
<string name="qrshow_title">Κωδικός Πρόσκλησης QR</string>
@@ -828,8 +825,6 @@
<string name="mailto_link_could_not_be_decoded">Αδυναμία αποκωδικοποίησης του συνδέσμου mailto: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">Απόρριψη</string>
<string name="notify_reply_button">Απάντηση</string>
<string name="notify_new_message">Νέο μήνυμα</string>
<string name="notify_background_connection_enabled">Η σύνδεση στο παρασκήνιο ενεργοποιήθηκε</string>
@@ -876,7 +871,9 @@
<string name="global_menu_view_developer_desktop">Προγραμματιστής</string>
<string name="global_menu_view_developer_tools_desktop">Εργαλεία Προγραμματιστή</string>
<string name="global_menu_help_desktop">Βοήθεια</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Μάθετε περισσότερα για το Delta Chat</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Συνεισφέρετε στο GitHub</string>
<string name="global_menu_help_report_desktop">Αναφέρετε ένα πρόβλημα</string>
<string name="global_menu_help_about_desktop">Για το Delta Chat</string>
@@ -949,11 +946,6 @@
<string name="notifications_avg_minutes">Κατά μέσο όρο κάθε %1$d λεπτά</string>
<string name="notifications_avg_hours">Κατά μέσο όρο κάθε %1$d ώρες</string>
<string name="last_check_at">Έλεγχος στις %1$s</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">Οι ιδιωτικές εφαρμογές που λαμβάνονται ή αποστέλλονται σε οποιαδήποτε συνομιλία θα εμφανίζονται εδώ. Το \"Αρχεία\" εμφανίζει ιδιωτικές εφαρμογές που μόλις κατεβάσατε.</string>
<!-- iOS webxdc shortcut page -->
<string name="shortcut_step1_tap_share_btn">Κάντε κλικ στο κουμπί κοινής χρήσης</string>
<string name="shortcut_step2_tap_add_to_home_screen">Επιλέξτε \"Προσθήκη στην αρχική οθόνη\" για να προσθέσετε την εφαρμογή στην αρχική σας οθόνη.</string>
<!-- 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 χρησιμοποιεί την κάμερά σας για λήψη και αποστολή φωτογραφιών και βίντεο και για σάρωση κωδικών QR.</string>
<string name="InfoPlist_NSContactsUsageDescription">Το Delta Chat χρησιμοποιεί τις επαφές σας για να εμφανίσει μια λίστα με διευθύνσεις e-mail στις οποίες μπορείτε να γράψετε. Το Delta Chat δεν έχει διακομιστή, οι επαφές σας δεν αποστέλλονται πουθενά.</string>
+2 -3
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">Bone</string>
<string name="cancel">Nuligi</string>
<string name="clear_search">Forviŝi Serĉon</string>
<string name="clear_search">Forviŝi Serĉon</string>
<string name="yes">Jes</string>
<string name="no">Ne</string>
<string name="select">Elekti</string>
@@ -422,8 +422,6 @@
<string name="pref_app_access">Aliro al aplikaĵo</string>
<string name="pref_chats">Interparoloj</string>
<string name="pref_in_chat_sounds">Sonoj dum interparolado</string>
<!-- deprecated -->
<string name="pref_message_text_size">Mesaĝa tipargrando</string>
<string name="pref_view_log">Vidi protokolon</string>
<string name="pref_saved_log">Konservis protokolon al la elŝuta dosierujo</string>
<string name="pref_save_log_failed">Malsukcesis konservi protokolon</string>
@@ -446,6 +444,7 @@
<string name="pref_send_copy_to_self">Sendi kopion al mi mem</string>
<string name="pref_show_emails_all">Ĉiuj</string>
<string name="autocrypt_prefer_e2ee">Preferi tutvojan ĉifradon</string>
<!-- notifications -->
<string name="notify_reply_button">Respondi</string>
<string name="notify_new_message">Nova mesaĝo</string>
<string name="notify_priority_high">Alta</string>
+42 -21
View File
@@ -8,8 +8,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Cancelar</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">o</string>
<string name="or_separator">o</string>
<string name="clear_search">Borrar búsqueda</string>
<!-- a noun, used on a button, short for "show link" -->
<string name="link">Enlace</string>
@@ -43,6 +42,7 @@
<string name="close_window">Cerrar ventana</string>
<string name="forward">Reenviar</string>
<string name="create">Crear</string>
<string name="reset">Restablecer</string>
<string name="later">Luego</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. -->
<string name="resend">Volver a enviar</string>
@@ -51,6 +51,7 @@
<!-- Verb "to unarchive", as in "remove a chat from the archive", opposite of the previous string -->
<string name="unarchive">Des-archivar</string>
<string name="mute">Silenciar</string>
<string name="muted">Silenciar</string>
<string name="ephemeral_messages">Desaparición de mensajes</string>
<string name="ephemeral_messages_hint">Estos ajustes se aplican a todos los participantes que usan Delta Chat. Sin embargo, pueden copiar, guardar y reenviar mensajes o usar otros clientes de correo</string>
<string name="save">Guardar</string>
@@ -198,6 +199,16 @@
<string name="webxdc_app">Aplicación</string>
<!-- plural of "App"; used to present "Webxdc App" (https://webxdc.org) in a user friendly way. Please stay close to the original term and keep it short (it is used in menus with few screen space). -->
<string name="webxdc_apps">Aplicaciones</string>
<string name="webxdc_store_url">App Picker URL</string>
<string name="webxdc_store_url_explain">Si se establece, la URL se utilizará como App Picker en lugar de la predeterminada</string>
<string name="home">Inicio</string>
<string name="games">Juegos</string>
<string name="tools">Herramientas</string>
<string name="app_size">Tamaño</string>
<string name="app_date_published">Publicado</string>
<string name="add_to_chat">Agregar al chat</string>
<!-- short for "Browse through the App Picker/Store/Catalogue"; could also be translated as "Discover" or "Search" -->
<string name="browse">Navegar</string>
<string name="unknown">Desconocido</string>
<string name="green">Verde</string>
@@ -535,6 +546,7 @@
<string name="tab_audio_empty_hint">Los archivos de audio y los mensajes de voz compartidos en este chat se mostrarán aquí.</string>
<string name="tab_webxdc_empty_hint">Apps compartidas en este chat se mostrarán aquí</string>
<string name="tab_all_media_empty_hint">La multimedia compartida en cualquier chat aparecerá aquí</string>
<string name="all_apps_empty_hint">Aplicaciones privadas recibidas o enviadas en cualquier chat aparecerán aquí.</string>
<string name="media_preview">Vista previa de multimedia</string>
<!-- option to show images in the gallery with the correct width/height aspect (instead of square); other gallery apps may be a source of inspiration for translation :) -->
<string name="aspect_ratio_grid">Cuadrícula de relación de aspecto</string>
@@ -566,10 +578,6 @@
<string name="multidevice_transfer_done_devicemsg">️ Cuenta transferida a tu otro dispositivo.</string>
<!-- Shown beside progress bar, stay short -->
<string name="preparing_account">Preparando cuenta…</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="waiting_for_receiver">Esperando por receptor…</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="receiver_connected">Receptor conectado…</string>
<!-- Shown beside progress bar, stay short -->
<string name="transferring">Transfiriendo…</string>
<string name="troubleshooting">Solución de problemas</string>
@@ -609,7 +617,7 @@
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
<string name="instant_onboarding_title">Tu perfil</string>
<!-- The placeholder will be replaced by the default onboarding server -->
<string name="instant_onboarding_agree_default2">Política de privacidad para %1$s</string>
<string name="instant_onboarding_agree_default2">Términos y política de privacidad para %1$s</string>
<!-- The placeholder will be replaced by instance name, the whole text will link to the instance page -->
<string name="instant_onboarding_agree_instance">Acerca de los perfiles en %1$s</string>
<!-- Confirmation button on the instant onboarding screen -->
@@ -688,6 +696,8 @@
<string name="profile_tag">Etiqueta privada</string>
<string name="profile_tag_hint">ej. Trabajo, Familia</string>
<string name="profile_tag_explain">Etiqueta que es visible sólo para ti; útil para diferenciar tus perfiles.</string>
<!-- Menu entry to sort an item to the beginning of a list. Only "To Top" may do as well in some translations, if that helps to stay shorter. -->
<string name="move_to_top">Mover arriba</string>
<string name="delete_account">Eliminar cuenta</string>
<string name="delete_account_ask">¿Estás seguro de que quieres eliminar los datos de tu cuenta?</string>
<string name="delete_account_explain_with_name">Todos los datos de la cuenta de \"%s\" este dispositivo serán eliminados. Incluyendo la configuración de encriptado punto a punto, contactos, chats, mensajes y multimedia. Esta acción no puede ser deshecha.</string>
@@ -733,8 +743,8 @@
<string name="pref_screen_security_explain">Solicitar bloqueo de capturas de pantalla en la lista de recientes y dentro de la aplicación</string>
<string name="pref_screen_security_please_restart_hint">Para aplicar la configuración de seguridad de la pantalla, reinicie la aplicación.</string>
<string name="pref_notifications">Notificaciones </string>
<string name="pref_mention_notifications">Notificar menciones</string>
<string name="pref_mention_notifications_explain">Notificar mensajes en chats silenciados si están dirigidos a ti, como en respuestas o reacciones a tus mensajes</string>
<string name="pref_mention_notifications">Menciones</string>
<string name="pref_mention_notifications_explain">En los grupos silenciados, notifica los mensajes dirigidos a ti, como respuestas o reacciones</string>
<string name="pref_notifications_show">Mostrar</string>
<string name="pref_notifications_priority">Prioridad</string>
<string name="pref_notifications_explain">Habilitar las notificaciones del sistema para nuevos mensajes</string>
@@ -752,6 +762,7 @@
<string name="pref_appearance">Apariencia</string>
<string name="pref_theme">Tema</string>
<string name="pref_language">Idioma</string>
<string name="pref_use_system_ui_font">Usar fuentes del sistema</string>
<string name="pref_incognito_keyboard">Teclado incógnito</string>
<!-- Translators: Must indicate that there is no guarantee as the system may not honor our request. -->
<string name="pref_incognito_keyboard_explain">Solicitar al teclado deshabilitar el aprendizaje personalizado</string>
@@ -769,8 +780,6 @@
<string name="pref_app_access">Acceso a la aplicación</string>
<string name="pref_chats">Chats</string>
<string name="pref_in_chat_sounds">Sonidos en el chat</string>
<!-- deprecated -->
<string name="pref_message_text_size">Tamaño de texto del mensaje</string>
<string name="pref_view_log">Ver log</string>
<string name="pref_saved_log">El log fue guardado en la carpeta de Descargas</string>
<string name="pref_save_log_failed">No se pudo guardar el log</string>
@@ -981,6 +990,7 @@
<string name="chat_protection_broken_explanation">El cifrado de extremo a extremo ya no se puede garantizar, probablemente porque %1$s reinstaló Delta Chat o envió un mensaje desde otro dispositivo.\n\nPueden encontrarse en persona y escanear su código QR nuevamente para restablecer el cifrado de extremo a extremo garantizado.</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>
<!-- deprecated -->
<string name="encryption_required_for_new_contact">Se requiere cifrado de extremo a extremo, pero aún no está disponible para %1$s.\n\nPuede compartir su enlace de invitación o reunirse en persona y escanear su código QR.</string>
<string name="learn_more">Aprender más</string>
@@ -1010,9 +1020,7 @@
<string name="withdraw_verifycontact_explain">Este código QR puede ser escaneado por otras personas para contactarlo.\n\nPuede desactivar el código QR aquí y reactivarlo escaneándolo de nuevo.</string>
<string name="withdraw_verifygroup_explain">Este código QR puede ser escaneado por otros para unirse al grupo \"%1$s\".\n\nPuede desactivar el código QR aquí y reactivarlo escaneándolo de nuevo.</string>
<string name="withdraw_qr_code">Desactivar código QR</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">Este código QR puede ser escaneado por otros para contactarlo.\n\nEl código QR no está activo en este dispositivo.</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">Este código QR puede ser escaneado por otros para unirse al grupo \"%1$s\".\n\nEl código QR no está activo en este dispositivo.</string>
<string name="revive_qr_code">Activar código QR</string>
<string name="qrshow_title">Código de invitación QR</string>
@@ -1049,7 +1057,6 @@
<!-- translators: "setup" is the "encryption setup" here, as in "Autocrypt Setup Message" -->
<string name="contact_setup_changed">Configuración cambiada para %1$s.</string>
<string name="verified_contact_required_explain">Para garantizar el cifrado de extremo a extremo, solo puedes añadir contactos con una marca de verificación verde</string>
<string name="create_verified_group_ask">¿Quieres crear un grupo protegido que garantiza el cifrado de extremo a extremo?\n\nSolo contactos que tengan una estampilla verde de verificación pueden ser añadidos a un grupo protegido.</string>
<string name="copy_qr_data_success">URL del código QR copiado al portapapeles</string>
<string name="mailto_dialog_header_select_chat">Seleccione el chat para enviar el mensaje</string>
<!-- first placeholder is the name of the chat -->
@@ -1057,8 +1064,6 @@
<string name="mailto_link_could_not_be_decoded">El enlace mailto no se pudo decodificar: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">Descartar</string>
<string name="notify_reply_button">Responder</string>
<string name="notify_new_message">Nuevo mensaje</string>
<string name="notify_background_connection_enabled">Conexión en segundo plano habilitada</string>
@@ -1114,8 +1119,12 @@
<string name="global_menu_view_developer_desktop">Programador</string>
<string name="global_menu_view_developer_tools_desktop">Herramientas del Programador</string>
<string name="global_menu_help_desktop">Ayuda</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Aprender más sobre Delta Chat</string>
<string name="delta_chat_homepage">Página de inicio de Delta Chat</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Contribuir en GitHub</string>
<string name="contribute">Contribuir</string>
<string name="global_menu_help_report_desktop">Reportar un problema</string>
<string name="global_menu_help_about_desktop">Sobre Delta Chat</string>
<string name="global_menu_file_open_desktop">Abrir Delta Chat</string>
@@ -1128,6 +1137,8 @@
<string name="timestamp_format_m_desktop">MMM D</string>
<string name="remove_desktop">Eliminar</string>
<string name="save_desktop">Guardar</string>
<!-- Opposite of "Save". Undo a "Save" action. Similar to "Unmute", "Unpin". Could also be worded as "Save no longer" or so. -->
<string name="unsave">Deshacer guardado</string>
<string name="name_desktop">Nombre</string>
<string name="select_group_image_desktop">Seleccionar imagen de grupo</string>
<string name="export_backup_desktop">Exportar copia de respaldo</string>
@@ -1187,11 +1198,18 @@
<string name="notifications_avg_minutes">Promedio cada %1$d minutos</string>
<string name="notifications_avg_hours">Promedio cada %1$d horas</string>
<string name="last_check_at">Comprobado en %1$s</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">Apps recibidas o enviadas en cualquier chat aparecerán aquí. \"Archivos\" muestra apps descargadas.</string>
<!-- iOS webxdc shortcut page -->
<string name="shortcut_step1_tap_share_btn">Presiona el botón de compartir</string>
<string name="shortcut_step2_tap_add_to_home_screen">Selecciona \"Añadir a la pantalla principal\" para añadir la aplicación a tu pantaña principal.</string>
<string name="system_settings">Configuración del sistema</string>
<!-- shown below the button "System Settings" on the notification screen. this is a hint about what can be edited on System Settings' Notification page - eg. the notification type (banner, lock screen, notification centre), sound, badges and so on. no need to be exhaustive here, it is only to give the user an idea. -->
<string name="system_settings_notify_explain_ios">Editar tipo, insignias, vista previa y más</string>
<!-- iOS shortcut widget -->
<!-- use the same translation for "Shortcuts" as the system is using, often the term "Shortcut" stays untranslated; check eg. how the "Shortcuts" system app is called in your locale -->
<string name="shortcuts_widget_title">Accesos directos</string>
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
<string name="shortcuts_widget_description">Utilice «Añadir al widget» de Delta Chat para añadir elementos</string>
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
<string name="remove_from_widget">Quitar del widget.</string>
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
<string name="add_to_widget">Agregar al widget</string>
<!-- 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">Al permitir el acceso a la cámara podrás tomar fotos y videos.</string>
<string name="InfoPlist_NSContactsUsageDescription">Al permitir acceder a tu libreta de direcciones podrás chatear con los contactos de tu dispositivo.</string>
@@ -1200,6 +1218,9 @@
<string name="InfoPlist_NSMicrophoneUsageDescription">Al permitir el acceso al micrófono podrás grabar audio.</string>
<string name="InfoPlist_NSPhotoLibraryUsageDescription">Al permitir el acceso a la galería de fotos podrás subir tus imágenes desde allí.</string>
<string name="InfoPlist_NSPhotoLibraryAddUsageDescription">Delta Chat quiere guardar imágenes en tu galería</string>
<string name="InfoPlist_NSFaceIDUsageDescription">Delta Chat puede utilizar Face ID para proteger su perfil local, la creación de copias de seguridad y la configuración de un segundo dispositivo.</string>
<!-- android specific strings, developers: please take care to remove strings that are no longer used! -->
<string name="pref_instant_delivery">Entrega inmediata</string>
<string name="pref_background_notifications">Usar conexión en segundo plano</string>
+4 -3
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">Ados</string>
<string name="cancel">Utzi</string>
<string name="yes">Bai</string>
<string name="yes">Bai</string>
<string name="no">Ez</string>
<string name="on">Bai</string>
<string name="off">Ez</string>
@@ -365,8 +365,6 @@
<string name="pref_app_access">Aplikazio sarbidea</string>
<string name="pref_chats">Txatak</string>
<string name="pref_in_chat_sounds">Txat bitarteko soinuak</string>
<!-- deprecated -->
<string name="pref_message_text_size">Mezuen letra tamaina</string>
<string name="pref_view_log">Ikusi egunkaria</string>
<string name="pref_saved_log">Egunkaria deskargen karpetan gorde da</string>
<string name="pref_save_log_failed">Huts egin du egunkaria gordetzean</string>
@@ -482,6 +480,7 @@
<string name="contact_not_verified">Ezin da %1$s egiaztatu</string>
<!-- translators: "setup" is the "encryption setup" here, as in "Autocrypt Setup Message" -->
<string name="contact_setup_changed">Aldatu %1$s(r)en ezarpena</string>
<!-- notifications -->
<string name="notify_reply_button">Erantzun</string>
<string name="notify_new_message">Mezu berria</string>
<string name="notify_background_connection_enabled">Bigarren planoko konexioa gaituta</string>
@@ -515,7 +514,9 @@
<string name="global_menu_view_developer_desktop">Garatzailea</string>
<string name="global_menu_view_developer_tools_desktop">Garatzaile-tresnak</string>
<string name="global_menu_help_desktop">Laguntza</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Ikasi gehiago Delta Chat-i buruz</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Hartu parte GitHub-en</string>
<string name="global_menu_help_report_desktop">Eman arazo baten berri</string>
<string name="global_menu_help_about_desktop">Delta Chat-i buruz</string>
+3 -17
View File
@@ -4,8 +4,6 @@
<string name="app_name">دلتاچت</string>
<string name="ok">تأیید</string>
<string name="cancel">لغو</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">یا</string>
<string name="clear_search">پاک کردن جست‌وجو</string>
<!-- a noun, used on a button, short for "show link" -->
<string name="link">پیوند</string>
@@ -541,10 +539,6 @@ https://meet.jit.si/$ROOM
<string name="multidevice_transfer_done_devicemsg">ℹ️ حساب به دستگاه دوم شما منتقل شد.</string>
<!-- Shown beside progress bar, stay short -->
<string name="preparing_account">در حال آماده سازی حساب…</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="waiting_for_receiver">در انتظار گیرنده…</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="receiver_connected">گیرنده متصل شد…</string>
<!-- Shown beside progress bar, stay short -->
<string name="transferring">در حال انتقال…</string>
<string name="troubleshooting">عیب‌یابی</string>
@@ -743,8 +737,6 @@ https://meet.jit.si/$ROOM
<string name="pref_app_access">دسترسی نرم‌افزار</string>
<string name="pref_chats">گپ‌ها</string>
<string name="pref_in_chat_sounds">صداهای درون‌گپی</string>
<!-- deprecated -->
<string name="pref_message_text_size">اندازه نوشته‌های پیام</string>
<string name="pref_view_log">نمایش گزارش</string>
<string name="pref_saved_log">گزارش را در پوشه\"دانلودها\" ذخیره کن </string>
<string name="pref_save_log_failed">ذخیره گزارش ناموفق بود</string>
@@ -949,6 +941,7 @@ https://meet.jit.si/$ROOM
<string name="chat_protection_enabled_explanation">رمزنگاری سراسری پیام‌های این گفتگو اکنون تضمین می‌شود. رمزنگاری سراسری باعث می‌شود پیام‌هایتان بین شما و مخاطبین شما محرمانه بماند. حتی ارائه‌دهنده رایانامه شما هم نمی‌تواند آن‌ها را بخواند.</string>
<string name="chat_protection_broken_tap_to_learn_more">%1$s پیامی را از دستگاه دیگری ارسال کرد. برای اطلاعات بیشتر ضربه بزنید.</string>
<string name="invalid_unencrypted_tap_to_learn_more">⚠️ %1$s به رمزنگاری سراسری نیاز دارد که هنوز برای این گپ پیکره‌بندی نشده است. برای یادگیری بیش‌تر این‌جا بزنید.</string>
<!-- deprecated -->
<string name="encryption_required_for_new_contact">رمزنگاری سراسری لازم است اما برای %1$s هنوز پیکره‌بندی نشده است.\n\nمی‌توانید پیوند دعوت خود را به مخاطبتان بدهید یا این‌که به صورت حضوری کد QR مخاطب را اسکن کنید.</string>
<string name="learn_more">بیشتر بدانید</string>
@@ -982,9 +975,7 @@ https://meet.jit.si/$ROOM
<string name="withdraw_verifycontact_explain">دیگران برای ارتباط با شما می‌توانند این کد کیوآر را اسکن کنند. \n\n می‌توان کد کیوآر را در اینجا غیر فعال کنید و با اسکن کردن مجدد، آن را فعال کنید. </string>
<string name="withdraw_verifygroup_explain">این کد کیوآر می‌تواند توسط دیگران و برای پیوستن به گروه \"%1$s\" اسکن شود.\n\n شما می‌تواند این کد کیوآر را در اینجا غیرفعال کنید و با اسکن کردن مجدد، آن را فعال نمایید. </string>
<string name="withdraw_qr_code">غیرفعال کردن کد کیوآر</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">دیگران برای تماس با شما می‌توانند این کد کیوآر را اسکن کنند. \n\n این کد کیوآر در این دستگاه فعال نیست. </string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">دیگران می‌توانند برای پیوستن به گروه \"%1$s\" این کد کیوآر را اسکن کنند. این کد کیوآر روی این دستگاه فعال نیست. </string>
<string name="revive_qr_code">فعال کردن کد کیوآر</string>
<string name="qrshow_title">کد دعوت کیوآر</string>
@@ -1030,8 +1021,6 @@ https://meet.jit.si/$ROOM
<string name="mailto_link_could_not_be_decoded">امکان کدگشایی پیوند mailto وجود ندارد: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">صرف نظر</string>
<string name="notify_reply_button">پاسخ</string>
<string name="notify_new_message">پیام جدید</string>
<string name="notify_background_connection_enabled">اتصال‌ها پیش زمینه فعال شد</string>
@@ -1103,7 +1092,9 @@ GNU GPL ورژن ۳
<string name="global_menu_view_developer_desktop">برنامه‌نویس</string>
<string name="global_menu_view_developer_tools_desktop">ابزار برنامه نویس</string>
<string name="global_menu_help_desktop">کمک</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">یادگیری بیشتر درمورد دلتاچت</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">کمک به گیت‌هاب</string>
<string name="global_menu_help_report_desktop">گزارش یک مشکل</string>
<string name="global_menu_help_about_desktop">درباره دلتاچت</string>
@@ -1176,11 +1167,6 @@ GNU GPL ورژن ۳
<string name="notifications_avg_minutes">به صورت متوسط هر%1$d دقیقه</string>
<string name="notifications_avg_hours">به صورت متوسط هر %1$d ساعت</string>
<string name="last_check_at">بررسی شده در %1$s</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">برنامه‌های دریافت‌شده یا ارسال‌شده از همه چت‌ها در این‌جا نمایش داده می‌شود. «پرونده‌ها» تنها برنامه‌های اخیرا دریافت‌شده را نمایش می‌دهد.</string>
<!-- iOS webxdc shortcut page -->
<string name="shortcut_step1_tap_share_btn">روی دکمه اشتراک کلیک کنید</string>
<string name="shortcut_step2_tap_add_to_home_screen">برای افزودن برنامه به صفحه اصلی خود، «افزودن به صفحه اصلی» را انتخاب کنید.</string>
<!-- 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">دلتاچت برای گرفتن و ارسال عکس و فیلم و برای اسکن کردن کیوآر کد از دوربین شما استفاده می‌کند. </string>
<string name="InfoPlist_NSContactsUsageDescription">دلتاچت از مخاطبین شما برای نمایش فهرست رایانامه‌هایی که می‌توانید برایشان پیام ارسال کنید استفاده می‌کند. دلتاچت کارساز ندارد، مخاطبین شما به جایی ارسال نمی‌شوند. </string>
+3 -17
View File
@@ -4,8 +4,6 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Peruuta</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">tai</string>
<string name="clear_search">Tyhjennä haku</string>
<string name="yes">Kyllä</string>
<string name="no">Ei</string>
@@ -478,6 +476,7 @@
<string name="tab_audio_empty_hint">Tässä keskustelussa jaetut äänitiedostot ja -viestit näkyvät tässä.</string>
<string name="tab_webxdc_empty_hint">Keskustelussa jaetut yksityiset sovellukset näkyvät tässä.</string>
<string name="tab_all_media_empty_hint">Kun keskusteluissa jaetaan mediaa, se tulee näkymään täällä.</string>
<string name="all_apps_empty_hint">Kaikissa keskusteluissa jaetut yksityiset sovellukset näkyvät tässä.</string>
<string name="media_preview">Median esikatselu</string>
<!-- option to show images in the gallery with the correct width/height aspect (instead of square); other gallery apps may be a source of inspiration for translation :) -->
<string name="aspect_ratio_grid">Kuvasuhteen mukainen ruudukko</string>
@@ -509,10 +508,6 @@
<string name="multidevice_transfer_done_devicemsg">️ Profiili siirretty toiselle laitteellesi.</string>
<!-- Shown beside progress bar, stay short -->
<string name="preparing_account">Valmistellaan profiilia...</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="waiting_for_receiver">Odotetaan vastaanottajaa...</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="receiver_connected">Vastaanottaja yhdistetty...</string>
<!-- Shown beside progress bar, stay short -->
<string name="transferring">Siirretään...</string>
<string name="troubleshooting">Vianetsintä</string>
@@ -690,8 +685,6 @@
<string name="pref_app_access">Sovelluksen pääsy</string>
<string name="pref_chats">Keskustelut</string>
<string name="pref_in_chat_sounds">Keskustelunaikaiset äänet</string>
<!-- deprecated -->
<string name="pref_message_text_size">Viestin fonttikoko</string>
<string name="pref_view_log">Näytä loki</string>
<string name="pref_saved_log">Tallenna loki \"Lataukset\" -kansioon</string>
<string name="pref_save_log_failed">Lokin tallennus epäonnistui</string>
@@ -928,9 +921,7 @@
<string name="withdraw_verifycontact_explain">Muut voivat skannata tämän QR-koodin ottaakseen yhteyttä sinuun.\n\nVoit kytkeä QR-koodin pois täällä ja aktivoida sen uudelleen skannaamalla uudestaan.</string>
<string name="withdraw_verifygroup_explain">Muut voivat skannata tämän QR-koodin liittyäkseen ryhmään \"%1$s\".\n\nVoit kytkeä QR-koodin pois täällä ja aktivoida sen uudelleen skannaamalla.</string>
<string name="withdraw_qr_code">Kytke QR-koodi pois käytöstä</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">Muut voivat skannata tämän QR-koodin ottaakseen yhteyttä sinuun.\n\nQR-koodi ei ole aktiivinen tällä laitteella.</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">Muut voivat skannata tämän QR-koodin liittyäkseen ryhmään \"%1$s\".\n\nQR-koodi ei ole aktiivinen tällä laitteella.</string>
<string name="revive_qr_code">Aktivoi QR-koodi</string>
<string name="qrshow_title">QR-kutsukoodi</string>
@@ -974,8 +965,6 @@
<string name="mailto_link_could_not_be_decoded">mailto-linkkiä ei voitu selvittää: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">Hylkää</string>
<string name="notify_reply_button">Vastaa</string>
<string name="notify_new_message">Uusi viesti</string>
<string name="notify_background_connection_enabled">Yhteys käynnissä taustalla</string>
@@ -1031,7 +1020,9 @@
<string name="global_menu_view_developer_desktop">Kehittäjä</string>
<string name="global_menu_view_developer_tools_desktop">Kehittäjätyökalut</string>
<string name="global_menu_help_desktop">Ohje</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Lisätietoja Delta Chatista</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Osallistu GitHubissa</string>
<string name="global_menu_help_report_desktop">Ilmoita ongelma</string>
<string name="global_menu_help_about_desktop">Tietoja Delta Chatista</string>
@@ -1104,11 +1095,6 @@
<string name="notifications_avg_minutes">Keskimäärin%1$d minuutin välein</string>
<string name="notifications_avg_hours">Keskimäärin %1$d tunnin välein</string>
<string name="last_check_at">Tarkistettu %1$s</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">Kaikissa keskusteluissa jaetut yksityiset sovellukset näkyvät tässä. \"Tiedostot\" näyttää ladatut yksityiset sovellukset.</string>
<!-- iOS webxdc shortcut page -->
<string name="shortcut_step1_tap_share_btn">Napauta jakamispainiketta.</string>
<string name="shortcut_step2_tap_add_to_home_screen">Valitse \"Lisää aloitusnäytölle\" lisätäksesi sovelluksen puhelimesi aloitusnäytölle.</string>
<!-- 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 käyttää kameraa kuvien ja videoiden kuvaamiseen ja lähettämiseen sekä QR-koodien skannaamiseen.</string>
<string name="InfoPlist_NSContactsUsageDescription">Delta Chat käyttää yhteystietojasi näyttämään listan sähköpostiosoitteista, joihin voit kirjoittaa. Delta Chatilla ei ole palvelimia, eikä yhteystietojasi lähetetä mihinkään.</string>
+3 -17
View File
@@ -4,8 +4,6 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Annuler</string>
<!-- deprecated, the word "or" to separate blocks in the user interface that are mutually exclusive -->
<string name="or_separator">ou</string>
<string name="clear_search">Effacer la recherche</string>
<string name="yes">Oui</string>
<string name="no">Non</string>
@@ -494,6 +492,7 @@
<string name="tab_audio_empty_hint">Les fichiers audio et messages vocaux partagés dans cette discussion seront affichés ici.</string>
<string name="tab_webxdc_empty_hint">Les applis partagées dans cette discussion seront affichées ici.</string>
<string name="tab_all_media_empty_hint">Les fichiers multimédias partagés dans une discussion apparaissent ici.</string>
<string name="all_apps_empty_hint">Les applications envoyées ou reçues dans une discussion apparaissent ici.</string>
<string name="media_preview">Prévisualiser le fichier multimédia</string>
<!-- option to show images in the gallery with the correct width/height aspect (instead of square); other gallery apps may be a source of inspiration for translation :) -->
<string name="aspect_ratio_grid">Grille de proportions</string>
@@ -525,10 +524,6 @@
<string name="multidevice_transfer_done_devicemsg">️ Compte transféré sur votre deuxième appareil.</string>
<!-- Shown beside progress bar, stay short -->
<string name="preparing_account">Préparation du compte...</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="waiting_for_receiver">En attente de l\'appareil...</string>
<!-- deprecated, shown beside progress bar, stay short -->
<string name="receiver_connected">Appareil connecté...</string>
<!-- Shown beside progress bar, stay short -->
<string name="transferring">Transfert...</string>
<string name="troubleshooting">Dépannage</string>
@@ -695,8 +690,6 @@
<string name="pref_app_access">Accès à l\'application</string>
<string name="pref_chats">Discussions</string>
<string name="pref_in_chat_sounds">Sons de messages entrants</string>
<!-- deprecated -->
<string name="pref_message_text_size">Taille de police des messages</string>
<string name="pref_view_log">Voir le journal</string>
<string name="pref_saved_log">Journal enregistré dans le dossier \"Téléchargements\"</string>
<string name="pref_save_log_failed">Enregistrement du journal échoué</string>
@@ -923,9 +916,7 @@
<string name="withdraw_verifycontact_explain">Ce code QR pourrait être scanné par d\'autre personnes pour vous contacter.\n\nVous pouvez désactiver le QR code ici et le réactiver en le scannant ici de nouveau.</string>
<string name="withdraw_verifygroup_explain">Le code QR peut être scanné par d\'autres personnes pour rejoindre le groupe \"%1$s\".\n\nVous pouvez désactiver le QR code ici et le réactiver en le scannant ici de nouveau.</string>
<string name="withdraw_qr_code">Désactiver le QR Code</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">Ce code QR pourrait être scanné par d\'autre personnes pour vous contacter.\n\nCe code QR n\'est pas actif sur cet appareil.</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">Ce code QR pourrait être scanné par d\'autre personnes pour rejoindre le groupe \"%1$s\".\n\nLe code QR n\'est pas actif sur cet appareil.</string>
<string name="revive_qr_code">Activer le QR Code</string>
<string name="qrshow_title">QR Code d\'Invitation</string>
@@ -968,8 +959,6 @@
<string name="mailto_link_could_not_be_decoded">Le lien mailto n\'a pas pu être décodé: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">Rejeter</string>
<string name="notify_reply_button">Répondre</string>
<string name="notify_new_message">Nouveau message</string>
<string name="notify_background_connection_enabled">Connexion en arrière-plan activée</string>
@@ -1025,7 +1014,9 @@
<string name="global_menu_view_developer_desktop">Développeur</string>
<string name="global_menu_view_developer_tools_desktop">Outils de développement</string>
<string name="global_menu_help_desktop">Aide</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">En savoir plus sur Delta Chat</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Contribuer sur Github</string>
<string name="global_menu_help_report_desktop">Signaler un problème</string>
<string name="global_menu_help_about_desktop">À propos de Delta Chat</string>
@@ -1098,11 +1089,6 @@
<string name="notifications_avg_minutes">Toutes les %1$d minutes en moyenne</string>
<string name="notifications_avg_hours">Toutes les %1$d heures en moyenne</string>
<string name="last_check_at">Dernièrement vu à %1$s</string>
<!-- iOS webxdc selector -->
<string name="webxdc_selector_empty_hint">Les applications envoyées ou reçues dans une discussion apparaissent ici. « Fichiers » affiche les applis que vous venez de télécharger.</string>
<!-- iOS webxdc shortcut page -->
<string name="shortcut_step1_tap_share_btn">Cliquer sur le bouton « Partager ».</string>
<string name="shortcut_step2_tap_add_to_home_screen">Sélectionner « Ajouter à l\'écran d\'accueil » pour ajouter l\'appli à votre écran d\'accueil.</string>
<!-- 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 utilise votre appareil photo pour prendre des photos et des vidéos et les envoyer, ainsi que pour scanner des QR codes.</string>
<string name="InfoPlist_NSContactsUsageDescription">Delta Chat utilise vos contacts pour montrer une liste d\'adresses de courriel auxquels vous pouvez écrire. Delta Chat n\'a pas de serveur, vos contacts ne sont envoyés nulle part.</string>
+3 -7
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Cancelar</string>
<string name="clear_search">Eliminar busca</string>
<string name="clear_search">Eliminar busca</string>
<string name="yes">Si</string>
<string name="no">Non</string>
<string name="select">Seleccionar</string>
@@ -591,8 +591,6 @@
<string name="pref_app_access">Acceso a app</string>
<string name="pref_chats">Conversas</string>
<string name="pref_in_chat_sounds">Sons na conversa</string>
<!-- deprecated -->
<string name="pref_message_text_size">Tamaño da letra na mensaxe</string>
<string name="pref_view_log">Ver rexistro</string>
<string name="pref_saved_log">Gardouse o rexistro no cartafol \"Descargas\"</string>
<string name="pref_save_log_failed">Non se puido gardar o rexistro</string>
@@ -770,9 +768,7 @@
<string name="withdraw_verifycontact_explain">Este código QR permite que outras persoas contacten contigo.\n\nPodes desactivar o código QR aquí e reactivalo volvéndoo a escanear.</string>
<string name="withdraw_verifygroup_explain">Este código QR permite que outras persoas se unan ao grupo \"%1$s\".\n\nPodes desactivar aquí o código QR e reactivalo volvéndoo a escanear.</string>
<string name="withdraw_qr_code">Desactivar código QR</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifycontact_explain">Este código QR podía ser escaneado por outras persoas para contactar contigo.\n\nO código QR non está activo neste dispositio.</string>
<!-- "could" in the meaning of "possible at some point in the past, but no longer possible today" -->
<string name="revive_verifygroup_explain">O código QR podía ser escaneado por outras persoas para unirse ao grupo \"%1$s\".\n\nO código QR non está activo neste dispositivo.</string>
<string name="revive_qr_code">Activar código QR</string>
<string name="qrshow_title">Código QR de convite</string>
@@ -804,8 +800,6 @@
<string name="mailto_link_could_not_be_decoded">a ligazón mailto non se puido descodificar: %1$s</string>
<!-- notifications -->
<!-- deprecated, use mark_as_read or mark_as_read_short -->
<string name="notify_dismiss">Desbotar</string>
<string name="notify_reply_button">Responder</string>
<string name="notify_new_message">Nova mensaxe</string>
<string name="notify_background_connection_enabled">Conexión en segundo plano establecida</string>
@@ -852,7 +846,9 @@
<string name="global_menu_view_developer_desktop">Desenvolvedora</string>
<string name="global_menu_view_developer_tools_desktop">Ferramentas de desenvolvedora</string>
<string name="global_menu_help_desktop">Axuda</string>
<!-- deprecated, use delta_chat_homepage instead -->
<string name="global_menu_help_learn_desktop">Coñece máis sobre Delta Chat</string>
<!-- deprecated, use contribute instead -->
<string name="global_menu_help_contribute_desktop">Contribúe en GitHub</string>
<string name="global_menu_help_report_desktop">Informa dun fallo</string>
<string name="global_menu_help_about_desktop">Acerca de Delta Chat</string>
+2 -3
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Otkaži</string>
<string name="yes">Da</string>
<string name="yes">Da</string>
<string name="no">Ne</string>
<string name="on">Uključeno</string>
<string name="off">Isključeno</string>
@@ -211,8 +211,6 @@
<string name="pref_app_access">Pristup aplikaciji</string>
<string name="pref_chats">Razgovori</string>
<string name="pref_in_chat_sounds">Zvuk unutar razgovora</string>
<!-- deprecated -->
<string name="pref_message_text_size">Veličina fonta poruke</string>
<string name="pref_other">Ostalo</string>
<string name="pref_backup">Sigurnosna kopija</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. -->
@@ -224,6 +222,7 @@
<!-- qr code stuff -->
<string name="qr_code">QR kod</string>
<string name="qrscan_fingerprint_label">Otisak prsta</string>
<!-- notifications -->
<string name="notify_reply_button">Odgovori</string>
<string name="notify_new_message">Nova poruka</string>
<string name="notify_priority_high">Visoko</string>

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