Compare commits

...

86 Commits

Author SHA1 Message Date
Avently 1b254f0d22 revert Kotlin 2.0 update 2024-06-03 14:04:08 +07:00
Avently ee6f9c334a multiplatform: Kotlin 2.0 & Compose 1.6.10 2024-06-03 14:01:18 +07:00
Evgeny Poberezkin dc8d08ec04 website: translations (#4274)
* Added translation using Weblate (Hungarian)

* Added translation using Weblate (Hungarian)

* Translated using Weblate (Dutch)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/nl/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/uk/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/

* Translated using Weblate (Polish)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/pl/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/ar/

---------

Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: Maksym Lukashenko <livelmaxim@gmail.com>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
2024-06-02 19:43:59 +01:00
Evgeny Poberezkin 4ad0e0f65e ui: translations (#4273)
* Translated using Weblate (Italian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/nl/

* Translated using Weblate (Dutch)

Currently translated at 99.8% (1547 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/nl/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/uk/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (German)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (French)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (French)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Persian)

Currently translated at 99.9% (1822 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/nl/

* Translated using Weblate (Dutch)

Currently translated at 99.8% (1547 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/nl/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/uk/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/uk/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (German)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1819 of 1819 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (French)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (French)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Persian)

Currently translated at 99.9% (1822 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Romanian)

Currently translated at 13.0% (237 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/

* Translated using Weblate (German)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (German)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/nl/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/nl/

* Translated using Weblate (Polish)

Currently translated at 99.9% (1822 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/

* Translated using Weblate (Polish)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/pl/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Persian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Romanian)

Currently translated at 17.6% (322 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (Japanese)

Currently translated at 96.9% (1767 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ja/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/

* Translated using Weblate (German)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Russian)

Currently translated at 100.0% (1823 of 1823 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/

* Translated using Weblate (German)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (Russian)

Currently translated at 100.0% (1549 of 1549 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/

* import/export localizations

---------

Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: Maksym Lukashenko <livelmaxim@gmail.com>
Co-authored-by: z0rden <kaanpeker196@gmail.com>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: J R <jr@simplex.chat>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: Siavash <ciavash@proton.me>
Co-authored-by: Flavian <3zorro.1@gmail.com>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: Ninja Left <s1lntlwd@proton.me>
Co-authored-by: Miyu Sakatsuki <miyu-sakatsuki@outlook.jp>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
2024-06-02 19:20:46 +01:00
Evgeny Poberezkin d01515e755 blog: Protecting Children's Safety Requires End-to-End Encryption 2024-06-01 21:47:38 +01:00
Evgeny Poberezkin 3fa70ba217 5.8-beta.5: ios 223, android 218, desktop 52 2024-06-01 11:03:22 +01:00
Evgeny Poberezkin 6ae4cddc2e Merge branch 'stable' 2024-06-01 09:33:36 +01:00
Evgeny Poberezkin ac8ee971f5 5.7.5: ios 222, android 216, desktop 51 2024-06-01 09:15:41 +01:00
Evgeny Poberezkin 11d4872186 core: 5.8.0.5 (simplexmq 5.8.0.10) 2024-06-01 00:22:26 +01:00
Evgeny Poberezkin 370e2e87ad Merge branch 'stable' 2024-05-31 23:50:00 +01:00
Evgeny Poberezkin ef30fcf5e2 cli: options for private message routing and fallback mode (#4256)
* cli: options for private message routing and fallback mode

* remove short options

* fix tests

* encoding

* fix
2024-05-31 23:41:20 +01:00
Evgeny Poberezkin 6ad1423f29 core: 5.7.5.0 (simplexmq: 5.7.6.0, file download fix) 2024-05-31 23:35:00 +01:00
Stanislav Dmitrenko c52e5349db ios: more sheets will become hidden while protect screen on (#4259)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-31 22:47:57 +01:00
Stanislav Dmitrenko 3c98c6acc0 android, desktop: selectable cards for proxy options (#4263)
* android, desktop: selectable cards for proxy options

* title
2024-05-31 22:25:15 +01:00
Stanislav Dmitrenko c251f5e2bd android, desktop: debug subscribed SMP queues (#4262)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-31 18:54:12 +01:00
Evgeny Poberezkin b165603136 ios: log file error to console 2024-05-31 18:33:57 +01:00
spaced4ndy 184a24b70e ui: fix filtering of contacts that can be invited to group (#4265) 2024-05-31 18:30:59 +01:00
spaced4ndy d46bae6498 ios: allow to save sent file on tap (#4264) 2024-05-31 20:20:49 +04:00
Evgeny Poberezkin 5ac521f6d8 core: commands to debug subscribed SMP queues (#4253)
* core: commands to debug subscribed SMP queues

* getLastRcvMsgInfo

* DESC

* update

* update commands, ui compiles

* update

* ios: fix type

* swap

* simplexmq

* group member queue info

* copy button in the alert
2024-05-31 12:45:58 +01:00
Stanislav Dmitrenko 7b5b747b19 desktop: performant drawing of wallpaper (#4249)
* desktop: low quality drawing of wallpaper

* fast drawing

* clean up

* unused
2024-05-30 17:07:58 +01:00
Stanislav Dmitrenko 037655e30f android, desktop: creating wallpapers dir in some situations (#4254) 2024-05-30 17:04:00 +01:00
spaced4ndy 54088c6d5a core: "/get queues" api to debug agent queues (#4252) 2024-05-30 14:24:33 +04:00
Stanislav Dmitrenko 78f7fcc89f android, desktop: wallpaper fixes (#4251) 2024-05-30 07:03:23 +01:00
Evgeny Poberezkin b402caeb89 5.8-beta.4: ios 221, android 215, desktop 50 2024-05-29 18:49:35 +01:00
Evgeny Poberezkin ff8a8de3c8 Revert "android, desktop: change wallpaper file type from PNG to WebP (#4250)"
This reverts commit d22c0c2614.
2024-05-29 17:35:57 +01:00
Stanislav Dmitrenko d22c0c2614 android, desktop: change wallpaper file type from PNG to WebP (#4250) 2024-05-29 13:31:31 +01:00
Evgeny Poberezkin 73c8d3c2e3 android, desktop: add Persian interface language 2024-05-29 10:06:54 +01:00
Evgeny Poberezkin 0110385e65 ui: v5.8 whats new (#4244)
* ios: v5.8 whats new

* blog post stub

* update

* android

* ios: export localizations
2024-05-29 09:59:41 +01:00
Evgeny Poberezkin ad0a678c5f core: 5.8.0.4 (simplexmq 5.8.0.7) 2024-05-29 08:20:51 +01:00
sh 0495a4cd78 docs/smp-server: expand tor configuration, add security practices (#4228)
* docs/smp-server: expand tor configuration, add security practices

* docs/smp-server: add TOC

* update

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-28 22:26:15 +01:00
Stanislav Dmitrenko 02267c5263 android: show alert of exception while initializing WebView (#4245)
* android: show alert of exception while initializing WebView

* Update apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-28 22:01:45 +01:00
Stanislav Dmitrenko cad3bc048f desktop: prevent corruption of settings file (#4243)
* desktop: prevent corruption of settings file

* check for existence

* unneeded

* simplify

* unused
2024-05-28 21:41:22 +01:00
Stanislav Dmitrenko 1b04423745 android, desktop: close notes tab on switching between chats (#4246) 2024-05-28 16:35:43 +01:00
spaced4ndy 2143eb2d7a core: batch send pending group messages (#4242) 2024-05-28 18:32:29 +04:00
spaced4ndy 3d395b0e45 core: inactive connections/members (#4009) 2024-05-28 16:42:07 +04:00
Stanislav Dmitrenko d79b4dfb5a android: replace new line in Uri before transforming it to URI (#4240) 2024-05-28 11:24:57 +01:00
Evgeny Poberezkin 0ae9f5ebba website: translations (#4241)
* Translated using Weblate (German)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/ja/

* Translated using Weblate (German)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (257 of 257 strings)

Translation: SimpleX Chat/SimpleX Chat website
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/ja/

---------

Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: Miyu Sakatsuki <miyu-sakatsuki@outlook.jp>
2024-05-28 11:23:58 +01:00
Evgeny Poberezkin 57c80786dc ui: translations, remove translations for wallpaper names used in exported themes (#4239)
* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1741 of 1741 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Persian)

Currently translated at 54.1% (943 of 1741 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Persian)

Currently translated at 65.5% (1141 of 1741 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1741 of 1741 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Persian)

Currently translated at 76.3% (1330 of 1741 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Persian)

Currently translated at 83.0% (1446 of 1741 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (German)

Currently translated at 100.0% (1751 of 1751 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1751 of 1751 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1751 of 1751 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Hungarian)

Currently translated at 99.3% (1760 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Persian)

Currently translated at 88.3% (1566 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Persian)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Translated using Weblate (Polish)

Currently translated at 98.3% (1743 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/nl/

* Translated using Weblate (Japanese)

Currently translated at 98.8% (1751 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ja/

* Translated using Weblate (Polish)

Currently translated at 99.9% (1771 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 95.6% (1449 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1772 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Romanian)

Currently translated at 9.8% (175 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Vietnamese)

Currently translated at 10.6% (189 of 1772 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/vi/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/nl/

* Translated using Weblate (Polish)

Currently translated at 99.9% (1777 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (German)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/

* Translated using Weblate (French)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (French)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/

* Translated using Weblate (Persian)

Currently translated at 100.0% (1778 of 1778 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/

* Translated using Weblate (Hungarian)

Currently translated at 98.8% (1794 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Czech)

Currently translated at 94.2% (1710 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/cs/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Polish)

Currently translated at 99.9% (1813 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Turkish)

Currently translated at 99.6% (1807 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (German)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1814 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1515 of 1515 strings)

Translation: SimpleX Chat/SimpleX Chat iOS
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/

* Translated using Weblate (Vietnamese)

Currently translated at 11.2% (204 of 1814 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/vi/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/

* Translated using Weblate (Ukrainian)

Currently translated at 97.1% (1764 of 1815 strings)

Translation: SimpleX Chat/SimpleX Chat Android
Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/uk/

* process localizations

* removed wallpapers names

---------

Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: Siavash <ciavash@proton.me>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: Miyu Sakatsuki <miyu-sakatsuki@outlook.jp>
Co-authored-by: sith-on-mars <groguko36@pm.me>
Co-authored-by: z0rden <kaanpeker196@gmail.com>
Co-authored-by: Flavian <3zorro.1@gmail.com>
Co-authored-by: tuananh-ng <158744840+tuananh-ng@users.noreply.github.com>
Co-authored-by: indiandoc <marc@nymtech.net>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: zenobit <zen@osowoso.xyz>
Co-authored-by: Maksym Lukashenko <livelmaxim@gmail.com>
Co-authored-by: Avently <7953703+avently@users.noreply.github.com>
2024-05-28 11:20:52 +01:00
Stanislav Dmitrenko da1cad96fc android: fix showing empty notification (#4237)
* android: fix showing empty notification

* fix desktop concurrent notifications
2024-05-28 08:04:23 +01:00
Stanislav Dmitrenko b58ccedf23 android, desktop: enhancements to wallpapers (#4234)
* android, desktop: enhancements to wallpapers

* fixes

* unneeded
2024-05-28 08:02:45 +01:00
spaced4ndy 01cadefde7 core: avoid creating duplicate introductions between group members connecting concurrently (#4235) 2024-05-27 18:42:39 +04:00
Evgeny Poberezkin c70e7223d9 core: delete connection records when connecting (JOIN) fails (#4233)
* core: delete connection records when connecting (JOIN) fails

* show errors in commands
2024-05-27 15:32:09 +01:00
Evgeny Poberezkin a1d4f52185 5.8-beta.3: ios 220, android 214, desktop 49 2024-05-25 20:57:07 +01:00
Evgeny Poberezkin 373070f388 ui: show UI for additional group preferences (SimpleX links and per-role permissions) 2024-05-25 19:54:05 +01:00
Evgeny Poberezkin a03ccd0ba6 ios: update core library 5.8.0.3 2024-05-25 18:55:15 +01:00
Evgeny Poberezkin a7982cccf9 Merge branch 'stable' 2024-05-25 17:22:25 +01:00
Stanislav Dmitrenko bf91666f07 android, desktop: wallpapers (#4109)
* android, desktop: wallpapers

* changes

* removed unused

* changes

* backgrounds moved to themes. can be exported/imported

* changes and refactoring

* scrollable

* change

* reorder

* theme per background

* changes

* don't drop customization in same cases

* changes

* changes

* fix state update

* different defaults

* fix Android

* removed migration

* temporary

* returned theme name as uppercase back

* resilient to wrong preset name

* more

* live color change without button

* fix

* Revert "temporary"

This reverts commit 705c92ee56.

* changes

* changes

* almost candy

* old picker and ability to specify hex color

* different image

* picker

* user theme override, fixes, import/export theme with image

* revert when about to merge: useful layout for theming

* custom image displaying and deletion work correctly

* performance

* moved code up

* changes

* color changes in picker when changing themes

* reset color without closing modal

* unused

* log

* currentTheme instead of MaterialTheme

* different inheritance logic

* fix and move sent/received message colors to top

* remove background

* performance

* fix wrong base

* changes

* fix

* small

* custom image selection made normally

* better color picker

* better picker

* refactor, fixes, optimizations

* working with unknown base theme + tests

* change

* delete wallpaper dir when importing archive

* function rename

* fix bug with state update

* update colors

* fix text colors

* update images

* changes

* remote desktop and theme mode dropdown

* default theme

* additional accent 2 changes

* fix default wallpaper

* removed ChatListAlwaysVisible

* renaming

* update messages

* changes

* default theme

* unused

* member icon background color

* image quality

* fix wallpaper on empty notes screen

* update colors

* change

* update colors

* fix update on android

* fix update on both platforms

* update colors, remove serializable

* fix color

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-25 09:52:16 +01:00
Evgeny Poberezkin ab47a5a27e Revert "ui: comment smp proxy ui (#4204)"
This reverts commit a0d6ae15ab.
2024-05-24 22:59:37 +01:00
Evgeny Poberezkin 23581f59ae core: 5.8.0.3 2024-05-24 21:33:45 +01:00
Evgeny Poberezkin 291df6e9d0 core: logging of chat events (#4216)
* core: update simplexmq (persist server errors)

* fix

* same config

* logging

* logging 2

* log

* log 2

* finally

* catch better

* more logs

* logs

* fix

* more logging, context from PROHIBITED

* warning

* more logs

* logs3

* logs4

* logs in simplexmq

* log locks from simplemq

* log queue size

* log sendMessagesB in simplexmq

* update simplexmq

* logs5

* logs6

* logs7

* logs8

* logs8

* logs9

* logs10

* log11

* log12

* fix test

* more logs

* logging

* clean up

* refactor

* simplify

* tags

* log level

* remove network errors from the log

* rename
2024-05-24 21:09:21 +01:00
Evgeny Poberezkin dae0b63c22 Merge branch 'stable' 2024-05-23 22:56:04 +01:00
Evgeny Poberezkin c59eb06b8a 5.8-beta.2: ios 218, android 210, desktop 47 2024-05-20 21:23:40 +01:00
Evgeny Poberezkin 423fc96638 core: 5.8.0.2 (simplexmq 5.8.0.2) 2024-05-20 18:38:46 +01:00
spaced4ndy ba203faad4 android: check known relays before file reception, support user approval of unknown relays (#4196) 2024-05-20 17:58:30 +04:00
spaced4ndy ec7b35adb9 ios: check known relays before file reception, support user approval of unknown relays (#4044)
* ios: check known relays before file reception, support user approval of unknown relays

* add privacyAskToApproveRelays to AppSettings

* less text

* ui improvements, fixes

* fix ntf

* shorter alert

* simplify settings

* rename

* icon

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-20 17:49:19 +04:00
spaced4ndy d2d450d1d7 core: check known relays before file reception, support user approval of unknown relays (#4043)
* core: check known relays before file reception, support user approval of unknown relays

* comment

* reset on not approved agent error

* add privacyAskToApproveRelays to AppSettings

* filter distinct servers

* update simplexmq

* remember user_approved_relays

* refactor

* rename

* update simplexmq

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-20 17:23:29 +04:00
Evgeny Poberezkin b4caefb17c 5.8-beta.1: ios 217, android 209, desktop 46 2024-05-18 08:20:38 +01:00
Evgeny Poberezkin fd791f3fb8 ios: update core library 2024-05-17 15:54:51 +01:00
Evgeny Poberezkin 0720292ebf core: 5.8.0.1 (simplexmq: 5.8.0.1, faster reconnection when switching networks) 2024-05-17 15:39:58 +01:00
spaced4ndy a0d6ae15ab ui: comment smp proxy ui (#4204) 2024-05-17 16:36:25 +04:00
Evgeny Poberezkin 3e76a2d49c blog: image 2024-05-16 19:47:24 +01:00
Evgeny Poberezkin ed3365bb6d website: fix links 2024-05-16 18:16:00 +01:00
Evgeny Poberezkin b2a8797ed4 blog: Redefining Privacy by Making Hard Choices (#4195)
* blog: Redefining Privacy by Making Hard Choices

* update

* update

* revert

* update

* corrections

Co-authored-by: Esra'a Al Shafei <alshafei@users.noreply.github.com>

* update

---------

Co-authored-by: Esra'a Al Shafei <alshafei@users.noreply.github.com>
2024-05-16 18:02:37 +01:00
spaced4ndy d3e522e169 ui: disable send field for disabled connection (based on authErrCounter) (#4193) 2024-05-16 17:08:31 +04:00
spaced4ndy 49e09ca449 core: contact disabled event (#4194) 2024-05-16 17:08:13 +04:00
spaced4ndy d1dde3d0c8 ui: support message forwarding with custom ttl (#4192) 2024-05-16 14:12:58 +04:00
spaced4ndy ef75eceb40 core: support message forwarding with custom ttl (#4191) 2024-05-16 14:11:55 +04:00
spaced4ndy 96ce59f330 multiplatform: SMP proxy configuration buttons (#4188)
* multiplatform: SMP proxy configuration buttons

* fix

* icons

* icon

* icon
2024-05-15 20:09:51 +01:00
spaced4ndy 98a67fa2e4 multiplatform: SMP proxy support (#4179)
* android: SMP proxy support

* android types

* show in meta

* reserve

* remove comment

* texts
2024-05-15 13:56:29 +01:00
spaced4ndy 4b13512950 ios: SMP proxy support (#4178)
* ios: SMP proxy support

* statuses

* group statuses

* error texts

* update

* change icon

* texts

* texts

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-15 13:09:42 +01:00
spaced4ndy 4c0d47bbd4 core: message statuses for sending proxies (#4161)
* core: delivery path

* update simplexmq

* via proxy snd flags

* error statuses

* rework errors

* proxy expired errors

* corrections

* move backwards compatibile parser to new type

* update simplexmq

* names

* refactor, style

* simplexmq

* refactor

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-15 12:30:05 +01:00
Evgeny Poberezkin 3129602a78 Merge branch 'stable' 2024-05-15 11:44:22 +01:00
Evgeny Poberezkin 93ae1145bc core: update simplexmq (use MVar for better DB connection concurrency) (#4183)
* core: update simplexmq (use MVar for better DB connection concurrency)

* focus failing tests

* add timeouts to test

* fix tests

* more delays

* increase timeouts

* prints

* delay

* delay

* empty

* more delays

* enable all

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2024-05-15 11:16:38 +01:00
Evgeny Poberezkin d02668386f directory: debug logging (#4104) 2024-05-14 21:32:53 +01:00
M. Sarmad Qadeer bd8c8b5a8c web: fix the links of faq & some other (#4144)
* web: fix the links of faq & some other

* web: fix links

* web: update .eleventy.js to fix links

* web: fix some links and improve the logic

* web: fix links & improve the logic

* remove semicolon

* update links

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-05-14 19:59:51 +01:00
Evgeny Poberezkin e359ec02f5 5.8-beta.0: ios 216, android 208, desktop 45 2024-05-13 23:34:14 +01:00
Evgeny Poberezkin a1948d549b ios: update core library 2024-05-13 22:24:10 +01:00
Evgeny Poberezkin 396b73b480 core: 5.8.0.0 2024-05-13 21:13:07 +01:00
Evgeny Poberezkin 331b4633fc core: platform independent encoding for delete command (#4176) 2024-05-13 20:39:13 +01:00
Evgeny Poberezkin 29db2b4e9b core: command to show duplicate message count (#4172)
* core: command to show duplicate message count

* update

* updated

* update

* update

* simplexmq
2024-05-13 19:55:57 +01:00
spaced4ndy f091384aa7 ui: apply model updates only for active user for switch and ratchet sync events (#4175) 2024-05-13 17:25:24 +01:00
spaced4ndy f40ba6f04d core: api to differentiate contacts and conversations (#4111) 2024-05-13 16:51:54 +04:00
Evgeny Poberezkin 06d61ea73e core: update simplexmq 2024-05-13 08:19:40 +01:00
Evgeny Poberezkin 84d7a77a9f core: update simplexmq (better subscription management) (#4131)
* core: update simplexmq (better subscription management)

* ui: update settings

* update simplexmq

* simplexmq

* simplexmq

* test output

* delay

* disable test
2024-05-13 08:04:12 +01:00
Evgeny Poberezkin 878eea774d core: save app themes as map with any text key (#4159)
* core: save app themes as map with any text key

* remove theme preset name

* list of themes

* theme id

* theme IDs

* moar

* colors

* default to dark

* fix
2024-05-12 23:35:14 +01:00
Narasimha-sc 4575dc6e30 langs: change 1-2 days to several days on fdroid (#4170) 2024-05-12 18:19:27 +01:00
266 changed files with 15408 additions and 2891 deletions
+4 -3
View File
@@ -1,5 +1,6 @@
---
layout: layouts/privacy.html
permalink: /privacy/index.html
---
# SimpleX Chat Privacy Policy and Conditions of Use
@@ -10,7 +11,7 @@ SimpleX Chat communication protocol is the first protocol that has no user profi
Double ratchet algorithm has such important properties as [forward secrecy](/docs/GLOSSARY.md#forward-secrecy), sender [repudiation](/docs/GLOSSARY.md#) and break-in recovery (also known as [post-compromise security](/docs/GLOSSARY.md#post-compromise-security)).
If you believe that any part of this document is not aligned with our mission or values, please raise it with us via [email](chat@simplex.chat) or [chat](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23%2F%3Fv%3D1%26dh%3DMCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion).
If you believe that any part of this document is not aligned with our mission or values, please raise it with us via [email](mailto:chat@simplex.chat) or [chat](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23%2F%3Fv%3D1%26dh%3DMCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion).
## Privacy Policy
@@ -78,7 +79,7 @@ When you choose to use instant push notifications in SimpleX iOS app, because th
Preset notification server cannot observe the actual addresses of these queues, as a separate address is used to subscribe to the notifications. It also cannot observe who sends messages to you. Apple push notifications servers can only observe how many notifications are sent to you, but not from how many contacts, or from which messaging relays, as notifications are delivered to your device end-to-end encrypted by one of the preset notification servers - these notifications only contain end-to-end encrypted metadata, not even encrypted message content, and they look completely random to Apple push notification servers.
You can read more about the design of iOS push notifications [here](https://simplex.chat/blog/20220404-simplex-chat-instant-notifications.html#our-ios-approach-has-one-trade-off).
You can read more about the design of iOS push notifications [here](./blog/20220404-simplex-chat-instant-notifications.md#our-ios-approach-has-one-trade-off).
#### Another information stored on the servers
@@ -115,7 +116,7 @@ We will update this Privacy Policy as needed so that it is current, accurate, an
Please also read our Conditions of Use of Software and Infrastructure below.
If you have questions about our Privacy Policy please contact us via [email](chat@simplex.chat) or [chat](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23%2F%3Fv%3D1%26dh%3DMCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion).
If you have questions about our Privacy Policy please contact us via [email](mailto:chat@simplex.chat) or [chat](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23%2F%3Fv%3D1%26dh%3DMCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion).
## Conditions of Use of Software and Infrastructure
+87 -25
View File
@@ -341,8 +341,8 @@ func apiGetChatItemInfo(type: ChatType, id: Int64, itemId: Int64) async throws -
throw r
}
func apiForwardChatItem(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemId: Int64) async -> ChatItem? {
let cmd: ChatCommand = .apiForwardChatItem(toChatType: toChatType, toChatId: toChatId, fromChatType: fromChatType, fromChatId: fromChatId, itemId: itemId)
func apiForwardChatItem(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemId: Int64, ttl: Int?) async -> ChatItem? {
let cmd: ChatCommand = .apiForwardChatItem(toChatType: toChatType, toChatId: toChatId, fromChatType: fromChatType, fromChatId: fromChatId, itemId: itemId, ttl: ttl)
return await processSendMessageCmd(toChatType: toChatType, cmd: cmd)
}
@@ -561,6 +561,18 @@ func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) throws -> (Gro
throw r
}
func apiContactQueueInfo(_ contactId: Int64) async throws -> (RcvMsgInfo?, QueueInfo) {
let r = await chatSendCmd(.apiContactQueueInfo(contactId: contactId))
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
throw r
}
func apiGroupMemberQueueInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (RcvMsgInfo?, QueueInfo) {
let r = await chatSendCmd(.apiGroupMemberQueueInfo(groupId: groupId, groupMemberId: groupMemberId))
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
throw r
}
func apiSwitchContact(contactId: Int64) throws -> ConnectionStats {
let r = chatSendCmdSync(.apiSwitchContact(contactId: contactId))
if case let .contactSwitchStarted(_, _, connectionStats) = r { return connectionStats }
@@ -927,14 +939,19 @@ func standaloneFileInfo(url: String, ctrl: chat_ctrl? = nil) async -> MigrationF
}
}
func receiveFile(user: any UserLike, fileId: Int64, auto: Bool = false) async {
if let chatItem = await apiReceiveFile(fileId: fileId, encrypted: privacyEncryptLocalFilesGroupDefault.get(), auto: auto) {
func receiveFile(user: any UserLike, fileId: Int64, userApprovedRelays: Bool = false, auto: Bool = false) async {
if let chatItem = await apiReceiveFile(
fileId: fileId,
userApprovedRelays: userApprovedRelays || !privacyAskToApproveRelaysGroupDefault.get(),
encrypted: privacyEncryptLocalFilesGroupDefault.get(),
auto: auto
) {
await chatItemSimpleUpdate(user, chatItem)
}
}
func apiReceiveFile(fileId: Int64, encrypted: Bool, inline: Bool? = nil, auto: Bool = false) async -> AChatItem? {
let r = await chatSendCmd(.receiveFile(fileId: fileId, encrypted: encrypted, inline: inline))
func apiReceiveFile(fileId: Int64, userApprovedRelays: Bool, encrypted: Bool, inline: Bool? = nil, auto: Bool = false) async -> AChatItem? {
let r = await chatSendCmd(.receiveFile(fileId: fileId, userApprovedRelays: userApprovedRelays, encrypted: encrypted, inline: inline))
let am = AlertManager.shared
if case let .rcvFileAccepted(_, chatItem) = r { return chatItem }
if case .rcvFileAcceptedSndCancelled = r {
@@ -947,19 +964,50 @@ func apiReceiveFile(fileId: Int64, encrypted: Bool, inline: Bool? = nil, auto: B
}
} else if let networkErrorAlert = networkErrorAlert(r) {
logger.error("apiReceiveFile network error: \(String(describing: r))")
am.showAlert(networkErrorAlert)
if !auto {
am.showAlert(networkErrorAlert)
}
} else {
switch chatError(r) {
case .fileCancelled:
logger.debug("apiReceiveFile ignoring fileCancelled error")
case .fileAlreadyReceiving:
logger.debug("apiReceiveFile ignoring fileAlreadyReceiving error")
case let .fileNotApproved(fileId, unknownServers):
logger.debug("apiReceiveFile fileNotApproved error")
if !auto {
let srvs = unknownServers.map { s in
if let srv = parseServerAddress(s), !srv.hostnames.isEmpty {
srv.hostnames[0]
} else {
serverHost(s)
}
}
am.showAlert(Alert(
title: Text("Unknown servers!"),
message: Text("Without Tor or VPN, your IP address will be visible to these XFTP relays: \(srvs.sorted().joined(separator: ", "))."),
primaryButton: .default(
Text("Download"),
action: {
Task {
logger.debug("apiReceiveFile fileNotApproved alert - in Task")
if let user = ChatModel.shared.currentUser {
await receiveFile(user: user, fileId: fileId, userApprovedRelays: true)
}
}
}
),
secondaryButton: .cancel()
))
}
default:
logger.error("apiReceiveFile error: \(String(describing: r))")
am.showAlertMsg(
title: "Error receiving file",
message: "Error: \(String(describing: r))"
)
if !auto {
am.showAlertMsg(
title: "Error receiving file",
message: "Error: \(String(describing: r))"
)
}
}
}
return nil
@@ -1229,7 +1277,7 @@ func filterMembersToAdd(_ ms: [GMember]) -> [Contact] {
let memberContactIds = ms.compactMap{ m in m.wrapped.memberCurrent ? m.wrapped.memberContactId : nil }
return ChatModel.shared.chats
.compactMap{ $0.chatInfo.contact }
.filter{ c in c.ready && c.active && !memberContactIds.contains(c.apiId) }
.filter{ c in c.sendMsgEnabled && !c.nextSendGrpInv && !memberContactIds.contains(c.apiId) }
.sorted{ $0.displayName.lowercased() < $1.displayName.lowercased() }
}
@@ -1799,7 +1847,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
case let .sndFileCompleteXFTP(user, aChatItem, _):
await chatItemSimpleUpdate(user, aChatItem)
case let .sndFileError(user, aChatItem, _):
case let .sndFileError(user, aChatItem, _, _):
if let aChatItem = aChatItem {
await chatItemSimpleUpdate(user, aChatItem)
Task { cleanupFile(aChatItem) }
@@ -1849,21 +1897,35 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
case .chatSuspended:
chatSuspended()
case let .contactSwitch(_, contact, switchProgress):
await MainActor.run {
m.updateContactConnectionStats(contact, switchProgress.connectionStats)
case let .contactSwitch(user, contact, switchProgress):
if active(user) {
await MainActor.run {
m.updateContactConnectionStats(contact, switchProgress.connectionStats)
}
}
case let .groupMemberSwitch(_, groupInfo, member, switchProgress):
await MainActor.run {
m.updateGroupMemberConnectionStats(groupInfo, member, switchProgress.connectionStats)
case let .groupMemberSwitch(user, groupInfo, member, switchProgress):
if active(user) {
await MainActor.run {
m.updateGroupMemberConnectionStats(groupInfo, member, switchProgress.connectionStats)
}
}
case let .contactRatchetSync(_, contact, ratchetSyncProgress):
await MainActor.run {
m.updateContactConnectionStats(contact, ratchetSyncProgress.connectionStats)
case let .contactRatchetSync(user, contact, ratchetSyncProgress):
if active(user) {
await MainActor.run {
m.updateContactConnectionStats(contact, ratchetSyncProgress.connectionStats)
}
}
case let .groupMemberRatchetSync(_, groupInfo, member, ratchetSyncProgress):
await MainActor.run {
m.updateGroupMemberConnectionStats(groupInfo, member, ratchetSyncProgress.connectionStats)
case let .groupMemberRatchetSync(user, groupInfo, member, ratchetSyncProgress):
if active(user) {
await MainActor.run {
m.updateGroupMemberConnectionStats(groupInfo, member, ratchetSyncProgress.connectionStats)
}
}
case let .contactDisabled(user, contact):
if active(user) {
await MainActor.run {
m.updateContact(contact)
}
}
case let .remoteCtrlFound(remoteCtrl, ctrlAppInfo_, appVersion, compatible):
await MainActor.run {
+32 -1
View File
@@ -49,7 +49,7 @@ func localizedInfoRow(_ title: LocalizedStringKey, _ value: LocalizedStringKey)
}
}
private func serverHost(_ s: String) -> String {
func serverHost(_ s: String) -> String {
if let i = s.range(of: "@")?.lowerBound {
return String(s[i...].dropFirst())
} else {
@@ -110,6 +110,7 @@ struct ChatInfoView: View {
case switchAddressAlert
case abortSwitchAddressAlert
case syncConnectionForceAlert
case queueInfo(info: String)
case error(title: LocalizedStringKey, error: LocalizedStringKey = "")
var id: String {
@@ -119,6 +120,7 @@ struct ChatInfoView: View {
case .switchAddressAlert: return "switchAddressAlert"
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
case let .queueInfo(info): return "queueInfo \(info)"
case let .error(title, _): return "error \(title)"
}
}
@@ -224,6 +226,18 @@ struct ChatInfoView: View {
Section(header: Text("For console")) {
infoRow("Local name", chat.chatInfo.localDisplayName)
infoRow("Database ID", "\(chat.chatInfo.apiId)")
Button ("Debug delivery") {
Task {
do {
let info = queueInfoText(try await apiContactQueueInfo(chat.chatInfo.apiId))
await MainActor.run { alert = .queueInfo(info: info) }
} catch let e {
logger.error("apiContactQueueInfo error: \(responseError(e))")
let a = getErrorAlert(e, "Error")
await MainActor.run { alert = .error(title: a.title, error: a.message) }
}
}
}
}
}
}
@@ -243,6 +257,7 @@ struct ChatInfoView: View {
case .switchAddressAlert: return switchAddressAlert(switchContactAddress)
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchContactAddress)
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncContactConnection(force: true) })
case let .queueInfo(info): return queueInfoAlert(info)
case let .error(title, error): return mkAlert(title: title, message: error)
}
}
@@ -577,6 +592,22 @@ func syncConnectionForceAlert(_ syncConnectionForce: @escaping () -> Void) -> Al
)
}
func queueInfoText(_ info: (RcvMsgInfo?, QueueInfo)) -> String {
let (rcvMsgInfo, qInfo) = info
var msgInfo: String
if let rcvMsgInfo { msgInfo = encodeJSON(rcvMsgInfo) } else { msgInfo = "none" }
return String.localizedStringWithFormat(NSLocalizedString("server queue info: %@\n\nlast received msg: %@", comment: "queue info"), encodeJSON(qInfo), msgInfo)
}
func queueInfoAlert(_ info: String) -> Alert {
Alert(
title: Text("Message queue info"),
message: Text(info),
primaryButton: .default(Text("Ok")),
secondaryButton: .default(Text("Copy")) { UIPasteboard.general.string = info }
)
}
struct ChatInfoView_Previews: PreviewProvider {
static var previews: some View {
ChatInfoView(
@@ -54,12 +54,13 @@ struct CIFileView: View {
switch (file.fileStatus) {
case .sndStored: return file.fileProtocol == .local
case .sndTransfer: return false
case .sndComplete: return false
case .sndComplete: return true
case .sndCancelled: return false
case .sndError: return false
case .rcvInvitation: return true
case .rcvAccepted: return true
case .rcvTransfer: return false
case .rcvAborted: return true
case .rcvComplete: return true
case .rcvCancelled: return false
case .rcvError: return false
@@ -73,10 +74,10 @@ struct CIFileView: View {
logger.debug("CIFileView fileAction")
if let file = file {
switch (file.fileStatus) {
case .rcvInvitation:
case .rcvInvitation, .rcvAborted:
if fileSizeValid(file) {
Task {
logger.debug("CIFileView fileAction - in .rcvInvitation, in Task")
logger.debug("CIFileView fileAction - in .rcvInvitation, .rcvAborted, in Task")
if let user = m.currentUser {
await receiveFile(user: user, fileId: file.fileId)
}
@@ -112,6 +113,11 @@ struct CIFileView: View {
if file.fileProtocol == .local, let fileSource = getLoadedFileSource(file) {
saveCryptoFile(fileSource)
}
case .sndComplete:
logger.debug("CIFileView fileAction - in .sndComplete")
if let fileSource = getLoadedFileSource(file) {
saveCryptoFile(fileSource)
}
default: break
}
}
@@ -148,6 +154,8 @@ struct CIFileView: View {
} else {
progressView()
}
case .rcvAborted:
fileIcon("doc.fill", color: .accentColor, innerIcon: "exclamationmark.arrow.circlepath", innerIconSize: 12)
case .rcvComplete: fileIcon("doc.fill")
case .rcvCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .rcvError: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
@@ -21,6 +21,8 @@ struct CIGroupInvitationView: View {
@State private var inProgress = false
@State private var progressByTimeout = false
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false
var body: some View {
let action = !chatItem.chatDir.sent && groupInvitation.status == .pending
let v = ZStack(alignment: .bottomTrailing) {
@@ -43,7 +45,7 @@ struct CIGroupInvitationView: View {
.foregroundColor(inProgress ? .secondary : chatIncognito ? .indigo : .accentColor)
.font(.callout)
+ Text(" ")
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showStatus: false, showEdited: false)
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showStatus: false, showEdited: false, showViaProxy: showSentViaProxy)
)
.overlay(DetermineWidth())
}
@@ -51,7 +53,7 @@ struct CIGroupInvitationView: View {
(
groupInvitationText()
+ Text(" ")
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showStatus: false, showEdited: false)
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showStatus: false, showEdited: false, showViaProxy: showSentViaProxy)
)
.overlay(DetermineWidth())
}
@@ -17,7 +17,6 @@ struct CIImageView: View {
let maxWidth: CGFloat
@Binding var imgWidth: CGFloat?
@State var scrollProxy: ScrollViewProxy?
@State var metaColor: Color
@State private var showFullScreenImage = false
var body: some View {
@@ -38,7 +37,7 @@ struct CIImageView: View {
.onTapGesture {
if let file = file {
switch file.fileStatus {
case .rcvInvitation:
case .rcvInvitation, .rcvAborted:
Task {
if let user = m.currentUser {
await receiveFile(user: user, fileId: file.fileId)
@@ -103,6 +102,7 @@ struct CIImageView: View {
case .rcvInvitation: fileIcon("arrow.down", 10, 13)
case .rcvAccepted: fileIcon("ellipsis", 14, 11)
case .rcvTransfer: progressView()
case .rcvAborted: fileIcon("exclamationmark.arrow.circlepath", 14, 11)
case .rcvCancelled: fileIcon("xmark", 10, 13)
case .rcvError: fileIcon("xmark", 10, 13)
case .invalid: fileIcon("questionmark", 10, 13)
@@ -116,7 +116,7 @@ struct CIImageView: View {
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: size, height: size)
.foregroundColor(metaColor)
.foregroundColor(.white)
.padding(padding)
}
@@ -24,7 +24,7 @@ struct CIInvalidJSONView: View {
.cornerRadius(18)
.textSelection(.disabled)
.onTapGesture { showJSON = true }
.sheet(isPresented: $showJSON) {
.appSheet(isPresented: $showJSON) {
invalidJSONView(json)
}
}
@@ -17,6 +17,8 @@ struct CIMetaView: View {
var showStatus = true
var showEdited = true
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false
var body: some View {
if chatItem.isDeletedContent {
chatItem.timestampText.font(.caption).foregroundColor(metaColor)
@@ -27,24 +29,24 @@ struct CIMetaView: View {
switch meta.itemStatus {
case let .sndSent(sndProgress):
switch sndProgress {
case .complete: ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .sent, showStatus: showStatus, showEdited: showEdited)
case .partial: ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .sent, showStatus: showStatus, showEdited: showEdited)
case .complete: ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .sent, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
case .partial: ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .sent, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
}
case let .sndRcvd(_, sndProgress):
switch sndProgress {
case .complete:
ZStack {
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .rcvd1, showStatus: showStatus, showEdited: showEdited)
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .rcvd2, showStatus: showStatus, showEdited: showEdited)
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .rcvd1, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .rcvd2, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
}
case .partial:
ZStack {
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .rcvd1, showStatus: showStatus, showEdited: showEdited)
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .rcvd2, showStatus: showStatus, showEdited: showEdited)
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .rcvd1, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .rcvd2, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
}
}
default:
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, showStatus: showStatus, showEdited: showEdited)
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
}
}
}
@@ -64,7 +66,8 @@ func ciMetaText(
transparent: Bool = false,
sent: SentCheckmark? = nil,
showStatus: Bool = true,
showEdited: Bool = true
showEdited: Bool = true,
showViaProxy: Bool
) -> Text {
var r = Text("")
if showEdited, meta.itemEdited {
@@ -78,6 +81,9 @@ func ciMetaText(
}
r = r + Text(" ")
}
if showViaProxy, meta.sentViaProxy == true {
r = r + statusIconText("arrow.forward", color.opacity(0.67)).font(.caption2)
}
if showStatus {
if let (icon, statusColor) = meta.statusIcon(color) {
let t = Text(Image(systemName: icon)).font(.caption2)
@@ -19,6 +19,8 @@ struct CIRcvDecryptionError: View {
var chatItem: ChatItem
@State private var alert: CIRcvDecryptionErrorAlert?
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false
enum CIRcvDecryptionErrorAlert: Identifiable {
case syncAllowedAlert(_ syncConnection: () -> Void)
case syncNotSupportedContactAlert
@@ -119,7 +121,7 @@ struct CIRcvDecryptionError: View {
.foregroundColor(syncSupported ? .accentColor : .secondary)
.font(.callout)
+ Text(" ")
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true)
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showViaProxy: showSentViaProxy)
)
}
.padding(.horizontal, 12)
@@ -140,7 +142,7 @@ struct CIRcvDecryptionError: View {
.foregroundColor(.red)
.italic()
+ Text(" ")
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true)
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showViaProxy: showSentViaProxy)
}
.padding(.horizontal, 12)
CIMetaView(chat: chat, chatItem: chatItem)
@@ -69,7 +69,7 @@ struct CIVideoView: View {
.onTapGesture {
if let file = file {
switch file.fileStatus {
case .rcvInvitation:
case .rcvInvitation, .rcvAborted:
receiveFileIfValidSize(file: file, receiveFile: receiveFile)
case .rcvAccepted:
switch file.fileProtocol {
@@ -95,7 +95,7 @@ struct CIVideoView: View {
}
durationProgress()
}
if let file = file, case .rcvInvitation = file.fileStatus {
if let file = file, showDownloadButton(file.fileStatus) {
Button {
receiveFileIfValidSize(file: file, receiveFile: receiveFile)
} label: {
@@ -105,6 +105,14 @@ struct CIVideoView: View {
}
}
private func showDownloadButton(_ fileStatus: CIFileStatus) -> Bool {
switch fileStatus {
case .rcvInvitation: true
case .rcvAborted: true
default: false
}
}
private func videoViewEncrypted(_ file: CIFile, _ defaultPreview: UIImage, _ duration: Int) -> some View {
return ZStack(alignment: .topTrailing) {
ZStack(alignment: .center) {
@@ -280,6 +288,7 @@ struct CIVideoView: View {
} else {
progressView()
}
case .rcvAborted: fileIcon("exclamationmark.arrow.circlepath", 14, 11)
case .rcvCancelled: fileIcon("xmark", 10, 13)
case .rcvError: fileIcon("xmark", 10, 13)
case .invalid: fileIcon("questionmark", 10, 13)
@@ -318,10 +327,10 @@ struct CIVideoView: View {
}
// TODO encrypt: where file size is checked?
private func receiveFileIfValidSize(file: CIFile, receiveFile: @escaping (User, Int64, Bool) async -> Void) {
private func receiveFileIfValidSize(file: CIFile, receiveFile: @escaping (User, Int64, Bool, Bool) async -> Void) {
Task {
if let user = m.currentUser {
await receiveFile(user, file.fileId, false)
await receiveFile(user, file.fileId, false, false)
}
}
}
@@ -139,9 +139,10 @@ struct VoiceMessagePlayer: View {
case .sndComplete: playbackButton()
case .sndCancelled: playbackButton()
case .sndError: playbackButton()
case .rcvInvitation: downloadButton(recordingFile)
case .rcvInvitation: downloadButton(recordingFile, "play.fill")
case .rcvAccepted: loadingIcon()
case .rcvTransfer: loadingIcon()
case .rcvAborted: downloadButton(recordingFile, "exclamationmark.arrow.circlepath")
case .rcvComplete: playbackButton()
case .rcvCancelled: playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
case .rcvError: playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
@@ -217,7 +218,7 @@ struct VoiceMessagePlayer: View {
}
}
private func downloadButton(_ recordingFile: CIFile) -> some View {
private func downloadButton(_ recordingFile: CIFile, _ icon: String) -> some View {
Button {
Task {
if let user = chatModel.currentUser {
@@ -225,7 +226,7 @@ struct VoiceMessagePlayer: View {
}
}
} label: {
playPauseIcon("play.fill")
playPauseIcon(icon)
}
}
@@ -87,12 +87,17 @@ struct FramedItemView: View {
.cornerRadius(18)
.onPreferenceChange(DetermineWidth.Key.self) { msgWidth = $0 }
switch chatItem.meta.itemStatus {
case .sndErrorAuth:
v.onTapGesture { msgDeliveryError("Most likely this contact has deleted the connection with you.") }
case let .sndError(agentError):
v.onTapGesture { msgDeliveryError("Unexpected error: \(agentError)") }
default: v
if let (title, text) = chatItem.meta.itemStatus.statusInfo {
v.onTapGesture {
AlertManager.shared.showAlert(
Alert(
title: Text(title),
message: Text(text)
)
)
}
} else {
v
}
}
@@ -110,7 +115,7 @@ struct FramedItemView: View {
} else {
switch (chatItem.content.msgContent) {
case let .image(text, image):
CIImageView(chatItem: chatItem, image: image, maxWidth: maxWidth, imgWidth: $imgWidth, scrollProxy: scrollProxy, metaColor: metaColor)
CIImageView(chatItem: chatItem, image: image, maxWidth: maxWidth, imgWidth: $imgWidth, scrollProxy: scrollProxy)
.overlay(DetermineWidth())
if text == "" && !chatItem.meta.isLive {
Color.clear
@@ -157,13 +162,6 @@ struct FramedItemView: View {
}
}
}
private func msgDeliveryError(_ err: LocalizedStringKey) {
AlertManager.shared.showAlertMsg(
title: "Message delivery error",
message: err
)
}
@ViewBuilder func framedItemHeader(icon: String? = nil, caption: Text, pad: Bool = false) -> some View {
let v = HStack(spacing: 6) {
@@ -35,6 +35,8 @@ struct MsgContentView: View {
@State private var typingIdx = 0
@State private var timer: Timer?
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false
var body: some View {
if meta?.isLive == true {
msgContentView()
@@ -81,7 +83,7 @@ struct MsgContentView: View {
}
private func reserveSpaceForMeta(_ mt: CIMeta) -> Text {
(rightToLeft ? Text("\n") : Text(" ")) + ciMetaText(mt, chatTTL: chat.chatInfo.timedMessagesTTL, encrypted: nil, transparent: true)
(rightToLeft ? Text("\n") : Text(" ")) + ciMetaText(mt, chatTTL: chat.chatInfo.timedMessagesTTL, encrypted: nil, transparent: true, showViaProxy: showSentViaProxy)
}
}
@@ -383,7 +383,7 @@ struct ChatItemInfoView: View {
let mss = membersStatuses(memberDeliveryStatuses)
if !mss.isEmpty {
ForEach(mss, id: \.0.groupMemberId) { memberStatus in
memberDeliveryStatusView(memberStatus.0, memberStatus.1)
memberDeliveryStatusView(memberStatus.0, memberStatus.1, memberStatus.2)
}
} else {
Text("No delivery information")
@@ -392,23 +392,27 @@ struct ChatItemInfoView: View {
}
}
private func membersStatuses(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> [(GroupMember, CIStatus)] {
private func membersStatuses(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> [(GroupMember, CIStatus, Bool?)] {
memberDeliveryStatuses.compactMap({ mds in
if let mem = chatModel.getGroupMember(mds.groupMemberId) {
return (mem.wrapped, mds.memberDeliveryStatus)
return (mem.wrapped, mds.memberDeliveryStatus, mds.sentViaProxy)
} else {
return nil
}
})
}
private func memberDeliveryStatusView(_ member: GroupMember, _ status: CIStatus) -> some View {
private func memberDeliveryStatusView(_ member: GroupMember, _ status: CIStatus, _ sentViaProxy: Bool?) -> some View {
HStack{
ProfileImage(imageStr: member.image, size: 30)
.padding(.trailing, 2)
Text(member.chatViewName)
.lineLimit(1)
Spacer()
if sentViaProxy == true {
Image(systemName: "arrow.forward")
.foregroundColor(.secondary).opacity(0.67)
}
let v = Group {
if let (icon, statusColor) = status.statusIcon(Color.secondary) {
switch status {
+1 -1
View File
@@ -131,7 +131,7 @@ struct ChatView: View {
} label: {
ChatInfoToolbar(chat: chat)
}
.sheet(isPresented: $showChatInfoSheet, onDismiss: {
.appSheet(isPresented: $showChatInfoSheet, onDismiss: {
connectionStats = nil
customUserProfile = nil
connectionCode = nil
@@ -712,9 +712,9 @@ struct ComposeView: View {
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
await sendMemberContactInvitation()
} else if case let .forwardingItem(ci, fromChatInfo) = composeState.contextItem {
sent = await forwardItem(ci, fromChatInfo)
sent = await forwardItem(ci, fromChatInfo, ttl)
if !composeState.message.isEmpty {
sent = await send(checkLinkPreview(), quoted: sent?.id, live: false, ttl: nil)
sent = await send(checkLinkPreview(), quoted: sent?.id, live: false, ttl: ttl)
}
} else if case let .editingItem(ci) = composeState.contextItem {
sent = await updateMessage(ci, live: live)
@@ -890,13 +890,14 @@ struct ComposeView: View {
return nil
}
func forwardItem(_ forwardedItem: ChatItem, _ fromChatInfo: ChatInfo) async -> ChatItem? {
func forwardItem(_ forwardedItem: ChatItem, _ fromChatInfo: ChatInfo, _ ttl: Int?) async -> ChatItem? {
if let chatItem = await apiForwardChatItem(
toChatType: chat.chatInfo.chatType,
toChatId: chat.chatInfo.apiId,
fromChatType: fromChatInfo.chatType,
fromChatId: fromChatInfo.apiId,
itemId: forwardedItem.id
itemId: forwardedItem.id,
ttl: ttl
) {
await MainActor.run {
chatModel.addChatItem(chat.chatInfo, chatItem)
@@ -224,8 +224,7 @@ struct SendMessageView: View {
@ViewBuilder private func sendButtonContextMenuItems() -> some View {
if composeState.liveMessage == nil,
!composeState.editing,
!composeState.forwarding {
!composeState.editing {
if case .noContextItem = composeState.contextItem,
!composeState.voicePreview,
let send = sendLiveMessage,
@@ -35,6 +35,7 @@ struct GroupMemberInfoView: View {
case abortSwitchAddressAlert
case syncConnectionForceAlert
case planAndConnectAlert(alert: PlanAndConnectAlert)
case queueInfo(info: String)
case error(title: LocalizedStringKey, error: LocalizedStringKey)
var id: String {
@@ -49,6 +50,7 @@ struct GroupMemberInfoView: View {
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
case let .planAndConnectAlert(alert): return "planAndConnectAlert \(alert.id)"
case let .queueInfo(info): return "queueInfo \(info)"
case let .error(title, _): return "error \(title)"
}
}
@@ -178,6 +180,18 @@ struct GroupMemberInfoView: View {
Section("For console") {
infoRow("Local name", member.localDisplayName)
infoRow("Database ID", "\(member.groupMemberId)")
Button ("Debug delivery") {
Task {
do {
let info = queueInfoText(try await apiGroupMemberQueueInfo(groupInfo.apiId, member.groupMemberId))
await MainActor.run { alert = .queueInfo(info: info) }
} catch let e {
logger.error("apiContactQueueInfo error: \(responseError(e))")
let a = getErrorAlert(e, "Error")
await MainActor.run { alert = .error(title: a.title, error: a.message) }
}
}
}
}
}
}
@@ -223,6 +237,7 @@ struct GroupMemberInfoView: View {
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchMemberAddress)
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncMemberConnection(force: true) })
case let .planAndConnectAlert(alert): return planAndConnectAlert(alert, dismiss: true)
case let .queueInfo(info): return queueInfoAlert(info)
case let .error(title, error): return Alert(title: Text(title), message: Text(error))
}
}
@@ -34,8 +34,7 @@ struct GroupPreferencesView: View {
featureSection(.reactions, $preferences.reactions.enable)
featureSection(.voice, $preferences.voice.enable, $preferences.voice.role)
featureSection(.files, $preferences.files.enable, $preferences.files.role)
// TODO enable simplexLinks preference in 5.8
// featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role)
featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role)
featureSection(.history, $preferences.history.enable)
if groupInfo.canEdit {
@@ -102,8 +101,6 @@ struct GroupPreferencesView: View {
}
}
.frame(height: 36)
// remove in v5.8
.disabled(true)
}
} else {
settingsRow(icon, color: color) {
@@ -349,10 +349,12 @@ struct ChatListNavLink: View {
.tint(.accentColor)
}
.frame(height: rowHeights[dynamicTypeSize])
.sheet(isPresented: $showContactConnectionInfo) {
if case let .contactConnection(contactConnection) = chat.chatInfo {
ContactConnectionInfo(contactConnection: contactConnection)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
.appSheet(isPresented: $showContactConnectionInfo) {
Group {
if case let .contactConnection(contactConnection) = chat.chatInfo {
ContactConnectionInfo(contactConnection: contactConnection)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
}
}
}
.onTapGesture {
@@ -467,7 +469,7 @@ struct ChatListNavLink: View {
.padding(4)
.frame(height: rowHeights[dynamicTypeSize])
.onTapGesture { showInvalidJSON = true }
.sheet(isPresented: $showInvalidJSON) {
.appSheet(isPresented: $showInvalidJSON) {
invalidJSONView(json)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
}
@@ -240,14 +240,14 @@ struct ChatPreviewView: View {
private func itemStatusMark(_ cItem: ChatItem) -> Text {
switch cItem.meta.itemStatus {
case .sndErrorAuth:
case .sndErrorAuth, .sndError:
return Text(Image(systemName: "multiply"))
.font(.caption)
.foregroundColor(.red) + Text(" ")
case .sndError:
case .sndWarning:
return Text(Image(systemName: "exclamationmark.triangle.fill"))
.font(.caption)
.foregroundColor(.yellow) + Text(" ")
.foregroundColor(.orange) + Text(" ")
default: return Text("")
}
}
@@ -406,7 +406,28 @@ private let versionDescriptions: [VersionDescription] = [
description: "More reliable network connection."
)
]
)
),
VersionDescription(
version: "v5.8",
post: URL(string: "https://simplex.chat/blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.html"),
features: [
FeatureDescription(
icon: "arrow.forward",
title: "Private message routing 🚀",
description: "Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings."
),
FeatureDescription(
icon: "network.badge.shield.half.filled",
title: "Safely receive files",
description: "Confirm files from unknown servers."
),
FeatureDescription(
icon: "battery.50",
title: "Improved message delivery",
description: "With reduced battery usage."
)
]
),
]
private let lastVersion = versionDescriptions.last!.version
@@ -51,10 +51,10 @@ struct AdvancedNetworkSettings: View {
}
.disabled(currentNetCfg == NetCfg.proxyDefaults)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [10_000000, 15_000000, 20_000000, 25_000000, 35_000000, 50_000000], label: secondsLabel)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [10_000000, 15_000000, 20_000000, 30_000000, 45_000000, 60_000000, 90_000000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout", selection: $netCfg.tcpTimeout, values: [5_000000, 7_000000, 10_000000, 15_000000, 20_000000, 30_000000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout per KB", selection: $netCfg.tcpTimeoutPerKb, values: [2_500, 5_000, 10_000, 15_000, 20_000, 30_000], label: secondsLabel)
intSettingPicker("Receiving concurrency", selection: $netCfg.rcvConcurrency, values: [1, 2, 4, 8, 12, 16, 24], label: "")
// intSettingPicker("Receiving concurrency", selection: $netCfg.rcvConcurrency, values: [1, 2, 4, 8, 12, 16, 24], label: "")
timeoutSettingPicker("PING interval", selection: $netCfg.smpPingInterval, values: [120_000000, 300_000000, 600_000000, 1200_000000, 2400_000000, 3600_000000], label: secondsLabel)
intSettingPicker("PING count", selection: $netCfg.smpPingCount, values: [1, 2, 3, 5, 8], label: "")
Toggle("Enable TCP keep-alive", isOn: $enableKeepAlive)
@@ -23,6 +23,7 @@ extension AppSettings {
setNetCfg(val)
}
if let val = privacyEncryptLocalFiles { privacyEncryptLocalFilesGroupDefault.set(val) }
if let val = privacyAskToApproveRelays { privacyAskToApproveRelaysGroupDefault.set(val) }
if let val = privacyAcceptImages {
privacyAcceptImagesGroupDefault.set(val)
def.setValue(val, forKey: DEFAULT_PRIVACY_ACCEPT_IMAGES)
@@ -50,6 +51,7 @@ extension AppSettings {
var c = AppSettings.defaults
c.networkConfig = getNetCfg()
c.privacyEncryptLocalFiles = privacyEncryptLocalFilesGroupDefault.get()
c.privacyAskToApproveRelays = privacyAskToApproveRelaysGroupDefault.get()
c.privacyAcceptImages = privacyAcceptImagesGroupDefault.get()
c.privacyLinkPreviews = def.bool(forKey: DEFAULT_PRIVACY_LINK_PREVIEWS)
c.privacyShowChatPreviews = def.bool(forKey: DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS)
@@ -12,12 +12,16 @@ import SimpleXChat
private enum NetworkAlert: Identifiable {
case updateOnionHosts(hosts: OnionHosts)
case updateSessionMode(mode: TransportSessionMode)
case updateSMPProxyMode(proxyMode: SMPProxyMode)
case updateSMPProxyFallback(proxyFallback: SMPProxyFallback)
case error(err: String)
var id: String {
switch self {
case let .updateOnionHosts(hosts): return "updateOnionHosts \(hosts)"
case let .updateSessionMode(mode): return "updateSessionMode \(mode)"
case let .updateSMPProxyMode(proxyMode): return "updateSMPProxyMode \(proxyMode)"
case let .updateSMPProxyFallback(proxyFallback): return "updateSMPProxyFallback \(proxyFallback)"
case let .error(err): return "error \(err)"
}
}
@@ -26,11 +30,14 @@ private enum NetworkAlert: Identifiable {
struct NetworkAndServers: View {
@EnvironmentObject var m: ChatModel
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = true
@State private var cfgLoaded = false
@State private var currentNetCfg = NetCfg.defaults
@State private var netCfg = NetCfg.defaults
@State private var onionHosts: OnionHosts = .no
@State private var sessionMode: TransportSessionMode = .user
@State private var proxyMode: SMPProxyMode = .never
@State private var proxyFallback: SMPProxyFallback = .allow
@State private var alert: NetworkAlert?
var body: some View {
@@ -75,6 +82,30 @@ struct NetworkAndServers: View {
Text("Using .onion hosts requires compatible VPN provider.")
}
Section {
Picker("Private routing", selection: $proxyMode) {
ForEach(SMPProxyMode.values, id: \.self) { Text($0.text) }
}
.frame(height: 36)
Picker("Allow downgrade", selection: $proxyFallback) {
ForEach(SMPProxyFallback.values, id: \.self) { Text($0.text) }
}
.disabled(proxyMode == .never)
.frame(height: 36)
Toggle("Show message status", isOn: $showSentViaProxy)
} header: {
Text("Private message routing")
} footer: {
VStack(alignment: .leading) {
Text("To protect your IP address, private routing uses your SMP servers to deliver messages.")
if showSentViaProxy {
Text("Show → on messages sent via private routing.")
}
}
}
Section("Calls") {
NavigationLink {
RTCServers()
@@ -99,14 +130,24 @@ struct NetworkAndServers: View {
currentNetCfg = getNetCfg()
resetNetCfgView()
}
.onChange(of: onionHosts) { _ in
if onionHosts != OnionHosts(netCfg: currentNetCfg) {
alert = .updateOnionHosts(hosts: onionHosts)
.onChange(of: onionHosts) { hosts in
if hosts != OnionHosts(netCfg: currentNetCfg) {
alert = .updateOnionHosts(hosts: hosts)
}
}
.onChange(of: sessionMode) { _ in
if sessionMode != netCfg.sessionMode {
alert = .updateSessionMode(mode: sessionMode)
.onChange(of: sessionMode) { mode in
if mode != netCfg.sessionMode {
alert = .updateSessionMode(mode: mode)
}
}
.onChange(of: proxyMode) { mode in
if mode != netCfg.smpProxyMode {
alert = .updateSMPProxyMode(proxyMode: mode)
}
}
.onChange(of: proxyFallback) { fallbackMode in
if fallbackMode != netCfg.smpProxyFallback {
alert = .updateSMPProxyFallback(proxyFallback: fallbackMode)
}
}
.alert(item: $alert) { a in
@@ -137,6 +178,30 @@ struct NetworkAndServers: View {
resetNetCfgView()
}
)
case let .updateSMPProxyMode(proxyMode):
return Alert(
title: Text("Message routing mode"),
message: Text(proxyModeInfo(proxyMode)) + Text("\n") + Text("Updating this setting will re-connect the client to all servers."),
primaryButton: .default(Text("Ok")) {
netCfg.smpProxyMode = proxyMode
saveNetCfg()
},
secondaryButton: .cancel() {
resetNetCfgView()
}
)
case let .updateSMPProxyFallback(proxyFallback):
return Alert(
title: Text("Message routing fallback"),
message: Text(proxyFallbackInfo(proxyFallback)) + Text("\n") + Text("Updating this setting will re-connect the client to all servers."),
primaryButton: .default(Text("Ok")) {
netCfg.smpProxyFallback = proxyFallback
saveNetCfg()
},
secondaryButton: .cancel() {
resetNetCfgView()
}
)
case let .error(err):
return Alert(
title: Text("Error updating settings"),
@@ -166,6 +231,8 @@ struct NetworkAndServers: View {
netCfg = currentNetCfg
onionHosts = OnionHosts(netCfg: netCfg)
sessionMode = netCfg.sessionMode
proxyMode = netCfg.smpProxyMode
proxyFallback = netCfg.smpProxyFallback
}
private func onionHostsInfo(_ hosts: OnionHosts) -> LocalizedStringKey {
@@ -182,6 +249,23 @@ struct NetworkAndServers: View {
case .entity: return "A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail."
}
}
private func proxyModeInfo(_ mode: SMPProxyMode) -> LocalizedStringKey {
switch mode {
case .always: return "Always use private routing."
case .unknown: return "Use private routing with unknown servers."
case .unprotected: return "Use private routing with unknown servers when IP address is not protected."
case .never: return "Do NOT use private routing."
}
}
private func proxyFallbackInfo(_ proxyFallback: SMPProxyFallback) -> LocalizedStringKey {
switch proxyFallback {
case .allow: return "Send messages directly when your or destination server does not support private routing."
case .allowProtected: return "Send messages directly when IP address is protected and your or destination server does not support private routing."
case .prohibit: return "Do NOT send messages directly, even if your or destination server does not support private routing."
}
}
}
struct NetworkServersView_Previews: PreviewProvider {
@@ -16,6 +16,7 @@ struct PrivacySettings: View {
@AppStorage(DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS) private var showChatPreviews = true
@AppStorage(DEFAULT_PRIVACY_SAVE_LAST_DRAFT) private var saveLastDraft = true
@AppStorage(GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES, store: groupDefaults) private var encryptLocalFiles = true
@AppStorage(GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS, store: groupDefaults) private var askToApproveRelays = true
@State private var simplexLinkMode = privacySimplexLinkModeDefault.get()
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
@@ -64,18 +65,6 @@ struct PrivacySettings: View {
}
Section {
settingsRow("lock.doc") {
Toggle("Encrypt local files", isOn: $encryptLocalFiles)
.onChange(of: encryptLocalFiles) {
setEncryptLocalFiles($0)
}
}
settingsRow("photo") {
Toggle("Auto-accept images", isOn: $autoAcceptImages)
.onChange(of: autoAcceptImages) {
privacyAcceptImagesGroupDefault.set($0)
}
}
settingsRow("network") {
Toggle("Send link previews", isOn: $useLinkPreviews)
}
@@ -108,6 +97,32 @@ struct PrivacySettings: View {
Text("Chats")
}
Section {
settingsRow("lock.doc") {
Toggle("Encrypt local files", isOn: $encryptLocalFiles)
.onChange(of: encryptLocalFiles) {
setEncryptLocalFiles($0)
}
}
settingsRow("photo") {
Toggle("Auto-accept images", isOn: $autoAcceptImages)
.onChange(of: autoAcceptImages) {
privacyAcceptImagesGroupDefault.set($0)
}
}
settingsRow("network.badge.shield.half.filled") {
Toggle("Protect IP address", isOn: $askToApproveRelays)
}
} header: {
Text("Files")
} footer: {
if askToApproveRelays {
Text("The app will ask to confirm downloads from unknown file servers (except .onion).")
} else {
Text("Without Tor or VPN, your IP address will be visible to file servers.")
}
}
Section {
settingsRow("person") {
Toggle("Contacts", isOn: $contactReceipts)
@@ -60,6 +60,7 @@ let DEFAULT_DEVICE_NAME_FOR_REMOTE_ACCESS = "deviceNameForRemoteAccess"
let DEFAULT_CONFIRM_REMOTE_SESSIONS = "confirmRemoteSessions"
let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST = "connectRemoteViaMulticast"
let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO = "connectRemoteViaMulticastAuto"
let DEFAULT_SHOW_SENT_VIA_RPOXY = "showSentViaProxy"
let ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN = "androidCallOnLockScreen"
@@ -99,6 +100,7 @@ let appDefaults: [String: Any] = [
DEFAULT_CONFIRM_REMOTE_SESSIONS: false,
DEFAULT_CONNECT_REMOTE_VIA_MULTICAST: true,
DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO: true,
DEFAULT_SHOW_SENT_VIA_RPOXY: false,
ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN: AppSettingsLockScreenCalls.show.rawValue
]
@@ -123,7 +123,7 @@ struct UserProfilesView: View {
deleteModeButton("Profile and server connections", true)
deleteModeButton("Local profile data only", false)
}
.sheet(item: $selectedUser) { user in
.appSheet(item: $selectedUser) { user in
HiddenProfileView(user: user, profileHidden: $profileHidden)
}
.onChange(of: profileHidden) { _ in
@@ -131,7 +131,7 @@ struct UserProfilesView: View {
withAnimation { profileHidden = false }
}
}
.sheet(item: $profileAction) { action in
.appSheet(item: $profileAction) { action in
profileActionView(action)
}
.alert(item: $alert) { alert in
@@ -713,6 +713,10 @@
<target>Позволи изчезващи съобщения само ако вашият контакт ги разрешава.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Позволи необратимо изтриване на съобщение само ако вашият контакт го рарешава. (24 часа)</target>
@@ -808,6 +812,10 @@
<target>Вече се присъединихте към групата!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Винаги използвай реле</target>
@@ -1088,6 +1096,10 @@
<target>Файлът не може да бъде получен</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Мобилна мрежа</target>
@@ -1284,6 +1296,10 @@
<target>Потвърди актуализаациите на базата данни</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Потвърди мрежовите настройки</target>
@@ -1701,6 +1717,10 @@ This is your own one-time link!</source>
<target>Базата данни ще бъде мигрирана, когато приложението се рестартира</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Децентрализиран</target>
@@ -1948,6 +1968,10 @@ This cannot be undone!</source>
<target>Настолни устройства</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Разработване</target>
@@ -2053,11 +2077,19 @@ This cannot be undone!</source>
<target>Откриване през локалната мрежа</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>НЕ използвайте SimpleX за спешни повиквания.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Отложи</target>
@@ -2621,7 +2653,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Грешка: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2745,10 @@ This cannot be undone!</source>
<target>Файл: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Файлове и медия</target>
@@ -2818,6 +2854,16 @@ This cannot be undone!</source>
<target>Препратено от</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Намерено настолно устройство</target>
@@ -3633,11 +3679,19 @@ This is your link for group %@!</source>
<target>Потвърждениe за доставка на съобщения!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Чернова на съобщение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Реакции на съобщения</target>
@@ -3653,6 +3707,14 @@ This is your link for group %@!</source>
<target>Реакциите на съобщения са забранени в тази група.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Източникът на съобщението остава скрит.</target>
@@ -3783,11 +3845,6 @@ This is your link for group %@!</source>
<target>Най-вероятно тази връзка е изтрита.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Най-вероятно този контакт е изтрил връзката с вас.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Множество профили за чат</target>
@@ -3818,6 +3875,10 @@ This is your link for group %@!</source>
<target>Мрежова връзка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Управление на мрежата</target>
@@ -4359,11 +4420,23 @@ Error: %@</source>
<target>Поверителни имена на файлове</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Лични бележки</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Профилни и сървърни връзки</target>
@@ -4444,11 +4517,20 @@ Error: %@</source>
<target>Забрани изпращането на гласови съобщения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Защити екрана на приложението</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Защитете чат профилите с парола!</target>
@@ -4554,11 +4636,6 @@ Error: %@</source>
<target>Получаващият адрес ще бъде променен към друг сървър. Промяната на адреса ще завърши, след като подателят е онлайн.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Паралелност на получаване</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Получаващият се файл ще бъде спрян.</target>
@@ -4794,6 +4871,10 @@ Error: %@</source>
<target>SMP сървъри</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>По-безопасни групи</target>
@@ -5019,6 +5100,14 @@ Error: %@</source>
<target>Изпрати съобщение на живо</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Изпращай известия</target>
@@ -5124,6 +5213,10 @@ Error: %@</source>
<target>Изпратените съобщения ще бъдат изтрити след зададеното време.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сървърът изисква оторизация за създаване на опашки, проверете паролата</target>
@@ -5139,6 +5232,10 @@ Error: %@</source>
<target>Тестът на сървъра е неуспешен!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Сървъри</target>
@@ -5259,11 +5356,19 @@ Error: %@</source>
<target>Показване на последните съобщения в листа с чатовете</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Показване на визуализация</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Покажи:</target>
@@ -5586,6 +5691,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Приложението може да ви уведоми, когато получите съобщения или заявки за контакт - моля, отворете настройките, за да активирате.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Опитът за промяна на паролата на базата данни не беше завършен.</target>
@@ -5771,6 +5880,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>За да не се разкрива часовата зона, файловете с изображения/глас използват UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5976,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Отблокирай член?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Неочаквана грешка: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Неочаквано състояние на миграция</target>
@@ -5913,6 +6021,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Непозната грешка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Освен ако не използвате интерфейса за повикване на iOS, активирайте режима "Не безпокой", за да избегнете прекъсвания.</target>
@@ -6060,6 +6172,14 @@ To connect, please ask your contact to create another connection link and check
<target>Използвай само локални известия?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Използвай сървър</target>
@@ -6295,11 +6415,23 @@ To connect, please ask your contact to create another connection link and check
<target>С намален разход на батерията.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Грешна парола за базата данни</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Грешна парола!</target>
@@ -7415,6 +7547,12 @@ SimpleX сървърите не могат да видят вашия профи
<target>изпрати лично съобщение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>зададен нов адрес за контакт</target>
@@ -7455,11 +7593,19 @@ SimpleX сървърите не могат да видят вашия профи
<target>неизвестен</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>неизвестен статус</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>актуализиран профил на групата</target>
@@ -7525,6 +7671,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>седмици</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>да</target>
@@ -690,6 +690,10 @@
<target>Povolte mizící zprávy, pouze pokud vám to váš kontakt dovolí.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Povolte nevratné smazání zprávy pouze v případě, že vám to váš kontakt dovolí. (24 hodin)</target>
@@ -782,6 +786,10 @@
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Spojení přes relé</target>
@@ -1047,6 +1055,10 @@
<target>Nelze přijmout soubor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1238,6 +1250,10 @@
<target>Potvrdit aktualizaci databáze</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<note>No comment provided by engineer.</note>
@@ -1631,6 +1647,10 @@ This is your own one-time link!</source>
<target>Databáze bude přenesena po restartu aplikace</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Decentralizované</target>
@@ -1870,6 +1890,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Vyvinout</target>
@@ -1973,11 +1997,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NEpoužívejte SimpleX pro tísňová volání.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Udělat později</target>
@@ -2519,7 +2551,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Chyba: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2608,6 +2640,10 @@ This cannot be undone!</source>
<target>Soubor: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Soubory a média</target>
@@ -2706,6 +2742,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3490,11 +3536,19 @@ This is your link for group %@!</source>
<target>Potvrzení o doručení zprávy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Návrh zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Reakce na zprávy</target>
@@ -3510,6 +3564,14 @@ This is your link for group %@!</source>
<target>Reakce na zprávy jsou v této skupině zakázány.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3627,11 +3689,6 @@ This is your link for group %@!</source>
<target>Pravděpodobně je toto spojení smazáno.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Tento kontakt s největší pravděpodobností smazal spojení s vámi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Více chatovacích profilů</target>
@@ -3661,6 +3718,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4181,10 +4242,22 @@ Error: %@</source>
<target>Soukromé názvy souborů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil a připojení k serveru</target>
@@ -4261,11 +4334,20 @@ Error: %@</source>
<target>Zakázat odesílání hlasových zpráv.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Ochrana obrazovky aplikace</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Chraňte své chat profily heslem!</target>
@@ -4368,10 +4450,6 @@ Error: %@</source>
<target>Přijímací adresa bude změněna na jiný server. Změna adresy bude dokončena po připojení odesílatele.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Příjem souboru bude zastaven.</target>
@@ -4599,6 +4677,10 @@ Error: %@</source>
<target>SMP servery</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<note>No comment provided by engineer.</note>
@@ -4817,6 +4899,14 @@ Error: %@</source>
<target>Odeslat živou zprávu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Odeslat oznámení</target>
@@ -4921,6 +5011,10 @@ Error: %@</source>
<target>Odeslané zprávy se po uplynutí nastavené doby odstraní.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server vyžaduje autorizaci pro vytváření front, zkontrolujte heslo</target>
@@ -4936,6 +5030,10 @@ Error: %@</source>
<target>Test serveru se nezdařil!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servery</target>
@@ -5051,11 +5149,19 @@ Error: %@</source>
<target>Zobrazit poslední zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Zobrazení náhledu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Zobrazit:</target>
@@ -5369,6 +5475,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>Aplikace vás může upozornit na přijaté zprávy nebo žádosti o kontakt - povolte to v nastavení.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Pokus o změnu přístupové fráze databáze nebyl dokončen.</target>
@@ -5545,6 +5655,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>K ochraně časového pásma používají obrazové/hlasové soubory UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5631,11 +5745,6 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Neočekávaná chyba: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Neočekávaný stav přenášení</target>
@@ -5681,6 +5790,10 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
<target>Neznámá chyba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Při nepoužívání rozhraní volání iOS, povolte režim Nerušit, abyste se vyhnuli vyrušování.</target>
@@ -5821,6 +5934,14 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Použít server</target>
@@ -6038,11 +6159,23 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Špatná přístupová fráze k databázi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Špatná přístupová fráze!</target>
@@ -7122,6 +7255,12 @@ Servery SimpleX nevidí váš profil.</target>
<target>odeslat přímou zprávu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<note>profile update event chat item</note>
@@ -7158,10 +7297,18 @@ Servery SimpleX nevidí váš profil.</target>
<target>neznámý</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>aktualizoval profil skupiny</target>
@@ -7225,6 +7372,10 @@ Servery SimpleX nevidí váš profil.</target>
<target>týdnů</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>ano</target>
@@ -695,7 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Server hochgeladen.</target>
<target>Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Relais hochgeladen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -713,6 +713,11 @@
<target>Erlauben Sie verschwindende Nachrichten nur dann, wenn es Ihr Kontakt ebenfalls erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Herabstufung erlauben</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Erlauben Sie das unwiederbringliche Löschen von Nachrichten nur dann, wenn es Ihnen Ihr Kontakt ebenfalls erlaubt. (24 Stunden)</target>
@@ -808,6 +813,11 @@
<target>Sie sind bereits Mitglied der Gruppe!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Sie nutzen immer privates Routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Über ein Relais verbinden</target>
@@ -1088,6 +1098,11 @@
<target>Datei kann nicht empfangen werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Kapazität überschritten - der Empfänger hat die zuvor gesendeten Nachrichten nicht empfangen.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Zellulär</target>
@@ -1284,6 +1299,11 @@
<target>Datenbank-Aktualisierungen bestätigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Dateien von unbekannten Servern bestätigen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Bestätigen Sie die Netzwerkeinstellungen</target>
@@ -1701,6 +1721,10 @@ Das ist Ihr eigener Einmal-Link!</target>
<target>Die Datenbank wird beim nächsten Start der App migriert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Dezentral</target>
@@ -1948,6 +1972,11 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Desktop-Geräte</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Zielserver-Fehler: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Entwicklung</target>
@@ -2053,9 +2082,19 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Lokales Netzwerk durchsuchen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Nachrichten werden nicht direkt versendet, selbst wenn Ihr oder der Zielserver kein privates Routing unterstützt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Nutzen Sie SimpleX nicht für Notrufe.</target>
<target>SimpleX NICHT für Notrufe nutzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Sie nutzen KEIN privates Routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
@@ -2621,7 +2660,7 @@ Das kann nicht rückgängig gemacht werden!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Fehler: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Datei: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Dateien</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Dateien &amp; Medien</target>
@@ -2818,6 +2862,20 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Weitergeleitet aus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Weiterleitungsserver: %1$@
Zielserver Fehler: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Weiterleitungsserver: %1$@
Fehler: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Gefundener Desktop</target>
@@ -3633,11 +3691,20 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Empfangsbestätigungen für Nachrichten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Warnung bei der Nachrichtenzustellung</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Nachrichtenentwurf</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Reaktionen auf Nachrichten</target>
@@ -3653,6 +3720,16 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>In dieser Gruppe sind Reaktionen auf Nachrichten nicht erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Fallback für das Nachrichten-Routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Modus für das Nachrichten-Routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Die Nachrichtenquelle bleibt privat.</target>
@@ -3783,11 +3860,6 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Wahrscheinlich ist diese Verbindung gelöscht worden.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Dieser Kontakt hat sehr wahrscheinlich die Verbindung mit Ihnen gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Mehrere Chat-Profile</target>
@@ -3818,6 +3890,11 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Netzwerkverbindung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Netzwerk-Fehler - die Nachricht ist nach vielen Sende-Versuchen abgelaufen.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Netzwerk-Verwaltung</target>
@@ -4004,12 +4081,12 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Onion hosts will be required for connection. Requires enabling VPN." xml:space="preserve">
<source>Onion hosts will be required for connection. Requires enabling VPN.</source>
<target>Für die Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.</target>
<target>Für diese Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Onion hosts will be used when available. Requires enabling VPN." xml:space="preserve">
<source>Onion hosts will be used when available. Requires enabling VPN.</source>
<target>Onion-Hosts werden verwendet, sobald sie verfügbar sind. Dies erfordert die Aktivierung eines VPNs.</target>
<target>Wenn Onion-Hosts verfügbar sind, werden sie verwendet. Dies erfordert die Aktivierung eines VPNs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Onion hosts will not be used." xml:space="preserve">
@@ -4359,11 +4436,26 @@ Fehler: %@</target>
<target>Neutrale Dateinamen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Privates Nachrichten-Routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Privates Nachrichten-Routing 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Private Notizen</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Privates Routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil und Serververbindungen</target>
@@ -4444,11 +4536,23 @@ Fehler: %@</target>
<target>Das Senden von Sprachnachrichten nicht erlauben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>IP-Adresse schützen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>App-Bildschirm schützen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Schützen Sie Ihre IP-Adresse vor den Nachrichten-Relais , die Ihre Kontakte ausgewählt haben.
Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Ihre Chat-Profile mit einem Passwort schützen!</target>
@@ -4554,11 +4658,6 @@ Fehler: %@</target>
<target>Die Empfängeradresse wird auf einen anderen Server geändert. Der Adresswechsel wird abgeschlossen, wenn der Absender wieder online ist.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Gleichzeitiger Empfang</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Der Empfang der Datei wird beendet.</target>
@@ -4794,6 +4893,11 @@ Fehler: %@</target>
<target>SMP-Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Dateien sicher empfangen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Sicherere Gruppen</target>
@@ -5019,6 +5123,16 @@ Fehler: %@</target>
<target>Live Nachricht senden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Nachrichten werden direkt versendet, wenn die IP-Adresse geschützt ist, und Ihr oder der Zielserver kein privates Routing unterstützt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Nachrichten werden direkt versendet, wenn Ihr oder der Zielserver kein privates Routing unterstützt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Benachrichtigungen senden</target>
@@ -5124,6 +5238,11 @@ Fehler: %@</target>
<target>Gesendete Nachrichten werden nach der eingestellten Zeit gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Die Server-Adresse ist nicht mit den Netzwerk-Einstellungen kompatibel.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Um Warteschlangen zu erzeugen benötigt der Server eine Authentifizierung. Bitte überprüfen Sie das Passwort</target>
@@ -5139,6 +5258,11 @@ Fehler: %@</target>
<target>Server Test ist fehlgeschlagen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Die Server-Version ist nicht mit den Netzwerk-Einstellungen kompatibel.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Server</target>
@@ -5259,11 +5383,21 @@ Fehler: %@</target>
<target>Letzte Nachrichten anzeigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Nachrichtenstatus anzeigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Vorschau anzeigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Bei Nachrichten, die über privates Routing versendet wurden, → anzeigen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Anzeigen:</target>
@@ -5586,6 +5720,11 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Wenn sie Nachrichten oder Kontaktanfragen empfangen, kann Sie die App benachrichtigen - Um dies zu aktivieren, öffnen Sie bitte die Einstellungen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>Die App wird eine Bestätigung bei Downloads von unbekannten Datei-Servern anfordern (außer bei .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Die Änderung des Datenbank-Passworts konnte nicht abgeschlossen werden.</target>
@@ -5771,6 +5910,11 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Bild- und Sprachdateinamen enthalten UTC, um Informationen zur Zeitzone zu schützen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Zum Schutz Ihrer IP-Adresse, wird für die Nachrichten-Auslieferung privates Routing über Ihre konfigurierten SMP-Server genutzt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
<target>Mitglied freigeben?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Unerwarteter Fehler: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Unerwarteter Migrationsstatus</target>
@@ -5913,6 +6052,11 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
<target>Unbekannter Fehler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Unbekannte Server!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Aktivieren Sie den Modus "Bitte nicht stören", um Unterbrechungen zu vermeiden, es sei denn, Sie verwenden die iOS Anrufschnittstelle.</target>
@@ -6032,7 +6176,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Das aktuelle Profil nutzen</target>
<target>Aktuelles Profil nutzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use for new connections" xml:space="preserve">
@@ -6052,7 +6196,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Ein neues Inkognito-Profil nutzen</target>
<target>Neues Inkognito-Profil nutzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
@@ -6060,6 +6204,16 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>Nur lokale Benachrichtigungen nutzen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Sie nutzen privates Routing mit unbekannten Servern, wenn Ihre IP-Adresse nicht geschützt ist.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Sie nutzen privates Routing mit unbekannten Servern.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Server nutzen</target>
@@ -6295,11 +6449,26 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>Mit reduziertem Akkuverbrauch.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für Datei-Server sichtbar sein.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für diese XFTP-Relais sichtbar sein: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Falsches Datenbank-Passwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Falscher Schlüssel oder unbekannte Verbindung - höchstwahrscheinlich ist diese Verbindung gelöscht worden.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Falsches Passwort!</target>
@@ -7415,6 +7584,12 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Direktnachricht senden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>Es wurde eine neue Kontaktadresse festgelegt</target>
@@ -7455,11 +7630,21 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Unbekannt</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>Unbekannte Relais</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>unbekannter Gruppenmitglieds-Status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>Ungeschützt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>Aktualisiertes Gruppenprofil</target>
@@ -7525,6 +7710,11 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Wochen</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>Wenn die IP-Adresse versteckt ist</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>Ja</target>
@@ -7661,7 +7851,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="NSHumanReadableCopyright" xml:space="preserve">
<source>Copyright © 2022 SimpleX Chat. All rights reserved.</source>
<target>Copyright © 2022 SimpleX Chat. All rights reserved.</target>
<target>Copyright © 2024 SimpleX Chat. All rights reserved.</target>
<note>Copyright (human-readable)</note>
</trans-unit>
</body>
@@ -713,6 +713,11 @@
<target>Allow disappearing messages only if your contact allows it to you.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Allow downgrade</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</target>
@@ -808,6 +813,11 @@
<target>Already joining the group!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Always use private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Always use relay</target>
@@ -1088,6 +1098,11 @@
<target>Cannot receive file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Capacity exceeded - recipient did not receive previously sent messages.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Cellular</target>
@@ -1284,6 +1299,11 @@
<target>Confirm database upgrades</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Confirm files from unknown servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Confirm network settings</target>
@@ -1701,6 +1721,11 @@ This is your own one-time link!</target>
<target>Database will be migrated when the app restarts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Debug delivery</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Decentralized</target>
@@ -1948,6 +1973,11 @@ This cannot be undone!</target>
<target>Desktop devices</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Destination server error: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Develop</target>
@@ -2053,11 +2083,21 @@ This cannot be undone!</target>
<target>Discover via local network</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Do NOT send messages directly, even if your or destination server does not support private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Do NOT use SimpleX for emergency calls.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Do NOT use private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Do it later</target>
@@ -2621,7 +2661,7 @@ This cannot be undone!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Error: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2753,11 @@ This cannot be undone!</target>
<target>File: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Files</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Files &amp; media</target>
@@ -2818,6 +2863,20 @@ This cannot be undone!</target>
<target>Forwarded from</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Forwarding server: %1$@
Destination server error: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Forwarding server: %1$@
Error: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Found desktop</target>
@@ -3633,11 +3692,21 @@ This is your link for group %@!</target>
<target>Message delivery receipts!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Message delivery warning</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Message draft</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Message queue info</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Message reactions</target>
@@ -3653,6 +3722,16 @@ This is your link for group %@!</target>
<target>Message reactions are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Message routing fallback</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Message routing mode</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Message source remains private.</target>
@@ -3783,11 +3862,6 @@ This is your link for group %@!</target>
<target>Most likely this connection is deleted.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Most likely this contact has deleted the connection with you.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Multiple chat profiles</target>
@@ -3818,6 +3892,11 @@ This is your link for group %@!</target>
<target>Network connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Network issues - message expired after many attempts to send it.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Network management</target>
@@ -4359,11 +4438,26 @@ Error: %@</target>
<target>Private filenames</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Private message routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Private message routing 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Private notes</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Private routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profile and server connections</target>
@@ -4444,11 +4538,23 @@ Error: %@</target>
<target>Prohibit sending voice messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Protect IP address</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Protect app screen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Protect your chat profiles with a password!</target>
@@ -4554,11 +4660,6 @@ Error: %@</target>
<target>Receiving address will be changed to a different server. Address change will complete after sender comes online.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Receiving concurrency</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Receiving file will be stopped.</target>
@@ -4794,6 +4895,11 @@ Error: %@</target>
<target>SMP servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Safely receive files</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Safer groups</target>
@@ -5019,6 +5125,16 @@ Error: %@</target>
<target>Send live message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Send messages directly when IP address is protected and your or destination server does not support private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Send messages directly when your or destination server does not support private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Send notifications</target>
@@ -5124,6 +5240,11 @@ Error: %@</target>
<target>Sent messages will be deleted after set time.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Server address is incompatible with network settings.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server requires authorization to create queues, check password</target>
@@ -5139,6 +5260,11 @@ Error: %@</target>
<target>Server test failed!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Server version is incompatible with network settings.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servers</target>
@@ -5259,11 +5385,21 @@ Error: %@</target>
<target>Show last messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Show message status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Show preview</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Show → on messages sent via private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Show:</target>
@@ -5586,6 +5722,11 @@ It can happen because of some bug or when the connection is compromised.</target
<target>The app can notify you when you receive messages or contact requests - please open settings to enable.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>The app will ask to confirm downloads from unknown file servers (except .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>The attempt to change database passphrase was not completed.</target>
@@ -5771,6 +5912,11 @@ It can happen because of some bug or when the connection is compromised.</target
<target>To protect timezone, image/voice files use UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>To protect your IP address, private routing uses your SMP servers to deliver messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6009,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Unblock member?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Unexpected error: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Unexpected migration state</target>
@@ -5913,6 +6054,11 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Unknown error</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Unknown servers!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</target>
@@ -6060,6 +6206,16 @@ To connect, please ask your contact to create another connection link and check
<target>Use only local notifications?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Use private routing with unknown servers when IP address is not protected.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Use private routing with unknown servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Use server</target>
@@ -6295,11 +6451,26 @@ To connect, please ask your contact to create another connection link and check
<target>With reduced battery usage.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Without Tor or VPN, your IP address will be visible to file servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Wrong database passphrase</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Wrong key or unknown connection - most likely this connection is deleted.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Wrong passphrase!</target>
@@ -7415,6 +7586,15 @@ SimpleX servers cannot see your profile.</target>
<target>send direct message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>server queue info: %1$@
last received msg: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>set new contact address</target>
@@ -7455,11 +7635,21 @@ SimpleX servers cannot see your profile.</target>
<target>unknown</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>unknown relays</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>unknown status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>unprotected</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>updated group profile</target>
@@ -7525,6 +7715,11 @@ SimpleX servers cannot see your profile.</target>
<target>weeks</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>when IP hidden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>yes</target>
@@ -713,6 +713,11 @@
<target>Se permiten los mensajes temporales pero sólo si tu contacto también los permite para tí.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Permitir versión anterior</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también la permite para tí. (24 horas)</target>
@@ -808,6 +813,11 @@
<target>¡Ya en proceso de unirte al grupo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Usar siempre enrutamiento privado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Usar siempre retransmisor</target>
@@ -1040,7 +1050,7 @@
</trans-unit>
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
<source>By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</source>
<target>Mediante perfil (por defecto) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</target>
<target>Mediante perfil (predeterminado) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Call already ended!" xml:space="preserve">
@@ -1088,6 +1098,11 @@
<target>No se puede recibir el archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Capacidad excedida - el destinatario no ha recibido los mensajes previos.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Móvil</target>
@@ -1284,6 +1299,11 @@
<target>Confirmar actualizaciones de la bases de datos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Confirma archivos de servidores desconocidos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Confirmar configuración de red</target>
@@ -1701,6 +1721,10 @@ This is your own one-time link!</source>
<target>La base de datos migrará cuando se reinicie la aplicación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Descentralizada</target>
@@ -1948,6 +1972,11 @@ This cannot be undone!</source>
<target>Ordenadores</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Error del servidor de destino: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Desarrollo</target>
@@ -2053,11 +2082,21 @@ This cannot be undone!</source>
<target>Descubrir en red local</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>NO enviar mensajes directamente incluso si tu servidor o el de destino no soportan enrutamiento privado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NO uses SimpleX para llamadas de emergencia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>NO usar enrutamiento privado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Hacer más tarde</target>
@@ -2205,7 +2244,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<target>Activar para</target>
<target>Activado para</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
@@ -2621,7 +2660,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Error: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ This cannot be undone!</source>
<target>Archivo: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Archivos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Archivos y multimedia</target>
@@ -2818,6 +2862,20 @@ This cannot be undone!</source>
<target>Reenviado por</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Servidor de reenvío: %1$@
Error del servidor de destino: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Servidor de reenvío: %1$@
Error: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Ordenador encontrado</target>
@@ -3633,11 +3691,20 @@ This is your link for group %@!</source>
<target>¡Confirmación de entrega de mensajes!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Aviso de entrega de mensaje</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Borrador de mensaje</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Reacciones a mensajes</target>
@@ -3653,6 +3720,16 @@ This is your link for group %@!</source>
<target>Las reacciones a los mensajes no están permitidas en este grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Enrutamiento de mensajes alternativo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Modo de enrutamiento de mensajes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>El autor del mensaje se mantiene privado.</target>
@@ -3783,11 +3860,6 @@ This is your link for group %@!</source>
<target>Probablemente la conexión ha sido eliminada.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Lo más probable es que este contacto haya eliminado la conexión contigo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Múltiples perfiles</target>
@@ -3818,6 +3890,11 @@ This is your link for group %@!</source>
<target>Conexión de red</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Problema en la red - el mensaje ha expirado tras muchos intentos de envío.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Gestión de la red</target>
@@ -4359,11 +4436,26 @@ Error: %@</target>
<target>Nombres de archivos privados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Enrutamiento privado de mensajes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Enrutamiento privado de mensajes 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Notas privadas</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Enrutamiento privado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Datos del perfil y conexiones</target>
@@ -4376,7 +4468,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Profile images" xml:space="preserve">
<source>Profile images</source>
<target>Imágenes del perfil</target>
<target>Forma de los perfiles</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
@@ -4444,11 +4536,23 @@ Error: %@</target>
<target>No se permiten mensajes de voz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Proteger dirección IP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Proteger la pantalla de la aplicación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Protege tu dirección IP de los servidores de retransmisión elegidos por tus contactos.
Actívalo en ajustes de *Servidores y Redes*.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>¡Protege tus perfiles con contraseña!</target>
@@ -4554,11 +4658,6 @@ Error: %@</target>
<target>La dirección de recepción pasará a otro servidor. El cambio se completará cuando el remitente esté en línea.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Concurrencia en la recepción</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Se detendrá la recepción del archivo.</target>
@@ -4626,7 +4725,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>El retransmisor sólo se usa en caso de necesidad. Un tercero podría ver tu IP.</target>
<target>El servidor de retransmisión sólo se usa en caso de necesidad. Un tercero podría ver tu IP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Relay server protects your IP address, but it can observe the duration of the call." xml:space="preserve">
@@ -4716,7 +4815,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Reset to defaults" xml:space="preserve">
<source>Reset to defaults</source>
<target>Restablecer valores por defecto</target>
<target>Restablecer valores predetarminados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Restart the app to create a new chat profile" xml:space="preserve">
@@ -4794,6 +4893,11 @@ Error: %@</target>
<target>Servidores SMP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Recibe archivos de forma segura</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Grupos más seguros</target>
@@ -5001,7 +5105,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Send direct message to connect" xml:space="preserve">
<source>Send direct message to connect</source>
<target>Enviar mensaje directo para conectar</target>
<target>Envia un mensaje para conectar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send disappearing message" xml:space="preserve">
@@ -5019,6 +5123,16 @@ Error: %@</target>
<target>Mensaje en vivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Enviar mensajes directamente cuando tu dirección IP está protegida y tu servidor o el de destino no admitan enrutamiento privado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Enviar mensajes directamente cuando tu servidor o el de destino no admitan enrutamiento privado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Enviar notificaciones</target>
@@ -5124,6 +5238,11 @@ Error: %@</target>
<target>Los mensajes enviados se eliminarán una vez transcurrido el tiempo establecido.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>La dirección del servidor es incompatible con la configuración de la red.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>El servidor requiere autorización para crear colas, comprueba la contraseña</target>
@@ -5139,6 +5258,11 @@ Error: %@</target>
<target>¡Error en prueba del servidor!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>La versión del servidor es incompatible con la configuración de red.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servidores</target>
@@ -5259,11 +5383,21 @@ Error: %@</target>
<target>Mostrar último mensaje</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Estado del mensaje</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Mostrar vista previa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Mostrar → en mensajes con enrutamiento privado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Mostrar:</target>
@@ -5586,6 +5720,11 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
<target>La aplicación puede notificarte cuando recibas mensajes o solicitudes de contacto: por favor, abre la configuración para activarlo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>La aplicación pedirá que confirmes las descargas desde servidores de archivos desconocidos (excepto .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>El intento de cambiar la contraseña de la base de datos no se ha completado.</target>
@@ -5771,6 +5910,11 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
<target>Para proteger la zona horaria, los archivos de imagen/voz usan la hora UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Para proteger tu dirección IP, el enrutamiento privado usa tus servidores SMP para enviar mensajes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
<target>¿Desbloquear miembro?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Error inesperado: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Estado de migración inesperado</target>
@@ -5913,6 +6052,11 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
<target>Error desconocido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>¡Servidores desconocidos!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>A menos que utilices la interfaz de llamadas de iOS, activa el modo No molestar para evitar interrupciones.</target>
@@ -6061,6 +6205,16 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<target>¿Usar sólo notificaciones locales?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Usar enrutamiento privado con servidores desconocidos cuando la dirección IP no está protegida.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Usar enrutamiento privado con servidores desconocidos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Usar servidor</target>
@@ -6296,11 +6450,26 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<target>Con uso reducido de batería.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Sin Tor o VPN, tu dirección IP será visible para los servidores de archivos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Sin Tor o VPN, tu dirección IP será visible para estos servidores XFTP: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Contraseña de base de datos incorrecta</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Clave incorrecta o conexión desconocida - probablemente esta conexión fue eliminada.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>¡Contraseña incorrecta!</target>
@@ -6986,17 +7155,17 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="default (%@)" xml:space="preserve">
<source>default (%@)</source>
<target>por defecto (%@)</target>
<target>predeterminado (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>por defecto (no)</target>
<target>predeterminado (no)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>por defecto (sí)</target>
<target>predeterminado (sí)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
@@ -7416,6 +7585,12 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>Enviar mensaje directo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>nueva dirección de contacto</target>
@@ -7456,11 +7631,21 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>desconocido</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>servidor de retransmisión desconocido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>estado desconocido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>desprotegido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>ha actualizado el perfil del grupo</target>
@@ -7526,6 +7711,11 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>semanas</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>con IP oculta</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>sí</target>
@@ -685,6 +685,10 @@
<target>Salli katoavat viestit vain, jos kontaktisi sallii sen sinulle.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Salli peruuttamaton viestien poisto vain, jos kontaktisi sallii ne sinulle. (24 tuntia)</target>
@@ -777,6 +781,10 @@
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Käytä aina relettä</target>
@@ -1040,6 +1048,10 @@
<target>Tiedostoa ei voi vastaanottaa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1231,6 +1243,10 @@
<target>Vahvista tietokannan päivitykset</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<note>No comment provided by engineer.</note>
@@ -1624,6 +1640,10 @@ This is your own one-time link!</source>
<target>Tietokanta siirretään, kun sovellus käynnistyy uudelleen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Hajautettu</target>
@@ -1863,6 +1883,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Kehitä</target>
@@ -1966,11 +1990,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Älä käytä SimpleX-sovellusta hätäpuheluihin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Tee myöhemmin</target>
@@ -2509,7 +2541,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Virhe: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2598,6 +2630,10 @@ This cannot be undone!</source>
<target>Tiedosto: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Tiedostot &amp; media</target>
@@ -2696,6 +2732,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3480,11 +3526,19 @@ This is your link for group %@!</source>
<target>Viestien toimituskuittaukset!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Viestiluonnos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Viestireaktiot</target>
@@ -3500,6 +3554,14 @@ This is your link for group %@!</source>
<target>Viestireaktiot ovat kiellettyjä tässä ryhmässä.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3617,11 +3679,6 @@ This is your link for group %@!</source>
<target>Todennäköisesti tämä yhteys on poistettu.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Todennäköisesti tämä kontakti on poistanut yhteyden sinuun.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Useita keskusteluprofiileja</target>
@@ -3651,6 +3708,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4169,10 +4230,22 @@ Error: %@</source>
<target>Yksityiset tiedostonimet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profiili- ja palvelinyhteydet</target>
@@ -4249,11 +4322,20 @@ Error: %@</source>
<target>Estä ääniviestien lähettäminen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Suojaa sovellusnäyttö</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Suojaa keskusteluprofiilisi salasanalla!</target>
@@ -4356,10 +4438,6 @@ Error: %@</source>
<target>Vastaanotto-osoite vaihdetaan toiseen palvelimeen. Osoitteenmuutos tehdään sen jälkeen, kun lähettäjä tulee verkkoon.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Tiedoston vastaanotto pysäytetään.</target>
@@ -4587,6 +4665,10 @@ Error: %@</source>
<target>SMP-palvelimet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<note>No comment provided by engineer.</note>
@@ -4804,6 +4886,14 @@ Error: %@</source>
<target>Lähetä live-viesti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Lähetys ilmoitukset</target>
@@ -4908,6 +4998,10 @@ Error: %@</source>
<target>Lähetetyt viestit poistetaan asetetun ajan kuluttua.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Palvelin vaatii valtuutuksen jonojen luomiseen, tarkista salasana</target>
@@ -4923,6 +5017,10 @@ Error: %@</source>
<target>Palvelintesti epäonnistui!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Palvelimet</target>
@@ -5038,11 +5136,19 @@ Error: %@</source>
<target>Näytä viimeiset viestit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Näytä esikatselu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Näytä:</target>
@@ -5355,6 +5461,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
<target>Sovellus voi ilmoittaa sinulle, kun saat viestejä tai yhteydenottopyyntöjä - avaa asetukset ottaaksesi ne käyttöön.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Tietokannan tunnuslauseen muuttamista ei suoritettu loppuun.</target>
@@ -5531,6 +5641,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
<target>Aikavyöhykkeen suojaamiseksi kuva-/äänitiedostot käyttävät UTC:tä.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5616,11 +5730,6 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Odottamaton virhe: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Odottamaton siirtotila</target>
@@ -5666,6 +5775,10 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote
<target>Tuntematon virhe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Ellet käytä iOS:n puhelinkäyttöliittymää, ota Älä häiritse -tila käyttöön keskeytysten välttämiseksi.</target>
@@ -5806,6 +5919,14 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Käytä palvelinta</target>
@@ -6023,11 +6144,23 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Väärä tietokannan tunnuslause</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Väärä tunnuslause!</target>
@@ -7106,6 +7239,12 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<source>send direct message</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<note>profile update event chat item</note>
@@ -7142,10 +7281,18 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>tuntematon</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>päivitetty ryhmäprofiili</target>
@@ -7209,6 +7356,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>viikkoa</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>kyllä</target>
@@ -713,6 +713,11 @@
<target>Autorise les messages éphémères seulement si votre contact vous lautorise.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Autoriser la rétrogradation</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Autoriser la suppression irréversible des messages uniquement si votre contact vous l'autorise. (24 heures)</target>
@@ -808,6 +813,11 @@
<target>Groupe déjà rejoint !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Toujours utiliser le routage privé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Se connecter via relais</target>
@@ -1088,6 +1098,11 @@
<target>Impossible de recevoir le fichier</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Capacité dépassée - le destinataire n'a pas pu recevoir les messages envoyés précédemment.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Cellulaire</target>
@@ -1284,6 +1299,11 @@
<target>Confirmer la mise à niveau de la base de données</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Confirmer les fichiers provenant de serveurs inconnus.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Confirmer les paramètres réseau</target>
@@ -1701,6 +1721,10 @@ Il s'agit de votre propre lien unique !</target>
<target>La base de données sera migrée lors du redémarrage de l'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Décentralisé</target>
@@ -1925,7 +1949,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Justificatifs de réception!</target>
<target>Justificatifs de réception!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
@@ -1948,6 +1972,11 @@ Cette opération ne peut être annulée !</target>
<target>Appareils de bureau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Erreur du serveur de destination: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Développer</target>
@@ -2053,11 +2082,21 @@ Cette opération ne peut être annulée !</target>
<target>Rechercher sur le réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Ne pas envoyer de messages directement, même si votre serveur ou le serveur de destination ne prend pas en charge le routage privé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>N'utilisez PAS SimpleX pour les appels d'urgence.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Ne pas utiliser de routage privé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Faites-le plus tard</target>
@@ -2621,7 +2660,7 @@ Cette opération ne peut être annulée !</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Erreur: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ Cette opération ne peut être annulée !</target>
<target>Fichier: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Fichiers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Fichiers &amp; médias</target>
@@ -2775,7 +2819,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Réparer la connexion?</target>
<target>Réparer la connexion?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
@@ -2818,6 +2862,20 @@ Cette opération ne peut être annulée !</target>
<target>Transféré depuis</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Serveur de transfert: %1$@
Erreur du serveur de destination: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Serveur de transfert: %1$@
Erreur: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Bureau trouvé</target>
@@ -3633,11 +3691,20 @@ Voici votre lien pour le groupe %@ !</target>
<target>Accusés de réception des messages !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Avertissement sur la distribution des messages</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Brouillon de message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Réactions aux messages</target>
@@ -3653,6 +3720,16 @@ Voici votre lien pour le groupe %@ !</target>
<target>Les réactions aux messages sont interdites dans ce groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Rabattement du routage des messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Mode de routage des messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>La source du message reste privée.</target>
@@ -3783,11 +3860,6 @@ Voici votre lien pour le groupe %@ !</target>
<target>Connexion probablement supprimée.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Il est fort probable que ce contact ait supprimé la connexion avec vous.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Différents profils de chat</target>
@@ -3818,6 +3890,11 @@ Voici votre lien pour le groupe %@ !</target>
<target>Connexion au réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Problèmes de réseau - le message a expiré après plusieurs tentatives d'envoi.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Gestion du réseau</target>
@@ -4359,11 +4436,26 @@ Erreur: %@</target>
<target>Noms de fichiers privés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Routage privé des messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Routage privé des messages 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Notes privées</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Routage privé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil et connexions au serveur</target>
@@ -4444,11 +4536,23 @@ Erreur: %@</target>
<target>Interdire l'envoi de messages vocaux.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Protéger l'adresse IP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Protéger l'écran de l'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Protégez votre adresse IP des relais de messagerie choisis par vos contacts.
Activez-le dans les paramètres *Réseau et serveurs*.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Protégez vos profils de chat par un mot de passe !</target>
@@ -4554,11 +4658,6 @@ Erreur: %@</target>
<target>L'adresse de réception sera changée pour un autre serveur. Le changement d'adresse sera terminé lorsque l'expéditeur sera en ligne.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Réception simultanée</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La réception du fichier sera interrompue.</target>
@@ -4591,7 +4690,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Reconnecter les serveurs?</target>
<target>Reconnecter les serveurs?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
@@ -4666,7 +4765,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Renégocier le chiffrement?</target>
<target>Renégocier le chiffrement?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
@@ -4794,6 +4893,11 @@ Erreur: %@</target>
<target>Serveurs SMP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Réception de fichiers en toute sécurité</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Groupes plus sûrs</target>
@@ -5019,6 +5123,16 @@ Erreur: %@</target>
<target>Envoyer un message dynamique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Envoyer les messages de manière directe lorsque l'adresse IP est protégée et que votre serveur ou le serveur de destination ne prend pas en charge le routage privé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Envoyez les messages de manière directe lorsque votre serveur ou le serveur de destination ne prend pas en charge le routage privé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Envoi de notifications</target>
@@ -5124,6 +5238,11 @@ Erreur: %@</target>
<target>Les messages envoyés seront supprimés après une durée déterminée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>L'adresse du serveur est incompatible avec les paramètres du réseau.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Le serveur requiert une autorisation pour créer des files d'attente, vérifiez le mot de passe</target>
@@ -5139,6 +5258,11 @@ Erreur: %@</target>
<target>Échec du test du serveur !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>La version du serveur est incompatible avec les paramètres du réseau.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Serveurs</target>
@@ -5259,11 +5383,21 @@ Erreur: %@</target>
<target>Voir les derniers messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Afficher le statut du message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Afficher l'aperçu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Afficher → sur les messages envoyés via le routage privé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Afficher :</target>
@@ -5586,6 +5720,11 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>L'application peut vous avertir lorsque vous recevez des messages ou des demandes de contact - veuillez ouvrir les paramètres pour les activer.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>L'application demandera de confirmer les téléchargements à partir de serveurs de fichiers inconnus (sauf .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>La tentative de modification de la phrase secrète de la base de données n'a pas abouti.</target>
@@ -5771,6 +5910,11 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>Pour préserver le fuseau horaire, les fichiers image/voix utilisent le système UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Pour protéger votre adresse IP, le routage privé utilise vos serveurs SMP pour délivrer les messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
<target>Débloquer ce membre ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Erreur inattendue: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>État de la migration inattendu</target>
@@ -5913,6 +6052,11 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
<target>Erreur inconnue</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Serveurs inconnus!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>À moins que vous utilisiez l'interface d'appel d'iOS, activez le mode "Ne pas déranger" pour éviter les interruptions.</target>
@@ -6060,6 +6204,16 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Utilisation de notifications locales uniquement?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Utiliser le routage privé avec des serveurs inconnus lorsque l'adresse IP n'est pas protégée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Utiliser le routage privé avec des serveurs inconnus.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Utiliser ce serveur</target>
@@ -6212,7 +6366,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages</target>
<target>Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6295,11 +6449,26 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Consommation réduite de la batterie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Sans Tor ou un VPN, votre adresse IP sera visible par les serveurs de fichiers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Sans Tor ni VPN, votre adresse IP sera visible par ces relais XFTP: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Mauvaise phrase secrète pour la base de données</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Clé erronée ou connexion non identifiée - il est très probable que cette connexion soit supprimée.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Mauvaise phrase secrète !</target>
@@ -7415,6 +7584,12 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>envoyer un message direct</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>a changé d'adresse de contact</target>
@@ -7455,11 +7630,21 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>inconnu</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>relais inconnus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>statut inconnu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>non protégé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>mise à jour du profil de groupe</target>
@@ -7525,6 +7710,11 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>semaines</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>lorsque l'IP est masquée</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>oui</target>
@@ -349,7 +349,7 @@
</trans-unit>
<trans-unit id="**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." xml:space="preserve">
<source>**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app).</source>
<target>**Legprivátabb**: ne használja a SimpleX Chat értesítési szervert, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).</target>
<target>**Legprivátabb**: ne használja a SimpleX Chat értesítési kiszolgálót, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
@@ -364,7 +364,7 @@
</trans-unit>
<trans-unit id="**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." xml:space="preserve">
<source>**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from.</source>
<target>**Javasolt**: az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési szerverre, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.</target>
<target>**Javasolt**: az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési kiszolgálóra, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Warning**: Instant push notifications require passphrase saved in Keychain." xml:space="preserve">
@@ -570,7 +570,7 @@
</trans-unit>
<trans-unit id="Accept connection request?" xml:space="preserve">
<source>Accept connection request?</source>
<target>Kapcsolatfelvétel elfogadása?</target>
<target>Kapcsolódási kérelem elfogadása?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accept contact request from %@?" xml:space="preserve">
@@ -705,22 +705,27 @@
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Hívások engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.</target>
<target>A hívások kezdeményezése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Eltűnő üzenetek engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi az ön számára.</target>
<target>Az eltűnő üzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Korábbi verzióra történő visszatérés engedélyezése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Üzenet végleges törlésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi. (24 óra)</target>
<target>Az üzenetek végleges törlése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow message reactions only if your contact allows them." xml:space="preserve">
<source>Allow message reactions only if your contact allows them.</source>
<target>Üzenetreakciók engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.</target>
<target>Az üzenetreakciók küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow message reactions." xml:space="preserve">
@@ -735,7 +740,7 @@
</trans-unit>
<trans-unit id="Allow sending disappearing messages." xml:space="preserve">
<source>Allow sending disappearing messages.</source>
<target>Eltűnő üzenetek küldésének engedélyezése.</target>
<target>Az eltűnő üzenetek küldése engedélyezve van.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve">
@@ -760,7 +765,7 @@
</trans-unit>
<trans-unit id="Allow voice messages only if your contact allows them." xml:space="preserve">
<source>Allow voice messages only if your contact allows them.</source>
<target>Hangüzenetek küldésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.</target>
<target>A hangüzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow voice messages?" xml:space="preserve">
@@ -770,27 +775,27 @@
</trans-unit>
<trans-unit id="Allow your contacts adding message reactions." xml:space="preserve">
<source>Allow your contacts adding message reactions.</source>
<target>Ismerősök általi üzenetreakciók hozzáadásának engedélyezése.</target>
<target>Az üzenetreakciók küldése engedélyezve van az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Hívások engedélyezése ismerősök számára.</target>
<target>A hívások kezdeményezése engedélyezve van az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
<target>Elküldött üzenetek végleges törlésének engedélyezése az ismerősök számára. (24 óra)</target>
<target>Az elküldött üzenetek végleges törlése engedélyezve van az ismerősei számára. (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve">
<source>Allow your contacts to send disappearing messages.</source>
<target>Eltűnő üzenetek engedélyezése ismerősök számára.</target>
<target>Az eltűnő üzenetek küldésének engedélyezése az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
<source>Allow your contacts to send voice messages.</source>
<target>Hangüzenetek küldésének engedélyezése ismerősök számára.</target>
<target>A hangüzenetek küldése engedélyezve van az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Already connected?" xml:space="preserve">
@@ -808,6 +813,11 @@
<target>A csatlakozás folyamatban van a csoporthoz!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Mindig használjon privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Mindig használjon átjátszó kiszolgálót</target>
@@ -905,12 +915,12 @@
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>A hang- és videóhívások le vannak tiltva.</target>
<target>A hívások kezdeményezése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Hitelesítés megszakítva</target>
<target>Hitelesítés visszavonva</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Authentication failed" xml:space="preserve">
@@ -935,7 +945,7 @@
</trans-unit>
<trans-unit id="Auto-accept contact requests" xml:space="preserve">
<source>Auto-accept contact requests</source>
<target>Ismerős jelölések automatikus elfogadása</target>
<target>Kapcsolódási kérelmek automatikus elfogadása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept images" xml:space="preserve">
@@ -995,7 +1005,7 @@
</trans-unit>
<trans-unit id="Block member for all?" xml:space="preserve">
<source>Block member for all?</source>
<target>Tag letiltása mindenki számára?</target>
<target>Mindenki számára letiltja ezt a tagot?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Block member?" xml:space="preserve">
@@ -1020,7 +1030,7 @@
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Mindkét fél tud hívásokat indítani.</target>
<target>Mindkét fél tud hívásokat kezdeményezni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
@@ -1088,6 +1098,11 @@
<target>Nem lehet fogadni a fájlt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Kapacitás túllépés - a címzett nem kapta meg a korábban elküldött üzeneteket.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Mobilhálózat</target>
@@ -1211,7 +1226,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Válassza az _Átköltöztetés egy másik eszközről_ opciót az új eszközön és szkennelje be a QR-kódot.</target>
<target>Válassza az _Átköltöztetés egy másik eszközről_ opciót az új eszközön és olvassa be a QR-kódot.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1231,17 +1246,17 @@
</trans-unit>
<trans-unit id="Clear conversation" xml:space="preserve">
<source>Clear conversation</source>
<target>Beszélgetés kiürítése</target>
<target>Üzenetek kiürítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear conversation?" xml:space="preserve">
<source>Clear conversation?</source>
<target>Beszélgetés kiürítése?</target>
<target>Üzenetek kiürítése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear private notes?" xml:space="preserve">
<source>Clear private notes?</source>
<target>Privát jegyzetek törlése?</target>
<target>Privát jegyzetek kiürítése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear verification" xml:space="preserve">
@@ -1284,6 +1299,11 @@
<target>Adatbázis frissítés megerősítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Ismeretlen kiszolgálókról származó fájlok jóváhagyása.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Hálózati beállítások megerősítése</target>
@@ -1465,7 +1485,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Contacts can mark messages for deletion; you will be able to view them." xml:space="preserve">
<source>Contacts can mark messages for deletion; you will be able to view them.</source>
<target>Az ismerősök törlésre jelölhetnek üzeneteket ; megtekintheti őket.</target>
<target>Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Continue" xml:space="preserve">
@@ -1701,6 +1721,10 @@ Ez az egyszer használatos hivatkozása!</target>
<target>Az adatbázis az alkalmazás újraindításakor migrálásra kerül</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Decentralizált</target>
@@ -1738,7 +1762,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Delete after" xml:space="preserve">
<source>Delete after</source>
<target>Törlés miután</target>
<target>Törlés ennyi idő után</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete all files" xml:space="preserve">
@@ -1865,7 +1889,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Delete messages after" xml:space="preserve">
<source>Delete messages after</source>
<target>Üzenetek törlése miután</target>
<target>Üzenetek törlése ennyi idő után</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete old database" xml:space="preserve">
@@ -1948,6 +1972,11 @@ Ez a művelet nem vonható vissza!</target>
<target>Számítógépek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Célkiszolgáló hiba: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Fejlesztés</target>
@@ -1985,7 +2014,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Direct messages between members are prohibited in this group." xml:space="preserve">
<source>Direct messages between members are prohibited in this group.</source>
<target>Ebben a csoportban tiltott a tagok közötti közvetlen üzenetek küldése.</target>
<target>A közvetlen üzenetek küldése a tagok között le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
@@ -2015,7 +2044,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Disappearing messages are prohibited in this chat." xml:space="preserve">
<source>Disappearing messages are prohibited in this chat.</source>
<target>Az eltűnő üzenetek le vannak tiltva ebben a csevegésben.</target>
<target>Az eltűnő üzenetek küldése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing messages are prohibited in this group." xml:space="preserve">
@@ -2053,11 +2082,21 @@ Ez a művelet nem vonható vissza!</target>
<target>Felfedezés helyi hálózaton keresztül</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NE használja a SimpleX-et segélyhívásokhoz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Ne használjon privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Későbbre halaszt</target>
@@ -2621,7 +2660,7 @@ Ez a művelet nem vonható vissza!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Hiba: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ Ez a művelet nem vonható vissza!</target>
<target>Fájl: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Fájlok</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Fájlok és média</target>
@@ -2818,6 +2862,20 @@ Ez a művelet nem vonható vissza!</target>
<target>Továbbítva innen:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Továbbító kiszolgáló: %1$@
Célkiszolgáló hiba:%2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Továbbító kiszolgáló: %1$@
Hiba: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Megtalált számítógép</target>
@@ -3090,7 +3148,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="If you enter your self-destruct passcode while opening the app:" xml:space="preserve">
<source>If you enter your self-destruct passcode while opening the app:</source>
<target>Ha az alkalmazás megnyitásakor az önmegsemmisítő jelkódot megadásra kerül:</target>
<target>Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." xml:space="preserve">
@@ -3337,12 +3395,12 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Irreversible message deletion is prohibited in this chat." xml:space="preserve">
<source>Irreversible message deletion is prohibited in this chat.</source>
<target>Ebben a csevegésben az üzenetek végleges törlése le van tiltva.</target>
<target>Az üzenetek végleges törlése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Irreversible message deletion is prohibited in this group." xml:space="preserve">
<source>Irreversible message deletion is prohibited in this group.</source>
<target>Ebben a csoportban az üzenetek végleges törlése le van tiltva.</target>
<target>Az üzenetek végleges törlése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It allows having many anonymous connections without any shared data between them in a single chat profile." xml:space="preserve">
@@ -3470,7 +3528,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Leave" xml:space="preserve">
<source>Leave</source>
<target>Elhagy</target>
<target>Elhagyás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Leave group" xml:space="preserve">
@@ -3565,7 +3623,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@)." xml:space="preserve">
<source>Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@).</source>
<target>Győződjön meg arról, hogy a %@ szervercímek megfelelő formátumúak, sorszeparáltak és nem duplikáltak (%@).</target>
<target>Győződjön meg arról, hogy a %@ kiszolgálócímek megfelelő formátumúak, sorszeparáltak és nem duplikáltak (%@).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated." xml:space="preserve">
@@ -3585,12 +3643,12 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Mark read" xml:space="preserve">
<source>Mark read</source>
<target>Megjelölés olvasottként</target>
<target>Olvasottnak jelölés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Mark verified" xml:space="preserve">
<source>Mark verified</source>
<target>Ellenőrzöttként jelölve</target>
<target>Hitelesítés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Markdown in messages" xml:space="preserve">
@@ -3633,11 +3691,20 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Üzenetkézbesítési bizonylatok!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Üzenet kézbesítési figyelmeztetés</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Üzenetvázlat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Üzenetreakciók</target>
@@ -3645,12 +3712,22 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Message reactions are prohibited in this chat." xml:space="preserve">
<source>Message reactions are prohibited in this chat.</source>
<target>Az üzenetreakciók ebben a csevegésben le vannak tiltva.</target>
<target>Az üzenetreakciók küldése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions are prohibited in this group." xml:space="preserve">
<source>Message reactions are prohibited in this group.</source>
<target>Ebben a csoportban az üzenetreakciók le vannak tiltva.</target>
<target>Az üzenetreakciók küldése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Üzenet útválasztási tartalék</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Üzenet útválasztási mód</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
@@ -3685,12 +3762,12 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Az üzeneteket, fájlokat és hívásokat **végpontok közötti titkosítással** és sérülés utáni titkosságvédelemmel, visszautasítással és sérülés utáni helyreállítással védi.</target>
<target>Az üzeneteket, fájlokat és hívásokat **végpontok közötti titkosítással**, sérülés utáni titkosság-védelemmel és -helyreállítással, továbbá visszautasítással védi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Az üzeneteket, fájlokat és hívásokat **végpontok közötti kvantumrezisztens titkosítással** és sérülés utáni titkosságvédelemmel, visszautasítással és sérülés utáni helyreállítással védi.</target>
<target>Az üzeneteket, fájlokat és hívásokat **végpontok közötti kvantumrezisztens titkosítással**, sérülés utáni titkosság-védelemmel és -helyreállítással, továbbá visszautasítással védi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
@@ -3783,11 +3860,6 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Valószínűleg ez a kapcsolat törlésre került.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Valószínűleg ez az ismerős törölte önnel a kapcsolatot.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Több csevegőprofil</target>
@@ -3818,6 +3890,11 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Internetkapcsolat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Hálózati problémák - az üzenet többszöri elküldési kísérlet után lejárt.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Hálózatkezelés</target>
@@ -4079,7 +4156,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Csak az ismerős tud eltűnő üzeneteket küldeni.</target>
<target>Csak az ismerőse tud eltűnő üzeneteket küldeni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
@@ -4359,11 +4436,26 @@ Hiba: %@</target>
<target>Privát fájl nevek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Privát üzenet útválasztás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Privát üzenet útválasztás 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Privát jegyzetek</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Privát útválasztás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil és kiszolgálókapcsolatok</target>
@@ -4401,7 +4493,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Hang- és videóhívások tiltása.</target>
<target>A hívások kezdeményezése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
@@ -4411,7 +4503,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit message reactions." xml:space="preserve">
<source>Prohibit message reactions.</source>
<target>Üzenetreakciók tiltása.</target>
<target>Az üzenetreakciók küldése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit messages reactions." xml:space="preserve">
@@ -4426,12 +4518,12 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Közvetlen üzenetek küldésének letiltása a tagok számára.</target>
<target>A közvetlen üzenetek küldése le van tiltva a tagok között.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending disappearing messages." xml:space="preserve">
<source>Prohibit sending disappearing messages.</source>
<target>Eltűnő üzenetek küldésének letiltása.</target>
<target>Az eltűnő üzenetek küldése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
@@ -4441,7 +4533,12 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Hangüzenetek küldésének letiltása.</target>
<target>A hangüzenetek küldése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Az IP-cím védelme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
@@ -4449,6 +4546,13 @@ Hiba: %@</target>
<target>Alkalmazás képernyőjének védelme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Védje IP-címét az ismerősei által kiválasztott üzenetküldő átjátszókkal szemben.
Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Csevegési profiljok védelme jelszóval!</target>
@@ -4554,11 +4658,6 @@ Hiba: %@</target>
<target>A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Egyidejű fogadás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>A fájl fogadása leállt.</target>
@@ -4641,12 +4740,12 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Remove member" xml:space="preserve">
<source>Remove member</source>
<target>Tag eltávolítása</target>
<target>Eltávolítás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove member?" xml:space="preserve">
<source>Remove member?</source>
<target>Tag eltávolítása?</target>
<target>Biztosan eltávolítja?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove passphrase from keychain?" xml:space="preserve">
@@ -4794,6 +4893,11 @@ Hiba: %@</target>
<target>Üzenetküldő (SMP) kiszolgálók</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Fájlok biztonságos fogadása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Biztonságosabb csoportok</target>
@@ -4911,7 +5015,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Scan code" xml:space="preserve">
<source>Scan code</source>
<target>Kód beolvasása</target>
<target>Beolvasás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Scan security code from your contact's app." xml:space="preserve">
@@ -5019,6 +5123,16 @@ Hiba: %@</target>
<target>Élő üzenet küldése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Közvetlen üzenetküldés, ha az IP-cím védett és az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Közvetlen üzenetküldés, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Értesítések küldése</target>
@@ -5051,7 +5165,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>A küldő megszakította a fájl átvitelt.</target>
<target>A fájl küldője visszavonta az átvitelt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
@@ -5124,6 +5238,11 @@ Hiba: %@</target>
<target>Az elküldött üzenetek törlésre kerülnek a beállított idő után.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>A kiszolgáló címe nem kompatibilis a hálózati beállításokkal.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze jelszavát</target>
@@ -5139,6 +5258,11 @@ Hiba: %@</target>
<target>Sikertelen kiszolgáló-teszt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>A kiszolgáló verziója nem kompatibilis a hálózati beállításokkal.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Kiszolgálók</target>
@@ -5259,11 +5383,21 @@ Hiba: %@</target>
<target>Utolsó üzenetek megjelenítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Üzenet állapot megjelenítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Előnézet megjelenítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Egy „→” jel megjelenítése a privát útválasztáson keresztül küldött üzeneteknél.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Megjelenítés:</target>
@@ -5326,7 +5460,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<target>A SimpleX hivatkozások küldése ebben a csoportban le van tiltva.</target>
<target>A SimpleX hivatkozások küldése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
@@ -5586,6 +5720,11 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
<target>Az alkalmazás értesíteni fogja, amikor üzeneteket vagy kapcsolatfelvételi kéréseket kap beállítások megnyitása az engedélyezéshez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>Az alkalmazás kérni fogja az ismeretlen fájlkiszolgálókról (kivéve .onion) történő letöltések megerősítését.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Az adatbázis jelmondatának megváltoztatására tett kísérlet nem fejeződött be.</target>
@@ -5598,7 +5737,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The connection you accepted will be cancelled!" xml:space="preserve">
<source>The connection you accepted will be cancelled!</source>
<target>Az ön által elfogadott kapcsolat megszakad!</target>
<target>Az ön által elfogadott kapcsolat vissza lesz vonva!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The contact you shared this link with will NOT be able to connect!" xml:space="preserve">
@@ -5771,6 +5910,11 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
<target>Az időzóna védelme érdekében a kép-/hangfájlok UTC-t használnak.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Az IP-címe védelme érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5795,7 +5939,7 @@ A funkció engedélyezése előtt a rendszer felszólítja a hitelesítés befej
</trans-unit>
<trans-unit id="To verify end-to-end encryption with your contact compare (or scan) the code on your devices." xml:space="preserve">
<source>To verify end-to-end encryption with your contact compare (or scan) the code on your devices.</source>
<target>A végpontok közötti titkosítás ellenőrzéséhez ismerősével hasonlítsa össze (vagy szkennelje be) az eszközén lévő kódot.</target>
<target>A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -5863,11 +6007,6 @@ A funkció engedélyezése előtt a rendszer felszólítja a hitelesítés befej
<target>Tag feloldása?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Váratlan hiba: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Váratlan átköltöztetési állapot</target>
@@ -5913,6 +6052,11 @@ A funkció engedélyezése előtt a rendszer felszólítja a hitelesítés befej
<target>Ismeretlen hiba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Ismeretlen kiszolgálók!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Hacsak nem az iOS hívási felületét használja, engedélyezze a Ne zavarjanak módot a megszakítások elkerülése érdekében.</target>
@@ -5987,7 +6131,7 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
</trans-unit>
<trans-unit id="Updating settings will re-connect the client to all servers." xml:space="preserve">
<source>Updating settings will re-connect the client to all servers.</source>
<target>A beállítások frissítése a szerverekhez újra kapcsolódással jár.</target>
<target>A beállítások frissítése a kiszolgálókhoz való újra kapcsolódással jár.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Updating this setting will re-connect the client to all servers." xml:space="preserve">
@@ -6060,6 +6204,16 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
<target>Csak helyi értesítések használata?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Privát útválasztás használata ismeretlen kiszolgálókkal, ha az IP-cím nem védett.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Használjon privát útválasztást ismeretlen kiszolgálókkal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Kiszolgáló használata</target>
@@ -6167,7 +6321,7 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
</trans-unit>
<trans-unit id="Voice messages are prohibited in this chat." xml:space="preserve">
<source>Voice messages are prohibited in this chat.</source>
<target>A hangüzenetek le vannak tiltva ebben a csevegésben.</target>
<target>A hangüzenetek küldése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages are prohibited in this group." xml:space="preserve">
@@ -6295,11 +6449,26 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
<target>Csökkentett akkumulátorhasználattal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Tor vagy VPN nélkül az IP-címe látható lesz a fájlkiszolgálók számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Tor vagy VPN nélkül az IP-címe látható lesz ezen XFTP átjátszók számára: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Téves adatbázis jelmondat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Rossz kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Téves jelmondat!</target>
@@ -6474,7 +6643,7 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You control through which server(s) **to receive** the messages, your contacts the servers you use to message them." xml:space="preserve">
<source>You control through which server(s) **to receive** the messages, your contacts the servers you use to message them.</source>
<target>Ön szabályozhatja, hogy mely kiszogál(ók)ón keresztül **kapja** az üzeneteket, az ismerősöket - az üzenetküldéshez használt szervereken.</target>
<target>Ön szabályozhatja, hogy mely kiszogál(ók)ón keresztül **kapja** az üzeneteket, az ismerősöket - az üzenetküldéshez használt kiszolgálókon.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
@@ -6642,8 +6811,8 @@ Kapcsolódási kérés megismétlése?</target>
<trans-unit id="Your contact needs to be online for the connection to complete.&#10;You can cancel this connection and remove the contact (and try later with a new link)." xml:space="preserve">
<source>Your contact needs to be online for the connection to complete.
You can cancel this connection and remove the contact (and try later with a new link).</source>
<target>Az ismerősnek online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.
Megszakíthatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).</target>
<target>Az ismerősének online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.
Visszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
@@ -6850,7 +7019,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>%@ törölve</target>
<target>%@ visszavonva</target>
<note>feature offered item</note>
</trans-unit>
<trans-unit id="changed address for you" xml:space="preserve">
@@ -6965,7 +7134,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>szerző</target>
<target>készítő</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="custom" xml:space="preserve">
@@ -7185,12 +7354,12 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="invited" xml:space="preserve">
<source>invited</source>
<target>meghívta</target>
<target>meghíva</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="invited %@" xml:space="preserve">
<source>invited %@</source>
<target>meghívta %@-t</target>
<target>meghívta őt: %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="invited to connect" xml:space="preserve">
@@ -7200,7 +7369,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="invited via your group link" xml:space="preserve">
<source>invited via your group link</source>
<target>meghívta a csoport hivatkozásán keresztül</target>
<target>meghíva az ön csoport hivatkozásán keresztül</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="italic" xml:space="preserve">
@@ -7415,6 +7584,12 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>közvetlen üzenet küldése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>új kapcsolattartási azonosító beállítása</target>
@@ -7455,14 +7630,24 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>ismeretlen</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>ismeretlen átjátszók</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>ismeretlen státusz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>nem védett</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>módosított csoport profil</target>
<target>frissítette a csoport profilját</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="updated profile" xml:space="preserve">
@@ -7507,7 +7692,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="waiting for answer…" xml:space="preserve">
<source>waiting for answer…</source>
<target>várakozás válaszra…</target>
<target>várakozás a válaszra…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="waiting for confirmation…" xml:space="preserve">
@@ -7525,6 +7710,11 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>hét</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>ha az IP-cím rejtett</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>igen</target>
@@ -713,6 +713,11 @@
<target>Consenti i messaggi a tempo solo se il contatto li consente a te.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Consenti downgrade</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Consenti l'eliminazione irreversibile dei messaggi solo se il contatto la consente a te. (24 ore)</target>
@@ -808,6 +813,11 @@
<target>Già in ingresso nel gruppo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Usa sempre l'instradamento privato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Connetti via relay</target>
@@ -1088,6 +1098,11 @@
<target>Impossibile ricevere il file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Quota superata - il destinatario non ha ricevuto i messaggi precedentemente inviati.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Mobile</target>
@@ -1284,6 +1299,11 @@
<target>Conferma aggiornamenti database</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Conferma i file da server sconosciuti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Conferma le impostazioni di rete</target>
@@ -1701,6 +1721,10 @@ Questo è il tuo link una tantum!</target>
<target>Il database verrà migrato al riavvio dell'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Decentralizzato</target>
@@ -1948,6 +1972,11 @@ Non è reversibile!</target>
<target>Dispositivi desktop</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Errore del server di destinazione: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Sviluppa</target>
@@ -2053,11 +2082,21 @@ Non è reversibile!</target>
<target>Individua via rete locale</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>NON inviare messaggi direttamente, anche se il tuo server o quello di destinazione non supporta l'instradamento privato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NON usare SimpleX per chiamate di emergenza.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>NON usare l'instradamento privato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Fallo dopo</target>
@@ -2621,7 +2660,7 @@ Non è reversibile!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Errore: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ Non è reversibile!</target>
<target>File: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>File</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>File e multimediali</target>
@@ -2818,6 +2862,20 @@ Non è reversibile!</target>
<target>Inoltrato da</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Server di inoltro: %1$@
Errore del server di destinazione: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Server di inoltro: %1$@
Errore: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Desktop trovato</target>
@@ -3633,11 +3691,20 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Ricevute di consegna dei messaggi!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Avviso di consegna del messaggio</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Bozza dei messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Reazioni ai messaggi</target>
@@ -3653,6 +3720,16 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Le reazioni ai messaggi sono vietate in questo gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Ripiego instradamento messaggio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Modalità instradamento messaggio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>La fonte del messaggio resta privata.</target>
@@ -3783,11 +3860,6 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Probabilmente questa connessione è stata eliminata.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Probabilmente questo contatto ha eliminato la connessione con te.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Profili di chat multipli</target>
@@ -3818,6 +3890,11 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Connessione di rete</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Problemi di rete - messaggio scaduto dopo molti tentativi di inviarlo.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Gestione della rete</target>
@@ -4359,11 +4436,26 @@ Errore: %@</target>
<target>Nomi di file privati</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Instradamento privato messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Instradamento privato dei messaggi 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Note private</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Instradamento privato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profilo e connessioni al server</target>
@@ -4444,11 +4536,23 @@ Errore: %@</target>
<target>Proibisci l'invio di messaggi vocali.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Proteggi l'indirizzo IP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Proteggi la schermata dell'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Proteggi il tuo indirizzo IP dai relay di messaggistica scelti dai tuoi contatti.
Attivalo nelle impostazioni *Rete e server*.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Proteggi i tuoi profili di chat con una password!</target>
@@ -4554,11 +4658,6 @@ Errore: %@</target>
<target>L'indirizzo di ricezione verrà cambiato in un server diverso. La modifica dell'indirizzo verrà completata dopo che il mittente sarà in linea.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Ricezione concomitanza</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La ricezione del file verrà interrotta.</target>
@@ -4794,6 +4893,11 @@ Errore: %@</target>
<target>Server SMP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Ricevi i file in sicurezza</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Gruppi più sicuri</target>
@@ -5019,6 +5123,16 @@ Errore: %@</target>
<target>Invia messaggio in diretta</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Invia messaggi direttamente quando l'indirizzo IP è protetto e il tuo server o quello di destinazione non supporta l'instradamento privato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Invia messaggi direttamente quando il tuo server o quello di destinazione non supporta l'instradamento privato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Invia notifiche</target>
@@ -5124,6 +5238,11 @@ Errore: %@</target>
<target>I messaggi inviati verranno eliminati dopo il tempo impostato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>L'indirizzo del server non è compatibile con le impostazioni di rete.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Il server richiede l'autorizzazione di creare code, controlla la password</target>
@@ -5139,6 +5258,11 @@ Errore: %@</target>
<target>Test del server fallito!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>La versione del server non è compatibile con le impostazioni di rete.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Server</target>
@@ -5259,11 +5383,21 @@ Errore: %@</target>
<target>Mostra ultimi messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Mostra stato del messaggio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Mostra anteprima</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Mostra → nei messaggi inviati via instradamento privato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Mostra:</target>
@@ -5586,6 +5720,11 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>L'app può avvisarti quando ricevi messaggi o richieste di contatto: apri le impostazioni per attivare.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>L'app chiederà di confermare i download da server di file sconosciuti (eccetto .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Il tentativo di cambiare la password del database non è stato completato.</target>
@@ -5771,6 +5910,11 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>Per proteggere il fuso orario, i file immagine/vocali usano UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Per proteggere il tuo indirizzo IP, l'instradamento privato usa i tuoi server SMP per consegnare i messaggi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
<target>Sbloccare il membro?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Errore imprevisto: % @</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Stato di migrazione imprevisto</target>
@@ -5913,6 +6052,11 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
<target>Errore sconosciuto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Server sconosciuti!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>A meno che non utilizzi l'interfaccia di chiamata iOS, attiva la modalità Non disturbare per evitare interruzioni.</target>
@@ -6060,6 +6204,16 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Usare solo notifiche locali?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Usa l'instradamento privato con server sconosciuti quando l'indirizzo IP non è protetto.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Usa l'instradamento privato con server sconosciuti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Usa il server</target>
@@ -6295,11 +6449,26 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Con consumo di batteria ridotto.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Senza Tor o VPN, il tuo indirizzo IP sarà visibile ai server di file.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Senza Tor o VPN, il tuo indirizzo IP sarà visibile a questi relay XFTP: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Password del database sbagliata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Chiave sbagliata o connessione sconosciuta - molto probabilmente questa connessione è stata eliminata.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Password sbagliata!</target>
@@ -7415,6 +7584,12 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>invia messaggio diretto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>impostato nuovo indirizzo di contatto</target>
@@ -7455,11 +7630,21 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>sconosciuto</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>relay sconosciuti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>stato sconosciuto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>non protetto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>ha aggiornato il profilo del gruppo</target>
@@ -7525,6 +7710,11 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>settimane</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>quando l'IP è nascosto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>sì</target>
@@ -703,6 +703,10 @@
<target>連絡先が許可している場合のみ消えるメッセージを許可する。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>送信相手も永久メッセージ削除を許可する時のみに許可する。</target>
@@ -798,6 +802,10 @@
<target>すでにグループに参加しています!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>常にリレーを経由する</target>
@@ -1064,6 +1072,10 @@
<target>ファイル受信ができません</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1255,6 +1267,10 @@
<target>データベースのアップグレードを確認</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<note>No comment provided by engineer.</note>
@@ -1648,6 +1664,10 @@ This is your own one-time link!</source>
<target>データベースはアプリ再起動時に移行されます</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>分散型</target>
@@ -1887,6 +1907,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>開発</target>
@@ -1990,11 +2014,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>緊急通報にSimpleXを使用しないでください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>後で行う</target>
@@ -2534,7 +2566,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>エラー : %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2623,6 +2655,10 @@ This cannot be undone!</source>
<target>ファイル: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>ファイルとメディア</target>
@@ -2721,6 +2757,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3504,11 +3550,19 @@ This is your link for group %@!</source>
<source>Message delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>メッセージの下書き</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>メッセージへのリアクション</target>
@@ -3524,6 +3578,14 @@ This is your link for group %@!</source>
<target>このグループではメッセージへのリアクションは禁止されています。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3641,11 +3703,6 @@ This is your link for group %@!</source>
<target>おそらく、この接続は削除されています。</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>恐らくこの連絡先があなたとの接続を削除しました。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>複数チャットのプロフィール</target>
@@ -3675,6 +3732,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4195,10 +4256,22 @@ Error: %@</source>
<target>プライベートなファイル名</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>プロフィールとサーバ接続</target>
@@ -4275,11 +4348,20 @@ Error: %@</source>
<target>音声メッセージを使用禁止にする。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>アプリ画面を守る</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>チャットのプロフィールをパスワードで保護します!</target>
@@ -4381,10 +4463,6 @@ Error: %@</source>
<target>開発中の機能です!相手のクライアントが4.2でなければ機能しません。アドレス変更が完了すると、会話にメッセージが出ます。連絡相手 (またはグループのメンバー) からメッセージを受信できないかをご確認ください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>ファイルの受信を停止します。</target>
@@ -4612,6 +4690,10 @@ Error: %@</source>
<target>SMPサーバ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<note>No comment provided by engineer.</note>
@@ -4829,6 +4911,14 @@ Error: %@</source>
<target>ライブメッセージを送信</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>通知を送信する</target>
@@ -4926,6 +5016,10 @@ Error: %@</source>
<target>一定時間が経ったら送信されたメッセージが削除されます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>キューを作成するにはサーバーの認証が必要です。パスワードを確認してください</target>
@@ -4941,6 +5035,10 @@ Error: %@</source>
<target>サーバテスト失敗!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>サーバ</target>
@@ -5056,11 +5154,19 @@ Error: %@</source>
<target>最新のメッセージを表示</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>プレビューを表示</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>表示する:</target>
@@ -5374,6 +5480,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>アプリは、メッセージや連絡先のリクエストを受信したときに通知することができます - 設定を開いて有効にしてください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>データベースのパスフレーズ変更が完了してません。</target>
@@ -5549,6 +5659,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>時間帯を漏らさないために、画像と音声ファイルはUTCを使います。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5634,11 +5748,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>予期しないエラー: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>予期しない移行状態</target>
@@ -5684,6 +5793,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>不明なエラー</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>iOS 通話インターフェイスを使用しない場合は、中断を避けるために「おやすみモード」を有効にしてください。</target>
@@ -5824,6 +5937,14 @@ To connect, please ask your contact to create another connection link and check
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>サーバを使う</target>
@@ -6041,11 +6162,23 @@ To connect, please ask your contact to create another connection link and check
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>データベースのパスフレーズが違います</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>パスフレーズが違います!</target>
@@ -7124,6 +7257,12 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<source>send direct message</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<note>profile update event chat item</note>
@@ -7160,10 +7299,18 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>不明</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>グループプロフィールを更新しました</target>
@@ -7227,6 +7374,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>週</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>はい</target>
@@ -713,6 +713,11 @@
<target>Sta verdwijnende berichten alleen toe als uw contact dit toestaat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Downgraden toestaan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Sta het onomkeerbaar verwijderen van berichten alleen toe als uw contact dit toestaat. (24 uur)</target>
@@ -808,6 +813,11 @@
<target>Al lid van de groep!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Gebruik altijd privéroutering.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Altijd relay gebruiken</target>
@@ -1088,6 +1098,11 @@
<target>Kan bestand niet ontvangen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Capaciteit overschreden - ontvanger heeft eerder verzonden berichten niet ontvangen.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Mobiel</target>
@@ -1284,6 +1299,11 @@
<target>Bevestig database upgrades</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Bevestig bestanden van onbekende servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Bevestig netwerk instellingen</target>
@@ -1701,6 +1721,10 @@ Dit is uw eigen eenmalige link!</target>
<target>De database wordt gemigreerd wanneer de app opnieuw wordt opgestart</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Gedecentraliseerd</target>
@@ -1948,6 +1972,11 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Desktop apparaten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Bestemmingsserverfout: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Ontwikkelen</target>
@@ -2053,11 +2082,21 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Ontdek via het lokale netwerk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Stuur GEEN berichten rechtstreeks, zelfs als uw of de bestemmingsserver geen privéroutering ondersteunt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Gebruik SimpleX NIET voor noodoproepen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Gebruik GEEN privéroutering.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Doe het later</target>
@@ -2621,7 +2660,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Fout: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Bestand: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Bestanden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Bestanden en media</target>
@@ -2818,6 +2862,20 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Doorgestuurd vanuit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Doorstuurserver: %1$@
Bestemmingsserverfout: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Doorstuurserver: %1$@
Fout: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Desktop gevonden</target>
@@ -3633,11 +3691,20 @@ Dit is jouw link voor groep %@!</target>
<target>Ontvangst bevestiging voor berichten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Waarschuwing voor berichtbezorging</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Concept bericht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Reacties op berichten</target>
@@ -3653,6 +3720,16 @@ Dit is jouw link voor groep %@!</target>
<target>Reacties op berichten zijn verboden in deze groep.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Terugval op berichtroutering</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Berichtrouteringsmodus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Berichtbron blijft privé.</target>
@@ -3783,11 +3860,6 @@ Dit is jouw link voor groep %@!</target>
<target>Hoogstwaarschijnlijk is deze verbinding verwijderd.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Hoogstwaarschijnlijk heeft dit contact de verbinding met jou verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Meerdere chat profielen</target>
@@ -3818,6 +3890,11 @@ Dit is jouw link voor groep %@!</target>
<target>Netwerkverbinding</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Netwerkproblemen - bericht is verlopen na vele pogingen om het te verzenden.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Netwerkbeheer</target>
@@ -4359,11 +4436,26 @@ Fout: %@</target>
<target>Privé bestandsnamen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Routering van privéberichten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Routing van privéberichten🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Privé notities</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Privéroutering</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profiel- en serververbindingen</target>
@@ -4444,11 +4536,23 @@ Fout: %@</target>
<target>Verbieden het verzenden van spraak berichten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Bescherm het IP-adres</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>App scherm verbergen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Bescherm uw IP-adres tegen de berichtenrelais die door uw contacten zijn gekozen.
Schakel dit in in *Netwerk en servers*-instellingen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Bescherm je chat profielen met een wachtwoord!</target>
@@ -4554,11 +4658,6 @@ Fout: %@</target>
<target>Het ontvangstadres wordt gewijzigd naar een andere server. Adres wijziging wordt voltooid nadat de afzender online is.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Gelijktijdig ontvangen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Het ontvangen van het bestand wordt gestopt.</target>
@@ -4794,6 +4893,11 @@ Fout: %@</target>
<target>SMP servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Veilig bestanden ontvangen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Veiligere groepen</target>
@@ -5019,6 +5123,16 @@ Fout: %@</target>
<target>Stuur een livebericht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Stuur berichten rechtstreeks als het IP-adres beschermd is en uw of bestemmingsserver geen privéroutering ondersteunt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Stuur berichten rechtstreeks wanneer uw of de doelserver geen privéroutering ondersteunt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Meldingen verzenden</target>
@@ -5124,6 +5238,11 @@ Fout: %@</target>
<target>Verzonden berichten worden na ingestelde tijd verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Serveradres is niet compatibel met netwerkinstellingen.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server vereist autorisatie om wachtrijen te maken, controleer wachtwoord</target>
@@ -5139,6 +5258,11 @@ Fout: %@</target>
<target>Servertest mislukt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Serverversie is incompatibel met netwerkinstellingen.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servers</target>
@@ -5259,11 +5383,21 @@ Fout: %@</target>
<target>Laat laatste berichten zien</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Toon berichtstatus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Toon voorbeeld</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Toon → bij berichten verzonden via privéroutering.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Toon:</target>
@@ -5586,6 +5720,11 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>De app kan u op de hoogte stellen wanneer u berichten of contact verzoeken ontvangt - open de instellingen om dit in te schakelen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>De app vraagt om downloads van onbekende bestandsservers (behalve .onion) te bevestigen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>De poging om het wachtwoord van de database te wijzigen is niet voltooid.</target>
@@ -5771,6 +5910,11 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>Om de tijdzone te beschermen, gebruiken afbeeldings-/spraakbestanden UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Om uw IP-adres te beschermen, gebruikt privéroutering uw SMP-servers om berichten te bezorgen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
<target>Lid deblokkeren?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Onverwachte fout: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Onverwachte migratiestatus</target>
@@ -5913,6 +6052,11 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
<target>Onbekende fout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Onbekende servers!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Schakel de modus Niet storen in om onderbrekingen te voorkomen, tenzij u de iOS-oproepinterface gebruikt.</target>
@@ -6060,6 +6204,16 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<target>Alleen lokale meldingen gebruiken?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Gebruik privéroutering met onbekende servers wanneer het IP-adres niet beveiligd is.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Gebruik privéroutering met onbekende servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Gebruik server</target>
@@ -6295,11 +6449,26 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<target>Met verminderd batterijgebruik.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Zonder Tor of VPN is uw IP-adres zichtbaar voor bestandsservers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Zonder Tor of VPN zal uw IP-adres zichtbaar zijn voor deze XFTP-relays: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Verkeerd wachtwoord voor de database</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Verkeerde sleutel of onbekende verbinding - hoogstwaarschijnlijk is deze verbinding verwijderd.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Verkeerd wachtwoord!</target>
@@ -7415,6 +7584,12 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>stuur een direct bericht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>nieuw contactadres instellen</target>
@@ -7455,11 +7630,21 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>onbekend</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>onbekende relays</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>onbekende status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>onbeschermd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>bijgewerkt groep profiel</target>
@@ -7525,6 +7710,11 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>weken</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>wanneer IP verborgen is</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>Ja</target>
@@ -713,6 +713,11 @@
<target>Zezwól na znikające wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Zezwól na obniżenie wersji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Zezwalaj na nieodwracalne usuwanie wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli. (24 godziny)</target>
@@ -808,6 +813,11 @@
<target>Już dołączono do grupy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Zawsze używaj prywatnego trasowania.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Zawsze używaj przekaźnika</target>
@@ -1088,6 +1098,11 @@
<target>Nie można odebrać pliku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Przekroczono pojemność - odbiorca nie otrzymał wcześniej wysłanych wiadomości.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Sieć komórkowa</target>
@@ -1284,6 +1299,11 @@
<target>Potwierdź aktualizacje bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Potwierdzaj pliki z nieznanych serwerów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Potwierdź ustawienia sieciowe</target>
@@ -1701,6 +1721,10 @@ To jest twój jednorazowy link!</target>
<target>Baza danych zostanie zmigrowana po ponownym uruchomieniu aplikacji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Zdecentralizowane</target>
@@ -1948,6 +1972,11 @@ To nie może być cofnięte!</target>
<target>Urządzenia komputerowe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Błąd docelowego serwera: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Deweloperskie</target>
@@ -2053,11 +2082,21 @@ To nie może być cofnięte!</target>
<target>Odkryj przez sieć lokalną</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>NIE wysyłaj wiadomości bezpośrednio, nawet jeśli serwer docelowy nie obsługuje prywatnego trasowania.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NIE używaj SimpleX do połączeń alarmowych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>NIE używaj prywatnego trasowania.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Zrób to później</target>
@@ -2621,7 +2660,7 @@ To nie może być cofnięte!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Błąd: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ To nie może być cofnięte!</target>
<target>Plik: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Pliki</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Pliki i media</target>
@@ -2818,6 +2862,20 @@ To nie może być cofnięte!</target>
<target>Przekazane dalej od</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Serwer przekazujący: %1$@
Błąd serwera docelowego: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Serwer przekazujący: %1$@
Błąd: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Znaleziono komputer</target>
@@ -3633,11 +3691,20 @@ To jest twój link do grupy %@!</target>
<target>Potwierdzenia dostarczenia wiadomości!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Ostrzeżenie dostarczenia wiadomości</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Wersja robocza wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Reakcje wiadomości</target>
@@ -3653,6 +3720,16 @@ To jest twój link do grupy %@!</target>
<target>Reakcje wiadomości są zabronione w tej grupie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Rezerwowe trasowania wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Tryb trasowania wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Źródło wiadomości pozostaje prywatne.</target>
@@ -3783,11 +3860,6 @@ To jest twój link do grupy %@!</target>
<target>Najprawdopodobniej to połączenie jest usunięte.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Najprawdopodobniej ten kontakt usunął połączenie z Tobą.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Wiele profili czatu</target>
@@ -3818,6 +3890,11 @@ To jest twój link do grupy %@!</target>
<target>Połączenie z siecią</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Błąd sieciowy - wiadomość wygasła po wielu próbach wysłania jej.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Zarządzenie sieciowe</target>
@@ -4359,11 +4436,26 @@ Błąd: %@</target>
<target>Prywatne nazwy plików</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Trasowanie prywatnych wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Trasowanie prywatnych wiadomości🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Prywatne notatki</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Prywatne trasowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil i połączenia z serwerem</target>
@@ -4444,11 +4536,23 @@ Błąd: %@</target>
<target>Zabroń wysyłania wiadomości głosowych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Chroń adres IP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Chroń ekran aplikacji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Chroni Twój adres IP przed przekaźnikami wiadomości wybranych przez Twoje kontakty.
Włącz w ustawianiach *Sieć i serwery* .</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Chroń swoje profile czatu hasłem!</target>
@@ -4554,11 +4658,6 @@ Błąd: %@</target>
<target>Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Konkurencyjne odbieranie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Odbieranie pliku zostanie przerwane.</target>
@@ -4794,6 +4893,11 @@ Błąd: %@</target>
<target>Serwery SMP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Bezpiecznie otrzymuj pliki</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Bezpieczniejsze grupy</target>
@@ -5019,6 +5123,16 @@ Błąd: %@</target>
<target>Wyślij wiadomość na żywo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Wysyłaj wiadomości bezpośrednio, gdy adres IP jest chroniony i Twój lub docelowy serwer nie obsługuje prywatnego trasowania.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Wysyłaj wiadomości bezpośrednio, gdy Twój lub docelowy serwer nie obsługuje prywatnego trasowania.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Wyślij powiadomienia</target>
@@ -5124,6 +5238,11 @@ Błąd: %@</target>
<target>Wysłane wiadomości zostaną usunięte po ustawionym czasie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Adres serwera jest niekompatybilny z ustawieniami sieciowymi.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Serwer wymaga autoryzacji do tworzenia kolejek, sprawdź hasło</target>
@@ -5139,6 +5258,11 @@ Błąd: %@</target>
<target>Test serwera nie powiódł się!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Wersja serwera jest niekompatybilna z ustawieniami sieciowymi.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Serwery</target>
@@ -5259,11 +5383,21 @@ Błąd: %@</target>
<target>Pokaż ostatnie wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Pokaż status wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Pokaż podgląd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Pokaż → na wiadomościach wysłanych przez prywatne trasowanie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Pokaż:</target>
@@ -5586,6 +5720,11 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Aplikacja może powiadamiać Cię, gdy otrzymujesz wiadomości lub prośby o kontakt — otwórz ustawienia, aby włączyć.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>Aplikacja zapyta o potwierdzenie pobierania od nieznanych serwerów plików (poza .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Próba zmiany hasła bazy danych nie została zakończona.</target>
@@ -5771,6 +5910,11 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Aby chronić strefę czasową, pliki obrazów/głosów używają UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Aby chronić Twój adres IP, prywatne trasowanie używa Twoich serwerów SMP, aby dostarczyć wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
<target>Odblokować członka?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Nieoczekiwany błąd: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Nieoczekiwany stan migracji</target>
@@ -5913,6 +6052,11 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
<target>Nieznany błąd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Nieznane serwery!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>O ile nie korzystasz z interfejsu połączeń systemu iOS, włącz tryb Nie przeszkadzać, aby uniknąć przerywania.</target>
@@ -6060,6 +6204,16 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Używać tylko lokalnych powiadomień?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Używaj prywatnego trasowania z nieznanymi serwerami, gdy adres IP nie jest chroniony.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Używaj prywatnego trasowania z nieznanymi serwerami.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Użyj serwera</target>
@@ -6295,11 +6449,26 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Ze zmniejszonym zużyciem baterii.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Bez Tor lub VPN, Twój adres IP będzie widoczny do serwerów plików.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Bez Tor lub VPN, Twój adres IP będzie widoczny dla tych przekaźników XFTP: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Nieprawidłowe hasło bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Zły klucz lub nieznane połączenie - najprawdopodobniej to połączenie jest usunięte.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Nieprawidłowe hasło!</target>
@@ -7415,6 +7584,12 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>wyślij wiadomość bezpośrednią</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>ustaw nowy adres kontaktu</target>
@@ -7455,11 +7630,21 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>nieznany</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>nieznane przekaźniki</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>nieznany status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>niezabezpieczony</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>zaktualizowano profil grupy</target>
@@ -7525,6 +7710,11 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>tygodnie</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>gdy IP ukryty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>tak</target>
@@ -713,6 +713,11 @@
<target>Разрешить исчезающие сообщения, только если Ваш контакт разрешает их Вам.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Разрешить прямую доставку</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Разрешить необратимое удаление сообщений, только если Ваш контакт разрешает это Вам. (24 часа)</target>
@@ -808,6 +813,11 @@
<target>Вступление в группу уже начато!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Всегда использовать конфиденциальную доставку.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Всегда соединяться через relay</target>
@@ -1088,6 +1098,11 @@
<target>Невозможно получить файл</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Превышено количество сообщений - предыдущие сообщения не доставлены.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Мобильная сеть</target>
@@ -1284,6 +1299,11 @@
<target>Подтвердить обновление базы данных</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Подтверждать файлы с неизвестных серверов.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Подтвердите настройки сети</target>
@@ -1701,6 +1721,10 @@ This is your own one-time link!</source>
<target>Данные чата будут мигрированы при перезапуске</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Децентрализованный</target>
@@ -1948,6 +1972,11 @@ This cannot be undone!</source>
<target>Компьютеры</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Ошибка сервера получателя: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Для разработчиков</target>
@@ -2053,11 +2082,21 @@ This cannot be undone!</source>
<target>Обнаружение по локальной сети</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Не отправлять сообщения напрямую, даже если сервер получателя не поддерживает конфиденциальную доставку.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Не используйте SimpleX для экстренных звонков.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Не использовать конфиденциальную доставку.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Отложить</target>
@@ -2621,7 +2660,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Ошибка: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ This cannot be undone!</source>
<target>Файл: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Файлы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Файлы и медиа</target>
@@ -2818,6 +2862,20 @@ This cannot be undone!</source>
<target>Переслано из</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Пересылающий сервер: %1$@
Ошибка сервера получателя: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Пересылающий сервер: %1$@
Ошибка: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Компьютер найден</target>
@@ -3633,11 +3691,20 @@ This is your link for group %@!</source>
<target>Отчеты о доставке сообщений!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Предупреждение доставки сообщения</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Черновик сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Реакции на сообщения</target>
@@ -3653,6 +3720,16 @@ This is your link for group %@!</source>
<target>Реакции на сообщения запрещены в этой группе.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Прямая доставка сообщений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Режим доставки сообщений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Источник сообщения остаётся конфиденциальным.</target>
@@ -3783,11 +3860,6 @@ This is your link for group %@!</source>
<target>Скорее всего, соединение удалено.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Скорее всего, этот контакт удалил соединение с Вами.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Много профилей чата</target>
@@ -3818,6 +3890,11 @@ This is your link for group %@!</source>
<target>Интернет-соединение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Ошибка сети - сообщение не было отправлено после многократных попыток.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Статус сети</target>
@@ -4359,11 +4436,26 @@ Error: %@</source>
<target>Защищенные имена файлов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Конфиденциальная доставка сообщений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Конфиденциальная доставка сообщений 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Личные заметки</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Конфиденциальная доставка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Профиль и соединения на сервере</target>
@@ -4444,11 +4536,23 @@ Error: %@</source>
<target>Запретить отправлять голосовые сообщений.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Защитить IP адрес</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Защитить экран приложения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Защитите ваш IP адрес от серверов сообщений, выбранных Вашими контактами.
Включите в настройках *Сеть и серверы*.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Защитите Ваши профили чата паролем!</target>
@@ -4554,11 +4658,6 @@ Error: %@</source>
<target>Адрес получения сообщений будет перемещён на другой сервер. Изменение адреса завершится после того как отправитель будет онлайн.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Одновременный приём</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Приём файла будет прекращён.</target>
@@ -4794,6 +4893,11 @@ Error: %@</source>
<target>SMP серверы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Получайте файлы безопасно</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Более безопасные группы</target>
@@ -5019,6 +5123,16 @@ Error: %@</source>
<target>Отправить живое сообщение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Отправлять сообщения напрямую, когда IP адрес защищен, и Ваш сервер или сервер получателя не поддерживает конфиденциальную доставку.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Отправлять сообщения напрямую, когда Ваш сервер или сервер получателя не поддерживает конфиденциальную доставку.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Отправлять уведомления</target>
@@ -5124,6 +5238,11 @@ Error: %@</source>
<target>Отправленные сообщения будут удалены через заданное время.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Адрес сервера несовместим с настройками сети.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сервер требует авторизации для создания очередей, проверьте пароль</target>
@@ -5139,6 +5258,11 @@ Error: %@</source>
<target>Ошибка теста сервера!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Версия сервера несовместима с настройками сети.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Серверы</target>
@@ -5259,11 +5383,21 @@ Error: %@</source>
<target>Показывать последние сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Показать статус сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Показывать уведомления</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Показать → на сообщениях доставленных конфиденциально.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Показать:</target>
@@ -5586,6 +5720,11 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Приложение может посылать Вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>Приложение будет запрашивать подтверждение загрузки с неизвестных серверов (за исключением .onion адресов).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Попытка поменять пароль базы данных не была завершена.</target>
@@ -5771,6 +5910,11 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Чтобы защитить Ваш часовой пояс, файлы картинок и голосовых сообщений используют UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Чтобы защитить ваш IP адрес, приложение использует Ваши SMP серверы для конфиденциальной доставки сообщений.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Разблокировать члена группы?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Неожиданная ошибка: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Неожиданная ошибка при перемещении данных чата</target>
@@ -5913,6 +6052,11 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Неизвестная ошибка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Неизвестные серверы!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Если Вы не используете интерфейс iOS, включите режим Не отвлекать, чтобы звонок не прерывался.</target>
@@ -6060,6 +6204,16 @@ To connect, please ask your contact to create another connection link and check
<target>Использовать только локальные нотификации?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Использовать конфиденциальную доставку с неизвестными серверами, когда IP адрес не защищен.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Использовать конфиденциальную доставку с неизвестными серверами.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Использовать сервер</target>
@@ -6295,11 +6449,26 @@ To connect, please ask your contact to create another connection link and check
<target>С уменьшенным потреблением батареи.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Без Тора или ВПН, Ваш IP адрес будет доступен серверам файлов.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Без Тора или ВПН, Ваш IP адрес будет доступен этим серверам файлов: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Неправильный пароль базы данных</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Неверный ключ или неизвестное соединение - скорее всего, это соединение удалено.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Неправильный пароль!</target>
@@ -7415,6 +7584,12 @@ SimpleX серверы не могут получить доступ к Ваше
<target>отправьте сообщение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>установлен новый адрес контакта</target>
@@ -7455,11 +7630,21 @@ SimpleX серверы не могут получить доступ к Ваше
<target>неизвестно</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>неизвестные серверы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>неизвестный статус</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>незащищённый</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>обновил(а) профиль группы</target>
@@ -7525,6 +7710,11 @@ SimpleX серверы не могут получить доступ к Ваше
<target>недель</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>когда IP защищен</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>да</target>
@@ -677,6 +677,10 @@
<target>อนุญาตให้ข้อความที่หายไปเฉพาะในกรณีที่ผู้ติดต่อของคุณอนุญาตเท่านั้น.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>อนุญาตให้ลบข้อความแบบถาวรเฉพาะในกรณีที่ผู้ติดต่อของคุณอนุญาตให้คุณเท่านั้น</target>
@@ -769,6 +773,10 @@
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>ใช้รีเลย์เสมอ</target>
@@ -1032,6 +1040,10 @@
<target>ไม่สามารถรับไฟล์ได้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1223,6 +1235,10 @@
<target>ยืนยันการอัพเกรดฐานข้อมูล</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<note>No comment provided by engineer.</note>
@@ -1613,6 +1629,10 @@ This is your own one-time link!</source>
<target>ระบบจะย้ายฐานข้อมูลเมื่อแอปรีสตาร์ท</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>กระจายอำนาจแล้ว</target>
@@ -1851,6 +1871,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>พัฒนา</target>
@@ -1953,11 +1977,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>อย่าใช้ SimpleX สําหรับการโทรฉุกเฉิน</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>ทำในภายหลัง</target>
@@ -2494,7 +2526,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>ข้อผิดพลาด: % @</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2583,6 +2615,10 @@ This cannot be undone!</source>
<target>ไฟล์: % @</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>ไฟล์และสื่อ</target>
@@ -2681,6 +2717,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3463,11 +3509,19 @@ This is your link for group %@!</source>
<target>ใบเสร็จการส่งข้อความ!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>ร่างข้อความ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>ปฏิกิริยาของข้อความ</target>
@@ -3483,6 +3537,14 @@ This is your link for group %@!</source>
<target>ปฏิกิริยาบนข้อความเป็นสิ่งต้องห้ามในกลุ่มนี้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3599,11 +3661,6 @@ This is your link for group %@!</source>
<source>Most likely this connection is deleted.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>เป็นไปได้มากว่าผู้ติดต่อนี้ได้ลบการเชื่อมต่อกับคุณ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>โปรไฟล์การแชทหลายรายการ</target>
@@ -3633,6 +3690,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4150,10 +4211,22 @@ Error: %@</source>
<target>ชื่อไฟล์ส่วนตัว</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>การเชื่อมต่อโปรไฟล์และเซิร์ฟเวอร์</target>
@@ -4230,11 +4303,20 @@ Error: %@</source>
<target>ห้ามส่งข้อความเสียง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>ปกป้องหน้าจอแอป</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>ปกป้องโปรไฟล์การแชทของคุณด้วยรหัสผ่าน!</target>
@@ -4336,10 +4418,6 @@ Error: %@</source>
<target>ที่อยู่ผู้รับจะถูกเปลี่ยนเป็นเซิร์ฟเวอร์อื่น การเปลี่ยนแปลงที่อยู่จะเสร็จสมบูรณ์หลังจากที่ผู้ส่งออนไลน์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>การรับไฟล์จะหยุดลง</target>
@@ -4566,6 +4644,10 @@ Error: %@</source>
<target>เซิร์ฟเวอร์ SMP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<note>No comment provided by engineer.</note>
@@ -4783,6 +4865,14 @@ Error: %@</source>
<target>ส่งข้อความสด</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>ส่งการแจ้งเตือน</target>
@@ -4885,6 +4975,10 @@ Error: %@</source>
<target>ข้อความที่ส่งจะถูกลบหลังเกินเวลาที่กําหนด</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>เซิร์ฟเวอร์ต้องการการอนุญาตในการสร้างคิว โปรดตรวจสอบรหัสผ่าน</target>
@@ -4900,6 +4994,10 @@ Error: %@</source>
<target>การทดสอบเซิร์ฟเวอร์ล้มเหลว!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>เซิร์ฟเวอร์</target>
@@ -5014,11 +5112,19 @@ Error: %@</source>
<source>Show last messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>แสดงตัวอย่าง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>แสดง:</target>
@@ -5331,6 +5437,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>แอปสามารถแจ้งให้คุณทราบเมื่อคุณได้รับข้อความหรือคำขอติดต่อ - โปรดเปิดการตั้งค่าเพื่อเปิดใช้งาน</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>ความพยายามในการเปลี่ยนรหัสผ่านของฐานข้อมูลไม่เสร็จสมบูรณ์</target>
@@ -5505,6 +5615,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>ไฟล์ภาพ/เสียงใช้ UTC เพื่อป้องกันเขตเวลา</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5590,11 +5704,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>ข้อผิดพลาดที่ไม่คาดคิด: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>สถานะการย้ายข้อมูลที่ไม่คาดคิด</target>
@@ -5640,6 +5749,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>ข้อผิดพลาดที่ไม่รู้จัก</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>ยกเว้นกรณีที่คุณใช้อินเทอร์เฟซการโทรของ iOS ให้เปิดใช้งานโหมดห้ามรบกวนเพื่อหลีกเลี่ยงการรบกวน</target>
@@ -5778,6 +5891,14 @@ To connect, please ask your contact to create another connection link and check
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>ใช้เซิร์ฟเวอร์</target>
@@ -5995,11 +6116,23 @@ To connect, please ask your contact to create another connection link and check
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>รหัสผ่านฐานข้อมูลไม่ถูกต้อง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>รหัสผ่านผิด!</target>
@@ -7074,6 +7207,12 @@ SimpleX servers cannot see your profile.</source>
<source>send direct message</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<note>profile update event chat item</note>
@@ -7110,10 +7249,18 @@ SimpleX servers cannot see your profile.</source>
<target>ไม่ทราบ</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>อัปเดตโปรไฟล์กลุ่มแล้ว</target>
@@ -7177,6 +7324,10 @@ SimpleX servers cannot see your profile.</source>
<target>สัปดาห์</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>ใช่</target>
@@ -445,7 +445,7 @@
</trans-unit>
<trans-unit id="0s" xml:space="preserve">
<source>0s</source>
<target>0 saniye</target>
<target>0sn</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="1 day" xml:space="preserve">
@@ -695,7 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Tüm kişileriniz, sohbetleriniz ve dosyalarınız güvenli bir şekilde şifrelenecek ve parçalar halinde yapılandırılmış XFTP rölelerine yüklenecektir.</target>
<target>Tüm kişileriniz, konuşmalarınız ve dosyalarınız güvenli bir şekilde şifrelenir ve yapılandırılmış XFTP yönlendiricilerine parçalar halinde yüklenir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -713,6 +713,11 @@
<target>Eğer kişide izin verirse kaybolan mesajlara izin ver.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Sürüm düşürmeye izin ver</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Konuştuğun kişi, kalıcı olarak silinebilen mesajlara izin veriyorsa sen de ver. (24 saat içinde)</target>
@@ -730,7 +735,7 @@
</trans-unit>
<trans-unit id="Allow sending direct messages to members." xml:space="preserve">
<source>Allow sending direct messages to members.</source>
<target>Üyelere direkt mesaj göndermeye izin ver.</target>
<target>Üyelere doğrudan mesaj göndermeye izin ver.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow sending disappearing messages." xml:space="preserve">
@@ -808,6 +813,11 @@
<target>Zaten gruba bağlanılıyor!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Her zaman gizli yönlendirme kullan.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Her zaman yönlendirici kullan</target>
@@ -1088,6 +1098,11 @@
<target>Dosya alınamıyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Kapasite aşıldı - alıcı önceden gönderilen mesajları almadı.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Hücresel Veri</target>
@@ -1284,6 +1299,11 @@
<target>Veritabanı geliştirmelerini onayla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Bilinmeyen sunuculardan gelen dosyaları onayla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Ağ ayarlarını onaylayın</target>
@@ -1701,6 +1721,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
<target>Uygulama yeniden başlatıldığında veritabanı taşınacaktır</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Merkezi Olmayan</target>
@@ -1948,6 +1972,11 @@ Bu geri alınamaz!</target>
<target>Bilgisayar cihazları</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Hedef sunucu hatası: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Geliştir</target>
@@ -2053,11 +2082,21 @@ Bu geri alınamaz!</target>
<target>Yerel ağ aracılığıyla keşfet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Sizin veya hedef sunucunun özel yönlendirmeyi desteklememesi durumunda bile mesajları doğrudan GÖNDERMEYİN.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Acil aramalar için SimpleX'i KULLANMAYIN.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Gizli yönlendirmeyi KULLANMA.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Sonra yap</target>
@@ -2621,7 +2660,7 @@ Bu geri alınamaz!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Hata: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2752,11 @@ Bu geri alınamaz!</target>
<target>Dosya: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Dosyalar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Dosyalar &amp; medya</target>
@@ -2818,6 +2862,20 @@ Bu geri alınamaz!</target>
<target>Şuradan iletildi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Yönlendirme sunucusu: %1$@
Hedef sunucu hatası: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Yönlendirme sunucusu: %1$@
Hata: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Bilgisayar bulundu</target>
@@ -3633,11 +3691,20 @@ Bu senin grup için bağlantın %@!</target>
<target>Mesaj alındı bilgisi!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Mesaj iletimi uyarısı</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Mesaj taslağı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Mesaj tepkileri</target>
@@ -3653,6 +3720,16 @@ Bu senin grup için bağlantın %@!</target>
<target>Mesaj tepkileri bu grupta yasaklandı.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Mesaj yönlendirme yedeklemesi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Mesaj yönlendirme modu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Mesaj kaynağı gizli kalır.</target>
@@ -3783,11 +3860,6 @@ Bu senin grup için bağlantın %@!</target>
<target>Büyük ihtimalle bu bağlantı silinmiş.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Büyük ihtimalle bu kişi seninle bağlantını sildi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Çoklu sohbet profili</target>
@@ -3818,6 +3890,11 @@ Bu senin grup için bağlantın %@!</target>
<target>Ağ bağlantısı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Ağ sorunları - birçok gönderme denemesinden sonra mesajın süresi doldu.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Ağ yönetimi</target>
@@ -4359,11 +4436,26 @@ Hata: %@</target>
<target>Gizli dosya adları</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Gizli mesaj yönlendirme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Gizli mesaj yönlendirme 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Gizli notlar</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Gizli yönlendirme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil ve sunucu bağlantıları</target>
@@ -4426,7 +4518,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Geri dönülmez mesaj silme işlemini yasakla.</target>
<target>Üyelere doğrudan mesaj göndermeyi yasakla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending disappearing messages." xml:space="preserve">
@@ -4444,11 +4536,23 @@ Hata: %@</target>
<target>Sesli mesajların gönderimini yasakla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>IP adresini koru</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Uygulama ekranını koru</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>IP adresinizi kişileriniz tarafından seçilen mesajlaşma yönlendiricilerinden koruyun.
*Ağ ve sunucular* ayarlarında etkinleştirin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Bir parolayla birlikte sohbet profillerini koru!</target>
@@ -4554,11 +4658,6 @@ Hata: %@</target>
<target>Alıcı adresi farklı bir sunucuya değiştirilecektir. Gönderici çevrimiçi olduktan sonra adres değişikliği tamamlanacaktır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Eşzamanlılık alınıyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Dosya alımı durdurulacaktır.</target>
@@ -4626,12 +4725,12 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Aktarma sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir.</target>
<target>Yönlendirici sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Relay server protects your IP address, but it can observe the duration of the call." xml:space="preserve">
<source>Relay server protects your IP address, but it can observe the duration of the call.</source>
<target>Aktarıcı sunucu IP adresinizi korur, ancak aramanın süresini gözlemleyebilir.</target>
<target>Yönlendirici sunucu IP adresinizi korur, ancak aramanın süresini gözlemleyebilir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove" xml:space="preserve">
@@ -4794,6 +4893,11 @@ Hata: %@</target>
<target>SMP sunucuları</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Dosyaları güvenle alın</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Daha güvenli gruplar</target>
@@ -5019,6 +5123,16 @@ Hata: %@</target>
<target>Canlı mesaj gönder</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>IP adresi korumalı olduğunda ve sizin veya hedef sunucunun özel yönlendirmeyi desteklemediği durumlarda mesajları doğrudan gönderin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Sizin veya hedef sunucunun özel yönlendirmeyi desteklemediği durumlarda mesajları doğrudan gönderin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Bildirimler gönder</target>
@@ -5124,6 +5238,11 @@ Hata: %@</target>
<target>Gönderilen mesajlar ayarlanan süreden sonra silinecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Sunucu adresi ağ ayarlarıyla uyumlu değil.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Sunucunun sıra oluşturması için yetki gereklidir, şifreyi kontrol edin</target>
@@ -5139,6 +5258,11 @@ Hata: %@</target>
<target>Sunucu testinde hata oluştu!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Sunucu sürümü ağ ayarlarıyla uyumlu değil.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Sunucular</target>
@@ -5259,11 +5383,21 @@ Hata: %@</target>
<target>Son mesajları göster</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Mesaj durumunu göster</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Ön gösterimi göser</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Gizli yönlendirme yoluyla gönderilen mesajlarda → işaretini göster.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Göster:</target>
@@ -5586,6 +5720,11 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
<target>Uygulama, mesaj veya iletişim isteği aldığınızda sizi bilgilendirebilir - etkinleştirmek için lütfen ayarları açın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>Uygulama bilinmeyen dosya sunucularından indirmeleri onaylamanızı isteyecektir (.onion hariç).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Veritabanı parolasını değiştirme girişimi tamamlanmadı.</target>
@@ -5771,6 +5910,11 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
<target>Zaman bölgesini korumak için,fotoğraf/ses dosyaları UTC kullanır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>IP adresinizi korumak için,gizli yönlendirme mesajları iletmek için SMP sunucularınızı kullanır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +6007,6 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec
<target>Üyenin engeli kaldırılsın mı?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Beklenmeyen hata: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Beklenmeyen geçiş durumu</target>
@@ -5913,6 +6052,11 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec
<target>Bilinmeyen hata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Bilinmeyen sunucular!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>iOS arama arayüzünü kullanmadığınız sürece, kesintileri önlemek için Rahatsız Etmeyin modunu etkinleştirin.</target>
@@ -6060,6 +6204,16 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<target>Sadece yerel bildirimler kullanılsın mı?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>IP adresi korunmadığında bilinmeyen sunucularla gizli yönlendirme kullan.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Bilinmeyen sunucularla gizli yönlendirme kullan.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Sunucu kullan</target>
@@ -6295,11 +6449,26 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<target>Azaltılmış pil kullanımı ile birlikte.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Tor veya VPN olmadan, IP adresiniz dosya sunucularına görülebilir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Tor veya VPN olmadan, IP adresiniz bu XFTP aktarıcıları tarafından görülebilir: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Yanlış veritabanı parolası</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Yanlış anahtar veya bilinmeyen bağlantı - büyük olasılıkla bu bağlantı silinmiştir.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Yanlış parola!</target>
@@ -7415,6 +7584,12 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>doğrudan mesaj gönder</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>yeni kişi adresi ayarla</target>
@@ -7455,11 +7630,21 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>bilinmeyen</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>bilinmeyen yönlendiriciler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>bilinmeyen durum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>korumasız</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>grup profili güncellendi</target>
@@ -7525,6 +7710,11 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>haftalar</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>IP gizliyken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>evet</target>
@@ -713,6 +713,11 @@
<target>Дозволяйте зникати повідомленням, тільки якщо контакт дозволяє вам це робити.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Дозволити пониження версії</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Дозволяйте безповоротне видалення повідомлень, тільки якщо контакт дозволяє вам це зробити. (24 години)</target>
@@ -745,6 +750,7 @@
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<target>Дозволити надсилати посилання SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
@@ -807,6 +813,11 @@
<target>Вже приєднуємося до групи!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Завжди використовуйте приватну маршрутизацію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Завжди використовуйте реле</target>
@@ -1087,8 +1098,14 @@
<target>Не вдається отримати файл</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Перевищено ліміт - одержувач не отримав раніше надіслані повідомлення.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Стільниковий</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
@@ -1282,6 +1299,11 @@
<target>Підтвердити оновлення бази даних</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm files from unknown servers." xml:space="preserve">
<source>Confirm files from unknown servers.</source>
<target>Підтвердити файли з невідомих серверів.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Підтвердьте налаштування мережі</target>
@@ -1699,6 +1721,10 @@ This is your own one-time link!</source>
<target>База даних буде перенесена під час перезапуску програми</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
<source>Decentralized</source>
<target>Децентралізований</target>
@@ -1946,6 +1972,11 @@ This cannot be undone!</source>
<target>Настільні пристрої</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Помилка сервера призначення: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Розробник</target>
@@ -2051,11 +2082,21 @@ This cannot be undone!</source>
<target>Відкриття через локальну мережу</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>НЕ надсилайте повідомлення напряму, навіть якщо ваш сервер або сервер призначення не підтримує приватну маршрутизацію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>НЕ використовуйте SimpleX для екстрених викликів.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>НЕ використовуйте приватну маршрутизацію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Зробіть це пізніше</target>
@@ -2088,6 +2129,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<target>Завантажити</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
@@ -2202,6 +2244,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<target>Увімкнено для</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
@@ -2617,7 +2660,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Помилка: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2709,6 +2752,11 @@ This cannot be undone!</source>
<target>Файл: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Файли</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Файли та медіа</target>
@@ -2726,6 +2774,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<target>Файли та медіафайли заборонені</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
@@ -2795,20 +2844,38 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<target>Пересилання</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forward and save messages" xml:space="preserve">
<source>Forward and save messages</source>
<target>Пересилання та збереження повідомлень</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Переслано</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<target>Переслано з</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Сервер переадресації: %1$@
Помилка сервера призначення: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Сервер переадресації: %1$@
Помилка: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Знайдено робочий стіл</target>
@@ -2921,6 +2988,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<target>Учасники групи можуть надсилати посилання SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
@@ -3165,6 +3233,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="In-call sounds" xml:space="preserve">
<source>In-call sounds</source>
<target>Звуки вхідного дзвінка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
@@ -3622,11 +3691,20 @@ This is your link for group %@!</source>
<target>Підтвердження доставки повідомлення!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Попередження про доставку повідомлення</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Чернетка повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
<source>Message reactions</source>
<target>Реакції на повідомлення</target>
@@ -3642,8 +3720,19 @@ This is your link for group %@!</source>
<target>Реакції на повідомлення в цій групі заборонені.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Запасний варіант маршрутизації повідомлень</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Режим маршрутизації повідомлень</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Джерело повідомлення залишається приватним.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
@@ -3763,6 +3852,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="More reliable network connection." xml:space="preserve">
<source>More reliable network connection.</source>
<target>Більш надійне з'єднання з мережею.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Most likely this connection is deleted." xml:space="preserve">
@@ -3770,11 +3860,6 @@ This is your link for group %@!</source>
<target>Швидше за все, це з'єднання видалено.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Швидше за все, цей контакт видалив зв'язок з вами.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Кілька профілів чату</target>
@@ -3802,10 +3887,17 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<target>Підключення до мережі</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Проблеми з мережею - термін дії повідомлення закінчився після багатьох спроб надіслати його.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Керування мережею</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
@@ -3920,6 +4012,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<target>Немає підключення до мережі</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
@@ -4138,6 +4231,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<target>Інше</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
@@ -4342,11 +4436,26 @@ Error: %@</source>
<target>Приватні імена файлів</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Маршрутизація приватних повідомлень</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Маршрутизація приватних повідомлень 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Приватні нотатки</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Приватна маршрутизація</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>З'єднання профілю та сервера</target>
@@ -4359,6 +4468,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Profile images" xml:space="preserve">
<source>Profile images</source>
<target>Зображення профілю</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
@@ -4403,6 +4513,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<target>Заборонити надсилання посилань SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
@@ -4425,11 +4536,23 @@ Error: %@</source>
<target>Заборонити надсилання голосових повідомлень.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Захист IP-адреси</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Захистіть екран програми</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Захистіть свою IP-адресу від ретрансляторів повідомлень, обраних вашими контактами.
Увімкніть у налаштуваннях *Мережа та сервери*.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
<source>Protect your chat profiles with a password!</source>
<target>Захистіть свої профілі чату паролем!</target>
@@ -4535,10 +4658,6 @@ Error: %@</source>
<target>Адреса отримувача буде змінена на інший сервер. Зміна адреси завершиться після того, як відправник з'явиться в мережі.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Отримання файлу буде зупинено.</target>
@@ -4556,6 +4675,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<target>Одержувач(и) не бачить, від кого це повідомлення.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
@@ -4773,6 +4893,11 @@ Error: %@</source>
<target>Сервери SMP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
<source>Safely receive files</source>
<target>Безпечне отримання файлів</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Безпечніші групи</target>
@@ -4860,6 +4985,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Збережено</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
@@ -4869,6 +4995,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<target>Збережено з</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
@@ -4996,6 +5123,16 @@ Error: %@</source>
<target>Надіслати живе повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Надсилайте повідомлення напряму, якщо IP-адреса захищена, а ваш сервер або сервер призначення не підтримує приватну маршрутизацію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Надсилайте повідомлення напряму, якщо ваш сервер або сервер призначення не підтримує приватну маршрутизацію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Надсилати сповіщення</target>
@@ -5101,6 +5238,11 @@ Error: %@</source>
<target>Надіслані повідомлення будуть видалені через встановлений час.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Адреса сервера несумісна з налаштуваннями мережі.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сервер вимагає авторизації для створення черг, перевірте пароль</target>
@@ -5116,6 +5258,11 @@ Error: %@</source>
<target>Тест сервера завершився невдало!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Серверна версія несумісна з мережевими налаштуваннями.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Сервери</target>
@@ -5178,6 +5325,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Сформуйте зображення профілю</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share" xml:space="preserve">
@@ -5235,11 +5383,21 @@ Error: %@</source>
<target>Показати останні повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Показати статус повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Показати попередній перегляд</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Показувати → у повідомленнях, надісланих через приватну маршрутизацію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Показати:</target>
@@ -5302,10 +5460,12 @@ Error: %@</source>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<target>У цій групі заборонені посилання на SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<target>Посилання SimpleX заборонені</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5345,6 +5505,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Square, circle, or anything in between." xml:space="preserve">
<source>Square, circle, or anything in between.</source>
<target>Квадрат, коло або щось середнє між ними.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Start chat" xml:space="preserve">
@@ -5559,6 +5720,11 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Додаток може сповіщати вас, коли ви отримуєте повідомлення або запити на контакт - будь ласка, відкрийте налаштування, щоб увімкнути цю функцію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>Програма попросить підтвердити завантаження з невідомих файлових серверів (крім .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Спроба змінити пароль до бази даних не була завершена.</target>
@@ -5744,6 +5910,11 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Для захисту часового поясу у файлах зображень/голосу використовується UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Щоб захистити вашу IP-адресу, приватна маршрутизація використовує ваші SMP-сервери для доставки повідомлень.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5836,11 +6007,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Розблокувати учасника?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Неочікувана помилка: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Неочікуваний стан міграції</target>
@@ -5886,6 +6052,11 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Невідома помилка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Невідомі сервери!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Якщо ви не користуєтеся інтерфейсом виклику iOS, увімкніть режим "Не турбувати", щоб уникнути переривань.</target>
@@ -6033,6 +6204,16 @@ To connect, please ask your contact to create another connection link and check
<target>Використовувати лише локальні сповіщення?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Використовуйте приватну маршрутизацію з невідомими серверами, якщо IP-адреса не захищена.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Використовуйте приватну маршрутизацію з невідомими серверами.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Використовувати сервер</target>
@@ -6150,6 +6331,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<target>Голосові повідомлення заборонені</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
@@ -6224,6 +6406,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="When connecting audio and video calls." xml:space="preserve">
<source>When connecting audio and video calls.</source>
<target>При підключенні аудіо та відеодзвінків.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="When people request to connect, you can accept or reject it." xml:space="preserve">
@@ -6238,14 +6421,17 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<target>WiFi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Will be enabled in direct chats!" xml:space="preserve">
<source>Will be enabled in direct chats!</source>
<target>Буде ввімкнено в прямих чатах!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<target>Дротова мережа Ethernet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
@@ -6263,11 +6449,26 @@ To connect, please ask your contact to create another connection link and check
<target>З меншим споживанням заряду акумулятора.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Без Tor або VPN ваша IP-адреса буде видимою для файлових серверів.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Без Tor або VPN ваша IP-адреса буде видимою для цих XFTP-ретрансляторів: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Неправильний пароль до бази даних</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Неправильний ключ або невідоме з'єднання - швидше за все, це з'єднання видалено.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Неправильний пароль!</target>
@@ -6733,6 +6934,7 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<target>адміністратори</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
@@ -6747,6 +6949,7 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>всі учасники</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
@@ -7081,6 +7284,7 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<target>переслано</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
@@ -7292,6 +7496,7 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<target>власники</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
@@ -7346,10 +7551,12 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>збережено</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<target>збережено з %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
@@ -7377,6 +7584,12 @@ SimpleX servers cannot see your profile.</source>
<target>надіслати пряме повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="server queue info: %@&#10;&#10;last received msg: %@" xml:space="preserve">
<source>server queue info: %1$@
last received msg: %2$@</source>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>встановити нову контактну адресу</target>
@@ -7417,11 +7630,21 @@ SimpleX servers cannot see your profile.</source>
<target>невідомий</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>невідомі реле</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>невідомий статус</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>незахищені</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>оновлений профіль групи</target>
@@ -7487,6 +7710,11 @@ SimpleX servers cannot see your profile.</source>
<target>тижнів</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>коли IP приховано</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>так</target>
@@ -7494,6 +7722,7 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<target>ти</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
File diff suppressed because it is too large Load Diff
@@ -696,14 +696,16 @@ func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? {
}
func apiReceiveFile(fileId: Int64, encrypted: Bool, inline: Bool? = nil) -> AChatItem? {
let r = sendSimpleXCmd(.receiveFile(fileId: fileId, encrypted: encrypted, inline: inline))
let userApprovedRelays = !privacyAskToApproveRelaysGroupDefault.get()
let r = sendSimpleXCmd(.receiveFile(fileId: fileId, userApprovedRelays: userApprovedRelays, encrypted: encrypted, inline: inline))
if case let .rcvFileAccepted(_, chatItem) = r { return chatItem }
logger.error("receiveFile error: \(responseError(r))")
return nil
}
func apiSetFileToReceive(fileId: Int64, encrypted: Bool) {
let r = sendSimpleXCmd(.setFileToReceive(fileId: fileId, encrypted: encrypted))
let userApprovedRelays = !privacyAskToApproveRelaysGroupDefault.get()
let r = sendSimpleXCmd(.setFileToReceive(fileId: fileId, userApprovedRelays: userApprovedRelays, encrypted: encrypted))
if case .cmdOk = r { return }
logger.error("setFileToReceive error: \(responseError(r))")
}
@@ -5,5 +5,5 @@
"CFBundleName" = "SimpleX NSE";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = "Copyright © 2022 SimpleX Chat. All rights reserved.";
"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. All rights reserved.";
+32 -32
View File
@@ -24,6 +24,11 @@
5C029EAA283942EA004A9677 /* CallController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C029EA9283942EA004A9677 /* CallController.swift */; };
5C05DF532840AA1D00C683F9 /* CallSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C05DF522840AA1D00C683F9 /* CallSettings.swift */; };
5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */; };
5C0EA13B2C0B176B00AD2E5E /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C0EA1362C0B176B00AD2E5E /* libgmp.a */; };
5C0EA13C2C0B176B00AD2E5E /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C0EA1372C0B176B00AD2E5E /* libgmpxx.a */; };
5C0EA13D2C0B176B00AD2E5E /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C0EA1382C0B176B00AD2E5E /* libffi.a */; };
5C0EA13E2C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C0EA1392C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc-ghc9.6.3.a */; };
5C0EA13F2C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C0EA13A2C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc.a */; };
5C10D88828EED12E00E58BF0 /* ContactConnectionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C10D88728EED12E00E58BF0 /* ContactConnectionInfo.swift */; };
5C10D88A28F187F300E58BF0 /* FullScreenMediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C10D88928F187F300E58BF0 /* FullScreenMediaView.swift */; };
5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; };
@@ -53,11 +58,6 @@
5C5E5D3B2824468B00B0488A /* ActiveCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5E5D3A2824468B00B0488A /* ActiveCallView.swift */; };
5C5F2B6D27EBC3FE006A9D5F /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */; };
5C5F2B7027EBC704006A9D5F /* ProfileImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6F27EBC704006A9D5F /* ProfileImage.swift */; };
5C614CFB2C021C1C000E7758 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C614CF62C021C1C000E7758 /* libffi.a */; };
5C614CFC2C021C1C000E7758 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C614CF72C021C1C000E7758 /* libgmpxx.a */; };
5C614CFD2C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C614CF82C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7-ghc9.6.3.a */; };
5C614CFE2C021C1C000E7758 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C614CF92C021C1C000E7758 /* libgmp.a */; };
5C614CFF2C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C614CFA2C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7.a */; };
5C65DAF929D0CC20003CEE45 /* DeveloperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C65DAF829D0CC20003CEE45 /* DeveloperView.swift */; };
5C65F343297D45E100B67AF3 /* VersionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C65F341297D3F3600B67AF3 /* VersionView.swift */; };
5C6BA667289BD954009B8ECC /* DismissSheets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6BA666289BD954009B8ECC /* DismissSheets.swift */; };
@@ -273,6 +273,11 @@
5C029EA9283942EA004A9677 /* CallController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallController.swift; sourceTree = "<group>"; };
5C05DF522840AA1D00C683F9 /* CallSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallSettings.swift; sourceTree = "<group>"; };
5C063D2627A4564100AEC577 /* ChatPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatPreviewView.swift; sourceTree = "<group>"; };
5C0EA1362C0B176B00AD2E5E /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C0EA1372C0B176B00AD2E5E /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C0EA1382C0B176B00AD2E5E /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C0EA1392C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc-ghc9.6.3.a"; sourceTree = "<group>"; };
5C0EA13A2C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc.a"; sourceTree = "<group>"; };
5C10D88728EED12E00E58BF0 /* ContactConnectionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactConnectionInfo.swift; sourceTree = "<group>"; };
5C10D88928F187F300E58BF0 /* FullScreenMediaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenMediaView.swift; sourceTree = "<group>"; };
5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactRequestView.swift; sourceTree = "<group>"; };
@@ -316,11 +321,6 @@
5C5E5D3C282447AB00B0488A /* CallTypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallTypes.swift; sourceTree = "<group>"; };
5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = "<group>"; };
5C5F2B6F27EBC704006A9D5F /* ProfileImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileImage.swift; sourceTree = "<group>"; };
5C614CF62C021C1C000E7758 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C614CF72C021C1C000E7758 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C614CF82C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7-ghc9.6.3.a"; sourceTree = "<group>"; };
5C614CF92C021C1C000E7758 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C614CFA2C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7.a"; sourceTree = "<group>"; };
5C636F662AAB3D2400751C84 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = "uk.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
5C636F672AAB3D2400751C84 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
5C65DAE429C77136003CEE45 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
@@ -529,13 +529,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5C614CFD2C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7-ghc9.6.3.a in Frameworks */,
5C614CFF2C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7.a in Frameworks */,
5C614CFC2C021C1C000E7758 /* libgmpxx.a in Frameworks */,
5C0EA13C2C0B176B00AD2E5E /* libgmpxx.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
5C614CFB2C021C1C000E7758 /* libffi.a in Frameworks */,
5C614CFE2C021C1C000E7758 /* libgmp.a in Frameworks */,
5C0EA13B2C0B176B00AD2E5E /* libgmp.a in Frameworks */,
5C0EA13D2C0B176B00AD2E5E /* libffi.a in Frameworks */,
5C0EA13F2C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
5C0EA13E2C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc-ghc9.6.3.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -601,11 +601,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
5C614CF62C021C1C000E7758 /* libffi.a */,
5C614CF92C021C1C000E7758 /* libgmp.a */,
5C614CF72C021C1C000E7758 /* libgmpxx.a */,
5C614CF82C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7-ghc9.6.3.a */,
5C614CFA2C021C1C000E7758 /* libHSsimplex-chat-5.7.4.1-FMTNcSSNT86KdfUI39X2r7.a */,
5C0EA1382C0B176B00AD2E5E /* libffi.a */,
5C0EA1362C0B176B00AD2E5E /* libgmp.a */,
5C0EA1372C0B176B00AD2E5E /* libgmpxx.a */,
5C0EA1392C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc-ghc9.6.3.a */,
5C0EA13A2C0B176B00AD2E5E /* libHSsimplex-chat-5.8.0.5-Idqi6HXqzzs2zrnyZtMyhc.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -1552,7 +1552,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219;
CURRENT_PROJECT_VERSION = 223;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1577,7 +1577,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES_THIN;
MARKETING_VERSION = 5.7.4;
MARKETING_VERSION = 5.8;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1601,7 +1601,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219;
CURRENT_PROJECT_VERSION = 223;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1626,7 +1626,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.7.4;
MARKETING_VERSION = 5.8;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1687,7 +1687,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219;
CURRENT_PROJECT_VERSION = 223;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -1702,7 +1702,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.7.4;
MARKETING_VERSION = 5.8;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1724,7 +1724,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219;
CURRENT_PROJECT_VERSION = 223;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -1739,7 +1739,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.7.4;
MARKETING_VERSION = 5.8;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1761,7 +1761,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219;
CURRENT_PROJECT_VERSION = 223;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1787,7 +1787,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.7.4;
MARKETING_VERSION = 5.8;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -1812,7 +1812,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 219;
CURRENT_PROJECT_VERSION = 223;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1838,7 +1838,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.7.4;
MARKETING_VERSION = 5.8;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
+113 -9
View File
@@ -48,7 +48,7 @@ public enum ChatCommand {
case apiDeleteChatItem(type: ChatType, id: Int64, itemId: Int64, mode: CIDeleteMode)
case apiDeleteMemberChatItem(groupId: Int64, groupMemberId: Int64, itemId: Int64)
case apiChatItemReaction(type: ChatType, id: Int64, itemId: Int64, add: Bool, reaction: MsgReaction)
case apiForwardChatItem(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemId: Int64)
case apiForwardChatItem(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemId: Int64, ttl: Int?)
case apiGetNtfToken
case apiRegisterToken(token: DeviceToken, notificationMode: NotificationsMode)
case apiVerifyToken(token: DeviceToken, nonce: String, code: String)
@@ -82,6 +82,8 @@ public enum ChatCommand {
case apiSetMemberSettings(groupId: Int64, groupMemberId: Int64, memberSettings: GroupMemberSettings)
case apiContactInfo(contactId: Int64)
case apiGroupMemberInfo(groupId: Int64, groupMemberId: Int64)
case apiContactQueueInfo(contactId: Int64)
case apiGroupMemberQueueInfo(groupId: Int64, groupMemberId: Int64)
case apiSwitchContact(contactId: Int64)
case apiSwitchGroupMember(groupId: Int64, groupMemberId: Int64)
case apiAbortSwitchContact(contactId: Int64)
@@ -123,8 +125,8 @@ public enum ChatCommand {
case apiGetNetworkStatuses
case apiChatRead(type: ChatType, id: Int64, itemRange: (Int64, Int64))
case apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool)
case receiveFile(fileId: Int64, encrypted: Bool?, inline: Bool?)
case setFileToReceive(fileId: Int64, encrypted: Bool?)
case receiveFile(fileId: Int64, userApprovedRelays: Bool, encrypted: Bool?, inline: Bool?)
case setFileToReceive(fileId: Int64, userApprovedRelays: Bool, encrypted: Bool?)
case cancelFile(fileId: Int64)
// remote desktop commands
case setLocalDeviceName(displayName: String)
@@ -192,7 +194,9 @@ public enum ChatCommand {
case let .apiDeleteChatItem(type, id, itemId, mode): return "/_delete item \(ref(type, id)) \(itemId) \(mode.rawValue)"
case let .apiDeleteMemberChatItem(groupId, groupMemberId, itemId): return "/_delete member item #\(groupId) \(groupMemberId) \(itemId)"
case let .apiChatItemReaction(type, id, itemId, add, reaction): return "/_reaction \(ref(type, id)) \(itemId) \(onOff(add)) \(encodeJSON(reaction))"
case let .apiForwardChatItem(toChatType, toChatId, fromChatType, fromChatId, itemId): return "/_forward \(ref(toChatType, toChatId)) \(ref(fromChatType, fromChatId)) \(itemId)"
case let .apiForwardChatItem(toChatType, toChatId, fromChatType, fromChatId, itemId, ttl):
let ttlStr = ttl != nil ? "\(ttl!)" : "default"
return "/_forward \(ref(toChatType, toChatId)) \(ref(fromChatType, fromChatId)) \(itemId) ttl=\(ttlStr)"
case .apiGetNtfToken: return "/_ntf get "
case let .apiRegisterToken(token, notificationMode): return "/_ntf register \(token.cmdString) \(notificationMode.rawValue)"
case let .apiVerifyToken(token, nonce, code): return "/_ntf verify \(token.cmdString) \(nonce) \(code)"
@@ -226,6 +230,8 @@ public enum ChatCommand {
case let .apiSetMemberSettings(groupId, groupMemberId, memberSettings): return "/_member settings #\(groupId) \(groupMemberId) \(encodeJSON(memberSettings))"
case let .apiContactInfo(contactId): return "/_info @\(contactId)"
case let .apiGroupMemberInfo(groupId, groupMemberId): return "/_info #\(groupId) \(groupMemberId)"
case let .apiContactQueueInfo(contactId): return "/_queue info @\(contactId)"
case let .apiGroupMemberQueueInfo(groupId, groupMemberId): return "/_queue info #\(groupId) \(groupMemberId)"
case let .apiSwitchContact(contactId): return "/_switch @\(contactId)"
case let .apiSwitchGroupMember(groupId, groupMemberId): return "/_switch #\(groupId) \(groupMemberId)"
case let .apiAbortSwitchContact(contactId): return "/_abort switch @\(contactId)"
@@ -280,8 +286,8 @@ public enum ChatCommand {
case .apiGetNetworkStatuses: return "/_network_statuses"
case let .apiChatRead(type, id, itemRange: (from, to)): return "/_read chat \(ref(type, id)) from=\(from) to=\(to)"
case let .apiChatUnread(type, id, unreadChat): return "/_unread chat \(ref(type, id)) \(onOff(unreadChat))"
case let .receiveFile(fileId, encrypt, inline): return "/freceive \(fileId)\(onOffParam("encrypt", encrypt))\(onOffParam("inline", inline))"
case let .setFileToReceive(fileId, encrypt): return "/_set_file_to_receive \(fileId)\(onOffParam("encrypt", encrypt))"
case let .receiveFile(fileId, userApprovedRelays, encrypt, inline): return "/freceive \(fileId)\(onOffParam("approved_relays", userApprovedRelays))\(onOffParam("encrypt", encrypt))\(onOffParam("inline", inline))"
case let .setFileToReceive(fileId, userApprovedRelays, encrypt): return "/_set_file_to_receive \(fileId)\(onOffParam("approved_relays", userApprovedRelays))\(onOffParam("encrypt", encrypt))"
case let .cancelFile(fileId): return "/fcancel \(fileId)"
case let .setLocalDeviceName(displayName): return "/set device name \(displayName)"
case let .connectRemoteCtrl(xrcpInv): return "/connect remote ctrl \(xrcpInv)"
@@ -373,6 +379,8 @@ public enum ChatCommand {
case .apiSetMemberSettings: return "apiSetMemberSettings"
case .apiContactInfo: return "apiContactInfo"
case .apiGroupMemberInfo: return "apiGroupMemberInfo"
case .apiContactQueueInfo: return "apiContactQueueInfo"
case .apiGroupMemberQueueInfo: return "apiGroupMemberQueueInfo"
case .apiSwitchContact: return "apiSwitchContact"
case .apiSwitchGroupMember: return "apiSwitchGroupMember"
case .apiAbortSwitchContact: return "apiAbortSwitchContact"
@@ -514,6 +522,7 @@ public enum ChatResponse: Decodable, Error {
case networkConfig(networkConfig: NetCfg)
case contactInfo(user: UserRef, contact: Contact, connectionStats_: ConnectionStats?, customUserProfile: Profile?)
case groupMemberInfo(user: UserRef, groupInfo: GroupInfo, member: GroupMember, connectionStats_: ConnectionStats?)
case queueInfo(user: UserRef, rcvMsgInfo: RcvMsgInfo?, queueInfo: QueueInfo)
case contactSwitchStarted(user: UserRef, contact: Contact, connectionStats: ConnectionStats)
case groupMemberSwitchStarted(user: UserRef, groupInfo: GroupInfo, member: GroupMember, connectionStats: ConnectionStats)
case contactSwitchAborted(user: UserRef, contact: Contact, connectionStats: ConnectionStats)
@@ -626,7 +635,7 @@ public enum ChatResponse: Decodable, Error {
case sndFileCompleteXFTP(user: UserRef, chatItem: AChatItem, fileTransferMeta: FileTransferMeta)
case sndStandaloneFileComplete(user: UserRef, fileTransferMeta: FileTransferMeta, rcvURIs: [String])
case sndFileCancelledXFTP(user: UserRef, chatItem_: AChatItem?, fileTransferMeta: FileTransferMeta)
case sndFileError(user: UserRef, chatItem_: AChatItem?, fileTransferMeta: FileTransferMeta)
case sndFileError(user: UserRef, chatItem_: AChatItem?, fileTransferMeta: FileTransferMeta, errorMessage: String)
// call events
case callInvitation(callInvitation: RcvCallInvitation)
case callOffer(user: UserRef, contact: Contact, callType: CallType, offer: WebRTCSession, sharedKey: String?, askConfirmation: Bool)
@@ -639,6 +648,7 @@ public enum ChatResponse: Decodable, Error {
case ntfMessages(user_: User?, connEntity_: ConnectionEntity?, msgTs: Date?, ntfMessages: [NtfMsgInfo])
case ntfMessage(user: UserRef, connEntity: ConnectionEntity, ntfMessage: NtfMsgInfo)
case contactConnectionDeleted(user: UserRef, connection: PendingContactConnection)
case contactDisabled(user: UserRef, contact: Contact)
// remote desktop responses/events
case remoteCtrlList(remoteCtrls: [RemoteCtrlInfo])
case remoteCtrlFound(remoteCtrl: RemoteCtrlInfo, ctrlAppInfo_: CtrlAppInfo?, appVersion: String, compatible: Bool)
@@ -675,6 +685,7 @@ public enum ChatResponse: Decodable, Error {
case .networkConfig: return "networkConfig"
case .contactInfo: return "contactInfo"
case .groupMemberInfo: return "groupMemberInfo"
case .queueInfo: return "queueInfo"
case .contactSwitchStarted: return "contactSwitchStarted"
case .groupMemberSwitchStarted: return "groupMemberSwitchStarted"
case .contactSwitchAborted: return "contactSwitchAborted"
@@ -796,6 +807,7 @@ public enum ChatResponse: Decodable, Error {
case .ntfMessages: return "ntfMessages"
case .ntfMessage: return "ntfMessage"
case .contactConnectionDeleted: return "contactConnectionDeleted"
case .contactDisabled: return "contactDisabled"
case .remoteCtrlList: return "remoteCtrlList"
case .remoteCtrlFound: return "remoteCtrlFound"
case .remoteCtrlConnecting: return "remoteCtrlConnecting"
@@ -832,6 +844,9 @@ public enum ChatResponse: Decodable, Error {
case let .networkConfig(networkConfig): return String(describing: networkConfig)
case let .contactInfo(u, contact, connectionStats_, customUserProfile): return withUser(u, "contact: \(String(describing: contact))\nconnectionStats_: \(String(describing: connectionStats_))\ncustomUserProfile: \(String(describing: customUserProfile))")
case let .groupMemberInfo(u, groupInfo, member, connectionStats_): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats_: \(String(describing: connectionStats_))")
case let .queueInfo(u, rcvMsgInfo, queueInfo):
let msgInfo = if let info = rcvMsgInfo { encodeJSON(rcvMsgInfo) } else { "none" }
return withUser(u, "rcvMsgInfo: \(msgInfo)\nqueueInfo: \(encodeJSON(queueInfo))")
case let .contactSwitchStarted(u, contact, connectionStats): return withUser(u, "contact: \(String(describing: contact))\nconnectionStats: \(String(describing: connectionStats))")
case let .groupMemberSwitchStarted(u, groupInfo, member, connectionStats): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats: \(String(describing: connectionStats))")
case let .contactSwitchAborted(u, contact, connectionStats): return withUser(u, "contact: \(String(describing: contact))\nconnectionStats: \(String(describing: connectionStats))")
@@ -941,7 +956,7 @@ public enum ChatResponse: Decodable, Error {
case let .sndFileCompleteXFTP(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .sndStandaloneFileComplete(u, _, rcvURIs): return withUser(u, String(rcvURIs.count))
case let .sndFileCancelledXFTP(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .sndFileError(u, chatItem, _): return withUser(u, String(describing: chatItem))
case let .sndFileError(u, chatItem, _, err): return withUser(u, "error: \(String(describing: err))\nchatItem: \(String(describing: chatItem))")
case let .callInvitation(inv): return String(describing: inv)
case let .callOffer(u, contact, callType, offer, sharedKey, askConfirmation): return withUser(u, "contact: \(contact.id)\ncallType: \(String(describing: callType))\nsharedKey: \(sharedKey ?? "")\naskConfirmation: \(askConfirmation)\noffer: \(String(describing: offer))")
case let .callAnswer(u, contact, answer): return withUser(u, "contact: \(contact.id)\nanswer: \(String(describing: answer))")
@@ -953,6 +968,7 @@ public enum ChatResponse: Decodable, Error {
case let .ntfMessages(u, connEntity, msgTs, ntfMessages): return withUser(u, "connEntity: \(String(describing: connEntity))\nmsgTs: \(String(describing: msgTs))\nntfMessages: \(String(describing: ntfMessages))")
case let .ntfMessage(u, connEntity, ntfMessage): return withUser(u, "connEntity: \(String(describing: connEntity))\nntfMessage: \(String(describing: ntfMessage))")
case let .contactConnectionDeleted(u, connection): return withUser(u, String(describing: connection))
case let .contactDisabled(u, contact): return withUser(u, String(describing: contact))
case let .remoteCtrlList(remoteCtrls): return String(describing: remoteCtrls)
case let .remoteCtrlFound(remoteCtrl, ctrlAppInfo_, appVersion, compatible): return "remoteCtrl:\n\(String(describing: remoteCtrl))\nctrlAppInfo_:\n\(String(describing: ctrlAppInfo_))\nappVersion: \(appVersion)\ncompatible: \(compatible)"
case let .remoteCtrlConnecting(remoteCtrl_, ctrlAppInfo, appVersion): return "remoteCtrl_:\n\(String(describing: remoteCtrl_))\nctrlAppInfo:\n\(String(describing: ctrlAppInfo))\nappVersion: \(appVersion)"
@@ -1242,9 +1258,12 @@ public struct ServerAddress: Decodable {
public struct NetCfg: Codable, Equatable {
public var socksProxy: String? = nil
var socksMode: SocksMode = .always
public var hostMode: HostMode = .publicHost
public var requiredHostMode = true
public var sessionMode: TransportSessionMode
public var smpProxyMode: SMPProxyMode = .never
public var smpProxyFallback: SMPProxyFallback = .allow
public var tcpConnectTimeout: Int // microseconds
public var tcpTimeout: Int // microseconds
public var tcpTimeoutPerKb: Int // microseconds
@@ -1289,6 +1308,49 @@ public enum HostMode: String, Codable {
case publicHost = "public"
}
public enum SocksMode: String, Codable {
case always = "always"
case onion = "onion"
}
public enum SMPProxyMode: String, Codable {
case always = "always"
case unknown = "unknown"
case unprotected = "unprotected"
case never = "never"
public var text: LocalizedStringKey {
switch self {
case .always: return "always"
case .unknown: return "unknown relays"
case .unprotected: return "unprotected"
case .never: return "never"
}
}
public var id: SMPProxyMode { self }
public static let values: [SMPProxyMode] = [.always, .unknown, .unprotected, .never]
}
public enum SMPProxyFallback: String, Codable {
case allow = "allow"
case allowProtected = "allowProtected"
case prohibit = "prohibit"
public var text: LocalizedStringKey {
switch self {
case .allow: return "yes"
case .allowProtected: return "when IP hidden"
case .prohibit: return "no"
}
}
public var id: SMPProxyFallback { self }
public static let values: [SMPProxyFallback] = [.allow, .allowProtected, .prohibit]
}
public enum OnionHosts: String, Identifiable {
case no
case prefer
@@ -1692,7 +1754,6 @@ public enum ChatErrorType: Decodable {
case groupMemberNotActive
case groupMemberUserRemoved
case groupMemberNotFound
case groupMemberIntroNotFound(contactName: ContactName)
case groupCantResendInvitation(groupInfo: GroupInfo, contactName: ContactName)
case groupInternal(message: String)
case fileNotFound(message: String)
@@ -1709,6 +1770,7 @@ public enum ChatErrorType: Decodable {
case fileImageType(filePath: String)
case fileImageSize(filePath: String)
case fileNotReceived(fileId: Int64)
case fileNotApproved(fileId: Int64, unknownServers: [String])
// case xFTPRcvFile
// case xFTPSndFile
case fallbackToSMPProhibited(fileId: Int64)
@@ -1987,6 +2049,7 @@ public struct MigrationFileLinkData: Codable {
public struct AppSettings: Codable, Equatable {
public var networkConfig: NetCfg? = nil
public var privacyEncryptLocalFiles: Bool? = nil
public var privacyAskToApproveRelays: Bool? = nil
public var privacyAcceptImages: Bool? = nil
public var privacyLinkPreviews: Bool? = nil
public var privacyShowChatPreviews: Bool? = nil
@@ -2010,6 +2073,7 @@ public struct AppSettings: Codable, Equatable {
let def = AppSettings.defaults
if networkConfig != def.networkConfig { empty.networkConfig = networkConfig }
if privacyEncryptLocalFiles != def.privacyEncryptLocalFiles { empty.privacyEncryptLocalFiles = privacyEncryptLocalFiles }
if privacyAskToApproveRelays != def.privacyAskToApproveRelays { empty.privacyAskToApproveRelays = privacyAskToApproveRelays }
if privacyAcceptImages != def.privacyAcceptImages { empty.privacyAcceptImages = privacyAcceptImages }
if privacyLinkPreviews != def.privacyLinkPreviews { empty.privacyLinkPreviews = privacyLinkPreviews }
if privacyShowChatPreviews != def.privacyShowChatPreviews { empty.privacyShowChatPreviews = privacyShowChatPreviews }
@@ -2034,6 +2098,7 @@ public struct AppSettings: Codable, Equatable {
AppSettings (
networkConfig: NetCfg.defaults,
privacyEncryptLocalFiles: true,
privacyAskToApproveRelays: true,
privacyAcceptImages: true,
privacyLinkPreviews: true,
privacyShowChatPreviews: true,
@@ -2116,3 +2181,42 @@ public enum UserNetworkType: String, Codable {
}
}
}
public struct RcvMsgInfo: Codable {
var msgId: Int64
var msgDeliveryId: Int64
var msgDeliveryStatus: String
var agentMsgId: Int64
var agentMsgMeta: String
}
public struct QueueInfo: Codable {
var qiSnd: Bool
var qiNtf: Bool
var qiSub: QSub?
var qiSize: Int
var qiMsg: MsgInfo?
}
public struct QSub: Codable {
var qSubThread: QSubThread
var qDelivered: String?
}
public enum QSubThread: String, Codable {
case noSub
case subPending
case subThread
case prohibitSub
}
public struct MsgInfo: Codable {
var msgId: String
var msgTs: Date
var msgType: MsgType
}
public enum MsgType: String, Codable {
case message
case quota
}
+26
View File
@@ -23,9 +23,12 @@ public let GROUP_DEFAULT_NTF_ENABLE_PERIODIC = "ntfEnablePeriodic" // no longer
let GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES = "privacyAcceptImages"
public let GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE = "privacyTransferImagesInline" // no longer used
public let GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES = "privacyEncryptLocalFiles"
public let GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS = "privacyAskToApproveRelays"
let GROUP_DEFAULT_NTF_BADGE_COUNT = "ntgBadgeCount"
let GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS = "networkUseOnionHosts"
let GROUP_DEFAULT_NETWORK_SESSION_MODE = "networkSessionMode"
let GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE = "networkSMPProxyMode"
let GROUP_DEFAULT_NETWORK_SMP_PROXY_FALLBACK = "networkSMPProxyFallback"
let GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT = "networkTCPConnectTimeout"
let GROUP_DEFAULT_NETWORK_TCP_TIMEOUT = "networkTCPTimeout"
let GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB = "networkTCPTimeoutPerKb"
@@ -53,6 +56,8 @@ public func registerGroupDefaults() {
GROUP_DEFAULT_NTF_ENABLE_PERIODIC: false,
GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS: OnionHosts.no.rawValue,
GROUP_DEFAULT_NETWORK_SESSION_MODE: TransportSessionMode.user.rawValue,
GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE: SMPProxyMode.never.rawValue,
GROUP_DEFAULT_NETWORK_SMP_PROXY_FALLBACK: SMPProxyFallback.allow.rawValue,
GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT: NetCfg.defaults.tcpConnectTimeout,
GROUP_DEFAULT_NETWORK_TCP_TIMEOUT: NetCfg.defaults.tcpTimeout,
GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB: NetCfg.defaults.tcpTimeoutPerKb,
@@ -69,6 +74,7 @@ public func registerGroupDefaults() {
GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES: true,
GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE: false,
GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES: true,
GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS: true,
GROUP_DEFAULT_CONFIRM_DB_UPGRADES: false,
GROUP_DEFAULT_CALL_KIT_ENABLED: true,
GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED: false,
@@ -177,6 +183,8 @@ public let privacyAcceptImagesGroupDefault = BoolDefault(defaults: groupDefaults
public let privacyEncryptLocalFilesGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES)
public let privacyAskToApproveRelaysGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS)
public let ntfBadgeCountGroupDefault = IntDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_NTF_BADGE_COUNT)
public let networkUseOnionHostsGroupDefault = EnumDefault<OnionHosts>(
@@ -191,6 +199,18 @@ public let networkSessionModeGroupDefault = EnumDefault<TransportSessionMode>(
withDefault: .user
)
public let networkSMPProxyModeGroupDefault = EnumDefault<SMPProxyMode>(
defaults: groupDefaults,
forKey: GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE,
withDefault: .never
)
public let networkSMPProxyFallbackGroupDefault = EnumDefault<SMPProxyFallback>(
defaults: groupDefaults,
forKey: GROUP_DEFAULT_NETWORK_SMP_PROXY_FALLBACK,
withDefault: .allow
)
public let storeDBPassphraseGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_STORE_DB_PASSPHRASE)
public let initialRandomDBPassphraseGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_INITIAL_RANDOM_DB_PASSPHRASE)
@@ -275,6 +295,8 @@ public func getNetCfg() -> NetCfg {
let onionHosts = networkUseOnionHostsGroupDefault.get()
let (hostMode, requiredHostMode) = onionHosts.hostMode
let sessionMode = networkSessionModeGroupDefault.get()
let smpProxyMode = networkSMPProxyModeGroupDefault.get()
let smpProxyFallback = networkSMPProxyFallbackGroupDefault.get()
let tcpConnectTimeout = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT)
let tcpTimeout = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT)
let tcpTimeoutPerKb = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB)
@@ -295,6 +317,8 @@ public func getNetCfg() -> NetCfg {
hostMode: hostMode,
requiredHostMode: requiredHostMode,
sessionMode: sessionMode,
smpProxyMode: smpProxyMode,
smpProxyFallback: smpProxyFallback,
tcpConnectTimeout: tcpConnectTimeout,
tcpTimeout: tcpTimeout,
tcpTimeoutPerKb: tcpTimeoutPerKb,
@@ -309,6 +333,8 @@ public func getNetCfg() -> NetCfg {
public func setNetCfg(_ cfg: NetCfg) {
networkUseOnionHostsGroupDefault.set(OnionHosts(netCfg: cfg))
networkSessionModeGroupDefault.set(cfg.sessionMode)
networkSMPProxyModeGroupDefault.set(cfg.smpProxyMode)
networkSMPProxyFallbackGroupDefault.set(cfg.smpProxyFallback)
groupDefaults.set(cfg.tcpConnectTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT)
groupDefaults.set(cfg.tcpTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT)
groupDefaults.set(cfg.tcpTimeoutPerKb, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB)
+66 -6
View File
@@ -1510,7 +1510,12 @@ public struct Contact: Identifiable, Decodable, NamedChat {
public var ready: Bool { get { activeConn?.connStatus == .ready } }
public var active: Bool { get { contactStatus == .active } }
public var sendMsgEnabled: Bool { get {
(ready && active && !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false))
(
ready
&& active
&& !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false)
&& !(activeConn?.connDisabled ?? true)
)
|| nextSendGrpInv
} }
public var nextSendGrpInv: Bool { get { contactGroupMemberId != nil && !contactGrpInvSent } }
@@ -1601,15 +1606,20 @@ public struct Connection: Decodable {
public var pqEncryption: Bool
public var pqSndEnabled: Bool?
public var pqRcvEnabled: Bool?
public var authErrCounter: Int
public var connectionStats: ConnectionStats? = nil
private enum CodingKeys: String, CodingKey {
case connId, agentConnId, peerChatVRange, connStatus, connLevel, viaGroupLink, customUserProfileId, connectionCode, pqSupport, pqEncryption, pqSndEnabled, pqRcvEnabled
case connId, agentConnId, peerChatVRange, connStatus, connLevel, viaGroupLink, customUserProfileId, connectionCode, pqSupport, pqEncryption, pqSndEnabled, pqRcvEnabled, authErrCounter
}
public var id: ChatId { get { ":\(connId)" } }
public var connDisabled: Bool {
authErrCounter >= 10 // authErrDisableCount in core
}
public var connPQEnabled: Bool {
pqSndEnabled == true && pqRcvEnabled == true
}
@@ -1622,7 +1632,8 @@ public struct Connection: Decodable {
connLevel: 0,
viaGroupLink: false,
pqSupport: false,
pqEncryption: false
pqEncryption: false,
authErrCounter: 0
)
}
@@ -2621,6 +2632,7 @@ public struct CIMeta: Decodable {
public var itemTs: Date
var itemText: String
public var itemStatus: CIStatus
public var sentViaProxy: Bool?
public var createdAt: Date
public var updatedAt: Date
public var itemForwarded: CIForwardedFrom?
@@ -2710,7 +2722,8 @@ public enum CIStatus: Decodable {
case sndSent(sndProgress: SndCIStatusProgress)
case sndRcvd(msgRcptStatus: MsgReceiptStatus, sndProgress: SndCIStatusProgress)
case sndErrorAuth
case sndError(agentError: String)
case sndError(agentError: SndError)
case sndWarning(agentError: SndError)
case rcvNew
case rcvRead
case invalid(text: String)
@@ -2722,6 +2735,7 @@ public enum CIStatus: Decodable {
case .sndRcvd: return "sndRcvd"
case .sndErrorAuth: return "sndErrorAuth"
case .sndError: return "sndError"
case .sndWarning: return "sndWarning"
case .rcvNew: return "rcvNew"
case .rcvRead: return "rcvRead"
case .invalid: return "invalid"
@@ -2738,7 +2752,8 @@ public enum CIStatus: Decodable {
case .badMsgHash: return ("checkmark", .red)
}
case .sndErrorAuth: return ("multiply", .red)
case .sndError: return ("exclamationmark.triangle.fill", .yellow)
case .sndError: return ("multiply", .red)
case .sndWarning: return ("exclamationmark.triangle.fill", .orange)
case .rcvNew: return ("circlebadge.fill", Color.accentColor)
case .rcvRead: return nil
case .invalid: return ("questionmark", metaColor)
@@ -2756,7 +2771,11 @@ public enum CIStatus: Decodable {
)
case let .sndError(agentError): return (
NSLocalizedString("Message delivery error", comment: "item status text"),
String.localizedStringWithFormat(NSLocalizedString("Unexpected error: %@", comment: "item status description"), agentError)
agentError.errorInfo
)
case let .sndWarning(agentError): return (
NSLocalizedString("Message delivery warning", comment: "item status text"),
agentError.errorInfo
)
case .rcvNew: return nil
case .rcvRead: return nil
@@ -2768,6 +2787,42 @@ public enum CIStatus: Decodable {
}
}
public enum SndError: Decodable {
case auth
case quota
case expired
case relay(srvError: SrvError)
case proxy(proxyServer: String, srvError: SrvError)
case proxyRelay(proxyServer: String, srvError: SrvError)
case other(sndError: String)
public var errorInfo: String {
switch self {
case .auth: NSLocalizedString("Wrong key or unknown connection - most likely this connection is deleted.", comment: "snd error text")
case .quota: NSLocalizedString("Capacity exceeded - recipient did not receive previously sent messages.", comment: "snd error text")
case .expired: NSLocalizedString("Network issues - message expired after many attempts to send it.", comment: "snd error text")
case let .relay(srvError): String.localizedStringWithFormat(NSLocalizedString("Destination server error: %@", comment: "snd error text"), srvError.errorInfo)
case let .proxy(proxyServer, srvError): String.localizedStringWithFormat(NSLocalizedString("Forwarding server: %@\nError: %@", comment: "snd error text"), proxyServer, srvError.errorInfo)
case let .proxyRelay(proxyServer, srvError): String.localizedStringWithFormat(NSLocalizedString("Forwarding server: %@\nDestination server error: %@", comment: "snd error text"), proxyServer, srvError.errorInfo)
case let .other(sndError): String.localizedStringWithFormat(NSLocalizedString("Error: %@", comment: "snd error text"), sndError)
}
}
}
public enum SrvError: Decodable {
case host
case version
case other(srvError: String)
public var errorInfo: String {
switch self {
case .host: NSLocalizedString("Server address is incompatible with network settings.", comment: "srv error text.")
case .version: NSLocalizedString("Server version is incompatible with network settings.", comment: "srv error text")
case let .other(srvError): srvError
}
}
}
public enum MsgReceiptStatus: String, Decodable {
case ok
case badMsgHash
@@ -3119,6 +3174,7 @@ public struct CIFile: Decodable {
case .rcvInvitation: return false
case .rcvAccepted: return false
case .rcvTransfer: return false
case .rcvAborted: return false
case .rcvCancelled: return false
case .rcvComplete: return true
case .rcvError: return false
@@ -3143,6 +3199,7 @@ public struct CIFile: Decodable {
case .rcvInvitation: return nil
case .rcvAccepted: return rcvCancelAction
case .rcvTransfer: return rcvCancelAction
case .rcvAborted: return nil
case .rcvCancelled: return nil
case .rcvComplete: return nil
case .rcvError: return nil
@@ -3257,6 +3314,7 @@ public enum CIFileStatus: Decodable, Equatable {
case rcvInvitation
case rcvAccepted
case rcvTransfer(rcvProgress: Int64, rcvTotal: Int64)
case rcvAborted
case rcvComplete
case rcvCancelled
case rcvError
@@ -3272,6 +3330,7 @@ public enum CIFileStatus: Decodable, Equatable {
case .rcvInvitation: return "rcvInvitation"
case .rcvAccepted: return "rcvAccepted"
case let .rcvTransfer(rcvProgress, rcvTotal): return "rcvTransfer \(rcvProgress) \(rcvTotal)"
case .rcvAborted: return "rcvAborted"
case .rcvComplete: return "rcvComplete"
case .rcvCancelled: return "rcvCancelled"
case .rcvError: return "rcvError"
@@ -3886,4 +3945,5 @@ public struct ChatItemVersion: Decodable {
public struct MemberDeliveryStatus: Decodable {
public var groupMemberId: Int64
public var memberDeliveryStatus: CIStatus
public var sentViaProxy: Bool?
}
+1 -10
View File
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Грешка: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Грешка: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Най-вероятно тази връзка е изтрита.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Най-вероятно този контакт е изтрил връзката с вас.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Множество профили за чат";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Получаващият адрес ще бъде променен към друг сървър. Промяната на адреса ще завърши, след като подателят е онлайн.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Паралелност на получаване";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Получаващият се файл ще бъде спрян.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "отблокиран %@";
/* item status description */
"Unexpected error: %@" = "Неочаквана грешка: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Неочаквано състояние на миграция";
+1 -7
View File
@@ -1461,7 +1461,7 @@
/* No comment provided by engineer. */
"Error: " = "Chyba: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Chyba: %@";
/* No comment provided by engineer. */
@@ -2082,9 +2082,6 @@
/* item status description */
"Most likely this connection is deleted." = "Pravděpodobně je toto spojení smazáno.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Tento kontakt s největší pravděpodobností smazal spojení s vámi.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Více chatovacích profilů";
@@ -3179,9 +3176,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "Nelze nahrát hlasovou zprávu";
/* item status description */
"Unexpected error: %@" = "Neočekávaná chyba: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Neočekávaný stav přenášení";
+118 -16
View File
@@ -438,7 +438,7 @@
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Alle Ihre Kontakte bleiben verbunden. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Server hochgeladen.";
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Relais hochgeladen.";
/* No comment provided by engineer. */
"Allow" = "Erlauben";
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Erlauben Sie verschwindende Nachrichten nur dann, wenn es Ihr Kontakt ebenfalls erlaubt.";
/* No comment provided by engineer. */
"Allow downgrade" = "Herabstufung erlauben";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Erlauben Sie das unwiederbringliche Löschen von Nachrichten nur dann, wenn es Ihnen Ihr Kontakt ebenfalls erlaubt. (24 Stunden)";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "Immer";
/* No comment provided by engineer. */
"Always use private routing." = "Sie nutzen immer privates Routing.";
/* No comment provided by engineer. */
"Always use relay" = "Über ein Relais verbinden";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Datei kann nicht empfangen werden";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Kapazität überschritten - der Empfänger hat die zuvor gesendeten Nachrichten nicht empfangen.";
/* No comment provided by engineer. */
"Cellular" = "Zellulär";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Datenbank-Aktualisierungen bestätigen";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Dateien von unbekannten Servern bestätigen.";
/* No comment provided by engineer. */
"Confirm network settings" = "Bestätigen Sie die Netzwerkeinstellungen";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Desktop-Geräte";
/* snd error text */
"Destination server error: %@" = "Zielserver-Fehler: %@";
/* No comment provided by engineer. */
"Develop" = "Entwicklung";
@@ -1399,7 +1414,13 @@
"Do not send history to new members." = "Den Nachrichtenverlauf nicht an neue Mitglieder senden.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "Nutzen Sie SimpleX nicht für Notrufe.";
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Nachrichten werden nicht direkt versendet, selbst wenn Ihr oder der Zielserver kein privates Routing unterstützt.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "Sie nutzen KEIN privates Routing.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "SimpleX NICHT für Notrufe nutzen.";
/* No comment provided by engineer. */
"Don't create address" = "Keine Adresse erstellt";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Fehler: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Fehler: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Datei: %@";
/* No comment provided by engineer. */
"Files" = "Dateien";
/* No comment provided by engineer. */
"Files & media" = "Dateien & Medien";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Weitergeleitet aus";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Weiterleitungsserver: %1$@\nZielserver Fehler: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Weiterleitungsserver: %1$@\nFehler: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Gefundener Desktop";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Empfangsbestätigungen für Nachrichten!";
/* item status text */
"Message delivery warning" = "Warnung bei der Nachrichtenzustellung";
/* No comment provided by engineer. */
"Message draft" = "Nachrichtenentwurf";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "Nachricht empfangen";
/* No comment provided by engineer. */
"Message routing fallback" = "Fallback für das Nachrichten-Routing";
/* No comment provided by engineer. */
"Message routing mode" = "Modus für das Nachrichten-Routing";
/* No comment provided by engineer. */
"Message source remains private." = "Die Nachrichtenquelle bleibt privat.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Wahrscheinlich ist diese Verbindung gelöscht worden.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Dieser Kontakt hat sehr wahrscheinlich die Verbindung mit Ihnen gelöscht.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Mehrere Chat-Profile";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Netzwerkverbindung";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Netzwerk-Fehler - die Nachricht ist nach vielen Sende-Versuchen abgelaufen.";
/* No comment provided by engineer. */
"Network management" = "Netzwerk-Verwaltung";
@@ -2730,10 +2769,10 @@
"One-time invitation link" = "Einmal-Einladungslink";
/* No comment provided by engineer. */
"Onion hosts will be required for connection. Requires enabling VPN." = "Für die Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.";
"Onion hosts will be required for connection. Requires enabling VPN." = "Für diese Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.";
/* No comment provided by engineer. */
"Onion hosts will be used when available. Requires enabling VPN." = "Onion-Hosts werden verwendet, sobald sie verfügbar sind. Dies erfordert die Aktivierung eines VPNs.";
"Onion hosts will be used when available. Requires enabling VPN." = "Wenn Onion-Hosts verfügbar sind, werden sie verwendet. Dies erfordert die Aktivierung eines VPNs.";
/* No comment provided by engineer. */
"Onion hosts will not be used." = "Onion-Hosts werden nicht verwendet.";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Neutrale Dateinamen";
/* No comment provided by engineer. */
"Private message routing" = "Privates Nachrichten-Routing";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Privates Nachrichten-Routing 🚀";
/* name of notes to self */
"Private notes" = "Private Notizen";
/* No comment provided by engineer. */
"Private routing" = "Privates Routing";
/* No comment provided by engineer. */
"Profile and server connections" = "Profil und Serververbindungen";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "App-Bildschirm schützen";
/* No comment provided by engineer. */
"Protect IP address" = "IP-Adresse schützen";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Ihre Chat-Profile mit einem Passwort schützen!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Schützen Sie Ihre IP-Adresse vor den Nachrichten-Relais , die Ihre Kontakte ausgewählt haben.\nAktivieren Sie es in den *Netzwerk & Server* Einstellungen.";
/* No comment provided by engineer. */
"Protocol timeout" = "Protokollzeitüberschreitung";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Die Empfängeradresse wird auf einen anderen Server geändert. Der Adresswechsel wird abgeschlossen, wenn der Absender wieder online ist.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Gleichzeitiger Empfang";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Der Empfang der Datei wird beendet.";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Chat starten";
/* No comment provided by engineer. */
"Safely receive files" = "Dateien sicher empfangen";
/* No comment provided by engineer. */
"Safer groups" = "Sicherere Gruppen";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Live Nachricht senden";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Nachrichten werden direkt versendet, wenn die IP-Adresse geschützt ist, und Ihr oder der Zielserver kein privates Routing unterstützt.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Nachrichten werden direkt versendet, wenn Ihr oder der Zielserver kein privates Routing unterstützt.";
/* No comment provided by engineer. */
"Send notifications" = "Benachrichtigungen senden";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Gesendete Nachrichten werden nach der eingestellten Zeit gelöscht.";
/* srv error text. */
"Server address is incompatible with network settings." = "Die Server-Adresse ist nicht mit den Netzwerk-Einstellungen kompatibel.";
/* server test error */
"Server requires authorization to create queues, check password" = "Um Warteschlangen zu erzeugen benötigt der Server eine Authentifizierung. Bitte überprüfen Sie das Passwort";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Server Test ist fehlgeschlagen!";
/* srv error text */
"Server version is incompatible with network settings." = "Die Server-Version ist nicht mit den Netzwerk-Einstellungen kompatibel.";
/* No comment provided by engineer. */
"Servers" = "Server";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Mit Kontakten teilen";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Bei Nachrichten, die über privates Routing versendet wurden, → anzeigen.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Anrufliste anzeigen";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Letzte Nachrichten anzeigen";
/* No comment provided by engineer. */
"Show message status" = "Nachrichtenstatus anzeigen";
/* No comment provided by engineer. */
"Show preview" = "Vorschau anzeigen";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Wenn sie Nachrichten oder Kontaktanfragen empfangen, kann Sie die App benachrichtigen - Um dies zu aktivieren, öffnen Sie bitte die Einstellungen.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "Die App wird eine Bestätigung bei Downloads von unbekannten Datei-Servern anfordern (außer bei .onion).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "Die Änderung des Datenbank-Passworts konnte nicht abgeschlossen werden.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Um Ihre Informationen zu schützen, schalten Sie die SimpleX-Sperre ein.\nSie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funktion aktiviert wird.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Zum Schutz Ihrer IP-Adresse, wird für die Nachrichten-Auslieferung privates Routing über Ihre konfigurierten SMP-Server genutzt.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Bitte erlauben Sie die Nutzung des Mikrofons, um Sprachnachrichten aufnehmen zu können.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ wurde freigegeben";
/* item status description */
"Unexpected error: %@" = "Unerwarteter Fehler: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Unerwarteter Migrationsstatus";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Unbekannter Fehler";
/* No comment provided by engineer. */
"unknown relays" = "Unbekannte Relais";
/* No comment provided by engineer. */
"Unknown servers!" = "Unbekannte Server!";
/* No comment provided by engineer. */
"unknown status" = "unbekannter Gruppenmitglieds-Status";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Stummschaltung aufheben";
/* No comment provided by engineer. */
"unprotected" = "Ungeschützt";
/* No comment provided by engineer. */
"Unread" = "Ungelesen";
@@ -4029,7 +4113,7 @@
"Use chat" = "Verwenden Sie Chat";
/* No comment provided by engineer. */
"Use current profile" = "Das aktuelle Profil nutzen";
"Use current profile" = "Aktuelles Profil nutzen";
/* No comment provided by engineer. */
"Use for new connections" = "Für neue Verbindungen nutzen";
@@ -4041,11 +4125,17 @@
"Use iOS call interface" = "iOS Anrufschnittstelle nutzen";
/* No comment provided by engineer. */
"Use new incognito profile" = "Ein neues Inkognito-Profil nutzen";
"Use new incognito profile" = "Neues Inkognito-Profil nutzen";
/* No comment provided by engineer. */
"Use only local notifications?" = "Nur lokale Benachrichtigungen nutzen?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Sie nutzen privates Routing mit unbekannten Servern, wenn Ihre IP-Adresse nicht geschützt ist.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Sie nutzen privates Routing mit unbekannten Servern.";
/* No comment provided by engineer. */
"Use server" = "Server nutzen";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Bei der Verbindung über Audio- und Video-Anrufe.";
/* No comment provided by engineer. */
"when IP hidden" = "Wenn die IP-Adresse versteckt ist";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Wenn Personen eine Verbindung anfordern, können Sie diese annehmen oder ablehnen.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Mit reduziertem Akkuverbrauch.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für Datei-Server sichtbar sein.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für diese XFTP-Relais sichtbar sein: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Falsches Datenbank-Passwort";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Falscher Schlüssel oder unbekannte Verbindung - höchstwahrscheinlich ist diese Verbindung gelöscht worden.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Falsches Passwort!";
+121 -19
View File
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Se permiten los mensajes temporales pero sólo si tu contacto también los permite para tí.";
/* No comment provided by engineer. */
"Allow downgrade" = "Permitir versión anterior";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también la permite para tí. (24 horas)";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "siempre";
/* No comment provided by engineer. */
"Always use private routing." = "Usar siempre enrutamiento privado.";
/* No comment provided by engineer. */
"Always use relay" = "Usar siempre retransmisor";
@@ -675,7 +681,7 @@
"Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" = "Búlgaro, Finlandés, Tailandés y Ucraniano - gracias a los usuarios y [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!";
/* No comment provided by engineer. */
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Mediante perfil (por defecto) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Mediante perfil (predeterminado) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
/* No comment provided by engineer. */
"Call already ended!" = "¡La llamada ha terminado!";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "No se puede recibir el archivo";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Capacidad excedida - el destinatario no ha recibido los mensajes previos.";
/* No comment provided by engineer. */
"Cellular" = "Móvil";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Confirmar actualizaciones de la bases de datos";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Confirma archivos de servidores desconocidos.";
/* No comment provided by engineer. */
"Confirm network settings" = "Confirmar configuración de red";
@@ -1162,13 +1174,13 @@
"Decryption error" = "Error descifrado";
/* pref value */
"default (%@)" = "por defecto (%@)";
"default (%@)" = "predeterminado (%@)";
/* No comment provided by engineer. */
"default (no)" = "por defecto (no)";
"default (no)" = "predeterminado (no)";
/* No comment provided by engineer. */
"default (yes)" = "por defecto (sí)";
"default (yes)" = "predeterminado (sí)";
/* chat item action */
"Delete" = "Eliminar";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Ordenadores";
/* snd error text */
"Destination server error: %@" = "Error del servidor de destino: %@";
/* No comment provided by engineer. */
"Develop" = "Desarrollo";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "No enviar historial a miembros nuevos.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "NO enviar mensajes directamente incluso si tu servidor o el de destino no soportan enrutamiento privado.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "NO usar enrutamiento privado.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "NO uses SimpleX para llamadas de emergencia.";
@@ -1492,7 +1513,7 @@
"enabled" = "activado";
/* No comment provided by engineer. */
"Enabled for" = "Activar para";
"Enabled for" = "Activado para";
/* enabled status */
"enabled for contact" = "activado para el contacto";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Error: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Error: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Archivo: %@";
/* No comment provided by engineer. */
"Files" = "Archivos";
/* No comment provided by engineer. */
"Files & media" = "Archivos y multimedia";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Reenviado por";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Servidor de reenvío: %1$@\nError del servidor de destino: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Servidor de reenvío: %1$@\nError: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Ordenador encontrado";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "¡Confirmación de entrega de mensajes!";
/* item status text */
"Message delivery warning" = "Aviso de entrega de mensaje";
/* No comment provided by engineer. */
"Message draft" = "Borrador de mensaje";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "mensaje recibido";
/* No comment provided by engineer. */
"Message routing fallback" = "Enrutamiento de mensajes alternativo";
/* No comment provided by engineer. */
"Message routing mode" = "Modo de enrutamiento de mensajes";
/* No comment provided by engineer. */
"Message source remains private." = "El autor del mensaje se mantiene privado.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Probablemente la conexión ha sido eliminada.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Lo más probable es que este contacto haya eliminado la conexión contigo.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Múltiples perfiles";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Conexión de red";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Problema en la red - el mensaje ha expirado tras muchos intentos de envío.";
/* No comment provided by engineer. */
"Network management" = "Gestión de la red";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Nombres de archivos privados";
/* No comment provided by engineer. */
"Private message routing" = "Enrutamiento privado de mensajes";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Enrutamiento privado de mensajes 🚀";
/* name of notes to self */
"Private notes" = "Notas privadas";
/* No comment provided by engineer. */
"Private routing" = "Enrutamiento privado";
/* No comment provided by engineer. */
"Profile and server connections" = "Datos del perfil y conexiones";
@@ -2961,7 +3009,7 @@
"Profile image" = "Imagen del perfil";
/* No comment provided by engineer. */
"Profile images" = "Imágenes del perfil";
"Profile images" = "Forma de los perfiles";
/* No comment provided by engineer. */
"Profile name" = "Nombre del perfil";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "Proteger la pantalla de la aplicación";
/* No comment provided by engineer. */
"Protect IP address" = "Proteger dirección IP";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "¡Protege tus perfiles con contraseña!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Protege tu dirección IP de los servidores de retransmisión elegidos por tus contactos.\nActívalo en ajustes de *Servidores y Redes*.";
/* No comment provided by engineer. */
"Protocol timeout" = "Tiempo de espera del protocolo";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "La dirección de recepción pasará a otro servidor. El cambio se completará cuando el remitente esté en línea.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Concurrencia en la recepción";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Se detendrá la recepción del archivo.";
@@ -3123,7 +3174,7 @@
"rejected call" = "llamada rechazada";
/* No comment provided by engineer. */
"Relay server is only used if necessary. Another party can observe your IP address." = "El retransmisor sólo se usa en caso de necesidad. Un tercero podría ver tu IP.";
"Relay server is only used if necessary. Another party can observe your IP address." = "El servidor de retransmisión sólo se usa en caso de necesidad. Un tercero podría ver tu IP.";
/* No comment provided by engineer. */
"Relay server protects your IP address, but it can observe the duration of the call." = "El servidor de retransmisión protege tu IP pero puede ver la duración de la llamada.";
@@ -3192,7 +3243,7 @@
"Reset colors" = "Restablecer colores";
/* No comment provided by engineer. */
"Reset to defaults" = "Restablecer valores por defecto";
"Reset to defaults" = "Restablecer valores predetarminados";
/* No comment provided by engineer. */
"Restart the app to create a new chat profile" = "Reinicia la aplicación para crear un perfil nuevo";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Ejecutar chat";
/* No comment provided by engineer. */
"Safely receive files" = "Recibe archivos de forma segura";
/* No comment provided by engineer. */
"Safer groups" = "Grupos más seguros";
@@ -3381,7 +3435,7 @@
"Send direct message" = "Enviar mensaje directo";
/* No comment provided by engineer. */
"Send direct message to connect" = "Enviar mensaje directo para conectar";
"Send direct message to connect" = "Envia un mensaje para conectar";
/* No comment provided by engineer. */
"Send disappearing message" = "Enviar mensaje temporal";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Mensaje en vivo";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Enviar mensajes directamente cuando tu dirección IP está protegida y tu servidor o el de destino no admitan enrutamiento privado.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Enviar mensajes directamente cuando tu servidor o el de destino no admitan enrutamiento privado.";
/* No comment provided by engineer. */
"Send notifications" = "Enviar notificaciones";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Los mensajes enviados se eliminarán una vez transcurrido el tiempo establecido.";
/* srv error text. */
"Server address is incompatible with network settings." = "La dirección del servidor es incompatible con la configuración de la red.";
/* server test error */
"Server requires authorization to create queues, check password" = "El servidor requiere autorización para crear colas, comprueba la contraseña";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "¡Error en prueba del servidor!";
/* srv error text */
"Server version is incompatible with network settings." = "La versión del servidor es incompatible con la configuración de red.";
/* No comment provided by engineer. */
"Servers" = "Servidores";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Compartir con contactos";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Mostrar → en mensajes con enrutamiento privado.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Mostrar llamadas en el historial del teléfono";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Mostrar último mensaje";
/* No comment provided by engineer. */
"Show message status" = "Estado del mensaje";
/* No comment provided by engineer. */
"Show preview" = "Mostrar vista previa";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "La aplicación puede notificarte cuando recibas mensajes o solicitudes de contacto: por favor, abre la configuración para activarlo.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "La aplicación pedirá que confirmes las descargas desde servidores de archivos desconocidos (excepto .onion).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "El intento de cambiar la contraseña de la base de datos no se ha completado.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Para proteger tu información, activa el Bloqueo SimpleX.\nSe te pedirá que completes la autenticación antes de activar esta función.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Para proteger tu dirección IP, el enrutamiento privado usa tus servidores SMP para enviar mensajes.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Para grabar el mensaje de voz concede permiso para usar el micrófono.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "ha desbloqueado a %@";
/* item status description */
"Unexpected error: %@" = "Error inesperado: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Estado de migración inesperado";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Error desconocido";
/* No comment provided by engineer. */
"unknown relays" = "servidor de retransmisión desconocido";
/* No comment provided by engineer. */
"Unknown servers!" = "¡Servidores desconocidos!";
/* No comment provided by engineer. */
"unknown status" = "estado desconocido";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Activar audio";
/* No comment provided by engineer. */
"unprotected" = "desprotegido";
/* No comment provided by engineer. */
"Unread" = "No leído";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "¿Usar sólo notificaciones locales?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Usar enrutamiento privado con servidores desconocidos cuando la dirección IP no está protegida.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Usar enrutamiento privado con servidores desconocidos.";
/* No comment provided by engineer. */
"Use server" = "Usar servidor";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Al iniciar llamadas de audio y vídeo.";
/* No comment provided by engineer. */
"when IP hidden" = "con IP oculta";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Cuando alguien solicite conectarse podrás aceptar o rechazar la solicitud.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Con uso reducido de batería.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Sin Tor o VPN, tu dirección IP será visible para los servidores de archivos.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Sin Tor o VPN, tu dirección IP será visible para estos servidores XFTP: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Contraseña de base de datos incorrecta";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Clave incorrecta o conexión desconocida - probablemente esta conexión fue eliminada.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "¡Contraseña incorrecta!";
+1 -7
View File
@@ -1434,7 +1434,7 @@
/* No comment provided by engineer. */
"Error: " = "Virhe: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Virhe: %@";
/* No comment provided by engineer. */
@@ -2058,9 +2058,6 @@
/* item status description */
"Most likely this connection is deleted." = "Todennäköisesti tämä yhteys on poistettu.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Todennäköisesti tämä kontakti on poistanut yhteyden sinuun.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Useita keskusteluprofiileja";
@@ -3137,9 +3134,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "Ääniviestiä ei voi tallentaa";
/* item status description */
"Unexpected error: %@" = "Odottamaton virhe: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Odottamaton siirtotila";
+117 -15
View File
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Autorise les messages éphémères seulement si votre contact vous lautorise.";
/* No comment provided by engineer. */
"Allow downgrade" = "Autoriser la rétrogradation";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Autoriser la suppression irréversible des messages uniquement si votre contact vous l'autorise. (24 heures)";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "toujours";
/* No comment provided by engineer. */
"Always use private routing." = "Toujours utiliser le routage privé.";
/* No comment provided by engineer. */
"Always use relay" = "Se connecter via relais";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Impossible de recevoir le fichier";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Capacité dépassée - le destinataire n'a pas pu recevoir les messages envoyés précédemment.";
/* No comment provided by engineer. */
"Cellular" = "Cellulaire";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Confirmer la mise à niveau de la base de données";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Confirmer les fichiers provenant de serveurs inconnus.";
/* No comment provided by engineer. */
"Confirm network settings" = "Confirmer les paramètres réseau";
@@ -1306,7 +1318,7 @@
"Delivery receipts are disabled!" = "Les accusés de réception sont désactivés !";
/* No comment provided by engineer. */
"Delivery receipts!" = "Justificatifs de réception!";
"Delivery receipts!" = "Justificatifs de réception!";
/* No comment provided by engineer. */
"Description" = "Description";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Appareils de bureau";
/* snd error text */
"Destination server error: %@" = "Erreur du serveur de destination: %@";
/* No comment provided by engineer. */
"Develop" = "Développer";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Ne pas envoyer d'historique aux nouveaux membres.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Ne pas envoyer de messages directement, même si votre serveur ou le serveur de destination ne prend pas en charge le routage privé.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "Ne pas utiliser de routage privé.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "N'utilisez PAS SimpleX pour les appels d'urgence.";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Erreur : ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Erreur: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Fichier: %@";
/* No comment provided by engineer. */
"Files" = "Fichiers";
/* No comment provided by engineer. */
"Files & media" = "Fichiers & médias";
@@ -1876,7 +1900,7 @@
"Fix connection" = "Réparer la connexion";
/* No comment provided by engineer. */
"Fix connection?" = "Réparer la connexion?";
"Fix connection?" = "Réparer la connexion?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Réparer le chiffrement après la restauration des sauvegardes.";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Transféré depuis";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Serveur de transfert: %1$@\nErreur du serveur de destination: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Serveur de transfert: %1$@\nErreur: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Bureau trouvé";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Accusés de réception des messages !";
/* item status text */
"Message delivery warning" = "Avertissement sur la distribution des messages";
/* No comment provided by engineer. */
"Message draft" = "Brouillon de message";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "message reçu";
/* No comment provided by engineer. */
"Message routing fallback" = "Rabattement du routage des messages";
/* No comment provided by engineer. */
"Message routing mode" = "Mode de routage des messages";
/* No comment provided by engineer. */
"Message source remains private." = "La source du message reste privée.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Connexion probablement supprimée.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Il est fort probable que ce contact ait supprimé la connexion avec vous.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Différents profils de chat";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Connexion au réseau";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Problèmes de réseau - le message a expiré après plusieurs tentatives d'envoi.";
/* No comment provided by engineer. */
"Network management" = "Gestion du réseau";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Noms de fichiers privés";
/* No comment provided by engineer. */
"Private message routing" = "Routage privé des messages";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Routage privé des messages 🚀";
/* name of notes to self */
"Private notes" = "Notes privées";
/* No comment provided by engineer. */
"Private routing" = "Routage privé";
/* No comment provided by engineer. */
"Profile and server connections" = "Profil et connexions au serveur";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "Protéger l'écran de l'app";
/* No comment provided by engineer. */
"Protect IP address" = "Protéger l'adresse IP";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Protégez vos profils de chat par un mot de passe !";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Protégez votre adresse IP des relais de messagerie choisis par vos contacts.\nActivez-le dans les paramètres *Réseau et serveurs*.";
/* No comment provided by engineer. */
"Protocol timeout" = "Délai du protocole";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "L'adresse de réception sera changée pour un autre serveur. Le changement d'adresse sera terminé lorsque l'expéditeur sera en ligne.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Réception simultanée";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La réception du fichier sera interrompue.";
@@ -3099,7 +3150,7 @@
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Reconnecter tous les serveurs connectés pour forcer la livraison des messages. Cette méthode utilise du trafic supplémentaire.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Reconnecter les serveurs?";
"Reconnect servers?" = "Reconnecter les serveurs?";
/* No comment provided by engineer. */
"Record updated at" = "Enregistrement mis à jour le";
@@ -3162,7 +3213,7 @@
"Renegotiate encryption" = "Renégocier le chiffrement";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Renégocier le chiffrement?";
"Renegotiate encryption?" = "Renégocier le chiffrement?";
/* No comment provided by engineer. */
"Repeat connection request?" = "Répéter la demande de connexion ?";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Exécuter le chat";
/* No comment provided by engineer. */
"Safely receive files" = "Réception de fichiers en toute sécurité";
/* No comment provided by engineer. */
"Safer groups" = "Groupes plus sûrs";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Envoyer un message dynamique";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Envoyer les messages de manière directe lorsque l'adresse IP est protégée et que votre serveur ou le serveur de destination ne prend pas en charge le routage privé.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Envoyez les messages de manière directe lorsque votre serveur ou le serveur de destination ne prend pas en charge le routage privé.";
/* No comment provided by engineer. */
"Send notifications" = "Envoi de notifications";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Les messages envoyés seront supprimés après une durée déterminée.";
/* srv error text. */
"Server address is incompatible with network settings." = "L'adresse du serveur est incompatible avec les paramètres du réseau.";
/* server test error */
"Server requires authorization to create queues, check password" = "Le serveur requiert une autorisation pour créer des files d'attente, vérifiez le mot de passe";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Échec du test du serveur !";
/* srv error text */
"Server version is incompatible with network settings." = "La version du serveur est incompatible avec les paramètres du réseau.";
/* No comment provided by engineer. */
"Servers" = "Serveurs";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Partager avec vos contacts";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Afficher → sur les messages envoyés via le routage privé.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Afficher les appels dans l'historique du téléphone";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Voir les derniers messages";
/* No comment provided by engineer. */
"Show message status" = "Afficher le statut du message";
/* No comment provided by engineer. */
"Show preview" = "Afficher l'aperçu";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "L'application peut vous avertir lorsque vous recevez des messages ou des demandes de contact - veuillez ouvrir les paramètres pour les activer.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "L'application demandera de confirmer les téléchargements à partir de serveurs de fichiers inconnus (sauf .onion).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "La tentative de modification de la phrase secrète de la base de données n'a pas abouti.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Pour protéger vos informations, activez la fonction SimpleX Lock.\nVous serez invité à confirmer l'authentification avant que cette fonction ne soit activée.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Pour protéger votre adresse IP, le routage privé utilise vos serveurs SMP pour délivrer les messages.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Pour enregistrer un message vocal, veuillez accorder la permission d'utiliser le microphone.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ débloqué";
/* item status description */
"Unexpected error: %@" = "Erreur inattendue: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "État de la migration inattendu";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Erreur inconnue";
/* No comment provided by engineer. */
"unknown relays" = "relais inconnus";
/* No comment provided by engineer. */
"Unknown servers!" = "Serveurs inconnus!";
/* No comment provided by engineer. */
"unknown status" = "statut inconnu";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Démute";
/* No comment provided by engineer. */
"unprotected" = "non protégé";
/* No comment provided by engineer. */
"Unread" = "Non lu";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Utilisation de notifications locales uniquement?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Utiliser le routage privé avec des serveurs inconnus lorsque l'adresse IP n'est pas protégée.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Utiliser le routage privé avec des serveurs inconnus.";
/* No comment provided by engineer. */
"Use server" = "Utiliser ce serveur";
@@ -4170,7 +4260,7 @@
"wants to connect to you!" = "veut établir une connexion !";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages";
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Attention : vous risquez de perdre des données !";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Lors des appels audio et vidéo.";
/* No comment provided by engineer. */
"when IP hidden" = "lorsque l'IP est masquée";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Vous pouvez accepter ou refuser les demandes de contacts.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Consommation réduite de la batterie.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Sans Tor ou un VPN, votre adresse IP sera visible par les serveurs de fichiers.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Sans Tor ni VPN, votre adresse IP sera visible par ces relais XFTP: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Mauvaise phrase secrète pour la base de données";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Clé erronée ou connexion non identifiée - il est très probable que cette connexion soit supprimée.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Mauvaise phrase secrète !";
+175 -73
View File
@@ -83,7 +83,7 @@
"**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have." = "**Privátabb**: 20 percenként ellenőrzi az új üzeneteket. Az eszköztoken megosztásra kerül a SimpleX Chat kiszolgálóval, de az nem, hogy hány ismerőse vagy üzenete van.";
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Legprivátabb**: ne használja a SimpleX Chat értesítési szervert, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).";
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Legprivátabb**: ne használja a SimpleX Chat értesítési kiszolgálót, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Megjegyzés**: ha két eszközön is ugyanazt az adatbázist használja, akkor biztonsági védelemként megszakítja a kapcsolataiból érkező üzenetek visszafejtését.";
@@ -92,7 +92,7 @@
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Figyelem**: NEM tudja visszaállítani vagy megváltoztatni jelmondatát, ha elveszíti azt.";
/* No comment provided by engineer. */
"**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." = "**Javasolt**: az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési szerverre, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.";
"**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." = "**Javasolt**: az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési kiszolgálóra, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.";
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Figyelmeztetés**: Az azonnali push-értesítésekhez a kulcstárolóban tárolt jelmondat megadása szükséges.";
@@ -345,7 +345,7 @@
"Accept" = "Elfogadás";
/* No comment provided by engineer. */
"Accept connection request?" = "Kapcsolatfelvétel elfogadása?";
"Accept connection request?" = "Kapcsolódási kérelem elfogadása?";
/* notification body */
"Accept contact request from %@?" = "Elfogadja %@ kapcsolat kérését?";
@@ -444,16 +444,19 @@
"Allow" = "Engedélyezés";
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Hívások engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.";
"Allow calls only if your contact allows them." = "A hívások kezdeményezése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Eltűnő üzenetek engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi az ön számára.";
"Allow disappearing messages only if your contact allows it to you." = "Az eltűnő üzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára.";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Üzenet végleges törlésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi. (24 óra)";
"Allow downgrade" = "Korábbi verzióra történő visszatérés engedélyezése";
/* No comment provided by engineer. */
"Allow message reactions only if your contact allows them." = "Üzenetreakciók engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.";
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Az üzenetek végleges törlése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. (24 óra)";
/* No comment provided by engineer. */
"Allow message reactions only if your contact allows them." = "Az üzenetreakciók küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.";
/* No comment provided by engineer. */
"Allow message reactions." = "Üzenetreakciók engedélyezése.";
@@ -462,7 +465,7 @@
"Allow sending direct messages to members." = "Közvetlen üzenetek küldésének engedélyezése a tagok számára.";
/* No comment provided by engineer. */
"Allow sending disappearing messages." = "Eltűnő üzenetek küldésének engedélyezése.";
"Allow sending disappearing messages." = "Az eltűnő üzenetek küldése engedélyezve van.";
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages. (24 hours)" = "Elküldött üzenetek végleges törlésének engedélyezése. (24 óra)";
@@ -477,25 +480,25 @@
"Allow to send voice messages." = "Hangüzenetek küldésének engedélyezése.";
/* No comment provided by engineer. */
"Allow voice messages only if your contact allows them." = "Hangüzenetek küldésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.";
"Allow voice messages only if your contact allows them." = "A hangüzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.";
/* No comment provided by engineer. */
"Allow voice messages?" = "Hangüzenetek engedélyezése?";
/* No comment provided by engineer. */
"Allow your contacts adding message reactions." = "Ismerősök általi üzenetreakciók hozzáadásának engedélyezése.";
"Allow your contacts adding message reactions." = "Az üzenetreakciók küldése engedélyezve van az ismerősei számára.";
/* No comment provided by engineer. */
"Allow your contacts to call you." = "Hívások engedélyezése ismerősök számára.";
"Allow your contacts to call you." = "A hívások kezdeményezése engedélyezve van az ismerősei számára.";
/* No comment provided by engineer. */
"Allow your contacts to irreversibly delete sent messages. (24 hours)" = "Elküldött üzenetek végleges törlésének engedélyezése az ismerősök számára. (24 óra)";
"Allow your contacts to irreversibly delete sent messages. (24 hours)" = "Az elküldött üzenetek végleges törlése engedélyezve van az ismerősei számára. (24 óra)";
/* No comment provided by engineer. */
"Allow your contacts to send disappearing messages." = "Eltűnő üzenetek engedélyezése ismerősök számára.";
"Allow your contacts to send disappearing messages." = "Az eltűnő üzenetek küldésének engedélyezése az ismerősei számára.";
/* No comment provided by engineer. */
"Allow your contacts to send voice messages." = "Hangüzenetek küldésének engedélyezése ismerősök számára.";
"Allow your contacts to send voice messages." = "A hangüzenetek küldése engedélyezve van az ismerősei számára.";
/* No comment provided by engineer. */
"Already connected?" = "Már kapcsolódott?";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "mindig";
/* No comment provided by engineer. */
"Always use private routing." = "Mindig használjon privát útválasztást.";
/* No comment provided by engineer. */
"Always use relay" = "Mindig használjon átjátszó kiszolgálót";
@@ -573,10 +579,10 @@
"Audio/video calls" = "Hang-/videóhívások";
/* No comment provided by engineer. */
"Audio/video calls are prohibited." = "A hang- és videóhívások le vannak tiltva.";
"Audio/video calls are prohibited." = "A hívások kezdeményezése le van tiltva ebben a csevegésben.";
/* PIN entry */
"Authentication cancelled" = "Hitelesítés megszakítva";
"Authentication cancelled" = "Hitelesítés visszavonva";
/* No comment provided by engineer. */
"Authentication failed" = "Sikertelen hitelesítés";
@@ -594,7 +600,7 @@
"Auto-accept" = "Automatikus elfogadás";
/* No comment provided by engineer. */
"Auto-accept contact requests" = "Ismerős jelölések automatikus elfogadása";
"Auto-accept contact requests" = "Kapcsolódási kérelmek automatikus elfogadása";
/* No comment provided by engineer. */
"Auto-accept images" = "Fotók automatikus elfogadása";
@@ -636,7 +642,7 @@
"Block member" = "Tag blokkolása";
/* No comment provided by engineer. */
"Block member for all?" = "Tag letiltása mindenki számára?";
"Block member for all?" = "Mindenki számára letiltja ezt a tagot?";
/* No comment provided by engineer. */
"Block member?" = "Tag blokkolása?";
@@ -663,7 +669,7 @@
"Both you and your contact can irreversibly delete sent messages. (24 hours)" = "Mindkét fél törölheti véglegesen az elküldött üzeneteket. (24 óra)";
/* No comment provided by engineer. */
"Both you and your contact can make calls." = "Mindkét fél tud hívásokat indítani.";
"Both you and your contact can make calls." = "Mindkét fél tud hívásokat kezdeményezni.";
/* No comment provided by engineer. */
"Both you and your contact can send disappearing messages." = "Mindkét fél küldhet eltűnő üzeneteket.";
@@ -708,7 +714,7 @@
"Cancel migration" = "Átköltöztetés visszavonása";
/* feature offered item */
"cancelled %@" = "%@ törölve";
"cancelled %@" = "%@ visszavonva";
/* No comment provided by engineer. */
"Cannot access keychain to save database password" = "Nem lehet hozzáférni a kulcstartóhoz az adatbázis jelszavának mentéséhez";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Nem lehet fogadni a fájlt";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Kapacitás túllépés - a címzett nem kapta meg a korábban elküldött üzeneteket.";
/* No comment provided by engineer. */
"Cellular" = "Mobilhálózat";
@@ -805,7 +814,7 @@
"Chinese and Spanish interface" = "Kínai és spanyol kezelőfelület";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Válassza az _Átköltöztetés egy másik eszközről_ opciót az új eszközön és szkennelje be a QR-kódot.";
"Choose _Migrate from another device_ on the new device and scan QR code." = "Válassza az _Átköltöztetés egy másik eszközről_ opciót az új eszközön és olvassa be a QR-kódot.";
/* No comment provided by engineer. */
"Choose file" = "Fájl kiválasztása";
@@ -817,13 +826,13 @@
"Clear" = "Kiürítés";
/* No comment provided by engineer. */
"Clear conversation" = "Beszélgetés kiürítése";
"Clear conversation" = "Üzenetek kiürítése";
/* No comment provided by engineer. */
"Clear conversation?" = "Beszélgetés kiürítése?";
"Clear conversation?" = "Üzenetek kiürítése?";
/* No comment provided by engineer. */
"Clear private notes?" = "Privát jegyzetek törlése?";
"Clear private notes?" = "Privát jegyzetek kiürítése?";
/* No comment provided by engineer. */
"Clear verification" = "Hitelesítés törlése";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Adatbázis frissítés megerősítése";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Ismeretlen kiszolgálókról származó fájlok jóváhagyása.";
/* No comment provided by engineer. */
"Confirm network settings" = "Hálózati beállítások megerősítése";
@@ -1006,7 +1018,7 @@
"Contacts" = "Ismerősök";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Az ismerősök törlésre jelölhetnek üzeneteket ; megtekintheti őket.";
"Contacts can mark messages for deletion; you will be able to view them." = "Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.";
/* No comment provided by engineer. */
"Continue" = "Folytatás";
@@ -1075,7 +1087,7 @@
"Creating link…" = "Hivatkozás létrehozása…";
/* No comment provided by engineer. */
"creator" = "szerző";
"creator" = "készítő";
/* No comment provided by engineer. */
"Current Passcode" = "Jelenlegi jelkód";
@@ -1183,7 +1195,7 @@
"Delete address?" = "Azonosító törlése?";
/* No comment provided by engineer. */
"Delete after" = "Törlés miután";
"Delete after" = "Törlés ennyi idő után";
/* No comment provided by engineer. */
"Delete all files" = "Minden fájl törlése";
@@ -1261,7 +1273,7 @@
"Delete messages" = "Üzenetek törlése";
/* No comment provided by engineer. */
"Delete messages after" = "Üzenetek törlése miután";
"Delete messages after" = "Üzenetek törlése ennyi idő után";
/* No comment provided by engineer. */
"Delete old database" = "Régi adatbázis törlése";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Számítógépek";
/* snd error text */
"Destination server error: %@" = "Célkiszolgáló hiba: %@";
/* No comment provided by engineer. */
"Develop" = "Fejlesztés";
@@ -1348,7 +1363,7 @@
"Direct messages" = "Közvetlen üzenetek";
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Ebben a csoportban tiltott a tagok közötti közvetlen üzenetek küldése.";
"Direct messages between members are prohibited in this group." = "A közvetlen üzenetek küldése a tagok között le van tiltva ebben a csoportban.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Letiltás (felülírások megtartásával)";
@@ -1369,7 +1384,7 @@
"Disappearing messages" = "Eltűnő üzenetek";
/* No comment provided by engineer. */
"Disappearing messages are prohibited in this chat." = "Az eltűnő üzenetek le vannak tiltva ebben a csevegésben.";
"Disappearing messages are prohibited in this chat." = "Az eltűnő üzenetek küldése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Disappearing messages are prohibited in this group." = "Az eltűnő üzenetek küldése le van tiltva ebben a csoportban.";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Az előzmények ne kerüljenek elküldésre az új tagok számára.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "Ne használjon privát útválasztást.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "NE használja a SimpleX-et segélyhívásokhoz.";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Hiba: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Hiba: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Fájl: %@";
/* No comment provided by engineer. */
"Files" = "Fájlok";
/* No comment provided by engineer. */
"Files & media" = "Fájlok és média";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Továbbítva innen:";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Továbbító kiszolgáló: %1$@\nCélkiszolgáló hiba:%2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Továbbító kiszolgáló: %1$@\nHiba: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Megtalált számítógép";
@@ -2077,7 +2107,7 @@
"If you enter this passcode when opening the app, all app data will be irreversibly removed!" = "Ha az alkalmazás megnyitásakor megadja ezt a jelkódot, az összes alkalmazásadat véglegesen törlődik!";
/* No comment provided by engineer. */
"If you enter your self-destruct passcode while opening the app:" = "Ha az alkalmazás megnyitásakor az önmegsemmisítő jelkódot megadásra kerül:";
"If you enter your self-destruct passcode while opening the app:" = "Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot:";
/* No comment provided by engineer. */
"If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Ha most kell használnia a csevegést, koppintson a ** Csináld később** elemre (az alkalmazás újraindításakor felajánlásra kerül az adatbázis áttelepítése).";
@@ -2245,16 +2275,16 @@
"Invite to group" = "Meghívás a csoportba";
/* No comment provided by engineer. */
"invited" = "meghívta";
"invited" = "meghíva";
/* rcv group event chat item */
"invited %@" = "meghívta %@-t";
"invited %@" = "meghívta őt: %@";
/* chat list item title */
"invited to connect" = "meghívta, hogy csatlakozzon";
/* rcv group event chat item */
"invited via your group link" = "meghívta a csoport hivatkozásán keresztül";
"invited via your group link" = "meghíva az ön csoport hivatkozásán keresztül";
/* No comment provided by engineer. */
"iOS Keychain is used to securely store passphrase - it allows receiving push notifications." = "Az iOS kulcstár a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását.";
@@ -2266,10 +2296,10 @@
"Irreversible message deletion" = "Végleges üzenettörlés";
/* No comment provided by engineer. */
"Irreversible message deletion is prohibited in this chat." = "Ebben a csevegésben az üzenetek végleges törlése le van tiltva.";
"Irreversible message deletion is prohibited in this chat." = "Az üzenetek végleges törlése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Irreversible message deletion is prohibited in this group." = "Ebben a csoportban az üzenetek végleges törlése le van tiltva.";
"Irreversible message deletion is prohibited in this group." = "Az üzenetek végleges törlése le van tiltva ebben a csoportban.";
/* No comment provided by engineer. */
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Lehetővé teszi, hogy egyetlen csevegőprofilon belül több anonim kapcsolat legyen, anélkül, hogy megosztott adatok lennének közöttük.";
@@ -2344,7 +2374,7 @@
"Learn more" = "Tudjon meg többet";
/* No comment provided by engineer. */
"Leave" = "Elhagy";
"Leave" = "Elhagyás";
/* No comment provided by engineer. */
"Leave group" = "Csoport elhagyása";
@@ -2407,7 +2437,7 @@
"Make profile private!" = "Tegye priváttá a profilját!";
/* No comment provided by engineer. */
"Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@)." = "Győződjön meg arról, hogy a %@ szervercímek megfelelő formátumúak, sorszeparáltak és nem duplikáltak (%@).";
"Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@)." = "Győződjön meg arról, hogy a %@ kiszolgálócímek megfelelő formátumúak, sorszeparáltak és nem duplikáltak (%@).";
/* No comment provided by engineer. */
"Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated." = "Győződjön meg arról, hogy a WebRTC ICE-kiszolgáló címei megfelelő formátumúak, sorszeparáltak és nem duplikáltak.";
@@ -2419,10 +2449,10 @@
"Mark deleted for everyone" = "Jelölje meg mindenki számára töröltként";
/* No comment provided by engineer. */
"Mark read" = "Megjelölés olvasottként";
"Mark read" = "Olvasottnak jelölés";
/* No comment provided by engineer. */
"Mark verified" = "Ellenőrzöttként jelölve";
"Mark verified" = "Hitelesítés";
/* No comment provided by engineer. */
"Markdown in messages" = "Markdown az üzenetekben";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Üzenetkézbesítési bizonylatok!";
/* item status text */
"Message delivery warning" = "Üzenet kézbesítési figyelmeztetés";
/* No comment provided by engineer. */
"Message draft" = "Üzenetvázlat";
@@ -2467,14 +2500,20 @@
"Message reactions" = "Üzenetreakciók";
/* No comment provided by engineer. */
"Message reactions are prohibited in this chat." = "Az üzenetreakciók ebben a csevegésben le vannak tiltva.";
"Message reactions are prohibited in this chat." = "Az üzenetreakciók küldése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Message reactions are prohibited in this group." = "Ebben a csoportban az üzenetreakciók le vannak tiltva.";
"Message reactions are prohibited in this group." = "Az üzenetreakciók küldése le van tiltva ebben a csoportban.";
/* notification */
"message received" = "üzenet érkezett";
/* No comment provided by engineer. */
"Message routing fallback" = "Üzenet útválasztási tartalék";
/* No comment provided by engineer. */
"Message routing mode" = "Üzenet útválasztási mód";
/* No comment provided by engineer. */
"Message source remains private." = "Az üzenet forrása titokban marad.";
@@ -2494,10 +2533,10 @@
"Messages from %@ will be shown!" = "A(z) %@ által írt üzenetek megjelennek!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzeneteket, fájlokat és hívásokat **végpontok közötti titkosítással** és sérülés utáni titkosságvédelemmel, visszautasítással és sérülés utáni helyreállítással védi.";
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzeneteket, fájlokat és hívásokat **végpontok közötti titkosítással**, sérülés utáni titkosság-védelemmel és -helyreállítással, továbbá visszautasítással védi.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzeneteket, fájlokat és hívásokat **végpontok közötti kvantumrezisztens titkosítással** és sérülés utáni titkosságvédelemmel, visszautasítással és sérülés utáni helyreállítással védi.";
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzeneteket, fájlokat és hívásokat **végpontok közötti kvantumrezisztens titkosítással**, sérülés utáni titkosság-védelemmel és -helyreállítással, továbbá visszautasítással védi.";
/* No comment provided by engineer. */
"Migrate device" = "Eszköz átköltöztetése";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Valószínűleg ez a kapcsolat törlésre került.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Valószínűleg ez az ismerős törölte önnel a kapcsolatot.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Több csevegőprofil";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Internetkapcsolat";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Hálózati problémák - az üzenet többszöri elküldési kísérlet után lejárt.";
/* No comment provided by engineer. */
"Network management" = "Hálózatkezelés";
@@ -2775,7 +2814,7 @@
"Only your contact can make calls." = "Csak az ismerős tud hívást indítani.";
/* No comment provided by engineer. */
"Only your contact can send disappearing messages." = "Csak az ismerős tud eltűnő üzeneteket küldeni.";
"Only your contact can send disappearing messages." = "Csak az ismerőse tud eltűnő üzeneteket küldeni.";
/* No comment provided by engineer. */
"Only your contact can send voice messages." = "Csak az ismerős tud hangüzeneteket küldeni.";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Privát fájl nevek";
/* No comment provided by engineer. */
"Private message routing" = "Privát üzenet útválasztás";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Privát üzenet útválasztás 🚀";
/* name of notes to self */
"Private notes" = "Privát jegyzetek";
/* No comment provided by engineer. */
"Private routing" = "Privát útválasztás";
/* No comment provided by engineer. */
"Profile and server connections" = "Profil és kiszolgálókapcsolatok";
@@ -2976,22 +3024,22 @@
"Profile update will be sent to your contacts." = "A profilfrissítés elküldésre került az ismerősök számára.";
/* No comment provided by engineer. */
"Prohibit audio/video calls." = "Hang- és videóhívások tiltása.";
"Prohibit audio/video calls." = "A hívások kezdeményezése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit irreversible message deletion." = "Az üzenetek véglegesen való törlése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit message reactions." = "Üzenetreakciók tiltása.";
"Prohibit message reactions." = "Az üzenetreakciók küldése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit messages reactions." = "Az üzenetreakciók tiltása.";
/* No comment provided by engineer. */
"Prohibit sending direct messages to members." = "Közvetlen üzenetek küldésének letiltása a tagok számára.";
"Prohibit sending direct messages to members." = "A közvetlen üzenetek küldése le van tiltva a tagok között.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Eltűnő üzenetek küldésének letiltása.";
"Prohibit sending disappearing messages." = "Az eltűnő üzenetek küldése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Fájlok- és a médiatartalom küldés letiltása.";
@@ -3000,14 +3048,20 @@
"Prohibit sending SimpleX links." = "A SimpleX hivatkozások küldése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Hangüzenetek küldésének letiltása.";
"Prohibit sending voice messages." = "A hangüzenetek küldése le van tiltva.";
/* No comment provided by engineer. */
"Protect app screen" = "Alkalmazás képernyőjének védelme";
/* No comment provided by engineer. */
"Protect IP address" = "Az IP-cím védelme";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Csevegési profiljok védelme jelszóval!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Védje IP-címét az ismerősei által kiválasztott üzenetküldő átjátszókkal szemben.\nEngedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.";
/* No comment provided by engineer. */
"Protocol timeout" = "Protokoll időtúllépés";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Egyidejű fogadás";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "A fájl fogadása leállt.";
@@ -3132,10 +3183,10 @@
"Remove" = "Eltávolítás";
/* No comment provided by engineer. */
"Remove member" = "Tag eltávolítása";
"Remove member" = "Eltávolítás";
/* No comment provided by engineer. */
"Remove member?" = "Tag eltávolítása?";
"Remove member?" = "Biztosan eltávolítja?";
/* No comment provided by engineer. */
"Remove passphrase from keychain?" = "Jelmondat eltávolítása a kulcstárolóból?";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Csevegési szolgáltatás indítása";
/* No comment provided by engineer. */
"Safely receive files" = "Fájlok biztonságos fogadása";
/* No comment provided by engineer. */
"Safer groups" = "Biztonságosabb csoportok";
@@ -3306,7 +3360,7 @@
"Saved WebRTC ICE servers will be removed" = "A mentett WebRTC ICE kiszolgálók eltávolításra kerülnek";
/* No comment provided by engineer. */
"Scan code" = "Kód beolvasása";
"Scan code" = "Beolvasás";
/* No comment provided by engineer. */
"Scan QR code" = "QR-kód beolvasása";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Élő üzenet küldése";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Közvetlen üzenetküldés, ha az IP-cím védett és az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Közvetlen üzenetküldés, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
/* No comment provided by engineer. */
"Send notifications" = "Értesítések küldése";
@@ -3411,7 +3471,7 @@
"Send up to 100 last messages to new members." = "Az utolsó 100 üzenet elküldése az új tagoknak.";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "A küldő megszakította a fájl átvitelt.";
"Sender cancelled file transfer." = "A fájl küldője visszavonta az átvitelt.";
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "A küldő törölhette a kapcsolódási kérelmet.";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Az elküldött üzenetek törlésre kerülnek a beállított idő után.";
/* srv error text. */
"Server address is incompatible with network settings." = "A kiszolgáló címe nem kompatibilis a hálózati beállításokkal.";
/* server test error */
"Server requires authorization to create queues, check password" = "A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze jelszavát";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Sikertelen kiszolgáló-teszt!";
/* srv error text */
"Server version is incompatible with network settings." = "A kiszolgáló verziója nem kompatibilis a hálózati beállításokkal.";
/* No comment provided by engineer. */
"Servers" = "Kiszolgálók";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Megosztás ismerősökkel";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Egy „→” jel megjelenítése a privát útválasztáson keresztül küldött üzeneteknél.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Hívások megjelenítése a híváslistában";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Utolsó üzenetek megjelenítése";
/* No comment provided by engineer. */
"Show message status" = "Üzenet állapot megjelenítése";
/* No comment provided by engineer. */
"Show preview" = "Előnézet megjelenítése";
@@ -3570,7 +3642,7 @@
"SimpleX links" = "SimpleX hivatkozások";
/* No comment provided by engineer. */
"SimpleX links are prohibited in this group." = "A SimpleX hivatkozások küldése ebben a csoportban le van tiltva.";
"SimpleX links are prohibited in this group." = "A SimpleX hivatkozások küldése le van tiltva ebben a csoportban.";
/* No comment provided by engineer. */
"SimpleX links not allowed" = "A SimpleX hivatkozások küldése le van tiltva";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Az alkalmazás értesíteni fogja, amikor üzeneteket vagy kapcsolatfelvételi kéréseket kap beállítások megnyitása az engedélyezéshez.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "Az alkalmazás kérni fogja az ismeretlen fájlkiszolgálókról (kivéve .onion) történő letöltések megerősítését.";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "Az adatbázis jelmondatának megváltoztatására tett kísérlet nem fejeződött be.";
@@ -3753,7 +3828,7 @@
"The code you scanned is not a SimpleX link QR code." = "A beolvasott kód nem egy SimpleX hivatkozás QR-kód.";
/* No comment provided by engineer. */
"The connection you accepted will be cancelled!" = "Az ön által elfogadott kapcsolat megszakad!";
"The connection you accepted will be cancelled!" = "Az ön által elfogadott kapcsolat vissza lesz vonva!";
/* No comment provided by engineer. */
"The contact you shared this link with will NOT be able to connect!" = "Ismerőse, akivel megosztotta ezt a hivatkozást, NEM fog tudni kapcsolódni!";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Az adatavédelem érdekében kapcsolja be a SimpleX zárolás funkciót.\nA funkció engedélyezése előtt a rendszer felszólítja a hitelesítés befejezésére.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Az IP-címe védelme érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Hangüzenet rögzítéséhez adjon engedélyt a mikrofon használathoz.";
@@ -3876,7 +3954,7 @@
"To support instant push notifications the chat database has to be migrated." = "Az azonnali push értesítések támogatásához a csevegési adatbázis migrálása szükséges.";
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "A végpontok közötti titkosítás ellenőrzéséhez ismerősével hasonlítsa össze (vagy szkennelje be) az eszközén lévő kódot.";
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Inkognitó mód kapcsolódáskor.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ feloldva";
/* item status description */
"Unexpected error: %@" = "Váratlan hiba: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Váratlan átköltöztetési állapot";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Ismeretlen hiba";
/* No comment provided by engineer. */
"unknown relays" = "ismeretlen átjátszók";
/* No comment provided by engineer. */
"Unknown servers!" = "Ismeretlen kiszolgálók!";
/* No comment provided by engineer. */
"unknown status" = "ismeretlen státusz";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Némítás feloldása";
/* No comment provided by engineer. */
"unprotected" = "nem védett";
/* No comment provided by engineer. */
"Unread" = "Olvasatlan";
@@ -3999,13 +4083,13 @@
"Update transport isolation mode?" = "Kapcsolat izolációs mód frissítése?";
/* rcv group event chat item */
"updated group profile" = "módosított csoport profil";
"updated group profile" = "frissítette a csoport profilját";
/* profile update event chat item */
"updated profile" = "frissített profil";
/* No comment provided by engineer. */
"Updating settings will re-connect the client to all servers." = "A beállítások frissítése a szerverekhez újra kapcsolódással jár.";
"Updating settings will re-connect the client to all servers." = "A beállítások frissítése a kiszolgálókhoz való újra kapcsolódással jár.";
/* No comment provided by engineer. */
"Updating this setting will re-connect the client to all servers." = "A beállítás frissítésével a kliens újrakapcsolódik az összes kiszolgálóhoz.";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Csak helyi értesítések használata?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Privát útválasztás használata ismeretlen kiszolgálókkal, ha az IP-cím nem védett.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Használjon privát útválasztást ismeretlen kiszolgálókkal.";
/* No comment provided by engineer. */
"Use server" = "Kiszolgáló használata";
@@ -4137,7 +4227,7 @@
"Voice messages" = "Hangüzenetek";
/* No comment provided by engineer. */
"Voice messages are prohibited in this chat." = "A hangüzenetek le vannak tiltva ebben a csevegésben.";
"Voice messages are prohibited in this chat." = "A hangüzenetek küldése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Voice messages are prohibited in this group." = "A hangüzenetek küldése le van tiltva ebben a csoportban.";
@@ -4149,7 +4239,7 @@
"Voice messages prohibited!" = "A hangüzenetek le vannak tilva!";
/* No comment provided by engineer. */
"waiting for answer…" = "várakozás válaszra…";
"waiting for answer…" = "várakozás a válaszra…";
/* No comment provided by engineer. */
"waiting for confirmation…" = "várakozás a visszaigazolásra…";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Amikor egy bejövő hang- vagy videóhívás érkezik.";
/* No comment provided by engineer. */
"when IP hidden" = "ha az IP-cím rejtett";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Amikor az emberek kapcsolódást kérelmeznek, ön elfogadhatja vagy elutasíthatja azokat.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Csökkentett akkumulátorhasználattal.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az IP-címe látható lesz a fájlkiszolgálók számára.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az IP-címe látható lesz ezen XFTP átjátszók számára: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Téves adatbázis jelmondat";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Rossz kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Téves jelmondat!";
@@ -4356,7 +4458,7 @@
"you changed role of %@ to %@" = "%1$@ szerepkörét megváltoztatta erre: %@";
/* No comment provided by engineer. */
"You control through which server(s) **to receive** the messages, your contacts the servers you use to message them." = "Ön szabályozhatja, hogy mely kiszogál(ók)ón keresztül **kapja** az üzeneteket, az ismerősöket - az üzenetküldéshez használt szervereken.";
"You control through which server(s) **to receive** the messages, your contacts the servers you use to message them." = "Ön szabályozhatja, hogy mely kiszogál(ók)ón keresztül **kapja** az üzeneteket, az ismerősöket - az üzenetküldéshez használt kiszolgálókon.";
/* No comment provided by engineer. */
"You could not be verified; please try again." = "Nem lehetett ellenőrizni; próbálja meg újra.";
@@ -4461,7 +4563,7 @@
"Your chat profiles" = "Csevegési profiljai";
/* No comment provided by engineer. */
"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Az ismerősnek online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.\nMegszakíthatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).";
"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Az ismerősének online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.\nVisszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).";
/* No comment provided by engineer. */
"Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ismerőse olyan fájlt küldött, amely meghaladja a jelenleg támogatott maximális méretet (%@).";
+112 -10
View File
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Consenti i messaggi a tempo solo se il contatto li consente a te.";
/* No comment provided by engineer. */
"Allow downgrade" = "Consenti downgrade";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Consenti l'eliminazione irreversibile dei messaggi solo se il contatto la consente a te. (24 ore)";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "sempre";
/* No comment provided by engineer. */
"Always use private routing." = "Usa sempre l'instradamento privato.";
/* No comment provided by engineer. */
"Always use relay" = "Connetti via relay";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Impossibile ricevere il file";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Quota superata - il destinatario non ha ricevuto i messaggi precedentemente inviati.";
/* No comment provided by engineer. */
"Cellular" = "Mobile";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Conferma aggiornamenti database";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Conferma i file da server sconosciuti.";
/* No comment provided by engineer. */
"Confirm network settings" = "Conferma le impostazioni di rete";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Dispositivi desktop";
/* snd error text */
"Destination server error: %@" = "Errore del server di destinazione: %@";
/* No comment provided by engineer. */
"Develop" = "Sviluppa";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Non inviare la cronologia ai nuovi membri.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "NON inviare messaggi direttamente, anche se il tuo server o quello di destinazione non supporta l'instradamento privato.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "NON usare l'instradamento privato.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "NON usare SimpleX per chiamate di emergenza.";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Errore: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Errore: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "File: %@";
/* No comment provided by engineer. */
"Files" = "File";
/* No comment provided by engineer. */
"Files & media" = "File e multimediali";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Inoltrato da";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Server di inoltro: %1$@\nErrore del server di destinazione: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Server di inoltro: %1$@\nErrore: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Desktop trovato";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Ricevute di consegna dei messaggi!";
/* item status text */
"Message delivery warning" = "Avviso di consegna del messaggio";
/* No comment provided by engineer. */
"Message draft" = "Bozza dei messaggi";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "messaggio ricevuto";
/* No comment provided by engineer. */
"Message routing fallback" = "Ripiego instradamento messaggio";
/* No comment provided by engineer. */
"Message routing mode" = "Modalità instradamento messaggio";
/* No comment provided by engineer. */
"Message source remains private." = "La fonte del messaggio resta privata.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Probabilmente questa connessione è stata eliminata.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Probabilmente questo contatto ha eliminato la connessione con te.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Profili di chat multipli";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Connessione di rete";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Problemi di rete - messaggio scaduto dopo molti tentativi di inviarlo.";
/* No comment provided by engineer. */
"Network management" = "Gestione della rete";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Nomi di file privati";
/* No comment provided by engineer. */
"Private message routing" = "Instradamento privato messaggi";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Instradamento privato dei messaggi 🚀";
/* name of notes to self */
"Private notes" = "Note private";
/* No comment provided by engineer. */
"Private routing" = "Instradamento privato";
/* No comment provided by engineer. */
"Profile and server connections" = "Profilo e connessioni al server";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "Proteggi la schermata dell'app";
/* No comment provided by engineer. */
"Protect IP address" = "Proteggi l'indirizzo IP";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Proteggi i tuoi profili di chat con una password!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Proteggi il tuo indirizzo IP dai relay di messaggistica scelti dai tuoi contatti.\nAttivalo nelle impostazioni *Rete e server*.";
/* No comment provided by engineer. */
"Protocol timeout" = "Scadenza del protocollo";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "L'indirizzo di ricezione verrà cambiato in un server diverso. La modifica dell'indirizzo verrà completata dopo che il mittente sarà in linea.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Ricezione concomitanza";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La ricezione del file verrà interrotta.";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Avvia chat";
/* No comment provided by engineer. */
"Safely receive files" = "Ricevi i file in sicurezza";
/* No comment provided by engineer. */
"Safer groups" = "Gruppi più sicuri";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Invia messaggio in diretta";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Invia messaggi direttamente quando l'indirizzo IP è protetto e il tuo server o quello di destinazione non supporta l'instradamento privato.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Invia messaggi direttamente quando il tuo server o quello di destinazione non supporta l'instradamento privato.";
/* No comment provided by engineer. */
"Send notifications" = "Invia notifiche";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "I messaggi inviati verranno eliminati dopo il tempo impostato.";
/* srv error text. */
"Server address is incompatible with network settings." = "L'indirizzo del server non è compatibile con le impostazioni di rete.";
/* server test error */
"Server requires authorization to create queues, check password" = "Il server richiede l'autorizzazione di creare code, controlla la password";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Test del server fallito!";
/* srv error text */
"Server version is incompatible with network settings." = "La versione del server non è compatibile con le impostazioni di rete.";
/* No comment provided by engineer. */
"Servers" = "Server";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Condividi con i contatti";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Mostra → nei messaggi inviati via instradamento privato.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Mostra le chiamate nella cronologia del telefono";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Mostra ultimi messaggi";
/* No comment provided by engineer. */
"Show message status" = "Mostra stato del messaggio";
/* No comment provided by engineer. */
"Show preview" = "Mostra anteprima";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "L'app può avvisarti quando ricevi messaggi o richieste di contatto: apri le impostazioni per attivare.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "L'app chiederà di confermare i download da server di file sconosciuti (eccetto .onion).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "Il tentativo di cambiare la password del database non è stato completato.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Per proteggere le tue informazioni, attiva SimpleX Lock.\nTi verrà chiesto di completare l'autenticazione prima di attivare questa funzionalità.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Per proteggere il tuo indirizzo IP, l'instradamento privato usa i tuoi server SMP per consegnare i messaggi.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Per registrare un messaggio vocale, concedi l'autorizzazione all'uso del microfono.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "ha sbloccato %@";
/* item status description */
"Unexpected error: %@" = "Errore imprevisto: % @";
/* No comment provided by engineer. */
"Unexpected migration state" = "Stato di migrazione imprevisto";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Errore sconosciuto";
/* No comment provided by engineer. */
"unknown relays" = "relay sconosciuti";
/* No comment provided by engineer. */
"Unknown servers!" = "Server sconosciuti!";
/* No comment provided by engineer. */
"unknown status" = "stato sconosciuto";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Riattiva notifiche";
/* No comment provided by engineer. */
"unprotected" = "non protetto";
/* No comment provided by engineer. */
"Unread" = "Non letto";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Usare solo notifiche locali?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Usa l'instradamento privato con server sconosciuti quando l'indirizzo IP non è protetto.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Usa l'instradamento privato con server sconosciuti.";
/* No comment provided by engineer. */
"Use server" = "Usa il server";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Quando si connettono le chiamate audio e video.";
/* No comment provided by engineer. */
"when IP hidden" = "quando l'IP è nascosto";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Quando le persone chiedono di connettersi, puoi accettare o rifiutare.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Con consumo di batteria ridotto.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Senza Tor o VPN, il tuo indirizzo IP sarà visibile ai server di file.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Senza Tor o VPN, il tuo indirizzo IP sarà visibile a questi relay XFTP: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Password del database sbagliata";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Chiave sbagliata o connessione sconosciuta - molto probabilmente questa connessione è stata eliminata.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Password sbagliata!";
+1 -7
View File
@@ -1509,7 +1509,7 @@
/* No comment provided by engineer. */
"Error: " = "エラー : ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "エラー : %@";
/* No comment provided by engineer. */
@@ -2130,9 +2130,6 @@
/* item status description */
"Most likely this connection is deleted." = "おそらく、この接続は削除されています。";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "恐らくこの連絡先があなたとの接続を削除しました。";
/* No comment provided by engineer. */
"Multiple chat profiles" = "複数チャットのプロフィール";
@@ -3191,9 +3188,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "音声メッセージを録音できません";
/* item status description */
"Unexpected error: %@" = "予期しないエラー: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "予期しない移行状態";
+112 -10
View File
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Sta verdwijnende berichten alleen toe als uw contact dit toestaat.";
/* No comment provided by engineer. */
"Allow downgrade" = "Downgraden toestaan";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Sta het onomkeerbaar verwijderen van berichten alleen toe als uw contact dit toestaat. (24 uur)";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "altijd";
/* No comment provided by engineer. */
"Always use private routing." = "Gebruik altijd privéroutering.";
/* No comment provided by engineer. */
"Always use relay" = "Altijd relay gebruiken";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Kan bestand niet ontvangen";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Capaciteit overschreden - ontvanger heeft eerder verzonden berichten niet ontvangen.";
/* No comment provided by engineer. */
"Cellular" = "Mobiel";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Bevestig database upgrades";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Bevestig bestanden van onbekende servers.";
/* No comment provided by engineer. */
"Confirm network settings" = "Bevestig netwerk instellingen";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Desktop apparaten";
/* snd error text */
"Destination server error: %@" = "Bestemmingsserverfout: %@";
/* No comment provided by engineer. */
"Develop" = "Ontwikkelen";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Stuur geen geschiedenis naar nieuwe leden.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Stuur GEEN berichten rechtstreeks, zelfs als uw of de bestemmingsserver geen privéroutering ondersteunt.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "Gebruik GEEN privéroutering.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "Gebruik SimpleX NIET voor noodoproepen.";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Fout: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Fout: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Bestand: %@";
/* No comment provided by engineer. */
"Files" = "Bestanden";
/* No comment provided by engineer. */
"Files & media" = "Bestanden en media";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Doorgestuurd vanuit";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Doorstuurserver: %1$@\nBestemmingsserverfout: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Doorstuurserver: %1$@\nFout: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Desktop gevonden";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Ontvangst bevestiging voor berichten!";
/* item status text */
"Message delivery warning" = "Waarschuwing voor berichtbezorging";
/* No comment provided by engineer. */
"Message draft" = "Concept bericht";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "bericht ontvangen";
/* No comment provided by engineer. */
"Message routing fallback" = "Terugval op berichtroutering";
/* No comment provided by engineer. */
"Message routing mode" = "Berichtrouteringsmodus";
/* No comment provided by engineer. */
"Message source remains private." = "Berichtbron blijft privé.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Hoogstwaarschijnlijk is deze verbinding verwijderd.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Hoogstwaarschijnlijk heeft dit contact de verbinding met jou verwijderd.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Meerdere chat profielen";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Netwerkverbinding";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Netwerkproblemen - bericht is verlopen na vele pogingen om het te verzenden.";
/* No comment provided by engineer. */
"Network management" = "Netwerkbeheer";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Privé bestandsnamen";
/* No comment provided by engineer. */
"Private message routing" = "Routering van privéberichten";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Routing van privéberichten🚀";
/* name of notes to self */
"Private notes" = "Privé notities";
/* No comment provided by engineer. */
"Private routing" = "Privéroutering";
/* No comment provided by engineer. */
"Profile and server connections" = "Profiel- en serververbindingen";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "App scherm verbergen";
/* No comment provided by engineer. */
"Protect IP address" = "Bescherm het IP-adres";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Bescherm je chat profielen met een wachtwoord!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Bescherm uw IP-adres tegen de berichtenrelais die door uw contacten zijn gekozen.\nSchakel dit in in *Netwerk en servers*-instellingen.";
/* No comment provided by engineer. */
"Protocol timeout" = "Protocol timeout";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Het ontvangstadres wordt gewijzigd naar een andere server. Adres wijziging wordt voltooid nadat de afzender online is.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Gelijktijdig ontvangen";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Het ontvangen van het bestand wordt gestopt.";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Chat uitvoeren";
/* No comment provided by engineer. */
"Safely receive files" = "Veilig bestanden ontvangen";
/* No comment provided by engineer. */
"Safer groups" = "Veiligere groepen";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Stuur een livebericht";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Stuur berichten rechtstreeks als het IP-adres beschermd is en uw of bestemmingsserver geen privéroutering ondersteunt.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Stuur berichten rechtstreeks wanneer uw of de doelserver geen privéroutering ondersteunt.";
/* No comment provided by engineer. */
"Send notifications" = "Meldingen verzenden";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Verzonden berichten worden na ingestelde tijd verwijderd.";
/* srv error text. */
"Server address is incompatible with network settings." = "Serveradres is niet compatibel met netwerkinstellingen.";
/* server test error */
"Server requires authorization to create queues, check password" = "Server vereist autorisatie om wachtrijen te maken, controleer wachtwoord";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Servertest mislukt!";
/* srv error text */
"Server version is incompatible with network settings." = "Serverversie is incompatibel met netwerkinstellingen.";
/* No comment provided by engineer. */
"Servers" = "Servers";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Delen met contacten";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Toon → bij berichten verzonden via privéroutering.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Toon oproepen in de telefoongeschiedenis";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Laat laatste berichten zien";
/* No comment provided by engineer. */
"Show message status" = "Toon berichtstatus";
/* No comment provided by engineer. */
"Show preview" = "Toon voorbeeld";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "De app kan u op de hoogte stellen wanneer u berichten of contact verzoeken ontvangt - open de instellingen om dit in te schakelen.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "De app vraagt om downloads van onbekende bestandsservers (behalve .onion) te bevestigen.";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "De poging om het wachtwoord van de database te wijzigen is niet voltooid.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Schakel SimpleX Vergrendelen om uw informatie te beschermen.\nU wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingeschakeld.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Om uw IP-adres te beschermen, gebruikt privéroutering uw SMP-servers om berichten te bezorgen.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Geef toestemming om de microfoon te gebruiken om een spraakbericht op te nemen.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "gedeblokkeerd %@";
/* item status description */
"Unexpected error: %@" = "Onverwachte fout: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Onverwachte migratiestatus";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Onbekende fout";
/* No comment provided by engineer. */
"unknown relays" = "onbekende relays";
/* No comment provided by engineer. */
"Unknown servers!" = "Onbekende servers!";
/* No comment provided by engineer. */
"unknown status" = "onbekende status";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Dempen opheffen";
/* No comment provided by engineer. */
"unprotected" = "onbeschermd";
/* No comment provided by engineer. */
"Unread" = "Ongelezen";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Alleen lokale meldingen gebruiken?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Gebruik privéroutering met onbekende servers wanneer het IP-adres niet beveiligd is.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Gebruik privéroutering met onbekende servers.";
/* No comment provided by engineer. */
"Use server" = "Gebruik server";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Bij het verbinden van audio- en video-oproepen.";
/* No comment provided by engineer. */
"when IP hidden" = "wanneer IP verborgen is";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Wanneer mensen vragen om verbinding te maken, kunt u dit accepteren of weigeren.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Met verminderd batterijgebruik.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Zonder Tor of VPN is uw IP-adres zichtbaar voor bestandsservers.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Zonder Tor of VPN zal uw IP-adres zichtbaar zijn voor deze XFTP-relays: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Verkeerd wachtwoord voor de database";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Verkeerde sleutel of onbekende verbinding - hoogstwaarschijnlijk is deze verbinding verwijderd.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Verkeerd wachtwoord!";
+112 -10
View File
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Zezwól na znikające wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli.";
/* No comment provided by engineer. */
"Allow downgrade" = "Zezwól na obniżenie wersji";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Zezwalaj na nieodwracalne usuwanie wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli. (24 godziny)";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "zawsze";
/* No comment provided by engineer. */
"Always use private routing." = "Zawsze używaj prywatnego trasowania.";
/* No comment provided by engineer. */
"Always use relay" = "Zawsze używaj przekaźnika";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Nie można odebrać pliku";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Przekroczono pojemność - odbiorca nie otrzymał wcześniej wysłanych wiadomości.";
/* No comment provided by engineer. */
"Cellular" = "Sieć komórkowa";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Potwierdź aktualizacje bazy danych";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Potwierdzaj pliki z nieznanych serwerów.";
/* No comment provided by engineer. */
"Confirm network settings" = "Potwierdź ustawienia sieciowe";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Urządzenia komputerowe";
/* snd error text */
"Destination server error: %@" = "Błąd docelowego serwera: %@";
/* No comment provided by engineer. */
"Develop" = "Deweloperskie";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Nie wysyłaj historii do nowych członków.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "NIE wysyłaj wiadomości bezpośrednio, nawet jeśli serwer docelowy nie obsługuje prywatnego trasowania.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "NIE używaj prywatnego trasowania.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "NIE używaj SimpleX do połączeń alarmowych.";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Błąd: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Błąd: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Plik: %@";
/* No comment provided by engineer. */
"Files" = "Pliki";
/* No comment provided by engineer. */
"Files & media" = "Pliki i media";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Przekazane dalej od";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Serwer przekazujący: %1$@\nBłąd serwera docelowego: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Serwer przekazujący: %1$@\nBłąd: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Znaleziono komputer";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Potwierdzenia dostarczenia wiadomości!";
/* item status text */
"Message delivery warning" = "Ostrzeżenie dostarczenia wiadomości";
/* No comment provided by engineer. */
"Message draft" = "Wersja robocza wiadomości";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "wiadomość otrzymana";
/* No comment provided by engineer. */
"Message routing fallback" = "Rezerwowe trasowania wiadomości";
/* No comment provided by engineer. */
"Message routing mode" = "Tryb trasowania wiadomości";
/* No comment provided by engineer. */
"Message source remains private." = "Źródło wiadomości pozostaje prywatne.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Najprawdopodobniej to połączenie jest usunięte.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Najprawdopodobniej ten kontakt usunął połączenie z Tobą.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Wiele profili czatu";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Połączenie z siecią";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Błąd sieciowy - wiadomość wygasła po wielu próbach wysłania jej.";
/* No comment provided by engineer. */
"Network management" = "Zarządzenie sieciowe";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Prywatne nazwy plików";
/* No comment provided by engineer. */
"Private message routing" = "Trasowanie prywatnych wiadomości";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Trasowanie prywatnych wiadomości🚀";
/* name of notes to self */
"Private notes" = "Prywatne notatki";
/* No comment provided by engineer. */
"Private routing" = "Prywatne trasowanie";
/* No comment provided by engineer. */
"Profile and server connections" = "Profil i połączenia z serwerem";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "Chroń ekran aplikacji";
/* No comment provided by engineer. */
"Protect IP address" = "Chroń adres IP";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Chroń swoje profile czatu hasłem!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Chroni Twój adres IP przed przekaźnikami wiadomości wybranych przez Twoje kontakty.\nWłącz w ustawianiach *Sieć i serwery* .";
/* No comment provided by engineer. */
"Protocol timeout" = "Limit czasu protokołu";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Konkurencyjne odbieranie";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Odbieranie pliku zostanie przerwane.";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Uruchom czat";
/* No comment provided by engineer. */
"Safely receive files" = "Bezpiecznie otrzymuj pliki";
/* No comment provided by engineer. */
"Safer groups" = "Bezpieczniejsze grupy";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Wyślij wiadomość na żywo";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Wysyłaj wiadomości bezpośrednio, gdy adres IP jest chroniony i Twój lub docelowy serwer nie obsługuje prywatnego trasowania.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Wysyłaj wiadomości bezpośrednio, gdy Twój lub docelowy serwer nie obsługuje prywatnego trasowania.";
/* No comment provided by engineer. */
"Send notifications" = "Wyślij powiadomienia";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Wysłane wiadomości zostaną usunięte po ustawionym czasie.";
/* srv error text. */
"Server address is incompatible with network settings." = "Adres serwera jest niekompatybilny z ustawieniami sieciowymi.";
/* server test error */
"Server requires authorization to create queues, check password" = "Serwer wymaga autoryzacji do tworzenia kolejek, sprawdź hasło";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Test serwera nie powiódł się!";
/* srv error text */
"Server version is incompatible with network settings." = "Wersja serwera jest niekompatybilna z ustawieniami sieciowymi.";
/* No comment provided by engineer. */
"Servers" = "Serwery";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Udostępnij kontaktom";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Pokaż → na wiadomościach wysłanych przez prywatne trasowanie.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Pokaż połączenia w historii telefonu";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Pokaż ostatnie wiadomości";
/* No comment provided by engineer. */
"Show message status" = "Pokaż status wiadomości";
/* No comment provided by engineer. */
"Show preview" = "Pokaż podgląd";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Aplikacja może powiadamiać Cię, gdy otrzymujesz wiadomości lub prośby o kontakt — otwórz ustawienia, aby włączyć.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "Aplikacja zapyta o potwierdzenie pobierania od nieznanych serwerów plików (poza .onion).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "Próba zmiany hasła bazy danych nie została zakończona.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Aby chronić swoje informacje, włącz funkcję blokady SimpleX.\nPrzed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Aby chronić Twój adres IP, prywatne trasowanie używa Twoich serwerów SMP, aby dostarczyć wiadomości.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Aby nagrać wiadomość głosową należy udzielić zgody na użycie Mikrofonu.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "odblokowano %@";
/* item status description */
"Unexpected error: %@" = "Nieoczekiwany błąd: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Nieoczekiwany stan migracji";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Nieznany błąd";
/* No comment provided by engineer. */
"unknown relays" = "nieznane przekaźniki";
/* No comment provided by engineer. */
"Unknown servers!" = "Nieznane serwery!";
/* No comment provided by engineer. */
"unknown status" = "nieznany status";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Wyłącz wyciszenie";
/* No comment provided by engineer. */
"unprotected" = "niezabezpieczony";
/* No comment provided by engineer. */
"Unread" = "Nieprzeczytane";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Używać tylko lokalnych powiadomień?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Używaj prywatnego trasowania z nieznanymi serwerami, gdy adres IP nie jest chroniony.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Używaj prywatnego trasowania z nieznanymi serwerami.";
/* No comment provided by engineer. */
"Use server" = "Użyj serwera";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Podczas łączenia połączeń audio i wideo.";
/* No comment provided by engineer. */
"when IP hidden" = "gdy IP ukryty";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Kiedy ludzie proszą o połączenie, możesz je zaakceptować lub odrzucić.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Ze zmniejszonym zużyciem baterii.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Bez Tor lub VPN, Twój adres IP będzie widoczny do serwerów plików.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Bez Tor lub VPN, Twój adres IP będzie widoczny dla tych przekaźników XFTP: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Nieprawidłowe hasło bazy danych";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Zły klucz lub nieznane połączenie - najprawdopodobniej to połączenie jest usunięte.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Nieprawidłowe hasło!";
+112 -10
View File
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Разрешить исчезающие сообщения, только если Ваш контакт разрешает их Вам.";
/* No comment provided by engineer. */
"Allow downgrade" = "Разрешить прямую доставку";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Разрешить необратимое удаление сообщений, только если Ваш контакт разрешает это Вам. (24 часа)";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "всегда";
/* No comment provided by engineer. */
"Always use private routing." = "Всегда использовать конфиденциальную доставку.";
/* No comment provided by engineer. */
"Always use relay" = "Всегда соединяться через relay";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Невозможно получить файл";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Превышено количество сообщений - предыдущие сообщения не доставлены.";
/* No comment provided by engineer. */
"Cellular" = "Мобильная сеть";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Подтвердить обновление базы данных";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Подтверждать файлы с неизвестных серверов.";
/* No comment provided by engineer. */
"Confirm network settings" = "Подтвердите настройки сети";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Компьютеры";
/* snd error text */
"Destination server error: %@" = "Ошибка сервера получателя: %@";
/* No comment provided by engineer. */
"Develop" = "Для разработчиков";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Не отправлять историю новым членам.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Не отправлять сообщения напрямую, даже если сервер получателя не поддерживает конфиденциальную доставку.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "Не использовать конфиденциальную доставку.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "Не используйте SimpleX для экстренных звонков.";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Ошибка: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Ошибка: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Файл: %@";
/* No comment provided by engineer. */
"Files" = "Файлы";
/* No comment provided by engineer. */
"Files & media" = "Файлы и медиа";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Переслано из";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Пересылающий сервер: %1$@\nОшибка сервера получателя: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Пересылающий сервер: %1$@\nОшибка: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Компьютер найден";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Отчеты о доставке сообщений!";
/* item status text */
"Message delivery warning" = "Предупреждение доставки сообщения";
/* No comment provided by engineer. */
"Message draft" = "Черновик сообщения";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "получено сообщение";
/* No comment provided by engineer. */
"Message routing fallback" = "Прямая доставка сообщений";
/* No comment provided by engineer. */
"Message routing mode" = "Режим доставки сообщений";
/* No comment provided by engineer. */
"Message source remains private." = "Источник сообщения остаётся конфиденциальным.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Скорее всего, соединение удалено.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Скорее всего, этот контакт удалил соединение с Вами.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Много профилей чата";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Интернет-соединение";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Ошибка сети - сообщение не было отправлено после многократных попыток.";
/* No comment provided by engineer. */
"Network management" = "Статус сети";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Защищенные имена файлов";
/* No comment provided by engineer. */
"Private message routing" = "Конфиденциальная доставка сообщений";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Конфиденциальная доставка сообщений 🚀";
/* name of notes to self */
"Private notes" = "Личные заметки";
/* No comment provided by engineer. */
"Private routing" = "Конфиденциальная доставка";
/* No comment provided by engineer. */
"Profile and server connections" = "Профиль и соединения на сервере";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "Защитить экран приложения";
/* No comment provided by engineer. */
"Protect IP address" = "Защитить IP адрес";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Защитите Ваши профили чата паролем!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Защитите ваш IP адрес от серверов сообщений, выбранных Вашими контактами.\nВключите в настройках *Сеть и серверы*.";
/* No comment provided by engineer. */
"Protocol timeout" = "Таймаут протокола";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Адрес получения сообщений будет перемещён на другой сервер. Изменение адреса завершится после того как отправитель будет онлайн.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Одновременный приём";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Приём файла будет прекращён.";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Запустить chat";
/* No comment provided by engineer. */
"Safely receive files" = "Получайте файлы безопасно";
/* No comment provided by engineer. */
"Safer groups" = "Более безопасные группы";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Отправить живое сообщение";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Отправлять сообщения напрямую, когда IP адрес защищен, и Ваш сервер или сервер получателя не поддерживает конфиденциальную доставку.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Отправлять сообщения напрямую, когда Ваш сервер или сервер получателя не поддерживает конфиденциальную доставку.";
/* No comment provided by engineer. */
"Send notifications" = "Отправлять уведомления";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Отправленные сообщения будут удалены через заданное время.";
/* srv error text. */
"Server address is incompatible with network settings." = "Адрес сервера несовместим с настройками сети.";
/* server test error */
"Server requires authorization to create queues, check password" = "Сервер требует авторизации для создания очередей, проверьте пароль";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Ошибка теста сервера!";
/* srv error text */
"Server version is incompatible with network settings." = "Версия сервера несовместима с настройками сети.";
/* No comment provided by engineer. */
"Servers" = "Серверы";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Поделиться с контактами";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Показать → на сообщениях доставленных конфиденциально.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Показать звонки в истории телефона";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Показывать последние сообщения";
/* No comment provided by engineer. */
"Show message status" = "Показать статус сообщения";
/* No comment provided by engineer. */
"Show preview" = "Показывать уведомления";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Приложение может посылать Вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "Приложение будет запрашивать подтверждение загрузки с неизвестных серверов (за исключением .onion адресов).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "Попытка поменять пароль базы данных не была завершена.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Чтобы защитить Вашу информацию, включите блокировку SimpleX Chat.\nВам будет нужно пройти аутентификацию для включения блокировки.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Чтобы защитить ваш IP адрес, приложение использует Ваши SMP серверы для конфиденциальной доставки сообщений.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Для записи голосового сообщения, пожалуйста разрешите доступ к микрофону.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ разблокирован";
/* item status description */
"Unexpected error: %@" = "Неожиданная ошибка: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Неожиданная ошибка при перемещении данных чата";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Неизвестная ошибка";
/* No comment provided by engineer. */
"unknown relays" = "неизвестные серверы";
/* No comment provided by engineer. */
"Unknown servers!" = "Неизвестные серверы!";
/* No comment provided by engineer. */
"unknown status" = "неизвестный статус";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Уведомлять";
/* No comment provided by engineer. */
"unprotected" = "незащищённый";
/* No comment provided by engineer. */
"Unread" = "Не прочитано";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Использовать только локальные нотификации?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Использовать конфиденциальную доставку с неизвестными серверами, когда IP адрес не защищен.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Использовать конфиденциальную доставку с неизвестными серверами.";
/* No comment provided by engineer. */
"Use server" = "Использовать сервер";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Во время соединения аудио и видео звонков.";
/* No comment provided by engineer. */
"when IP hidden" = "когда IP защищен";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Когда Вы получите запрос на соединение, Вы можете принять или отклонить его.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "С уменьшенным потреблением батареи.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Без Тора или ВПН, Ваш IP адрес будет доступен серверам файлов.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Без Тора или ВПН, Ваш IP адрес будет доступен этим серверам файлов: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Неправильный пароль базы данных";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Неверный ключ или неизвестное соединение - скорее всего, это соединение удалено.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Неправильный пароль!";
+1 -7
View File
@@ -1386,7 +1386,7 @@
/* No comment provided by engineer. */
"Error: " = "ผิดพลาด: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "ข้อผิดพลาด: % @";
/* No comment provided by engineer. */
@@ -1998,9 +1998,6 @@
/* No comment provided by engineer. */
"More improvements are coming soon!" = "การปรับปรุงเพิ่มเติมกำลังจะมาเร็ว ๆ นี้!";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "เป็นไปได้มากว่าผู้ติดต่อนี้ได้ลบการเชื่อมต่อกับคุณ";
/* No comment provided by engineer. */
"Multiple chat profiles" = "โปรไฟล์การแชทหลายรายการ";
@@ -3050,9 +3047,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "ไม่สามารถบันทึกข้อความเสียง";
/* item status description */
"Unexpected error: %@" = "ข้อผิดพลาดที่ไม่คาดคิด: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "สถานะการย้ายข้อมูลที่ไม่คาดคิด";
+118 -16
View File
@@ -275,7 +275,7 @@
"0 sec" = "0 saniye";
/* No comment provided by engineer. */
"0s" = "0 saniye";
"0s" = "0sn";
/* time interval */
"1 day" = "1 gün";
@@ -438,7 +438,7 @@
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Tüm kişileriniz bağlı kalacaktır. Profil güncellemesi kişilerinize gönderilecektir.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Tüm kişileriniz, sohbetleriniz ve dosyalarınız güvenli bir şekilde şifrelenecek ve parçalar halinde yapılandırılmış XFTP rölelerine yüklenecektir.";
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Tüm kişileriniz, konuşmalarınız ve dosyalarınız güvenli bir şekilde şifrelenir ve yapılandırılmış XFTP yönlendiricilerine parçalar halinde yüklenir.";
/* No comment provided by engineer. */
"Allow" = "İzin ver";
@@ -449,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Eğer kişide izin verirse kaybolan mesajlara izin ver.";
/* No comment provided by engineer. */
"Allow downgrade" = "Sürüm düşürmeye izin ver";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Konuştuğun kişi, kalıcı olarak silinebilen mesajlara izin veriyorsa sen de ver. (24 saat içinde)";
@@ -459,7 +462,7 @@
"Allow message reactions." = "Mesaj tepkilerine izin ver.";
/* No comment provided by engineer. */
"Allow sending direct messages to members." = "Üyelere direkt mesaj göndermeye izin ver.";
"Allow sending direct messages to members." = "Üyelere doğrudan mesaj göndermeye izin ver.";
/* No comment provided by engineer. */
"Allow sending disappearing messages." = "Kendiliğinden yok olan mesajlar göndermeye izin ver.";
@@ -509,6 +512,9 @@
/* pref value */
"always" = "her zaman";
/* No comment provided by engineer. */
"Always use private routing." = "Her zaman gizli yönlendirme kullan.";
/* No comment provided by engineer. */
"Always use relay" = "Her zaman yönlendirici kullan";
@@ -716,6 +722,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Dosya alınamıyor";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Kapasite aşıldı - alıcı önceden gönderilen mesajları almadı.";
/* No comment provided by engineer. */
"Cellular" = "Hücresel Veri";
@@ -852,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Veritabanı geliştirmelerini onayla";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Bilinmeyen sunuculardan gelen dosyaları onayla.";
/* No comment provided by engineer. */
"Confirm network settings" = "Ağ ayarlarını onaylayın";
@@ -1320,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Bilgisayar cihazları";
/* snd error text */
"Destination server error: %@" = "Hedef sunucu hatası: %@";
/* No comment provided by engineer. */
"Develop" = "Geliştir";
@@ -1398,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Yeni üyelere geçmişi gönderme.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Sizin veya hedef sunucunun özel yönlendirmeyi desteklememesi durumunda bile mesajları doğrudan GÖNDERMEYİN.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "Gizli yönlendirmeyi KULLANMA.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "Acil aramalar için SimpleX'i KULLANMAYIN.";
@@ -1779,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Hata: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Hata: %@";
/* No comment provided by engineer. */
@@ -1839,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Dosya: %@";
/* No comment provided by engineer. */
"Files" = "Dosyalar";
/* No comment provided by engineer. */
"Files & media" = "Dosyalar & medya";
@@ -1905,6 +1929,12 @@
/* No comment provided by engineer. */
"Forwarded from" = "Şuradan iletildi";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Yönlendirme sunucusu: %1$@\nHedef sunucu hatası: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Yönlendirme sunucusu: %1$@\nHata: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Bilgisayar bulundu";
@@ -2460,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Mesaj alındı bilgisi!";
/* item status text */
"Message delivery warning" = "Mesaj iletimi uyarısı";
/* No comment provided by engineer. */
"Message draft" = "Mesaj taslağı";
@@ -2475,6 +2508,12 @@
/* notification */
"message received" = "mesaj alındı";
/* No comment provided by engineer. */
"Message routing fallback" = "Mesaj yönlendirme yedeklemesi";
/* No comment provided by engineer. */
"Message routing mode" = "Mesaj yönlendirme modu";
/* No comment provided by engineer. */
"Message source remains private." = "Mesaj kaynağı gizli kalır.";
@@ -2568,9 +2607,6 @@
/* item status description */
"Most likely this connection is deleted." = "Büyük ihtimalle bu bağlantı silinmiş.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Büyük ihtimalle bu kişi seninle bağlantını sildi.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Çoklu sohbet profili";
@@ -2589,6 +2625,9 @@
/* No comment provided by engineer. */
"Network connection" = "Ağ bağlantısı";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Ağ sorunları - birçok gönderme denemesinden sonra mesajın süresi doldu.";
/* No comment provided by engineer. */
"Network management" = "Ağ yönetimi";
@@ -2951,9 +2990,18 @@
/* No comment provided by engineer. */
"Private filenames" = "Gizli dosya adları";
/* No comment provided by engineer. */
"Private message routing" = "Gizli mesaj yönlendirme";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Gizli mesaj yönlendirme 🚀";
/* name of notes to self */
"Private notes" = "Gizli notlar";
/* No comment provided by engineer. */
"Private routing" = "Gizli yönlendirme";
/* No comment provided by engineer. */
"Profile and server connections" = "Profil ve sunucu bağlantıları";
@@ -2988,7 +3036,7 @@
"Prohibit messages reactions." = "Mesajlarda tepkileri yasakla.";
/* No comment provided by engineer. */
"Prohibit sending direct messages to members." = "Geri dönülmez mesaj silme işlemini yasakla.";
"Prohibit sending direct messages to members." = "Üyelere doğrudan mesaj göndermeyi yasakla.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Kaybolan mesajların gönderimini yasakla.";
@@ -3005,9 +3053,15 @@
/* No comment provided by engineer. */
"Protect app screen" = "Uygulama ekranını koru";
/* No comment provided by engineer. */
"Protect IP address" = "IP adresini koru";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Bir parolayla birlikte sohbet profillerini koru!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "IP adresinizi kişileriniz tarafından seçilen mesajlaşma yönlendiricilerinden koruyun.\n*Ağ ve sunucular* ayarlarında etkinleştirin.";
/* No comment provided by engineer. */
"Protocol timeout" = "Protokol zaman aşımı";
@@ -3077,9 +3131,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Alıcı adresi farklı bir sunucuya değiştirilecektir. Gönderici çevrimiçi olduktan sonra adres değişikliği tamamlanacaktır.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Eşzamanlılık alınıyor";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Dosya alımı durdurulacaktır.";
@@ -3123,10 +3174,10 @@
"rejected call" = "geri çevrilmiş çağrı";
/* No comment provided by engineer. */
"Relay server is only used if necessary. Another party can observe your IP address." = "Aktarma sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir.";
"Relay server is only used if necessary. Another party can observe your IP address." = "Yönlendirici sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir.";
/* No comment provided by engineer. */
"Relay server protects your IP address, but it can observe the duration of the call." = "Aktarıcı sunucu IP adresinizi korur, ancak aramanın süresini gözlemleyebilir.";
"Relay server protects your IP address, but it can observe the duration of the call." = "Yönlendirici sunucu IP adresinizi korur, ancak aramanın süresini gözlemleyebilir.";
/* No comment provided by engineer. */
"Remove" = "Sil";
@@ -3236,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Sohbeti çalıştır";
/* No comment provided by engineer. */
"Safely receive files" = "Dosyaları güvenle alın";
/* No comment provided by engineer. */
"Safer groups" = "Daha güvenli gruplar";
@@ -3392,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Canlı mesaj gönder";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "IP adresi korumalı olduğunda ve sizin veya hedef sunucunun özel yönlendirmeyi desteklemediği durumlarda mesajları doğrudan gönderin.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Sizin veya hedef sunucunun özel yönlendirmeyi desteklemediği durumlarda mesajları doğrudan gönderin.";
/* No comment provided by engineer. */
"Send notifications" = "Bildirimler gönder";
@@ -3455,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Gönderilen mesajlar ayarlanan süreden sonra silinecektir.";
/* srv error text. */
"Server address is incompatible with network settings." = "Sunucu adresi ağ ayarlarıyla uyumlu değil.";
/* server test error */
"Server requires authorization to create queues, check password" = "Sunucunun sıra oluşturması için yetki gereklidir, şifreyi kontrol edin";
@@ -3464,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Sunucu testinde hata oluştu!";
/* srv error text */
"Server version is incompatible with network settings." = "Sunucu sürümü ağ ayarlarıyla uyumlu değil.";
/* No comment provided by engineer. */
"Servers" = "Sunucular";
@@ -3530,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Kişilerle paylaş";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Gizli yönlendirme yoluyla gönderilen mesajlarda → işaretini göster.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Telefon geçmişinde aramaları göster";
@@ -3539,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Son mesajları göster";
/* No comment provided by engineer. */
"Show message status" = "Mesaj durumunu göster";
/* No comment provided by engineer. */
"Show preview" = "Ön gösterimi göser";
@@ -3746,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Uygulama, mesaj veya iletişim isteği aldığınızda sizi bilgilendirebilir - etkinleştirmek için lütfen ayarları açın.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "Uygulama bilinmeyen dosya sunucularından indirmeleri onaylamanızı isteyecektir (.onion hariç).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "Veritabanı parolasını değiştirme girişimi tamamlanmadı.";
@@ -3866,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Bilgilerinizi korumak için SimpleX Lock özelliğini açın.\nBu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenecektir.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "IP adresinizi korumak için,gizli yönlendirme mesajları iletmek için SMP sunucularınızı kullanır.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Sesli mesaj kaydetmek için lütfen Mikrofon kullanım izni verin.";
@@ -3920,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "engeli kaldırıldı %@";
/* item status description */
"Unexpected error: %@" = "Beklenmeyen hata: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Beklenmeyen geçiş durumu";
@@ -3953,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Bilinmeyen hata";
/* No comment provided by engineer. */
"unknown relays" = "bilinmeyen yönlendiriciler";
/* No comment provided by engineer. */
"Unknown servers!" = "Bilinmeyen sunucular!";
/* No comment provided by engineer. */
"unknown status" = "bilinmeyen durum";
@@ -3977,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Susturmayı kaldır";
/* No comment provided by engineer. */
"unprotected" = "korumasız";
/* No comment provided by engineer. */
"Unread" = "Okunmamış";
@@ -4046,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Sadece yerel bildirimler kullanılsın mı?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "IP adresi korunmadığında bilinmeyen sunucularla gizli yönlendirme kullan.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Bilinmeyen sunucularla gizli yönlendirme kullan.";
/* No comment provided by engineer. */
"Use server" = "Sunucu kullan";
@@ -4199,6 +4289,9 @@
/* No comment provided by engineer. */
"When connecting audio and video calls." = "Sesli ve görüntülü aramalara bağlanırken.";
/* No comment provided by engineer. */
"when IP hidden" = "IP gizliyken";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "İnsanlar bağlantı talebinde bulunduğunda, kabul edebilir veya reddedebilirsiniz.";
@@ -4223,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "Azaltılmış pil kullanımı ile birlikte.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Tor veya VPN olmadan, IP adresiniz dosya sunucularına görülebilir.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor veya VPN olmadan, IP adresiniz bu XFTP aktarıcıları tarafından görülebilir: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Yanlış veritabanı parolası";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Yanlış anahtar veya bilinmeyen bağlantı - büyük olasılıkla bu bağlantı silinmiştir.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Yanlış parola!";
+226 -7
View File
@@ -389,6 +389,9 @@
/* member role */
"admin" = "адмін";
/* feature role */
"admins" = "адміністратори";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Адміністратори можуть заблокувати користувача для всіх.";
@@ -416,6 +419,9 @@
/* No comment provided by engineer. */
"All group members will remain connected." = "Всі учасники групи залишаться на зв'язку.";
/* feature role */
"all members" = "всі учасники";
/* No comment provided by engineer. */
"All messages will be deleted - this cannot be undone!" = "Усі повідомлення будуть видалені - цю дію не можна скасувати!";
@@ -443,6 +449,9 @@
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Дозволяйте зникати повідомленням, тільки якщо контакт дозволяє вам це робити.";
/* No comment provided by engineer. */
"Allow downgrade" = "Дозволити пониження версії";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Дозволяйте безповоротне видалення повідомлень, тільки якщо контакт дозволяє вам це зробити. (24 години)";
@@ -464,6 +473,9 @@
/* No comment provided by engineer. */
"Allow to send files and media." = "Дозволяє надсилати файли та медіа.";
/* No comment provided by engineer. */
"Allow to send SimpleX links." = "Дозволити надсилати посилання SimpleX.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Дозволити надсилати голосові повідомлення.";
@@ -500,6 +512,9 @@
/* pref value */
"always" = "завжди";
/* No comment provided by engineer. */
"Always use private routing." = "Завжди використовуйте приватну маршрутизацію.";
/* No comment provided by engineer. */
"Always use relay" = "Завжди використовуйте реле";
@@ -707,6 +722,12 @@
/* No comment provided by engineer. */
"Cannot receive file" = "Не вдається отримати файл";
/* snd error text */
"Capacity exceeded - recipient did not receive previously sent messages." = "Перевищено ліміт - одержувач не отримав раніше надіслані повідомлення.";
/* No comment provided by engineer. */
"Cellular" = "Стільниковий";
/* No comment provided by engineer. */
"Change" = "Зміна";
@@ -840,6 +861,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Підтвердити оновлення бази даних";
/* No comment provided by engineer. */
"Confirm files from unknown servers." = "Підтвердити файли з невідомих серверів.";
/* No comment provided by engineer. */
"Confirm network settings" = "Підтвердьте налаштування мережі";
@@ -1308,6 +1332,9 @@
/* No comment provided by engineer. */
"Desktop devices" = "Настільні пристрої";
/* snd error text */
"Destination server error: %@" = "Помилка сервера призначення: %@";
/* No comment provided by engineer. */
"Develop" = "Розробник";
@@ -1386,6 +1413,12 @@
/* No comment provided by engineer. */
"Do not send history to new members." = "Не надсилайте історію новим користувачам.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "НЕ надсилайте повідомлення напряму, навіть якщо ваш сервер або сервер призначення не підтримує приватну маршрутизацію.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "НЕ використовуйте приватну маршрутизацію.";
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "НЕ використовуйте SimpleX для екстрених викликів.";
@@ -1401,6 +1434,9 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Пониження та відкритий чат";
/* chat item action */
"Download" = "Завантажити";
/* No comment provided by engineer. */
"Download failed" = "Не вдалося завантажити";
@@ -1476,6 +1512,9 @@
/* enabled status */
"enabled" = "увімкнено";
/* No comment provided by engineer. */
"Enabled for" = "Увімкнено для";
/* enabled status */
"enabled for contact" = "увімкнено для контакту";
@@ -1761,7 +1800,7 @@
/* No comment provided by engineer. */
"Error: " = "Помилка: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Помилка: %@";
/* No comment provided by engineer. */
@@ -1821,6 +1860,9 @@
/* No comment provided by engineer. */
"File: %@" = "Файл: %@";
/* No comment provided by engineer. */
"Files" = "Файли";
/* No comment provided by engineer. */
"Files & media" = "Файли та медіа";
@@ -1830,6 +1872,9 @@
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "Файли та медіа в цій групі заборонені.";
/* No comment provided by engineer. */
"Files and media not allowed" = "Файли та медіафайли заборонені";
/* No comment provided by engineer. */
"Files and media prohibited!" = "Файли та медіа заборонені!";
@@ -1869,6 +1914,27 @@
/* No comment provided by engineer. */
"For console" = "Для консолі";
/* chat item action */
"Forward" = "Пересилання";
/* No comment provided by engineer. */
"Forward and save messages" = "Пересилання та збереження повідомлень";
/* No comment provided by engineer. */
"forwarded" = "переслано";
/* No comment provided by engineer. */
"Forwarded" = "Переслано";
/* No comment provided by engineer. */
"Forwarded from" = "Переслано з";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Сервер переадресації: %1$@\nПомилка сервера призначення: %2$@";
/* snd error text */
"Forwarding server: %@\nError: %@" = "Сервер переадресації: %1$@\nПомилка: %2$@";
/* No comment provided by engineer. */
"Found desktop" = "Знайдено робочий стіл";
@@ -1947,6 +2013,9 @@
/* No comment provided by engineer. */
"Group members can send files and media." = "Учасники групи можуть надсилати файли та медіа.";
/* No comment provided by engineer. */
"Group members can send SimpleX links." = "Учасники групи можуть надсилати посилання SimpleX.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Учасники групи можуть надсилати голосові повідомлення.";
@@ -2088,6 +2157,9 @@
/* No comment provided by engineer. */
"In reply to" = "У відповідь на";
/* No comment provided by engineer. */
"In-call sounds" = "Звуки вхідного дзвінка";
/* No comment provided by engineer. */
"Incognito" = "Інкогніто";
@@ -2418,6 +2490,9 @@
/* No comment provided by engineer. */
"Message delivery receipts!" = "Підтвердження доставки повідомлення!";
/* item status text */
"Message delivery warning" = "Попередження про доставку повідомлення";
/* No comment provided by engineer. */
"Message draft" = "Чернетка повідомлення";
@@ -2433,6 +2508,15 @@
/* notification */
"message received" = "повідомлення отримано";
/* No comment provided by engineer. */
"Message routing fallback" = "Запасний варіант маршрутизації повідомлень";
/* No comment provided by engineer. */
"Message routing mode" = "Режим маршрутизації повідомлень";
/* No comment provided by engineer. */
"Message source remains private." = "Джерело повідомлення залишається приватним.";
/* No comment provided by engineer. */
"Message text" = "Текст повідомлення";
@@ -2517,12 +2601,12 @@
/* No comment provided by engineer. */
"More improvements are coming soon!" = "Незабаром буде ще більше покращень!";
/* No comment provided by engineer. */
"More reliable network connection." = "Більш надійне з'єднання з мережею.";
/* item status description */
"Most likely this connection is deleted." = "Швидше за все, це з'єднання видалено.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Швидше за все, цей контакт видалив зв'язок з вами.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Кілька профілів чату";
@@ -2538,6 +2622,15 @@
/* No comment provided by engineer. */
"Network & servers" = "Мережа та сервери";
/* No comment provided by engineer. */
"Network connection" = "Підключення до мережі";
/* snd error text */
"Network issues - message expired after many attempts to send it." = "Проблеми з мережею - термін дії повідомлення закінчився після багатьох спроб надіслати його.";
/* No comment provided by engineer. */
"Network management" = "Керування мережею";
/* No comment provided by engineer. */
"Network settings" = "Налаштування мережі";
@@ -2616,6 +2709,9 @@
/* No comment provided by engineer. */
"No history" = "Немає історії";
/* No comment provided by engineer. */
"No network connection" = "Немає підключення до мережі";
/* No comment provided by engineer. */
"No permission to record voice message" = "Немає дозволу на запис голосового повідомлення";
@@ -2762,9 +2858,15 @@
/* No comment provided by engineer. */
"Or show this code" = "Або покажіть цей код";
/* No comment provided by engineer. */
"Other" = "Інше";
/* member role */
"owner" = "власник";
/* feature role */
"owners" = "власники";
/* No comment provided by engineer. */
"Passcode" = "Пароль";
@@ -2888,15 +2990,27 @@
/* No comment provided by engineer. */
"Private filenames" = "Приватні імена файлів";
/* No comment provided by engineer. */
"Private message routing" = "Маршрутизація приватних повідомлень";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Маршрутизація приватних повідомлень 🚀";
/* name of notes to self */
"Private notes" = "Приватні нотатки";
/* No comment provided by engineer. */
"Private routing" = "Приватна маршрутизація";
/* No comment provided by engineer. */
"Profile and server connections" = "З'єднання профілю та сервера";
/* No comment provided by engineer. */
"Profile image" = "Зображення профілю";
/* No comment provided by engineer. */
"Profile images" = "Зображення профілю";
/* No comment provided by engineer. */
"Profile name" = "Назва профілю";
@@ -2930,15 +3044,24 @@
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Заборонити надсилання файлів і медіа.";
/* No comment provided by engineer. */
"Prohibit sending SimpleX links." = "Заборонити надсилання посилань SimpleX.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Заборонити надсилання голосових повідомлень.";
/* No comment provided by engineer. */
"Protect app screen" = "Захистіть екран програми";
/* No comment provided by engineer. */
"Protect IP address" = "Захист IP-адреси";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Захистіть свої профілі чату паролем!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Захистіть свою IP-адресу від ретрансляторів повідомлень, обраних вашими контактами.\nУвімкніть у налаштуваннях *Мережа та сервери*.";
/* No comment provided by engineer. */
"Protocol timeout" = "Тайм-аут протоколу";
@@ -3017,6 +3140,9 @@
/* No comment provided by engineer. */
"Recent history and improved [directory bot](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion)." = "Нещодавня історія та покращення [directory bot](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).";
/* No comment provided by engineer. */
"Recipient(s) can't see who this message is from." = "Одержувач(и) не бачить, від кого це повідомлення.";
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "Одержувачі бачать оновлення, коли ви їх вводите.";
@@ -3161,6 +3287,9 @@
/* No comment provided by engineer. */
"Run chat" = "Запустити чат";
/* No comment provided by engineer. */
"Safely receive files" = "Безпечне отримання файлів";
/* No comment provided by engineer. */
"Safer groups" = "Безпечніші групи";
@@ -3212,6 +3341,18 @@
/* No comment provided by engineer. */
"Save welcome message?" = "Зберегти вітальне повідомлення?";
/* No comment provided by engineer. */
"saved" = "збережено";
/* No comment provided by engineer. */
"Saved" = "Збережено";
/* No comment provided by engineer. */
"Saved from" = "Збережено з";
/* No comment provided by engineer. */
"saved from %@" = "збережено з %@";
/* message info title */
"Saved message" = "Збережене повідомлення";
@@ -3305,6 +3446,12 @@
/* No comment provided by engineer. */
"Send live message" = "Надіслати живе повідомлення";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Надсилайте повідомлення напряму, якщо IP-адреса захищена, а ваш сервер або сервер призначення не підтримує приватну маршрутизацію.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Надсилайте повідомлення напряму, якщо ваш сервер або сервер призначення не підтримує приватну маршрутизацію.";
/* No comment provided by engineer. */
"Send notifications" = "Надсилати сповіщення";
@@ -3368,6 +3515,9 @@
/* No comment provided by engineer. */
"Sent messages will be deleted after set time." = "Надіслані повідомлення будуть видалені через встановлений час.";
/* srv error text. */
"Server address is incompatible with network settings." = "Адреса сервера несумісна з налаштуваннями мережі.";
/* server test error */
"Server requires authorization to create queues, check password" = "Сервер вимагає авторизації для створення черг, перевірте пароль";
@@ -3377,6 +3527,9 @@
/* No comment provided by engineer. */
"Server test failed!" = "Тест сервера завершився невдало!";
/* srv error text */
"Server version is incompatible with network settings." = "Серверна версія несумісна з мережевими налаштуваннями.";
/* No comment provided by engineer. */
"Servers" = "Сервери";
@@ -3419,6 +3572,9 @@
/* No comment provided by engineer. */
"Settings" = "Налаштування";
/* No comment provided by engineer. */
"Shape profile images" = "Сформуйте зображення профілю";
/* chat item action */
"Share" = "Поділіться";
@@ -3440,6 +3596,9 @@
/* No comment provided by engineer. */
"Share with contacts" = "Поділіться з контактами";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Показувати → у повідомленнях, надісланих через приватну маршрутизацію.";
/* No comment provided by engineer. */
"Show calls in phone history" = "Показувати дзвінки в історії дзвінків";
@@ -3449,6 +3608,9 @@
/* No comment provided by engineer. */
"Show last messages" = "Показати останні повідомлення";
/* No comment provided by engineer. */
"Show message status" = "Показати статус повідомлення";
/* No comment provided by engineer. */
"Show preview" = "Показати попередній перегляд";
@@ -3479,6 +3641,12 @@
/* chat feature */
"SimpleX links" = "Посилання SimpleX";
/* No comment provided by engineer. */
"SimpleX links are prohibited in this group." = "У цій групі заборонені посилання на SimpleX.";
/* No comment provided by engineer. */
"SimpleX links not allowed" = "Посилання SimpleX заборонені";
/* No comment provided by engineer. */
"SimpleX Lock" = "SimpleX Lock";
@@ -3515,6 +3683,9 @@
/* notification title */
"Somebody" = "Хтось";
/* No comment provided by engineer. */
"Square, circle, or anything in between." = "Квадрат, коло або щось середнє між ними.";
/* chat item text */
"standard end-to-end encryption" = "стандартне наскрізне шифрування";
@@ -3647,6 +3818,9 @@
/* No comment provided by engineer. */
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Додаток може сповіщати вас, коли ви отримуєте повідомлення або запити на контакт - будь ласка, відкрийте налаштування, щоб увімкнути цю функцію.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "Програма попросить підтвердити завантаження з невідомих файлових серверів (крім .onion).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "Спроба змінити пароль до бази даних не була завершена.";
@@ -3767,6 +3941,9 @@
/* No comment provided by engineer. */
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Щоб захистити вашу інформацію, увімкніть SimpleX Lock.\nПеред увімкненням цієї функції вам буде запропоновано пройти автентифікацію.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Щоб захистити вашу IP-адресу, приватна маршрутизація використовує ваші SMP-сервери для доставки повідомлень.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Щоб записати голосове повідомлення, будь ласка, надайте дозвіл на використання мікрофону.";
@@ -3821,9 +3998,6 @@
/* rcv group event chat item */
"unblocked %@" = "розблоковано %@";
/* item status description */
"Unexpected error: %@" = "Неочікувана помилка: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Неочікуваний стан міграції";
@@ -3854,6 +4028,12 @@
/* No comment provided by engineer. */
"Unknown error" = "Невідома помилка";
/* No comment provided by engineer. */
"unknown relays" = "невідомі реле";
/* No comment provided by engineer. */
"Unknown servers!" = "Невідомі сервери!";
/* No comment provided by engineer. */
"unknown status" = "невідомий статус";
@@ -3878,6 +4058,9 @@
/* No comment provided by engineer. */
"Unmute" = "Увімкнути звук";
/* No comment provided by engineer. */
"unprotected" = "незахищені";
/* No comment provided by engineer. */
"Unread" = "Непрочитане";
@@ -3947,6 +4130,12 @@
/* No comment provided by engineer. */
"Use only local notifications?" = "Використовувати лише локальні сповіщення?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Використовуйте приватну маршрутизацію з невідомими серверами, якщо IP-адреса не захищена.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Використовуйте приватну маршрутизацію з невідомими серверами.";
/* No comment provided by engineer. */
"Use server" = "Використовувати сервер";
@@ -4043,6 +4232,9 @@
/* No comment provided by engineer. */
"Voice messages are prohibited in this group." = "Голосові повідомлення в цій групі заборонені.";
/* No comment provided by engineer. */
"Voice messages not allowed" = "Голосові повідомлення заборонені";
/* No comment provided by engineer. */
"Voice messages prohibited!" = "Голосові повідомлення заборонені!";
@@ -4094,12 +4286,27 @@
/* No comment provided by engineer. */
"When available" = "За наявності";
/* No comment provided by engineer. */
"When connecting audio and video calls." = "При підключенні аудіо та відеодзвінків.";
/* No comment provided by engineer. */
"when IP hidden" = "коли IP приховано";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Коли люди звертаються із запитом на підключення, ви можете прийняти або відхилити його.";
/* No comment provided by engineer. */
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Коли ви ділитеся з кимось своїм профілем інкогніто, цей профіль буде використовуватися для груп, до яких вас запрошують.";
/* No comment provided by engineer. */
"WiFi" = "WiFi";
/* No comment provided by engineer. */
"Will be enabled in direct chats!" = "Буде ввімкнено в прямих чатах!";
/* No comment provided by engineer. */
"Wired ethernet" = "Дротова мережа Ethernet";
/* No comment provided by engineer. */
"With encrypted files and media." = "З зашифрованими файлами та медіа.";
@@ -4109,9 +4316,18 @@
/* No comment provided by engineer. */
"With reduced battery usage." = "З меншим споживанням заряду акумулятора.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Без Tor або VPN ваша IP-адреса буде видимою для файлових серверів.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Без Tor або VPN ваша IP-адреса буде видимою для цих XFTP-ретрансляторів: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Неправильний пароль до бази даних";
/* snd error text */
"Wrong key or unknown connection - most likely this connection is deleted." = "Неправильний ключ або невідоме з'єднання - швидше за все, це з'єднання видалено.";
/* No comment provided by engineer. */
"Wrong passphrase!" = "Неправильний пароль!";
@@ -4121,6 +4337,9 @@
/* pref value */
"yes" = "так";
/* No comment provided by engineer. */
"you" = "ти";
/* No comment provided by engineer. */
"You" = "Ти";
+298 -7
View File
@@ -353,6 +353,12 @@
/* member role */
"admin" = "管理员";
/* feature role */
"admins" = "管理员";
/* No comment provided by engineer. */
"Admins can block a member for all." = "管理员可以为所有人封禁一名成员。";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "管理员可以创建链接以加入群组。";
@@ -377,6 +383,9 @@
/* No comment provided by engineer. */
"All group members will remain connected." = "所有群组成员将保持连接。";
/* feature role */
"all members" = "所有成员";
/* No comment provided by engineer. */
"All messages will be deleted - this cannot be undone!" = "所有消息都将被删除 - 这无法被撤销!";
@@ -389,6 +398,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "您的所有联系人将保持连接。个人资料更新将发送给您的联系人。";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "你的所有联系人、对话和文件将被安全加密并分块上传到配置的 XFTP 中继。";
/* No comment provided by engineer. */
"Allow" = "允许";
@@ -419,6 +431,9 @@
/* No comment provided by engineer. */
"Allow to send files and media." = "允许发送文件和媒体。";
/* No comment provided by engineer. */
"Allow to send SimpleX links." = "允许发送 SimpleX 链接。";
/* No comment provided by engineer. */
"Allow to send voice messages." = "允许发送语音消息。";
@@ -467,6 +482,9 @@
/* No comment provided by engineer. */
"App build: %@" = "应用程序构建:%@";
/* No comment provided by engineer. */
"App data migration" = "应用数据迁移";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "应用程序为新的本地文件(视频除外)加密。";
@@ -488,6 +506,15 @@
/* No comment provided by engineer. */
"Appearance" = "外观";
/* No comment provided by engineer. */
"Apply" = "应用";
/* No comment provided by engineer. */
"Archive and upload" = "存档和上传";
/* No comment provided by engineer. */
"Archiving database" = "正在存档数据库";
/* No comment provided by engineer. */
"Attach" = "附件";
@@ -635,6 +662,9 @@
/* No comment provided by engineer. */
"Cancel" = "取消";
/* No comment provided by engineer. */
"Cancel migration" = "取消迁移";
/* feature offered item */
"cancelled %@" = "已取消 %@";
@@ -644,6 +674,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "无法接收文件";
/* No comment provided by engineer. */
"Cellular" = "移动网络";
/* No comment provided by engineer. */
"Change" = "更改";
@@ -714,6 +747,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "聊天已停止。如果你已经在另一台设备商使用过此数据库,你应该在启动聊天前将数据库传输回来。";
/* No comment provided by engineer. */
"Chat migrated!" = "已迁移聊天!";
/* No comment provided by engineer. */
"Chat preferences" = "聊天偏好设置";
@@ -771,6 +807,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "确认数据库升级";
/* No comment provided by engineer. */
"Confirm network settings" = "确认网络设置";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "确认新密码……";
@@ -780,6 +819,12 @@
/* No comment provided by engineer. */
"Confirm password" = "确认密码";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "请在迁移前确认你记得数据库的密码短语。";
/* No comment provided by engineer. */
"Confirm upload" = "确认上传";
/* server test step */
"Connect" = "连接";
@@ -957,6 +1002,9 @@
/* No comment provided by engineer. */
"Created on %@" = "创建于 %@";
/* No comment provided by engineer. */
"Creating archive link" = "正在创建存档链接";
/* No comment provided by engineer. */
"Creating link…" = "创建链接中…";
@@ -1098,6 +1146,9 @@
/* No comment provided by engineer. */
"Delete database" = "删除数据库";
/* No comment provided by engineer. */
"Delete database from this device" = "从这部设备上删除数据库";
/* server test step */
"Delete file" = "删除文件";
@@ -1287,9 +1338,21 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "降级并打开聊天";
/* chat item action */
"Download" = "下载";
/* No comment provided by engineer. */
"Download failed" = "下载失败了";
/* server test step */
"Download file" = "下载文件";
/* No comment provided by engineer. */
"Downloading archive" = "正在下载存档";
/* No comment provided by engineer. */
"Downloading link details" = "正在下载链接详情";
/* No comment provided by engineer. */
"Duplicate display name!" = "重复的显示名!";
@@ -1323,6 +1386,9 @@
/* No comment provided by engineer. */
"Enable for all" = "全部启用";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "在私聊中开启(公测)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "启用即时通知?";
@@ -1350,6 +1416,9 @@
/* enabled status */
"enabled" = "已启用";
/* No comment provided by engineer. */
"Enabled for" = "启用对象";
/* enabled status */
"enabled for contact" = "已为联系人启用";
@@ -1431,6 +1500,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "输入密码";
/* No comment provided by engineer. */
"Enter passphrase" = "输入密码短语";
/* No comment provided by engineer. */
"Enter passphrase…" = "输入密码……";
@@ -1521,6 +1593,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "删除用户资料错误";
/* No comment provided by engineer. */
"Error downloading the archive" = "下载存档出错";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "启用送达回执出错!";
@@ -1563,6 +1638,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "保存密码到钥匙串错误";
/* when migrating */
"Error saving settings" = "保存设置出错";
/* No comment provided by engineer. */
"Error saving user password" = "保存用户密码时出错";
@@ -1603,9 +1681,15 @@
"Error updating user privacy" = "更新用户隐私时出错";
/* No comment provided by engineer. */
"Error: " = "错误: ";
"Error uploading the archive" = "上传存档出错";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "验证密码短语出错:";
/* No comment provided by engineer. */
"Error: " = "错误: ";
/* snd error text */
"Error: %@" = "错误: @";
/* No comment provided by engineer. */
@@ -1635,6 +1719,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "导出数据库归档。";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "导出的文件不存在";
/* No comment provided by engineer. */
"Exporting database archive…" = "导出数据库档案中…";
@@ -1671,12 +1758,21 @@
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "此群组中禁止文件和媒体。";
/* No comment provided by engineer. */
"Files and media not allowed" = "不允许文件和媒体";
/* No comment provided by engineer. */
"Files and media prohibited!" = "禁止文件和媒体!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "过滤未读和收藏的聊天记录。";
/* No comment provided by engineer. */
"Finalize migration" = "完成迁移";
/* No comment provided by engineer. */
"Finalize migration on another device." = "在另一部设备上完成迁移";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "终于我们有它们了! 🚀";
@@ -1704,6 +1800,21 @@
/* No comment provided by engineer. */
"For console" = "用于控制台";
/* chat item action */
"Forward" = "转发";
/* No comment provided by engineer. */
"Forward and save messages" = "转发并保存消息";
/* No comment provided by engineer. */
"forwarded" = "已转发";
/* No comment provided by engineer. */
"Forwarded" = "已转发";
/* No comment provided by engineer. */
"Forwarded from" = "转发自";
/* No comment provided by engineer. */
"Found desktop" = "找到了桌面";
@@ -1779,6 +1890,9 @@
/* No comment provided by engineer. */
"Group members can send files and media." = "群组成员可以发送文件和媒体。";
/* No comment provided by engineer. */
"Group members can send SimpleX links." = "群成员可发送 SimpleX 链接。";
/* No comment provided by engineer. */
"Group members can send voice messages." = "群组成员可以发送语音消息。";
@@ -1896,6 +2010,12 @@
/* No comment provided by engineer. */
"Import database" = "导入数据库";
/* No comment provided by engineer. */
"Import failed" = "导入失败了";
/* No comment provided by engineer. */
"Importing archive" = "正在导入存档";
/* No comment provided by engineer. */
"Improved message delivery" = "改进了消息传递";
@@ -1905,9 +2025,15 @@
/* No comment provided by engineer. */
"Improved server configuration" = "改进的服务器配置";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "必须停止聊天才能继续。";
/* No comment provided by engineer. */
"In reply to" = "答复";
/* No comment provided by engineer. */
"In-call sounds" = "通话声音";
/* No comment provided by engineer. */
"Incognito" = "隐身聊天";
@@ -1986,6 +2112,12 @@
/* No comment provided by engineer. */
"Invalid display name!" = "无效的显示名!";
/* No comment provided by engineer. */
"Invalid link" = "无效链接";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "迁移确认无效";
/* No comment provided by engineer. */
"Invalid name!" = "无效名称!";
@@ -2232,18 +2364,45 @@
/* notification */
"message received" = "消息已收到";
/* No comment provided by engineer. */
"Message source remains private." = "消息来源保持私密。";
/* No comment provided by engineer. */
"Message text" = "消息正文";
/* No comment provided by engineer. */
"Message too large" = "消息太大了";
/* No comment provided by engineer. */
"Messages" = "消息";
/* No comment provided by engineer. */
"Messages & files" = "消息";
/* No comment provided by engineer. */
"Migrate device" = "迁移设备";
/* No comment provided by engineer. */
"Migrate from another device" = "从另一台设备迁移";
/* No comment provided by engineer. */
"Migrate here" = "迁移到此处";
/* No comment provided by engineer. */
"Migrate to another device" = "迁移到另一部设备";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "通过二维码迁移到另一部设备。";
/* No comment provided by engineer. */
"Migrating" = "迁移中";
/* No comment provided by engineer. */
"Migrating database archive…" = "迁移数据库档案中…";
/* No comment provided by engineer. */
"Migration complete" = "迁移完毕";
/* No comment provided by engineer. */
"Migration error:" = "迁移错误:";
@@ -2283,12 +2442,12 @@
/* No comment provided by engineer. */
"More improvements are coming soon!" = "更多改进即将推出!";
/* No comment provided by engineer. */
"More reliable network connection." = "更可靠的网络连接。";
/* item status description */
"Most likely this connection is deleted." = "此连接很可能已被删除。";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "很可能此联系人已经删除了与您的联系。";
/* No comment provided by engineer. */
"Multiple chat profiles" = "多个聊天资料";
@@ -2304,6 +2463,12 @@
/* No comment provided by engineer. */
"Network & servers" = "网络和服务器";
/* No comment provided by engineer. */
"Network connection" = "网络连接";
/* No comment provided by engineer. */
"Network management" = "网络管理";
/* No comment provided by engineer. */
"Network settings" = "网络设置";
@@ -2382,6 +2547,9 @@
/* No comment provided by engineer. */
"No history" = "无历史记录";
/* No comment provided by engineer. */
"No network connection" = "无网络连接";
/* No comment provided by engineer. */
"No permission to record voice message" = "没有录制语音消息的权限";
@@ -2510,15 +2678,27 @@
/* No comment provided by engineer. */
"Open-source protocol and code anybody can run the servers." = "开源协议和代码——任何人都可以运行服务器。";
/* No comment provided by engineer. */
"Or paste archive link" = "或粘贴存档链接";
/* No comment provided by engineer. */
"Or scan QR code" = "或者扫描二维码";
/* No comment provided by engineer. */
"Or securely share this file link" = "或安全地分享此文件链接";
/* No comment provided by engineer. */
"Or show this code" = "或者显示此码";
/* No comment provided by engineer. */
"Other" = "其他";
/* member role */
"owner" = "群主";
/* feature role */
"owners" = "所有者";
/* No comment provided by engineer. */
"Passcode" = "密码";
@@ -2561,6 +2741,9 @@
/* message decrypt error item */
"Permanent decryption error" = "解密错误";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "画中画通话";
/* No comment provided by engineer. */
"PING count" = "PING 次数";
@@ -2579,6 +2762,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "请检查您和您的联系人偏好设置。";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "请确认网络设置对此这台设备正确无误。";
/* No comment provided by engineer. */
"Please contact group admin." = "请联系群组管理员。";
@@ -2639,6 +2825,9 @@
/* No comment provided by engineer. */
"Profile image" = "资料图片";
/* No comment provided by engineer. */
"Profile images" = "个人资料图";
/* No comment provided by engineer. */
"Profile name:" = "显示名:";
@@ -2687,6 +2876,12 @@
/* No comment provided by engineer. */
"Push notifications" = "推送通知";
/* chat item text */
"quantum resistant e2e encryption" = "抗量子端到端加密";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "抗量子加密";
/* No comment provided by engineer. */
"Rate the app" = "评价此应用程序";
@@ -2744,6 +2939,9 @@
/* No comment provided by engineer. */
"Receiving via" = "接收通过";
/* No comment provided by engineer. */
"Recipient(s) can't see who this message is from." = "收件人看不到这条消息来自何人。";
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "对方会在您键入时看到更新。";
@@ -2819,9 +3017,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "重复连接请求吗?";
/* No comment provided by engineer. */
"Repeat download" = "重复下载";
/* No comment provided by engineer. */
"Repeat import" = "重复导入";
/* No comment provided by engineer. */
"Repeat join request?" = "重复加入请求吗?";
/* No comment provided by engineer. */
"Repeat upload" = "重复上传";
/* chat item action */
"Reply" = "回复";
@@ -2879,6 +3086,9 @@
/* No comment provided by engineer. */
"Run chat" = "运行聊天程序";
/* No comment provided by engineer. */
"Safer groups" = "更安全的群组";
/* chat item action */
"Save" = "保存";
@@ -2927,6 +3137,15 @@
/* No comment provided by engineer. */
"Save welcome message?" = "保存欢迎信息?";
/* No comment provided by engineer. */
"saved" = "已保存";
/* No comment provided by engineer. */
"Saved" = "已保存";
/* No comment provided by engineer. */
"Saved from" = "保存自";
/* message info title */
"Saved message" = "已保存的消息";
@@ -3119,6 +3338,9 @@
/* No comment provided by engineer. */
"Set passcode" = "设置密码";
/* No comment provided by engineer. */
"Set passphrase" = "设置密码短语";
/* No comment provided by engineer. */
"Set passphrase to export" = "设置密码来导出";
@@ -3131,6 +3353,9 @@
/* No comment provided by engineer. */
"Settings" = "设置";
/* No comment provided by engineer. */
"Shape profile images" = "改变个人资料图形状";
/* chat item action */
"Share" = "分享";
@@ -3164,6 +3389,9 @@
/* No comment provided by engineer. */
"Show preview" = "显示预览";
/* No comment provided by engineer. */
"Show QR code" = "显示二维码";
/* No comment provided by engineer. */
"Show:" = "显示:";
@@ -3188,6 +3416,12 @@
/* chat feature */
"SimpleX links" = "SimpleX 链接";
/* No comment provided by engineer. */
"SimpleX links are prohibited in this group." = "此群禁止 SimpleX 链接。";
/* No comment provided by engineer. */
"SimpleX links not allowed" = "不允许SimpleX 链接";
/* No comment provided by engineer. */
"SimpleX Lock" = "SimpleX 锁定";
@@ -3224,6 +3458,12 @@
/* notification title */
"Somebody" = "某人";
/* No comment provided by engineer. */
"Square, circle, or anything in between." = "方形、圆形、或两者之间的任意形状";
/* chat item text */
"standard end-to-end encryption" = "标准端到端加密";
/* No comment provided by engineer. */
"Start chat" = "开始聊天";
@@ -3239,6 +3479,9 @@
/* No comment provided by engineer. */
"Stop" = "停止";
/* No comment provided by engineer. */
"Stop chat" = "停止聊天程序";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "停止聊天以启用数据库操作";
@@ -3266,6 +3509,9 @@
/* authentication reason */
"Stop SimpleX" = "停止 SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "正在停止聊天";
/* No comment provided by engineer. */
"strike" = "删去";
@@ -3416,6 +3662,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "此操作无法撤消——您的个人资料、联系人、消息和文件将不可撤回地丢失。";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "此聊天受端到端加密保护。";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "此聊天受抗量子的端到端加密保护。";
/* notification title */
"this contact" = "这个联系人";
@@ -3509,9 +3761,6 @@
/* No comment provided by engineer. */
"Unblock member?" = "解封成员吗?";
/* item status description */
"Unexpected error: %@" = "意外错误: @";
/* No comment provided by engineer. */
"Unexpected migration state" = "未预料的迁移状态";
@@ -3602,9 +3851,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "升级并打开聊天";
/* No comment provided by engineer. */
"Upload failed" = "上传失败了";
/* server test step */
"Upload file" = "上传文件";
/* No comment provided by engineer. */
"Uploading archive" = "正在上传存档";
/* No comment provided by engineer. */
"Use .onion hosts" = "使用 .onion 主机";
@@ -3632,6 +3887,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "使用 SimpleX Chat 服务器?";
/* No comment provided by engineer. */
"Use the app while in the call." = "通话时使用本应用";
/* No comment provided by engineer. */
"User profile" = "用户资料";
@@ -3656,6 +3914,12 @@
/* No comment provided by engineer. */
"Verify connections" = "验证连接";
/* No comment provided by engineer. */
"Verify database passphrase" = "验证数据库密码短语";
/* No comment provided by engineer. */
"Verify passphrase" = "验证密码短语";
/* No comment provided by engineer. */
"Verify security code" = "验证安全码";
@@ -3710,6 +3974,9 @@
/* No comment provided by engineer. */
"Voice messages are prohibited in this group." = "语音信息在该群组中被禁用。";
/* No comment provided by engineer. */
"Voice messages not allowed" = "不允许语音消息";
/* No comment provided by engineer. */
"Voice messages prohibited!" = "语音消息禁止发送!";
@@ -3731,6 +3998,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "想要与您连接!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "警告:不支持在多部设备上启动聊天,这么做会导致消息传送失败。";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "警告:您可能会丢失部分数据!";
@@ -3746,18 +4016,33 @@
/* No comment provided by engineer. */
"Welcome message" = "欢迎消息";
/* No comment provided by engineer. */
"Welcome message is too long" = "欢迎消息太大了";
/* No comment provided by engineer. */
"What's new" = "更新内容";
/* No comment provided by engineer. */
"When available" = "当可用时";
/* No comment provided by engineer. */
"When connecting audio and video calls." = "连接音频和视频通话时。";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "当人们请求连接时,您可以接受或拒绝它。";
/* No comment provided by engineer. */
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "当您与某人共享隐身聊天资料时,该资料将用于他们邀请您加入的群组。";
/* No comment provided by engineer. */
"WiFi" = "WiFi";
/* No comment provided by engineer. */
"Will be enabled in direct chats!" = "将在私聊中启用!";
/* No comment provided by engineer. */
"Wired ethernet" = "有线以太网";
/* No comment provided by engineer. */
"With encrypted files and media." = "加密的文件和媒体。";
@@ -3779,6 +4064,9 @@
/* pref value */
"yes" = "是";
/* No comment provided by engineer. */
"you" = "您";
/* No comment provided by engineer. */
"You" = "您";
@@ -3824,6 +4112,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "您可以稍后通过应用程序的 \"隐私与安全 \"设置启用它们。";
/* No comment provided by engineer. */
"You can give another try." = "你可以再试一次。";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "您可以隐藏或静音用户个人资料——只需向右滑动。";
@@ -88,6 +88,7 @@ android {
"cs",
"de",
"es",
"fa",
"fi",
"fr",
"hu",
@@ -7,7 +7,7 @@ import chat.simplex.app.SimplexService.Companion.showPassphraseNotification
import chat.simplex.common.model.ChatController
import chat.simplex.common.views.helpers.DBMigrationResult
import chat.simplex.common.platform.chatModel
import chat.simplex.common.platform.initChatControllerAndRunMigrations
import chat.simplex.common.platform.initChatControllerOnStart
import chat.simplex.common.views.helpers.DatabaseUtils
import kotlinx.coroutines.*
import java.util.Date
@@ -60,7 +60,7 @@ class MessagesFetcherWork(
try {
// In case of self-destruct is enabled the initialization process will not start in SimplexApp, Let's start it here
if (DatabaseUtils.ksSelfDestructPassword.get() != null && chatModel.chatDbStatus.value == null) {
initChatControllerAndRunMigrations()
initChatControllerOnStart()
}
withTimeout(durationSeconds * 1000L) {
val chatController = ChatController
@@ -6,7 +6,6 @@ import android.content.Context
import chat.simplex.common.platform.Log
import android.content.Intent
import android.content.pm.ActivityInfo
import android.media.AudioManager
import android.os.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
@@ -66,6 +65,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
context = this
initHaskell()
initMultiplatform()
runMigrations()
tmpDir.deleteRecursively()
tmpDir.mkdir()
@@ -74,7 +74,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
// It's important, otherwise, user may be locked in undefined state
appPrefs.onboardingStage.set(OnboardingStage.Step1_SimpleXInfo)
} else if (DatabaseUtils.ksAppPassword.get() == null || DatabaseUtils.ksSelfDestructPassword.get() == null) {
initChatControllerAndRunMigrations()
initChatControllerOnStart()
}
ProcessLifecycleOwner.get().lifecycle.addObserver(this@SimplexApp)
}
@@ -254,7 +254,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
override fun androidSetNightModeIfSupported() {
if (Build.VERSION.SDK_INT < 31) return
val light = if (CurrentColors.value.name == DefaultTheme.SYSTEM.name) {
val light = if (CurrentColors.value.name == DefaultTheme.SYSTEM_THEME_NAME) {
null
} else {
CurrentColors.value.colors.isLight
@@ -77,7 +77,7 @@ class SimplexService: Service() {
isServiceStarted = true
// In case of self-destruct is enabled the initialization process will not start in SimplexApp, Let's start it here
if (DatabaseUtils.ksSelfDestructPassword.get() != null && chatModel.chatDbStatus.value == null) {
initChatControllerAndRunMigrations()
initChatControllerOnStart()
}
}
}
@@ -77,7 +77,7 @@ object NtfManager {
val msgNtfs = manager.activeNotifications.filter { ntf ->
ntf.notification.channelId == MessageChannel
}
if (msgNtfs.count() == 1) {
if (msgNtfs.size <= 1) {
// Have a group notification with no children so cancel it
manager.cancel(0)
}
@@ -2,6 +2,5 @@
<resources>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="highOrLowLight">#8b8786</color>
<color name="window_background_dark">#121212</color>
</resources>
+4 -1
View File
@@ -37,7 +37,7 @@ kotlin {
api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
api("org.jetbrains.kotlinx:kotlinx-datetime:0.5.0")
api("com.russhwolf:multiplatform-settings:1.1.1")
api("com.charleskorn.kaml:kaml:0.58.0")
api("com.charleskorn.kaml:kaml:0.59.0")
api("org.jetbrains.compose.ui:ui-text:${rootProject.extra["compose.version"] as String}")
implementation("org.jetbrains.compose.components:components-animatedimage:${rootProject.extra["compose.version"] as String}")
//Barcode
@@ -53,6 +53,9 @@ kotlin {
val commonTest by getting {
dependencies {
implementation(kotlin("test"))
implementation(kotlin("test-junit"))
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
@@ -17,6 +17,6 @@ val NotificationsMode.requiresIgnoringBattery
lateinit var APPLICATION_ID: String
fun Uri.toURI(): URI = URI(toString())
fun Uri.toURI(): URI = URI(toString().replace("\n", ""))
fun URI.toUri(): Uri = Uri.parse(toString())
@@ -15,8 +15,10 @@ actual val dataDir: File = androidAppContext.dataDir
actual val tmpDir: File = androidAppContext.getDir("temp", Application.MODE_PRIVATE)
actual val filesDir: File = File(dataDir.absolutePath + File.separator + "files")
actual val appFilesDir: File = File(filesDir.absolutePath + File.separator + "app_files")
actual val wallpapersDir: File = File(filesDir.absolutePath + File.separator + "assets" + File.separator + "wallpapers").also { it.mkdirs() }
actual val coreTmpDir: File = File(filesDir.absolutePath + File.separator + "temp_files")
actual val dbAbsolutePrefixPath: String = dataDir.absolutePath + File.separator + "files"
actual val preferencesDir = File(dataDir.absolutePath + File.separator + "shared_prefs")
actual val chatDatabaseFileName: String = "files_chat.db"
actual val agentDatabaseFileName: String = "files_agent.db"
@@ -7,6 +7,8 @@ import android.content.SharedPreferences
import android.content.res.Configuration
import android.text.BidiFormatter
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.Font
@@ -14,9 +16,11 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.core.graphics.drawable.toBitmap
import chat.simplex.common.model.AppPreferences
import com.russhwolf.settings.Settings
import com.russhwolf.settings.SharedPreferencesSettings
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.StringResource
import dev.icerock.moko.resources.desc.desc
@@ -51,3 +55,6 @@ actual fun windowWidth(): Dp = LocalConfiguration.current.screenWidthDp.dp
actual fun desktopExpandWindowToWidth(width: Dp) {}
actual fun isRtl(text: CharSequence): Boolean = BidiFormatter.getInstance().isRtl(text)
actual fun ImageResource.toComposeImageBitmap(): ImageBitmap? =
getDrawable(androidAppContext)?.toBitmap()?.asImageBitmap()
@@ -11,6 +11,7 @@ import android.media.*
import android.os.Build
import android.os.PowerManager
import android.os.PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK
import android.view.View
import android.view.ViewGroup
import android.webkit.*
import androidx.compose.desktop.ui.tooling.preview.Preview
@@ -670,37 +671,43 @@ fun WebRTCView(callCommand: SnapshotStateList<WCallCommand>, onResponse: (WVAPIM
Box(Modifier.fillMaxSize()) {
AndroidView(
factory = { AndroidViewContext ->
(staticWebView ?: WebView(androidAppContext)).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
this.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.origin.toString().startsWith("file:/")) {
request.grant(request.resources)
} else {
Log.d(TAG, "Permission request from webview denied.")
request.deny()
try {
(staticWebView ?: WebView(androidAppContext)).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
this.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.origin.toString().startsWith("file:/")) {
request.grant(request.resources)
} else {
Log.d(TAG, "Permission request from webview denied.")
request.deny()
}
}
}
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
this.clearHistory()
this.clearCache(true)
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
this.setBackgroundColor(android.graphics.Color.BLACK)
val webViewSettings = this.settings
webViewSettings.allowFileAccess = true
webViewSettings.allowContentAccess = true
webViewSettings.javaScriptEnabled = true
webViewSettings.mediaPlaybackRequiresUserGesture = false
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
if (staticWebView == null) {
this.loadUrl("file:android_asset/www/android/call.html")
} else {
webView.value = this
}
}
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
this.clearHistory()
this.clearCache(true)
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
this.setBackgroundColor(android.graphics.Color.BLACK)
val webViewSettings = this.settings
webViewSettings.allowFileAccess = true
webViewSettings.allowContentAccess = true
webViewSettings.javaScriptEnabled = true
webViewSettings.mediaPlaybackRequiresUserGesture = false
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
if (staticWebView == null) {
this.loadUrl("file:android_asset/www/android/call.html")
} else {
webView.value = this
}
} catch (e: Exception) {
Log.e(TAG, "Error initializing WebView: ${e.stackTraceToString()}")
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error), generalGetString(MR.strings.error_initializing_web_view).format(e.stackTraceToString()))
return@AndroidView View(androidAppContext)
}
}
) { /* WebView */ }
@@ -19,14 +19,10 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.*
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
import chat.simplex.common.R
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
@@ -34,7 +30,6 @@ import chat.simplex.common.model.ChatModel
import chat.simplex.common.platform.*
import chat.simplex.common.helpers.APPLICATION_ID
import chat.simplex.common.helpers.saveAppLocale
import chat.simplex.common.views.usersettings.AppearanceScope.ColorEditor
import chat.simplex.res.MR
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.compose.painterResource
@@ -46,9 +41,8 @@ enum class AppIcon(val image: ImageResource) {
}
@Composable
actual fun AppearanceView(m: ChatModel, showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit)) {
actual fun AppearanceView(m: ChatModel) {
val appIcon = remember { mutableStateOf(findEnabledIcon()) }
fun setAppIcon(newIcon: AppIcon) {
if (appIcon.value == newIcon) return
val newComponent = ComponentName(APPLICATION_ID, "chat.simplex.app.MainActivity_${newIcon.name.lowercase()}")
@@ -65,18 +59,11 @@ actual fun AppearanceView(m: ChatModel, showSettingsModal: (@Composable (ChatMod
appIcon.value = newIcon
}
AppearanceScope.AppearanceLayout(
appIcon,
m.controller.appPrefs.appLanguage,
m.controller.appPrefs.systemDarkTheme,
changeIcon = ::setAppIcon,
showSettingsModal = showSettingsModal,
editColor = { name, initialColor ->
ModalManager.start.showModalCloseable { close ->
ColorEditor(name, initialColor, close)
}
},
)
}
@@ -86,8 +73,6 @@ fun AppearanceScope.AppearanceLayout(
languagePref: SharedPreference<String?>,
systemDarkTheme: SharedPreference<String?>,
changeIcon: (AppIcon) -> Unit,
showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit),
editColor: (ThemeColor, Color) -> Unit,
) {
ColumnWithScrollBar(
Modifier.fillMaxWidth(),
@@ -120,6 +105,13 @@ fun AppearanceScope.AppearanceLayout(
}
// }
}
SectionDividerSpaced(maxTopPadding = true)
ThemesSection(systemDarkTheme)
SectionDividerSpaced(maxTopPadding = true)
ProfileImageSection()
SectionDividerSpaced()
SectionView(stringResource(MR.strings.settings_section_title_icon), padding = PaddingValues(horizontal = DEFAULT_PADDING_HALF)) {
@@ -145,11 +137,6 @@ fun AppearanceScope.AppearanceLayout(
}
}
SectionDividerSpaced(maxTopPadding = true)
ProfileImageSection()
SectionDividerSpaced(maxTopPadding = true)
ThemesSection(systemDarkTheme, showSettingsModal, editColor)
SectionBottomSpacer()
}
}
@@ -169,8 +156,6 @@ fun PreviewAppearanceSettings() {
languagePref = SharedPreference({ null }, {}),
systemDarkTheme = SharedPreference({ null }, {}),
changeIcon = {},
showSettingsModal = { {} },
editColor = { _, _ -> },
)
}
}
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@color/highOrLowLight" />
<solid android:color="#8b8786" />
<size android:width="1dp" />
</shape>
@@ -4,7 +4,7 @@ import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.runtime.snapshots.SnapshotStateMap
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.*
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.font.*
import androidx.compose.ui.text.style.TextDecoration
@@ -399,6 +399,18 @@ object ChatModel {
currentUser.value = updated
}
fun updateCurrentUserUiThemes(rhId: Long?, uiThemes: ThemeModeOverrides?) {
val current = currentUser.value ?: return
val updated = current.copy(
uiThemes = uiThemes
)
val i = users.indexOfFirst { it.user.userId == current.userId && it.user.remoteHostId == rhId }
if (i != -1) {
users[i] = users[i].copy(user = updated)
}
currentUser.value = updated
}
suspend fun addLiveDummy(chatInfo: ChatInfo): ChatItem {
val cItem = ChatItem.liveDummy(chatInfo is ChatInfo.Direct)
withContext(Dispatchers.Main) {
@@ -682,7 +694,8 @@ data class User(
override val showNtfs: Boolean,
val sendRcptsContacts: Boolean,
val sendRcptsSmallGroups: Boolean,
val viewPwdHash: UserPwdHash?
val viewPwdHash: UserPwdHash?,
val uiThemes: ThemeModeOverrides? = null,
): NamedChat, UserLike {
override val displayName: String get() = profile.displayName
override val fullName: String get() = profile.fullName
@@ -709,6 +722,7 @@ data class User(
sendRcptsContacts = true,
sendRcptsSmallGroups = false,
viewPwdHash = null,
uiThemes = null,
)
}
}
@@ -1041,16 +1055,21 @@ data class Contact(
override val updatedAt: Instant,
val chatTs: Instant?,
val contactGroupMemberId: Long? = null,
val contactGrpInvSent: Boolean
val contactGrpInvSent: Boolean,
val uiThemes: ThemeModeOverrides? = null,
): SomeChat, NamedChat {
override val chatType get() = ChatType.Direct
override val id get() = "@$contactId"
override val apiId get() = contactId
override val ready get() = activeConn?.connStatus == ConnStatus.Ready
val active get() = contactStatus == ContactStatus.Active
override val sendMsgEnabled get() =
(ready && active && !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?: false))
|| nextSendGrpInv
override val sendMsgEnabled get() = (
ready
&& active
&& !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?: false)
&& !(activeConn?.connDisabled ?: true)
)
|| nextSendGrpInv
val nextSendGrpInv get() = contactGroupMemberId != null && !contactGrpInvSent
override val ntfsEnabled get() = chatSettings.enableNtfs == MsgFilter.All
override val incognito get() = contactConnIncognito
@@ -1109,7 +1128,8 @@ data class Contact(
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
chatTs = Clock.System.now(),
contactGrpInvSent = false
contactGrpInvSent = false,
uiThemes = null,
)
}
}
@@ -1150,15 +1170,19 @@ data class Connection(
val pqEncryption: Boolean,
val pqSndEnabled: Boolean? = null,
val pqRcvEnabled: Boolean? = null,
val connectionStats: ConnectionStats? = null
val connectionStats: ConnectionStats? = null,
val authErrCounter: Int
) {
val id: ChatId get() = ":$connId"
val connDisabled: Boolean
get() = authErrCounter >= 10 // authErrDisableCount in core
val connPQEnabled: Boolean
get() = pqSndEnabled == true && pqRcvEnabled == true
companion object {
val sampleData = Connection(connId = 1, agentConnId = "abc", connStatus = ConnStatus.Ready, connLevel = 0, viaGroupLink = false, peerChatVRange = VersionRange(1, 1), customUserProfileId = null, pqSupport = false, pqEncryption = false)
val sampleData = Connection(connId = 1, agentConnId = "abc", connStatus = ConnStatus.Ready, connLevel = 0, viaGroupLink = false, peerChatVRange = VersionRange(1, 1), customUserProfileId = null, pqSupport = false, pqEncryption = false, authErrCounter = 0)
}
}
@@ -1245,7 +1269,8 @@ data class GroupInfo (
val chatSettings: ChatSettings,
override val createdAt: Instant,
override val updatedAt: Instant,
val chatTs: Instant?
val chatTs: Instant?,
val uiThemes: ThemeModeOverrides? = null,
): SomeChat, NamedChat {
override val chatType get() = ChatType.Group
override val id get() = "#$groupId"
@@ -1287,7 +1312,8 @@ data class GroupInfo (
chatSettings = ChatSettings(enableNtfs = MsgFilter.All, sendRcpts = null, favorite = false),
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
chatTs = Clock.System.now()
chatTs = Clock.System.now(),
uiThemes = null,
)
}
}
@@ -1900,18 +1926,20 @@ data class ChatItem (
ts: Instant = Clock.System.now(),
text: String = "hello\nthere",
status: CIStatus = CIStatus.SndNew(),
sentViaProxy: Boolean? = null,
quotedItem: CIQuote? = null,
file: CIFile? = null,
itemForwarded: CIForwardedFrom? = null,
itemDeleted: CIDeleted? = null,
itemEdited: Boolean = false,
itemTimed: CITimed? = null,
itemLive: Boolean = false,
deletable: Boolean = true,
editable: Boolean = true
) =
ChatItem(
chatDir = dir,
meta = CIMeta.getSample(id, ts, text, status, itemForwarded, itemDeleted, itemEdited, itemTimed, deletable, editable),
meta = CIMeta.getSample(id, ts, text, status, sentViaProxy, itemForwarded, itemDeleted, itemEdited, itemTimed, itemLive, deletable, editable),
content = CIContent.SndMsgContent(msgContent = MsgContent.MCText(text)),
quotedItem = quotedItem,
reactions = listOf(),
@@ -1993,6 +2021,7 @@ data class ChatItem (
itemTs = Clock.System.now(),
itemText = generalGetString(MR.strings.deleted_description),
itemStatus = CIStatus.RcvRead(),
sentViaProxy = null,
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
itemForwarded = null,
@@ -2016,6 +2045,7 @@ data class ChatItem (
itemTs = Clock.System.now(),
itemText = "",
itemStatus = CIStatus.RcvRead(),
sentViaProxy = null,
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
itemForwarded = null,
@@ -2118,6 +2148,7 @@ data class CIMeta (
val itemTs: Instant,
val itemText: String,
val itemStatus: CIStatus,
val sentViaProxy: Boolean?,
val createdAt: Instant,
val updatedAt: Instant,
val itemForwarded: CIForwardedFrom?,
@@ -2144,7 +2175,7 @@ data class CIMeta (
companion object {
fun getSample(
id: Long, ts: Instant, text: String, status: CIStatus = CIStatus.SndNew(),
id: Long, ts: Instant, text: String, status: CIStatus = CIStatus.SndNew(), sentViaProxy: Boolean? = null,
itemForwarded: CIForwardedFrom? = null, itemDeleted: CIDeleted? = null, itemEdited: Boolean = false,
itemTimed: CITimed? = null, itemLive: Boolean = false, deletable: Boolean = true, editable: Boolean = true
): CIMeta =
@@ -2153,6 +2184,7 @@ data class CIMeta (
itemTs = ts,
itemText = text,
itemStatus = status,
sentViaProxy = sentViaProxy,
createdAt = ts,
updatedAt = ts,
itemForwarded = itemForwarded,
@@ -2171,6 +2203,7 @@ data class CIMeta (
itemTs = Clock.System.now(),
itemText = "invalid JSON",
itemStatus = CIStatus.SndNew(),
sentViaProxy = null,
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
itemForwarded = null,
@@ -2227,7 +2260,8 @@ sealed class CIStatus {
@Serializable @SerialName("sndSent") class SndSent(val sndProgress: SndCIStatusProgress): CIStatus()
@Serializable @SerialName("sndRcvd") class SndRcvd(val msgRcptStatus: MsgReceiptStatus, val sndProgress: SndCIStatusProgress): CIStatus()
@Serializable @SerialName("sndErrorAuth") class SndErrorAuth: CIStatus()
@Serializable @SerialName("sndError") class SndError(val agentError: String): CIStatus()
@Serializable @SerialName("sndError") class CISSndError(val agentError: SndError): CIStatus()
@Serializable @SerialName("sndWarning") class SndWarning(val agentError: SndError): CIStatus()
@Serializable @SerialName("rcvNew") class RcvNew: CIStatus()
@Serializable @SerialName("rcvRead") class RcvRead: CIStatus()
@Serializable @SerialName("invalid") class Invalid(val text: String): CIStatus()
@@ -2251,7 +2285,8 @@ sealed class CIStatus {
MsgReceiptStatus.BadMsgHash -> MR.images.ic_double_check to Color.Red
}
is SndErrorAuth -> MR.images.ic_close to Color.Red
is SndError -> MR.images.ic_warning_filled to WarningYellow
is CISSndError -> MR.images.ic_close to Color.Red
is SndWarning -> MR.images.ic_warning_filled to WarningOrange
is RcvNew -> MR.images.ic_circle_filled to primaryColor
is RcvRead -> null
is CIStatus.Invalid -> MR.images.ic_question_mark to metaColor
@@ -2262,13 +2297,48 @@ sealed class CIStatus {
is SndSent -> null
is SndRcvd -> null
is SndErrorAuth -> generalGetString(MR.strings.message_delivery_error_title) to generalGetString(MR.strings.message_delivery_error_desc)
is SndError -> generalGetString(MR.strings.message_delivery_error_title) to (generalGetString(MR.strings.unknown_error) + ": $agentError")
is CISSndError -> generalGetString(MR.strings.message_delivery_error_title) to agentError.errorInfo
is SndWarning -> generalGetString(MR.strings.message_delivery_warning_title) to agentError.errorInfo
is RcvNew -> null
is RcvRead -> null
is Invalid -> "Invalid status" to this.text
}
}
@Serializable
sealed class SndError {
@Serializable @SerialName("auth") class Auth: SndError()
@Serializable @SerialName("quota") class Quota: SndError()
@Serializable @SerialName("expired") class Expired: SndError()
@Serializable @SerialName("relay") class Relay(val srvError: SrvError): SndError()
@Serializable @SerialName("proxy") class Proxy(val proxyServer: String, val srvError: SrvError): SndError()
@Serializable @SerialName("proxyRelay") class ProxyRelay(val proxyServer: String, val srvError: SrvError): SndError()
@Serializable @SerialName("other") class Other(val sndError: String): SndError()
val errorInfo: String get() = when (this) {
is SndError.Auth -> generalGetString(MR.strings.snd_error_auth)
is SndError.Quota -> generalGetString(MR.strings.snd_error_quota)
is SndError.Expired -> generalGetString(MR.strings.snd_error_expired)
is SndError.Relay -> generalGetString(MR.strings.snd_error_relay).format(srvError.errorInfo)
is SndError.Proxy -> generalGetString(MR.strings.snd_error_proxy).format(proxyServer, srvError.errorInfo)
is SndError.ProxyRelay -> generalGetString(MR.strings.snd_error_proxy_relay).format(proxyServer, srvError.errorInfo)
is SndError.Other -> generalGetString(MR.strings.ci_status_other_error).format(sndError)
}
}
@Serializable
sealed class SrvError {
@Serializable @SerialName("host") class Host: SrvError()
@Serializable @SerialName("version") class Version: SrvError()
@Serializable @SerialName("other") class Other(val srvError: String): SrvError()
val errorInfo: String get() = when (this) {
is SrvError.Host -> generalGetString(MR.strings.srv_error_host)
is SrvError.Version -> generalGetString(MR.strings.srv_error_version)
is SrvError.Other -> srvError
}
}
@Serializable
enum class MsgReceiptStatus {
@SerialName("ok") Ok,
@@ -2593,6 +2663,7 @@ data class CIFile(
is CIFileStatus.RcvInvitation -> false
is CIFileStatus.RcvAccepted -> false
is CIFileStatus.RcvTransfer -> false
is CIFileStatus.RcvAborted -> false
is CIFileStatus.RcvCancelled -> false
is CIFileStatus.RcvComplete -> true
is CIFileStatus.RcvError -> false
@@ -2614,6 +2685,7 @@ data class CIFile(
is CIFileStatus.RcvInvitation -> null
is CIFileStatus.RcvAccepted -> rcvCancelAction
is CIFileStatus.RcvTransfer -> rcvCancelAction
is CIFileStatus.RcvAborted -> null
is CIFileStatus.RcvCancelled -> null
is CIFileStatus.RcvComplete -> null
is CIFileStatus.RcvError -> null
@@ -2794,6 +2866,7 @@ sealed class CIFileStatus {
@Serializable @SerialName("rcvInvitation") object RcvInvitation: CIFileStatus()
@Serializable @SerialName("rcvAccepted") object RcvAccepted: CIFileStatus()
@Serializable @SerialName("rcvTransfer") class RcvTransfer(val rcvProgress: Long, val rcvTotal: Long): CIFileStatus()
@Serializable @SerialName("rcvAborted") object RcvAborted: CIFileStatus()
@Serializable @SerialName("rcvComplete") object RcvComplete: CIFileStatus()
@Serializable @SerialName("rcvCancelled") object RcvCancelled: CIFileStatus()
@Serializable @SerialName("rcvError") object RcvError: CIFileStatus()
@@ -2808,6 +2881,7 @@ sealed class CIFileStatus {
is RcvInvitation -> false
is RcvAccepted -> false
is RcvTransfer -> false
is RcvAborted -> false
is RcvComplete -> false
is RcvCancelled -> false
is RcvError -> false
@@ -3354,7 +3428,8 @@ data class ChatItemVersion(
@Serializable
data class MemberDeliveryStatus(
val groupMemberId: Long,
val memberDeliveryStatus: CIStatus
val memberDeliveryStatus: CIStatus,
val sentViaProxy: Boolean?
)
enum class NotificationPreviewMode {
@@ -12,6 +12,7 @@ import dev.icerock.moko.resources.compose.painterResource
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.call.*
import chat.simplex.common.views.chat.group.toggleShowMemberMessages
import chat.simplex.common.views.migration.MigrationFileLinkData
import chat.simplex.common.views.onboarding.OnboardingStage
import chat.simplex.common.views.usersettings.*
@@ -25,8 +26,7 @@ import kotlinx.coroutines.sync.withLock
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.*
import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.builtins.*
import kotlinx.serialization.json.*
import java.util.Date
@@ -106,6 +106,7 @@ class AppPreferences {
val privacySaveLastDraft = mkBoolPreference(SHARED_PREFS_PRIVACY_SAVE_LAST_DRAFT, true)
val privacyDeliveryReceiptsSet = mkBoolPreference(SHARED_PREFS_PRIVACY_DELIVERY_RECEIPTS_SET, false)
val privacyEncryptLocalFiles = mkBoolPreference(SHARED_PREFS_PRIVACY_ENCRYPT_LOCAL_FILES, true)
val privacyAskToApproveRelays = mkBoolPreference(SHARED_PREFS_PRIVACY_ASK_TO_APPROVE_RELAYS, true)
val experimentalCalls = mkBoolPreference(SHARED_PREFS_EXPERIMENTAL_CALLS, false)
val showUnreadAndFavorites = mkBoolPreference(SHARED_PREFS_SHOW_UNREAD_AND_FAVORITES, false)
val chatArchiveName = mkStrPreference(SHARED_PREFS_CHAT_ARCHIVE_NAME, null)
@@ -130,6 +131,8 @@ class AppPreferences {
},
set = fun(mode: TransportSessionMode) { _networkSessionMode.set(mode.name) }
)
val networkSMPProxyMode = mkStrPreference(SHARED_PREFS_NETWORK_SMP_PROXY_MODE, SMPProxyMode.Never.name)
val networkSMPProxyFallback = mkStrPreference(SHARED_PREFS_NETWORK_SMP_PROXY_FALLBACK, SMPProxyFallback.Allow.name)
val networkHostMode = mkStrPreference(SHARED_PREFS_NETWORK_HOST_MODE, HostMode.OnionViaSocks.name)
val networkRequiredHostMode = mkBoolPreference(SHARED_PREFS_NETWORK_REQUIRED_HOST_MODE, false)
val networkTCPConnectTimeout = mkTimeoutPreference(SHARED_PREFS_NETWORK_TCP_CONNECT_TIMEOUT, NetCfg.defaults.tcpConnectTimeout, NetCfg.proxyDefaults.tcpConnectTimeout)
@@ -164,13 +167,20 @@ class AppPreferences {
val selfDestruct = mkBoolPreference(SHARED_PREFS_SELF_DESTRUCT, false)
val selfDestructDisplayName = mkStrPreference(SHARED_PREFS_SELF_DESTRUCT_DISPLAY_NAME, null)
val currentTheme = mkStrPreference(SHARED_PREFS_CURRENT_THEME, DefaultTheme.SYSTEM.name)
val systemDarkTheme = mkStrPreference(SHARED_PREFS_SYSTEM_DARK_THEME, DefaultTheme.SIMPLEX.name)
val themeOverrides = mkMapPreference(SHARED_PREFS_THEMES, mapOf(), encode = {
val currentTheme = mkStrPreference(SHARED_PREFS_CURRENT_THEME, DefaultTheme.SYSTEM_THEME_NAME)
val systemDarkTheme = mkStrPreference(SHARED_PREFS_SYSTEM_DARK_THEME, DefaultTheme.SIMPLEX.themeName)
val currentThemeIds = mkMapPreference(SHARED_PREFS_CURRENT_THEME_IDs, mapOf(), encode = {
json.encodeToString(MapSerializer(String.serializer(), String.serializer()), it)
}, decode = {
json.decodeFromString(MapSerializer(String.serializer(), String.serializer()), it)
})
// Deprecated. Remove key from preferences in 2025
val themeOverridesOld = mkMapPreference(SHARED_PREFS_THEMES_OLD, mapOf(), encode = {
json.encodeToString(MapSerializer(String.serializer(), ThemeOverrides.serializer()), it)
}, decode = {
json.decodeFromString(MapSerializer(String.serializer(), ThemeOverrides.serializer()), it)
jsonCoerceInputValues.decodeFromString(MapSerializer(String.serializer(), ThemeOverrides.serializer()), it)
}, settingsThemes)
val themeOverrides = mkThemeOverridesPreference()
val profileImageCornerRadius = mkFloatPreference(SHARED_PREFS_PROFILE_IMAGE_CORNER_RADIUS, 22.5f)
val whatsNewVersion = mkStrPreference(SHARED_PREFS_WHATS_NEW_VERSION, null)
@@ -185,6 +195,8 @@ class AppPreferences {
val desktopWindowState = mkStrPreference(SHARED_PREFS_DESKTOP_WINDOW_STATE, null)
val showSentViaProxy = mkBoolPreference(SHARED_PREFS_SHOW_SENT_VIA_RPOXY, false)
val iosCallKitEnabled = mkBoolPreference(SHARED_PREFS_IOS_CALL_KIT_ENABLED, true)
val iosCallKitCallsInRecents = mkBoolPreference(SHARED_PREFS_IOS_CALL_KIT_CALLS_IN_RECENTS, false)
@@ -263,6 +275,12 @@ class AppPreferences {
set = fun(value) = prefs.putString(prefName, encode(value))
)
private fun mkThemeOverridesPreference(): SharedPreference<List<ThemeOverrides>> =
SharedPreference(
get = fun() = themeOverridesStore ?: (readThemeOverrides()).also { themeOverridesStore = it },
set = fun(value) { if (writeThemeOverrides(value)) { themeOverridesStore = value } }
)
companion object {
const val SHARED_PREFS_ID = "chat.simplex.app.SIMPLEX_APP_PREFS"
internal const val SHARED_PREFS_THEMES_ID = "chat.simplex.app.THEMES"
@@ -288,6 +306,7 @@ class AppPreferences {
private const val SHARED_PREFS_PRIVACY_SAVE_LAST_DRAFT = "PrivacySaveLastDraft"
private const val SHARED_PREFS_PRIVACY_DELIVERY_RECEIPTS_SET = "PrivacyDeliveryReceiptsSet"
private const val SHARED_PREFS_PRIVACY_ENCRYPT_LOCAL_FILES = "PrivacyEncryptLocalFiles"
private const val SHARED_PREFS_PRIVACY_ASK_TO_APPROVE_RELAYS = "PrivacyAskToApproveRelays"
const val SHARED_PREFS_PRIVACY_FULL_BACKUP = "FullBackup"
private const val SHARED_PREFS_EXPERIMENTAL_CALLS = "ExperimentalCalls"
private const val SHARED_PREFS_SHOW_UNREAD_AND_FAVORITES = "ShowUnreadAndFavorites"
@@ -306,6 +325,8 @@ class AppPreferences {
private const val SHARED_PREFS_NETWORK_USE_SOCKS_PROXY = "NetworkUseSocksProxy"
private const val SHARED_PREFS_NETWORK_PROXY_HOST_PORT = "NetworkProxyHostPort"
private const val SHARED_PREFS_NETWORK_SESSION_MODE = "NetworkSessionMode"
private const val SHARED_PREFS_NETWORK_SMP_PROXY_MODE = "NetworkSMPProxyMode"
private const val SHARED_PREFS_NETWORK_SMP_PROXY_FALLBACK = "NetworkSMPProxyFallback"
private const val SHARED_PREFS_NETWORK_HOST_MODE = "NetworkHostMode"
private const val SHARED_PREFS_NETWORK_REQUIRED_HOST_MODE = "NetworkRequiredHostMode"
private const val SHARED_PREFS_NETWORK_TCP_CONNECT_TIMEOUT = "NetworkTCPConnectTimeout"
@@ -336,8 +357,10 @@ class AppPreferences {
private const val SHARED_PREFS_SELF_DESTRUCT_DISPLAY_NAME = "LocalAuthenticationSelfDestructDisplayName"
private const val SHARED_PREFS_PQ_EXPERIMENTAL_ENABLED = "PQExperimentalEnabled" // no longer used
private const val SHARED_PREFS_CURRENT_THEME = "CurrentTheme"
private const val SHARED_PREFS_CURRENT_THEME_IDs = "CurrentThemeIds"
private const val SHARED_PREFS_SYSTEM_DARK_THEME = "SystemDarkTheme"
private const val SHARED_PREFS_THEMES = "Themes"
private const val SHARED_PREFS_THEMES_OLD = "Themes"
private const val SHARED_PREFS_THEME_OVERRIDES = "ThemeOverrides"
private const val SHARED_PREFS_PROFILE_IMAGE_CORNER_RADIUS = "ProfileImageCornerRadius"
private const val SHARED_PREFS_WHATS_NEW_VERSION = "WhatsNewVersion"
private const val SHARED_PREFS_LAST_MIGRATED_VERSION_CODE = "LastMigratedVersionCode"
@@ -348,9 +371,12 @@ class AppPreferences {
private const val SHARED_PREFS_CONNECT_REMOTE_VIA_MULTICAST_AUTO = "ConnectRemoteViaMulticastAuto"
private const val SHARED_PREFS_OFFER_REMOTE_MULTICAST = "OfferRemoteMulticast"
private const val SHARED_PREFS_DESKTOP_WINDOW_STATE = "DesktopWindowState"
private const val SHARED_PREFS_SHOW_SENT_VIA_RPOXY = "showSentViaProxy"
private const val SHARED_PREFS_IOS_CALL_KIT_ENABLED = "iOSCallKitEnabled"
private const val SHARED_PREFS_IOS_CALL_KIT_CALLS_IN_RECENTS = "iOSCallKitCallsInRecents"
private var themeOverridesStore: List<ThemeOverrides>? = null
}
}
@@ -435,8 +461,13 @@ object ChatController {
Log.d(TAG, "startChatWithTemporaryDatabase")
val migrationActiveUser = apiGetActiveUser(null, ctrl) ?: apiCreateActiveUser(null, Profile(displayName = "Temp", fullName = ""), ctrl = ctrl)
apiSetNetworkConfig(netCfg, ctrl)
apiSetTempFolder(getMigrationTempFilesDirectory().absolutePath, ctrl)
apiSetFilesFolder(getMigrationTempFilesDirectory().absolutePath, ctrl)
apiSetAppFilePaths(
getMigrationTempFilesDirectory().absolutePath,
getMigrationTempFilesDirectory().absolutePath,
wallpapersDir.parentFile.absolutePath,
remoteHostsDir.absolutePath,
ctrl
)
apiStartChat(ctrl)
return migrationActiveUser
}
@@ -655,22 +686,10 @@ object ChatController {
}
}
suspend fun apiSetTempFolder(tempFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.SetTempFolder(tempFolder), ctrl)
suspend fun apiSetAppFilePaths(filesFolder: String, tempFolder: String, assetsFolder: String, remoteHostsFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.ApiSetAppFilePaths(filesFolder, tempFolder, assetsFolder, remoteHostsFolder), ctrl)
if (r is CR.CmdOk) return
throw Exception("failed to set temp folder: ${r.responseType} ${r.details}")
}
suspend fun apiSetFilesFolder(filesFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.SetFilesFolder(filesFolder), ctrl)
if (r is CR.CmdOk) return
throw Exception("failed to set files folder: ${r.responseType} ${r.details}")
}
suspend fun apiSetRemoteHostsFolder(remoteHostsFolder: String) {
val r = sendCmd(null, CC.SetRemoteHostsFolder(remoteHostsFolder))
if (r is CR.CmdOk) return
throw Exception("failed to set remote hosts folder: ${r.responseType} ${r.details}")
throw Exception("failed to set app file paths: ${r.responseType} ${r.details}")
}
suspend fun apiSetEncryptLocalFiles(enable: Boolean) = sendCommandOkResp(null, CC.ApiSetEncryptLocalFiles(enable))
@@ -775,8 +794,8 @@ object ChatController {
}
}
suspend fun apiForwardChatItem(rh: Long?, toChatType: ChatType, toChatId: Long, fromChatType: ChatType, fromChatId: Long, itemId: Long): ChatItem? {
val cmd = CC.ApiForwardChatItem(toChatType, toChatId, fromChatType, fromChatId, itemId)
suspend fun apiForwardChatItem(rh: Long?, toChatType: ChatType, toChatId: Long, fromChatType: ChatType, fromChatId: Long, itemId: Long, ttl: Int?): ChatItem? {
val cmd = CC.ApiForwardChatItem(toChatType, toChatId, fromChatType, fromChatId, itemId, ttl)
return processSendMessageCmd(rh, cmd)?.chatItem
}
@@ -912,6 +931,20 @@ object ChatController {
return null
}
suspend fun apiContactQueueInfo(rh: Long?, contactId: Long): Pair<RcvMsgInfo?, QueueInfo>? {
val r = sendCmd(rh, CC.APIContactQueueInfo(contactId))
if (r is CR.QueueInfoR) return Pair(r.rcvMsgInfo, r.queueInfo)
apiErrorAlert("apiContactQueueInfo", generalGetString(MR.strings.error), r)
return null
}
suspend fun apiGroupMemberQueueInfo(rh: Long?, groupId: Long, groupMemberId: Long): Pair<RcvMsgInfo?, QueueInfo>? {
val r = sendCmd(rh, CC.APIGroupMemberQueueInfo(groupId, groupMemberId))
if (r is CR.QueueInfoR) return Pair(r.rcvMsgInfo, r.queueInfo)
apiErrorAlert("apiGroupMemberQueueInfo", generalGetString(MR.strings.error), r)
return null
}
suspend fun apiSwitchContact(rh: Long?, contactId: Long): ConnectionStats? {
val r = sendCmd(rh, CC.APISwitchContact(contactId))
if (r is CR.ContactSwitchStarted) return r.connectionStats
@@ -1156,6 +1189,20 @@ object ChatController {
return null
}
suspend fun apiSetUserUIThemes(rh: Long?, userId: Long, themes: ThemeModeOverrides?): Boolean {
val r = sendCmd(rh, CC.ApiSetUserUIThemes(userId, themes))
if (r is CR.CmdOk) return true
Log.e(TAG, "apiSetUserUIThemes bad response: ${r.responseType} ${r.details}")
return false
}
suspend fun apiSetChatUIThemes(rh: Long?, chatId: ChatId, themes: ThemeModeOverrides?): Boolean {
val r = sendCmd(rh, CC.ApiSetChatUIThemes(chatId, themes))
if (r is CR.CmdOk) return true
Log.e(TAG, "apiSetChatUIThemes bad response: ${r.responseType} ${r.details}")
return false
}
suspend fun apiCreateUserAddress(rh: Long?): String? {
val userId = kotlin.runCatching { currentUserId("apiCreateUserAddress") }.getOrElse { return null }
val r = sendCmd(rh, CC.ApiCreateMyAddress(userId))
@@ -1330,9 +1377,9 @@ object ChatController {
}
}
suspend fun apiReceiveFile(rh: Long?, fileId: Long, encrypted: Boolean, inline: Boolean? = null, auto: Boolean = false): AChatItem? {
suspend fun apiReceiveFile(rh: Long?, fileId: Long, userApprovedRelays: Boolean, encrypted: Boolean, inline: Boolean? = null, auto: Boolean = false): AChatItem? {
// -1 here is to override default behavior of providing current remote host id because file can be asked by local device while remote is connected
val r = sendCmd(rh, CC.ReceiveFile(fileId, encrypted, inline))
val r = sendCmd(rh, CC.ReceiveFile(fileId, userApprovedRelays = userApprovedRelays, encrypt = encrypted, inline = inline))
return when (r) {
is CR.RcvFileAccepted -> r.chatItem
is CR.RcvFileAcceptedSndCancelled -> {
@@ -1351,7 +1398,23 @@ object ChatController {
val maybeChatError = chatError(r)
if (maybeChatError is ChatErrorType.FileCancelled || maybeChatError is ChatErrorType.FileAlreadyReceiving) {
Log.d(TAG, "apiReceiveFile ignoring FileCancelled or FileAlreadyReceiving error")
} else {
} else if (maybeChatError is ChatErrorType.FileNotApproved) {
Log.d(TAG, "apiReceiveFile FileNotApproved error")
if (!auto) {
val srvs = maybeChatError.unknownServers.map{ serverHostname(it) }
AlertManager.shared.showAlertDialog(
title = generalGetString(MR.strings.file_not_approved_title),
text = generalGetString(MR.strings.file_not_approved_descr).format(srvs.sorted().joinToString(separator = ", ")),
confirmText = generalGetString(MR.strings.download_file),
onConfirm = {
val user = chatModel.currentUser.value
if (user != null) {
withBGApi { chatModel.controller.receiveFile(rh, user, fileId, userApprovedRelays = true) }
}
},
)
}
} else if (!auto) {
apiErrorAlert("apiReceiveFile", generalGetString(MR.strings.error_receiving_file), r)
}
}
@@ -2031,13 +2094,21 @@ object ChatController {
}
}
is CR.ContactSwitch ->
chatModel.updateContactConnectionStats(rhId, r.contact, r.switchProgress.connectionStats)
if (active(r.user)) {
chatModel.updateContactConnectionStats(rhId, r.contact, r.switchProgress.connectionStats)
}
is CR.GroupMemberSwitch ->
chatModel.updateGroupMemberConnectionStats(rhId, r.groupInfo, r.member, r.switchProgress.connectionStats)
if (active(r.user)) {
chatModel.updateGroupMemberConnectionStats(rhId, r.groupInfo, r.member, r.switchProgress.connectionStats)
}
is CR.ContactRatchetSync ->
chatModel.updateContactConnectionStats(rhId, r.contact, r.ratchetSyncProgress.connectionStats)
if (active(r.user)) {
chatModel.updateContactConnectionStats(rhId, r.contact, r.ratchetSyncProgress.connectionStats)
}
is CR.GroupMemberRatchetSync ->
chatModel.updateGroupMemberConnectionStats(rhId, r.groupInfo, r.member, r.ratchetSyncProgress.connectionStats)
if (active(r.user)) {
chatModel.updateGroupMemberConnectionStats(rhId, r.groupInfo, r.member, r.ratchetSyncProgress.connectionStats)
}
is CR.RemoteHostSessionCode -> {
chatModel.remoteHostPairing.value = r.remoteHost_ to RemoteHostSessionState.PendingConfirmation(r.sessionCode)
}
@@ -2046,6 +2117,11 @@ object ChatController {
chatModel.currentRemoteHost.value = r.remoteHost
switchUIRemoteHost(r.remoteHost.remoteHostId)
}
is CR.ContactDisabled -> {
if (active(r.user)) {
chatModel.updateContact(rhId, r.contact)
}
}
is CR.RemoteHostStopped -> {
val disconnectedHost = chatModel.remoteHosts.firstOrNull { it.remoteHostId == r.remoteHostId_ }
chatModel.remoteHostPairing.value = null
@@ -2196,9 +2272,14 @@ object ChatController {
}
}
suspend fun receiveFile(rhId: Long?, user: UserLike, fileId: Long, auto: Boolean = false) {
val encrypted = appPrefs.privacyEncryptLocalFiles.get()
val chatItem = apiReceiveFile(rhId, fileId, encrypted = encrypted, auto = auto)
suspend fun receiveFile(rhId: Long?, user: UserLike, fileId: Long, userApprovedRelays: Boolean = false, auto: Boolean = false) {
val chatItem = apiReceiveFile(
rhId,
fileId,
userApprovedRelays = userApprovedRelays || !appPrefs.privacyAskToApproveRelays.get(),
encrypted = appPrefs.privacyEncryptLocalFiles.get(),
auto = auto
)
if (chatItem != null) {
chatItemSimpleUpdate(rhId, user, chatItem)
}
@@ -2302,6 +2383,8 @@ object ChatController {
val hostMode = HostMode.valueOf(appPrefs.networkHostMode.get()!!)
val requiredHostMode = appPrefs.networkRequiredHostMode.get()
val sessionMode = appPrefs.networkSessionMode.get()
val smpProxyMode = SMPProxyMode.valueOf(appPrefs.networkSMPProxyMode.get()!!)
val smpProxyFallback = SMPProxyFallback.valueOf(appPrefs.networkSMPProxyFallback.get()!!)
val tcpConnectTimeout = appPrefs.networkTCPConnectTimeout.get()
val tcpTimeout = appPrefs.networkTCPTimeout.get()
val tcpTimeoutPerKb = appPrefs.networkTCPTimeoutPerKb.get()
@@ -2322,6 +2405,8 @@ object ChatController {
hostMode = hostMode,
requiredHostMode = requiredHostMode,
sessionMode = sessionMode,
smpProxyMode = smpProxyMode,
smpProxyFallback = smpProxyFallback,
tcpConnectTimeout = tcpConnectTimeout,
tcpTimeout = tcpTimeout,
tcpTimeoutPerKb = tcpTimeoutPerKb,
@@ -2340,6 +2425,8 @@ object ChatController {
appPrefs.networkHostMode.set(cfg.hostMode.name)
appPrefs.networkRequiredHostMode.set(cfg.requiredHostMode)
appPrefs.networkSessionMode.set(cfg.sessionMode)
appPrefs.networkSMPProxyMode.set(cfg.smpProxyMode.name)
appPrefs.networkSMPProxyFallback.set(cfg.smpProxyFallback.name)
appPrefs.networkTCPConnectTimeout.set(cfg.tcpConnectTimeout)
appPrefs.networkTCPTimeout.set(cfg.tcpTimeout)
appPrefs.networkTCPTimeoutPerKb.set(cfg.tcpTimeoutPerKb)
@@ -2387,9 +2474,8 @@ sealed class CC {
class ApiDeleteUser(val userId: Long, val delSMPQueues: Boolean, val viewPwd: String?): CC()
class StartChat(val mainApp: Boolean): CC()
class ApiStopChat: CC()
class SetTempFolder(val tempFolder: String): CC()
class SetFilesFolder(val filesFolder: String): CC()
class SetRemoteHostsFolder(val remoteHostsFolder: String): CC()
@Serializable
class ApiSetAppFilePaths(val appFilesFolder: String, val appTempFolder: String, val appAssetsFolder: String, val appRemoteHostsFolder: String): CC()
class ApiSetEncryptLocalFiles(val enable: Boolean): CC()
class ApiExportArchive(val config: ArchiveConfig): CC()
class ApiImportArchive(val config: ArchiveConfig): CC()
@@ -2407,7 +2493,7 @@ sealed class CC {
class ApiDeleteChatItem(val type: ChatType, val id: Long, val itemId: Long, val mode: CIDeleteMode): CC()
class ApiDeleteMemberChatItem(val groupId: Long, val groupMemberId: Long, val itemId: Long): CC()
class ApiChatItemReaction(val type: ChatType, val id: Long, val itemId: Long, val add: Boolean, val reaction: MsgReaction): CC()
class ApiForwardChatItem(val toChatType: ChatType, val toChatId: Long, val fromChatType: ChatType, val fromChatId: Long, val itemId: Long): CC()
class ApiForwardChatItem(val toChatType: ChatType, val toChatId: Long, val fromChatType: ChatType, val fromChatId: Long, val itemId: Long, val ttl: Int?): CC()
class ApiNewGroup(val userId: Long, val incognito: Boolean, val groupProfile: GroupProfile): CC()
class ApiAddMember(val groupId: Long, val contactId: Long, val memberRole: GroupMemberRole): CC()
class ApiJoinGroup(val groupId: Long): CC()
@@ -2435,6 +2521,8 @@ sealed class CC {
class ApiSetMemberSettings(val groupId: Long, val groupMemberId: Long, val memberSettings: GroupMemberSettings): CC()
class APIContactInfo(val contactId: Long): CC()
class APIGroupMemberInfo(val groupId: Long, val groupMemberId: Long): CC()
class APIContactQueueInfo(val contactId: Long): CC()
class APIGroupMemberQueueInfo(val groupId: Long, val groupMemberId: Long): CC()
class APISwitchContact(val contactId: Long): CC()
class APISwitchGroupMember(val groupId: Long, val groupMemberId: Long): CC()
class APIAbortSwitchContact(val contactId: Long): CC()
@@ -2457,6 +2545,8 @@ sealed class CC {
class ApiSetContactPrefs(val contactId: Long, val prefs: ChatPreferences): CC()
class ApiSetContactAlias(val contactId: Long, val localAlias: String): CC()
class ApiSetConnectionAlias(val connId: Long, val localAlias: String): CC()
class ApiSetUserUIThemes(val userId: Long, val themes: ThemeModeOverrides?): CC()
class ApiSetChatUIThemes(val chatId: String, val themes: ThemeModeOverrides?): CC()
class ApiCreateMyAddress(val userId: Long): CC()
class ApiDeleteMyAddress(val userId: Long): CC()
class ApiShowMyAddress(val userId: Long): CC()
@@ -2475,7 +2565,7 @@ sealed class CC {
class ApiRejectContact(val contactReqId: Long): CC()
class ApiChatRead(val type: ChatType, val id: Long, val range: ItemRange): CC()
class ApiChatUnread(val type: ChatType, val id: Long, val unreadChat: Boolean): CC()
class ReceiveFile(val fileId: Long, val encrypt: Boolean, val inline: Boolean?): CC()
class ReceiveFile(val fileId: Long, val userApprovedRelays: Boolean, val encrypt: Boolean, val inline: Boolean?): CC()
class CancelFile(val fileId: Long): CC()
// Remote control
class SetLocalDeviceName(val displayName: String): CC()
@@ -2524,9 +2614,7 @@ sealed class CC {
is ApiDeleteUser -> "/_delete user $userId del_smp=${onOff(delSMPQueues)}${maybePwd(viewPwd)}"
is StartChat -> "/_start main=${onOff(mainApp)}"
is ApiStopChat -> "/_stop"
is SetTempFolder -> "/_temp_folder $tempFolder"
is SetFilesFolder -> "/_files_folder $filesFolder"
is SetRemoteHostsFolder -> "/remote_hosts_folder $remoteHostsFolder"
is ApiSetAppFilePaths -> "/set file paths ${json.encodeToString(this)}"
is ApiSetEncryptLocalFiles -> "/_files_encrypt ${onOff(enable)}"
is ApiExportArchive -> "/_db export ${json.encodeToString(config)}"
is ApiImportArchive -> "/_db import ${json.encodeToString(config)}"
@@ -2549,7 +2637,10 @@ sealed class CC {
is ApiDeleteChatItem -> "/_delete item ${chatRef(type, id)} $itemId ${mode.deleteMode}"
is ApiDeleteMemberChatItem -> "/_delete member item #$groupId $groupMemberId $itemId"
is ApiChatItemReaction -> "/_reaction ${chatRef(type, id)} $itemId ${onOff(add)} ${json.encodeToString(reaction)}"
is ApiForwardChatItem -> "/_forward ${chatRef(toChatType, toChatId)} ${chatRef(fromChatType, fromChatId)} $itemId"
is ApiForwardChatItem -> {
val ttlStr = if (ttl != null) "$ttl" else "default"
"/_forward ${chatRef(toChatType, toChatId)} ${chatRef(fromChatType, fromChatId)} $itemId ttl=${ttlStr}"
}
is ApiNewGroup -> "/_group $userId incognito=${onOff(incognito)} ${json.encodeToString(groupProfile)}"
is ApiAddMember -> "/_add #$groupId $contactId ${memberRole.memberRole}"
is ApiJoinGroup -> "/_join #$groupId"
@@ -2577,6 +2668,8 @@ sealed class CC {
is ApiSetMemberSettings -> "/_member settings #$groupId $groupMemberId ${json.encodeToString(memberSettings)}"
is APIContactInfo -> "/_info @$contactId"
is APIGroupMemberInfo -> "/_info #$groupId $groupMemberId"
is APIContactQueueInfo -> "/_queue info @$contactId"
is APIGroupMemberQueueInfo -> "/_queue info #$groupId $groupMemberId"
is APISwitchContact -> "/_switch @$contactId"
is APISwitchGroupMember -> "/_switch #$groupId $groupMemberId"
is APIAbortSwitchContact -> "/_abort switch @$contactId"
@@ -2603,6 +2696,8 @@ sealed class CC {
is ApiSetContactPrefs -> "/_set prefs @$contactId ${json.encodeToString(prefs)}"
is ApiSetContactAlias -> "/_set alias @$contactId ${localAlias.trim()}"
is ApiSetConnectionAlias -> "/_set alias :$connId ${localAlias.trim()}"
is ApiSetUserUIThemes -> "/_set theme user $userId ${if (themes != null) json.encodeToString(themes) else ""}"
is ApiSetChatUIThemes -> "/_set theme $chatId ${if (themes != null) json.encodeToString(themes) else ""}"
is ApiCreateMyAddress -> "/_address $userId"
is ApiDeleteMyAddress -> "/_delete_address $userId"
is ApiShowMyAddress -> "/_show_address $userId"
@@ -2623,6 +2718,7 @@ sealed class CC {
is ApiChatUnread -> "/_unread chat ${chatRef(type, id)} ${onOff(unreadChat)}"
is ReceiveFile ->
"/freceive $fileId" +
(" approved_relays=${onOff(userApprovedRelays)}") +
(if (encrypt == null) "" else " encrypt=${onOff(encrypt)}") +
(if (inline == null) "" else " inline=${onOff(inline)}")
is CancelFile -> "/fcancel $fileId"
@@ -2666,9 +2762,7 @@ sealed class CC {
is ApiDeleteUser -> "apiDeleteUser"
is StartChat -> "startChat"
is ApiStopChat -> "apiStopChat"
is SetTempFolder -> "setTempFolder"
is SetFilesFolder -> "setFilesFolder"
is SetRemoteHostsFolder -> "setRemoteHostsFolder"
is ApiSetAppFilePaths -> "apiSetAppFilePaths"
is ApiSetEncryptLocalFiles -> "apiSetEncryptLocalFiles"
is ApiExportArchive -> "apiExportArchive"
is ApiImportArchive -> "apiImportArchive"
@@ -2714,6 +2808,8 @@ sealed class CC {
is ApiSetMemberSettings -> "apiSetMemberSettings"
is APIContactInfo -> "apiContactInfo"
is APIGroupMemberInfo -> "apiGroupMemberInfo"
is APIContactQueueInfo -> "apiContactQueueInfo"
is APIGroupMemberQueueInfo -> "apiGroupMemberQueueInfo"
is APISwitchContact -> "apiSwitchContact"
is APISwitchGroupMember -> "apiSwitchGroupMember"
is APIAbortSwitchContact -> "apiAbortSwitchContact"
@@ -2736,6 +2832,8 @@ sealed class CC {
is ApiSetContactPrefs -> "apiSetContactPrefs"
is ApiSetContactAlias -> "apiSetContactAlias"
is ApiSetConnectionAlias -> "apiSetConnectionAlias"
is ApiSetUserUIThemes -> "apiSetUserUIThemes"
is ApiSetChatUIThemes -> "apiSetChatUIThemes"
is ApiCreateMyAddress -> "apiCreateMyAddress"
is ApiDeleteMyAddress -> "apiDeleteMyAddress"
is ApiShowMyAddress -> "apiShowMyAddress"
@@ -3025,9 +3123,12 @@ data class ParsedServerAddress (
@Serializable
data class NetCfg(
val socksProxy: String?,
val socksMode: SocksMode = SocksMode.Always,
val hostMode: HostMode,
val requiredHostMode: Boolean,
val sessionMode: TransportSessionMode,
val smpProxyMode: SMPProxyMode,
val smpProxyFallback: SMPProxyFallback,
val tcpConnectTimeout: Long, // microseconds
val tcpTimeout: Long, // microseconds
val tcpTimeoutPerKb: Long, // microseconds
@@ -3056,6 +3157,8 @@ data class NetCfg(
hostMode = HostMode.OnionViaSocks,
requiredHostMode = false,
sessionMode = TransportSessionMode.User,
smpProxyMode = SMPProxyMode.Never,
smpProxyFallback = SMPProxyFallback.Allow,
tcpConnectTimeout = 25_000_000,
tcpTimeout = 15_000_000,
tcpTimeoutPerKb = 10_000,
@@ -3071,6 +3174,8 @@ data class NetCfg(
hostMode = HostMode.OnionViaSocks,
requiredHostMode = false,
sessionMode = TransportSessionMode.User,
smpProxyMode = SMPProxyMode.Never,
smpProxyFallback = SMPProxyFallback.Allow,
tcpConnectTimeout = 35_000_000,
tcpTimeout = 20_000_000,
tcpTimeoutPerKb = 15_000,
@@ -3109,6 +3214,35 @@ enum class HostMode {
@SerialName("public") Public;
}
@Serializable
enum class SocksMode {
@SerialName("always") Always,
@SerialName("onion") Onion;
}
@Serializable
enum class SMPProxyMode {
@SerialName("always") Always,
@SerialName("unknown") Unknown,
@SerialName("unprotected") Unprotected,
@SerialName("never") Never;
companion object {
val default = Never
}
}
@Serializable
enum class SMPProxyFallback {
@SerialName("allow") Allow,
@SerialName("allowProtected") AllowProtected,
@SerialName("prohibit") Prohibit;
companion object {
val default = Allow
}
}
@Serializable
enum class TransportSessionMode {
@SerialName("user") User,
@@ -3971,6 +4105,15 @@ val json = Json {
explicitNulls = false
}
// Can decode unknown enum to default value specified for this field
val jsonCoerceInputValues = Json {
prettyPrint = true
ignoreUnknownKeys = true
encodeDefaults = true
explicitNulls = false
coerceInputValues = true
}
val jsonShort = Json {
prettyPrint = false
ignoreUnknownKeys = true
@@ -3981,6 +4124,8 @@ val jsonShort = Json {
val yaml = Yaml(configuration = YamlConfiguration(
strictMode = false,
encodeDefaults = false,
/** ~5.5 MB limitation since wallpaper is limited by 5 MB, see [saveWallpaperFile] */
codePointLimit = 5500000,
))
@Serializable
@@ -4072,6 +4217,7 @@ sealed class CR {
@Serializable @SerialName("networkConfig") class NetworkConfig(val networkConfig: NetCfg): CR()
@Serializable @SerialName("contactInfo") class ContactInfo(val user: UserRef, val contact: Contact, val connectionStats_: ConnectionStats? = null, val customUserProfile: Profile? = null): CR()
@Serializable @SerialName("groupMemberInfo") class GroupMemberInfo(val user: UserRef, val groupInfo: GroupInfo, val member: GroupMember, val connectionStats_: ConnectionStats? = null): CR()
@Serializable @SerialName("queueInfo") class QueueInfoR(val user: UserRef, val rcvMsgInfo: RcvMsgInfo?, val queueInfo: QueueInfo): CR()
@Serializable @SerialName("contactSwitchStarted") class ContactSwitchStarted(val user: UserRef, val contact: Contact, val connectionStats: ConnectionStats): CR()
@Serializable @SerialName("groupMemberSwitchStarted") class GroupMemberSwitchStarted(val user: UserRef, val groupInfo: GroupInfo, val member: GroupMember, val connectionStats: ConnectionStats): CR()
@Serializable @SerialName("contactSwitchAborted") class ContactSwitchAborted(val user: UserRef, val contact: Contact, val connectionStats: ConnectionStats): CR()
@@ -4197,6 +4343,7 @@ sealed class CR {
@Serializable @SerialName("callExtraInfo") class CallExtraInfo(val user: UserRef, val contact: Contact, val extraInfo: WebRTCExtraInfo): CR()
@Serializable @SerialName("callEnded") class CallEnded(val user: UserRef, val contact: Contact): CR()
@Serializable @SerialName("contactConnectionDeleted") class ContactConnectionDeleted(val user: UserRef, val connection: PendingContactConnection): CR()
@Serializable @SerialName("contactDisabled") class ContactDisabled(val user: UserRef, val contact: Contact): CR()
// remote events (desktop)
@Serializable @SerialName("remoteHostList") class RemoteHostList(val remoteHosts: List<RemoteHostInfo>): CR()
@Serializable @SerialName("currentRemoteHost") class CurrentRemoteHost(val remoteHost_: RemoteHostInfo?): CR()
@@ -4242,6 +4389,7 @@ sealed class CR {
is NetworkConfig -> "networkConfig"
is ContactInfo -> "contactInfo"
is GroupMemberInfo -> "groupMemberInfo"
is QueueInfoR -> "queueInfo"
is ContactSwitchStarted -> "contactSwitchStarted"
is GroupMemberSwitchStarted -> "groupMemberSwitchStarted"
is ContactSwitchAborted -> "contactSwitchAborted"
@@ -4361,6 +4509,7 @@ sealed class CR {
is CallExtraInfo -> "callExtraInfo"
is CallEnded -> "callEnded"
is ContactConnectionDeleted -> "contactConnectionDeleted"
is ContactDisabled -> "contactDisabled"
is RemoteHostList -> "remoteHostList"
is CurrentRemoteHost -> "currentRemoteHost"
is RemoteHostStarted -> "remoteHostStarted"
@@ -4402,6 +4551,7 @@ sealed class CR {
is NetworkConfig -> json.encodeToString(networkConfig)
is ContactInfo -> withUser(user, "contact: ${json.encodeToString(contact)}\nconnectionStats: ${json.encodeToString(connectionStats_)}")
is GroupMemberInfo -> withUser(user, "group: ${json.encodeToString(groupInfo)}\nmember: ${json.encodeToString(member)}\nconnectionStats: ${json.encodeToString(connectionStats_)}")
is QueueInfoR -> withUser(user, "rcvMsgInfo: ${json.encodeToString(rcvMsgInfo)}\nqueueInfo: ${json.encodeToString(queueInfo)}\n")
is ContactSwitchStarted -> withUser(user, "contact: ${json.encodeToString(contact)}\nconnectionStats: ${json.encodeToString(connectionStats)}")
is GroupMemberSwitchStarted -> withUser(user, "group: ${json.encodeToString(groupInfo)}\nmember: ${json.encodeToString(member)}\nconnectionStats: ${json.encodeToString(connectionStats)}")
is ContactSwitchAborted -> withUser(user, "contact: ${json.encodeToString(contact)}\nconnectionStats: ${json.encodeToString(connectionStats)}")
@@ -4521,6 +4671,7 @@ sealed class CR {
is CallExtraInfo -> withUser(user, "contact: ${contact.id}\nextraInfo: ${json.encodeToString(extraInfo)}")
is CallEnded -> withUser(user, "contact: ${contact.id}")
is ContactConnectionDeleted -> withUser(user, json.encodeToString(connection))
is ContactDisabled -> withUser(user, json.encodeToString(contact))
// remote events (mobile)
is RemoteHostList -> json.encodeToString(remoteHosts)
is CurrentRemoteHost -> if (remoteHost_ == null) "local" else json.encodeToString(remoteHost_)
@@ -4814,7 +4965,6 @@ sealed class ChatErrorType {
is GroupMemberNotActive -> "groupMemberNotActive"
is GroupMemberUserRemoved -> "groupMemberUserRemoved"
is GroupMemberNotFound -> "groupMemberNotFound"
is GroupMemberIntroNotFound -> "groupMemberIntroNotFound"
is GroupCantResendInvitation -> "groupCantResendInvitation"
is GroupInternal -> "groupInternal"
is FileNotFound -> "fileNotFound"
@@ -4824,13 +4974,14 @@ sealed class ChatErrorType {
is FileCancel -> "fileCancel"
is FileAlreadyExists -> "fileAlreadyExists"
is FileRead -> "fileRead"
is FileWrite -> "fileWrite"
is FileWrite -> "fileWrite $message"
is FileSend -> "fileSend"
is FileRcvChunk -> "fileRcvChunk"
is FileInternal -> "fileInternal"
is FileImageType -> "fileImageType"
is FileImageSize -> "fileImageSize"
is FileNotReceived -> "fileNotReceived"
is FileNotApproved -> "fileNotApproved"
// is XFTPRcvFile -> "xftpRcvFile"
// is XFTPSndFile -> "xftpSndFile"
is FallbackToSMPProhibited -> "fallbackToSMPProhibited"
@@ -4893,7 +5044,6 @@ sealed class ChatErrorType {
@Serializable @SerialName("groupMemberNotActive") object GroupMemberNotActive: ChatErrorType()
@Serializable @SerialName("groupMemberUserRemoved") object GroupMemberUserRemoved: ChatErrorType()
@Serializable @SerialName("groupMemberNotFound") object GroupMemberNotFound: ChatErrorType()
@Serializable @SerialName("groupMemberIntroNotFound") class GroupMemberIntroNotFound(val contactName: String): ChatErrorType()
@Serializable @SerialName("groupCantResendInvitation") class GroupCantResendInvitation(val groupInfo: GroupInfo, val contactName: String): ChatErrorType()
@Serializable @SerialName("groupInternal") class GroupInternal(val message: String): ChatErrorType()
@Serializable @SerialName("fileNotFound") class FileNotFound(val message: String): ChatErrorType()
@@ -4910,6 +5060,7 @@ sealed class ChatErrorType {
@Serializable @SerialName("fileImageType") class FileImageType(val filePath: String): ChatErrorType()
@Serializable @SerialName("fileImageSize") class FileImageSize(val filePath: String): ChatErrorType()
@Serializable @SerialName("fileNotReceived") class FileNotReceived(val fileId: Long): ChatErrorType()
@Serializable @SerialName("fileNotApproved") class FileNotApproved(val fileId: Long, val unknownServers: List<String>): ChatErrorType()
// @Serializable @SerialName("xFTPRcvFile") object XFTPRcvFile: ChatErrorType()
// @Serializable @SerialName("xFTPSndFile") object XFTPSndFile: ChatErrorType()
@Serializable @SerialName("fallbackToSMPProhibited") class FallbackToSMPProhibited(val fileId: Long): ChatErrorType()
@@ -5408,6 +5559,7 @@ enum class NotificationsMode() {
data class AppSettings(
var networkConfig: NetCfg? = null,
var privacyEncryptLocalFiles: Boolean? = null,
var privacyAskToApproveRelays: Boolean? = null,
var privacyAcceptImages: Boolean? = null,
var privacyLinkPreviews: Boolean? = null,
var privacyShowChatPreviews: Boolean? = null,
@@ -5425,12 +5577,18 @@ data class AppSettings(
var androidCallOnLockScreen: AppSettingsLockScreenCalls? = null,
var iosCallKitEnabled: Boolean? = null,
var iosCallKitCallsInRecents: Boolean? = null,
var uiProfileImageCornerRadius: Float? = null,
var uiColorScheme: String? = null,
var uiDarkColorScheme: String? = null,
var uiCurrentThemeIds: Map<String, String>? = null,
var uiThemes: List<ThemeOverrides>? = null,
) {
fun prepareForExport(): AppSettings {
val empty = AppSettings()
val def = defaults
if (networkConfig != def.networkConfig) { empty.networkConfig = networkConfig }
if (privacyEncryptLocalFiles != def.privacyEncryptLocalFiles) { empty.privacyEncryptLocalFiles = privacyEncryptLocalFiles }
if (privacyAskToApproveRelays != def.privacyAskToApproveRelays) { empty.privacyAskToApproveRelays = privacyAskToApproveRelays }
if (privacyAcceptImages != def.privacyAcceptImages) { empty.privacyAcceptImages = privacyAcceptImages }
if (privacyLinkPreviews != def.privacyLinkPreviews) { empty.privacyLinkPreviews = privacyLinkPreviews }
if (privacyShowChatPreviews != def.privacyShowChatPreviews) { empty.privacyShowChatPreviews = privacyShowChatPreviews }
@@ -5448,6 +5606,11 @@ data class AppSettings(
if (androidCallOnLockScreen != def.androidCallOnLockScreen) { empty.androidCallOnLockScreen = androidCallOnLockScreen }
if (iosCallKitEnabled != def.iosCallKitEnabled) { empty.iosCallKitEnabled = iosCallKitEnabled }
if (iosCallKitCallsInRecents != def.iosCallKitCallsInRecents) { empty.iosCallKitCallsInRecents = iosCallKitCallsInRecents }
if (uiProfileImageCornerRadius != def.uiProfileImageCornerRadius) { empty.uiProfileImageCornerRadius = uiProfileImageCornerRadius }
if (uiColorScheme != def.uiColorScheme) { empty.uiColorScheme = uiColorScheme }
if (uiDarkColorScheme != def.uiDarkColorScheme) { empty.uiDarkColorScheme = uiDarkColorScheme }
if (uiCurrentThemeIds != def.uiCurrentThemeIds) { empty.uiCurrentThemeIds = uiCurrentThemeIds }
if (uiThemes != def.uiThemes) { empty.uiThemes = uiThemes }
return empty
}
@@ -5462,6 +5625,7 @@ data class AppSettings(
setNetCfg(net)
}
privacyEncryptLocalFiles?.let { def.privacyEncryptLocalFiles.set(it) }
privacyAskToApproveRelays?.let { def.privacyAskToApproveRelays.set(it) }
privacyAcceptImages?.let { def.privacyAcceptImages.set(it) }
privacyLinkPreviews?.let { def.privacyLinkPreviews.set(it) }
privacyShowChatPreviews?.let { def.privacyShowChatPreviews.set(it) }
@@ -5479,6 +5643,11 @@ data class AppSettings(
androidCallOnLockScreen?.let { def.callOnLockScreen.set(it.toCallOnLockScreen()) }
iosCallKitEnabled?.let { def.iosCallKitEnabled.set(it) }
iosCallKitCallsInRecents?.let { def.iosCallKitCallsInRecents.set(it) }
uiProfileImageCornerRadius?.let { def.profileImageCornerRadius.set(it) }
uiColorScheme?.let { def.currentTheme.set(it) }
uiDarkColorScheme?.let { def.systemDarkTheme.set(it) }
uiCurrentThemeIds?.let { def.currentThemeIds.set(it) }
uiThemes?.let { def.themeOverrides.set(it.skipDuplicates()) }
}
companion object {
@@ -5486,6 +5655,7 @@ data class AppSettings(
get() = AppSettings(
networkConfig = NetCfg.defaults,
privacyEncryptLocalFiles = true,
privacyAskToApproveRelays = true,
privacyAcceptImages = true,
privacyLinkPreviews = true,
privacyShowChatPreviews = true,
@@ -5502,7 +5672,12 @@ data class AppSettings(
confirmDBUpgrades = false,
androidCallOnLockScreen = AppSettingsLockScreenCalls.SHOW,
iosCallKitEnabled = true,
iosCallKitCallsInRecents = false
iosCallKitCallsInRecents = false,
uiProfileImageCornerRadius = 22.5f,
uiColorScheme = DefaultTheme.SYSTEM_THEME_NAME,
uiDarkColorScheme = DefaultTheme.SIMPLEX.themeName,
uiCurrentThemeIds = null,
uiThemes = null,
)
val current: AppSettings
@@ -5511,6 +5686,7 @@ data class AppSettings(
return defaults.copy(
networkConfig = getNetCfg(),
privacyEncryptLocalFiles = def.privacyEncryptLocalFiles.get(),
privacyAskToApproveRelays = def.privacyAskToApproveRelays.get(),
privacyAcceptImages = def.privacyAcceptImages.get(),
privacyLinkPreviews = def.privacyLinkPreviews.get(),
privacyShowChatPreviews = def.privacyShowChatPreviews.get(),
@@ -5528,6 +5704,11 @@ data class AppSettings(
androidCallOnLockScreen = AppSettingsLockScreenCalls.from(def.callOnLockScreen.get()),
iosCallKitEnabled = def.iosCallKitEnabled.get(),
iosCallKitCallsInRecents = def.iosCallKitCallsInRecents.get(),
uiProfileImageCornerRadius = def.profileImageCornerRadius.get(),
uiColorScheme = def.currentTheme.get() ?: DefaultTheme.SYSTEM_THEME_NAME,
uiDarkColorScheme = def.systemDarkTheme.get() ?: DefaultTheme.SIMPLEX.themeName,
uiCurrentThemeIds = def.currentThemeIds.get(),
uiThemes = def.themeOverrides.get(),
)
}
}
@@ -5628,3 +5809,52 @@ enum class UserNetworkType {
OTHER -> generalGetString(MR.strings.network_type_other)
}
}
@Serializable
data class RcvMsgInfo (
val msgId: Long,
val msgDeliveryId: Long,
val msgDeliveryStatus: String,
val agentMsgId: Long,
val agentMsgMeta: String
)
@Serializable
data class QueueInfo (
val qiSnd: Boolean,
val qiNtf: Boolean,
val qiSub: QSub? = null,
val qiSize: Int,
val qiMsg: MsgInfo? = null
)
@Serializable
data class QSub (
val qSubThread: QSubThread,
val qDelivered: String? = null
)
enum class QSubThread {
@SerialName("noSub")
NO_SUB,
@SerialName("subPending")
SUB_PENDING,
@SerialName("subThread")
SUB_THREAD,
@SerialName("prohibitSub")
PROHIBIT_SUB
}
@Serializable
data class MsgInfo (
val msgId: String,
val msgTs: Instant,
val msgType: MsgType,
)
enum class MsgType {
@SerialName("message")
MESSAGE,
@SerialName("quota")
QUOTA
}
@@ -2,7 +2,6 @@ package com.sd.lib.compose.wheel_picker
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.background
import chat.simplex.common.ui.theme.isSystemInDarkTheme
import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -12,6 +11,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import chat.simplex.common.ui.theme.isInDarkTheme
/**
* The default implementation of focus view in vertical.
@@ -76,7 +76,7 @@ fun FWheelPickerFocusHorizontal(
*/
private val DefaultDividerColor: Color
@Composable
get() = (if (isSystemInDarkTheme()) {
get() = (if (isInDarkTheme()) {
Color.White
} else {
Color.Black
@@ -42,6 +42,12 @@ fun runMigrations() {
ChatController.appPrefs.currentTheme.set(DefaultTheme.SIMPLEX.name)
}
lastMigration.set(117)
} else if (lastMigration.get() < 203) {
// Moving to a different key for storing themes as a List
val oldOverrides = ChatController.appPrefs.themeOverridesOld.get().values.toList()
ChatController.appPrefs.themeOverrides.set(oldOverrides)
ChatController.appPrefs.currentThemeIds.set(oldOverrides.associate { it.base.themeName to it.themeId })
lastMigration.set(203)
} else {
lastMigration.set(BuildConfigCommon.ANDROID_VERSION_CODE)
break
@@ -43,14 +43,13 @@ val appPreferences: AppPreferences
val chatController: ChatController = ChatController
fun initChatControllerAndRunMigrations() {
fun initChatControllerOnStart() {
withLongRunningApi {
if (appPreferences.chatStopped.get() && appPreferences.storeDBPassphrase.get() && ksDatabasePassword.get() != null) {
initChatController(startChat = ::showStartChatAfterRestartAlert)
} else {
initChatController()
}
runMigrations()
}
}
@@ -88,11 +87,13 @@ suspend fun initChatController(useKey: String? = null, confirmMigrations: Migrat
return
}
platform.androidRestartNetworkObserver()
controller.apiSetTempFolder(coreTmpDir.absolutePath)
controller.apiSetFilesFolder(appFilesDir.absolutePath)
if (appPlatform.isDesktop) {
controller.apiSetRemoteHostsFolder(remoteHostsDir.absolutePath)
}
controller.apiSetAppFilePaths(
appFilesDir.absolutePath,
coreTmpDir.absolutePath,
wallpapersDir.parentFile.absolutePath,
remoteHostsDir.absolutePath,
ctrl
)
controller.apiSetEncryptLocalFiles(controller.appPrefs.privacyEncryptLocalFiles.get())
// If we migrated successfully means previous re-encryption process on database level finished successfully too
if (appPreferences.encryptionStartedAt.get() != null) appPreferences.encryptionStartedAt.set(null)
@@ -1,10 +1,12 @@
package chat.simplex.common.platform
import androidx.compose.runtime.Composable
import chat.simplex.common.model.CIFile
import chat.simplex.common.model.CryptoFile
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.res.MR
import com.charleskorn.kaml.*
import kotlinx.serialization.encodeToString
import java.io.*
import java.net.URI
import java.net.URLDecoder
@@ -14,8 +16,10 @@ expect val dataDir: File
expect val tmpDir: File
expect val filesDir: File
expect val appFilesDir: File
expect val wallpapersDir: File
expect val coreTmpDir: File
expect val dbAbsolutePrefixPath: String
expect val preferencesDir: File
expect val chatDatabaseFileName: String
expect val agentDatabaseFileName: String
@@ -78,6 +82,20 @@ fun getAppFilePath(fileName: String): String {
}
}
fun getWallpaperFilePath(fileName: String): String {
val rh = chatModel.currentRemoteHost.value
val s = File.separator
val path = if (rh == null) {
wallpapersDir.absolutePath + s + fileName
} else {
remoteHostsDir.absolutePath + s + rh.storePath + s + "simplex_v1_assets" + s + "wallpapers" + s + fileName
}
File(path).parentFile.mkdirs()
return path
}
fun getPreferenceFilePath(fileName: String = "themes.yaml"): String = preferencesDir.absolutePath + File.separator + fileName
fun getLoadedFilePath(file: CIFile?): String? {
val f = file?.fileSource?.filePath
return if (f != null && file.loaded) {
@@ -98,6 +116,42 @@ fun getLoadedFileSource(file: CIFile?): CryptoFile? {
}
}
fun readThemeOverrides(): List<ThemeOverrides> {
return try {
val file = File(getPreferenceFilePath("themes.yaml"))
if (!file.exists()) return emptyList()
file.inputStream().use {
val map = yaml.parseToYamlNode(it).yamlMap
val list = map.get<YamlList>("themes")
val res = ArrayList<ThemeOverrides>()
list?.items?.forEach {
try {
res.add(yaml.decodeFromYamlNode(ThemeOverrides.serializer(), it))
} catch (e: Throwable) {
Log.e(TAG, "Error while reading specific theme: ${e.stackTraceToString()}")
}
}
res.skipDuplicates()
}
} catch (e: Throwable) {
Log.e(TAG, "Error while reading themes file: ${e.stackTraceToString()}")
emptyList()
}
}
fun writeThemeOverrides(overrides: List<ThemeOverrides>): Boolean =
try {
File(getPreferenceFilePath("themes.yaml")).outputStream().use {
val string = yaml.encodeToString(ThemesFile(themes = overrides))
it.bufferedWriter().use { it.write(string) }
}
true
} catch (e: Throwable) {
Log.e(TAG, "Error while writing themes file: ${e.stackTraceToString()}")
false
}
private fun fileReady(file: CIFile, filePath: String) =
File(filePath).exists() &&
CIFile.cachedRemoteFileRequests[file.fileSource] != false
@@ -1,11 +1,13 @@
package chat.simplex.common.platform
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp
import com.russhwolf.settings.Settings
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.StringResource
@Composable
@@ -31,3 +33,5 @@ expect fun windowWidth(): Dp
expect fun desktopExpandWindowToWidth(width: Dp)
expect fun isRtl(text: CharSequence): Boolean
expect fun ImageResource.toComposeImageBitmap(): ImageBitmap?
@@ -31,17 +31,6 @@ val WarningOrange = Color(255, 127, 0, 255)
val WarningYellow = Color(255, 192, 0, 255)
val FileLight = Color(183, 190, 199, 255)
val FileDark = Color(101, 101, 106, 255)
val SentMessageColor = Color(0x1E45B8FF)
val MenuTextColor: Color @Composable get () = if (isInDarkTheme()) LocalContentColor.current.copy(alpha = 0.8f) else Color.Black
val NoteFolderIconColor: Color @Composable get() = with(CurrentColors.collectAsState().value.appColors.sentMessage) {
// Default color looks too light and better to have it here a little bit brighter
if (alpha == SentMessageColor.alpha) {
copy(min(SentMessageColor.alpha + 0.1f, 1f))
} else {
// Color is non-standard and theme maker can choose color without alpha at all since the theme bound to dark/light variant,
// and it shouldn't be universal
this
}
}
val NoteFolderIconColor: Color @Composable get() = MaterialTheme.appColors.primaryVariant2
@@ -6,53 +6,136 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.*
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import chat.simplex.common.model.ChatController
import chat.simplex.common.platform.isInNightMode
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.ThemeManager.colorFromReadableHex
import chat.simplex.common.ui.theme.ThemeManager.toReadableHex
import chat.simplex.common.views.helpers.*
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import chat.simplex.res.MR
import kotlinx.serialization.Transient
import java.util.UUID
enum class DefaultTheme {
SYSTEM, LIGHT, DARK, SIMPLEX;
LIGHT, DARK, SIMPLEX, BLACK;
companion object {
const val SYSTEM_THEME_NAME: String = "SYSTEM"
}
val themeName: String
get() = name
val mode: DefaultThemeMode get() = if (this == LIGHT) DefaultThemeMode.LIGHT else DefaultThemeMode.DARK
// Call it only with base theme, not SYSTEM
fun hasChangedAnyColor(colors: Colors, appColors: AppColors): Boolean {
val palette = when (this) {
SYSTEM -> return false
LIGHT -> LightColorPalette
DARK -> DarkColorPalette
SIMPLEX -> SimplexColorPalette
}
val appPalette = when (this) {
SYSTEM -> return false
LIGHT -> LightColorPaletteApp
DARK -> DarkColorPaletteApp
SIMPLEX -> SimplexColorPaletteApp
}
return colors.primary != palette.primary ||
colors.primaryVariant != palette.primaryVariant ||
colors.secondary != palette.secondary ||
colors.secondaryVariant != palette.secondaryVariant ||
colors.background != palette.background ||
colors.surface != palette.surface ||
appColors != appPalette
fun hasChangedAnyColor(overrides: ThemeOverrides?): Boolean {
if (overrides == null) return false
return overrides.colors != ThemeColors() ||
overrides.wallpaper != null && (overrides.wallpaper.background != null || overrides.wallpaper.tint != null)
}
}
data class AppColors(
val title: Color,
val sentMessage: Color,
val receivedMessage: Color
)
@Serializable
enum class DefaultThemeMode {
@SerialName("light") LIGHT,
@SerialName("dark") DARK
}
@Stable
class AppColors(
title: Color,
primaryVariant2: Color,
sentMessage: Color,
sentQuote: Color,
receivedMessage: Color,
receivedQuote: Color,
) {
var title by mutableStateOf(title, structuralEqualityPolicy())
internal set
var primaryVariant2 by mutableStateOf(primaryVariant2, structuralEqualityPolicy())
internal set
var sentMessage by mutableStateOf(sentMessage, structuralEqualityPolicy())
internal set
var sentQuote by mutableStateOf(sentQuote, structuralEqualityPolicy())
internal set
var receivedMessage by mutableStateOf(receivedMessage, structuralEqualityPolicy())
internal set
var receivedQuote by mutableStateOf(receivedQuote, structuralEqualityPolicy())
internal set
fun copy(
title: Color = this.title,
primaryVariant2: Color = this.primaryVariant2,
sentMessage: Color = this.sentMessage,
sentQuote: Color = this.sentQuote,
receivedMessage: Color = this.receivedMessage,
receivedQuote: Color = this.receivedQuote,
): AppColors = AppColors(
title,
primaryVariant2,
sentMessage,
sentQuote,
receivedMessage,
receivedQuote,
)
override fun toString(): String {
return buildString {
append("AppColors(")
append("title=$title, ")
append("primaryVariant2=$primaryVariant2, ")
append("sentMessage=$sentMessage, ")
append("sentQuote=$sentQuote, ")
append("receivedMessage=$receivedMessage, ")
append("receivedQuote=$receivedQuote")
append(")")
}
}
}
@Stable
class AppWallpaper(
background: Color? = null,
tint: Color? = null,
type: WallpaperType = WallpaperType.Empty,
) {
var background by mutableStateOf(background, structuralEqualityPolicy())
internal set
var tint by mutableStateOf(tint, structuralEqualityPolicy())
internal set
var type by mutableStateOf(type, structuralEqualityPolicy())
internal set
fun copy(
background: Color? = this.background,
tint: Color? = this.tint,
type: WallpaperType = this.type,
): AppWallpaper = AppWallpaper(
background,
tint,
type,
)
override fun toString(): String {
return buildString {
append("AppWallpaper(")
append("background=$background, ")
append("tint=$tint, ")
append("type=$type")
append(")")
}
}
}
enum class ThemeColor {
PRIMARY, PRIMARY_VARIANT, SECONDARY, SECONDARY_VARIANT, BACKGROUND, SURFACE, TITLE, SENT_MESSAGE, RECEIVED_MESSAGE;
PRIMARY, PRIMARY_VARIANT, SECONDARY, SECONDARY_VARIANT, BACKGROUND, SURFACE, TITLE, SENT_MESSAGE, SENT_QUOTE, RECEIVED_MESSAGE, RECEIVED_QUOTE, PRIMARY_VARIANT2, WALLPAPER_BACKGROUND, WALLPAPER_TINT;
fun fromColors(colors: Colors, appColors: AppColors): Color {
fun fromColors(colors: Colors, appColors: AppColors, appWallpaper: AppWallpaper): Color? {
return when (this) {
PRIMARY -> colors.primary
PRIMARY_VARIANT -> colors.primaryVariant
@@ -61,8 +144,13 @@ enum class ThemeColor {
BACKGROUND -> colors.background
SURFACE -> colors.surface
TITLE -> appColors.title
PRIMARY_VARIANT2 -> appColors.primaryVariant2
SENT_MESSAGE -> appColors.sentMessage
SENT_QUOTE -> appColors.sentQuote
RECEIVED_MESSAGE -> appColors.receivedMessage
RECEIVED_QUOTE -> appColors.receivedQuote
WALLPAPER_BACKGROUND -> appWallpaper.background
WALLPAPER_TINT -> appWallpaper.tint
}
}
@@ -75,8 +163,13 @@ enum class ThemeColor {
BACKGROUND -> generalGetString(MR.strings.color_background)
SURFACE -> generalGetString(MR.strings.color_surface)
TITLE -> generalGetString(MR.strings.color_title)
PRIMARY_VARIANT2 -> generalGetString(MR.strings.color_primary_variant2)
SENT_MESSAGE -> generalGetString(MR.strings.color_sent_message)
SENT_QUOTE -> generalGetString(MR.strings.color_sent_quote)
RECEIVED_MESSAGE -> generalGetString(MR.strings.color_received_message)
RECEIVED_QUOTE -> generalGetString(MR.strings.color_received_quote)
WALLPAPER_BACKGROUND -> generalGetString(MR.strings.color_wallpaper_background)
WALLPAPER_TINT -> generalGetString(MR.strings.color_wallpaper_tint)
}
}
@@ -92,45 +185,232 @@ data class ThemeColors(
@SerialName("menus")
val surface: String? = null,
val title: String? = null,
@SerialName("accentVariant2")
val primaryVariant2: String? = null,
val sentMessage: String? = null,
@SerialName("sentReply")
val sentQuote: String? = null,
val receivedMessage: String? = null,
@SerialName("receivedReply")
val receivedQuote: String? = null,
) {
fun toColors(base: DefaultTheme): Colors {
companion object {
fun from(colors: Colors, appColors: AppColors): ThemeColors =
ThemeColors(
primary = colors.primary.toReadableHex(),
primaryVariant = colors.primaryVariant.toReadableHex(),
secondary = colors.secondary.toReadableHex(),
secondaryVariant = colors.secondaryVariant.toReadableHex(),
background = colors.background.toReadableHex(),
surface = colors.surface.toReadableHex(),
title = appColors.title.toReadableHex(),
primaryVariant2 = appColors.primaryVariant2.toReadableHex(),
sentMessage = appColors.sentMessage.toReadableHex(),
sentQuote = appColors.sentQuote.toReadableHex(),
receivedMessage = appColors.receivedMessage.toReadableHex(),
receivedQuote = appColors.receivedQuote.toReadableHex(),
)
}
}
@Serializable
data class ThemeWallpaper (
val preset: String? = null,
val scale: Float? = null,
val scaleType: WallpaperScaleType? = null,
val background: String? = null,
val tint: String? = null,
val image: String? = null,
val imageFile: String? = null,
) {
fun toAppWallpaper(): AppWallpaper {
return AppWallpaper(
background = background?.colorFromReadableHex(),
tint = tint?.colorFromReadableHex(),
type = WallpaperType.from(this) ?: WallpaperType.Empty
)
}
fun withFilledWallpaperBase64(): ThemeWallpaper {
val aw = toAppWallpaper()
val type = aw.type
return ThemeWallpaper(
image = if (type is WallpaperType.Image && type.image != null) resizeImageToStrSize(type.image!!, 5_000_000) else null,
imageFile = null,
preset = if (type is WallpaperType.Preset) type.filename else null,
scale = if (type is WallpaperType.Preset) type.scale else if (type is WallpaperType.Image) type.scale else 1f,
scaleType = if (type is WallpaperType.Image) type.scaleType else null,
background = aw.background?.toReadableHex(),
tint = aw.tint?.toReadableHex(),
)
}
fun withFilledWallpaperPath(): ThemeWallpaper {
val aw = toAppWallpaper()
val type = aw.type
return ThemeWallpaper(
image = null,
imageFile = if (type is WallpaperType.Image) type.filename else null,
preset = if (type is WallpaperType.Preset) type.filename else null,
scale = if (scale == null) null else if (type is WallpaperType.Preset) type.scale else if (type is WallpaperType.Image) scale else null,
scaleType = if (scaleType == null) null else if (type is WallpaperType.Image) type.scaleType else null,
background = aw.background?.toReadableHex(),
tint = aw.tint?.toReadableHex(),
)
}
fun importFromString(): ThemeWallpaper =
if (preset == null && image != null) {
// Need to save image from string and to save its path
try {
val parsed = base64ToBitmap(image)
val filename = saveWallpaperFile(parsed)
copy(image = null, imageFile = filename)
} catch (e: Exception) {
Log.e(TAG, "Error while parsing/copying the image: ${e.stackTraceToString()}")
ThemeWallpaper()
}
} else this
companion object {
fun from(type: WallpaperType, background: String?, tint: String?): ThemeWallpaper {
return ThemeWallpaper(
image = null,
imageFile = if (type is WallpaperType.Image) type.filename else null,
preset = if (type is WallpaperType.Preset) type.filename else null,
scale = if (type is WallpaperType.Preset) type.scale else if (type is WallpaperType.Image) type.scale else null,
scaleType = if (type is WallpaperType.Image) type.scaleType else null,
background = background,
tint = tint,
)
}
}
}
@Serializable
data class ThemesFile(
val themes: List<ThemeOverrides> = emptyList()
)
@Serializable
data class ThemeOverrides (
val themeId: String = UUID.randomUUID().toString(),
val base: DefaultTheme,
val colors: ThemeColors = ThemeColors(),
val wallpaper: ThemeWallpaper? = null,
) {
fun isSame(type: WallpaperType?, themeName: String): Boolean =
(
(wallpaper?.preset != null && type is WallpaperType.Preset && wallpaper.preset == type.filename) ||
(wallpaper?.imageFile != null && type is WallpaperType.Image) ||
(wallpaper?.preset == null && wallpaper?.imageFile == null && (type == WallpaperType.Empty || type == null))
) && base.themeName == themeName
fun withUpdatedColor(name: ThemeColor, color: String?): ThemeOverrides {
return copy(
colors = when (name) {
ThemeColor.PRIMARY -> colors.copy(primary = color)
ThemeColor.PRIMARY_VARIANT -> colors.copy(primaryVariant = color)
ThemeColor.SECONDARY -> colors.copy(secondary = color)
ThemeColor.SECONDARY_VARIANT -> colors.copy(secondaryVariant = color)
ThemeColor.BACKGROUND -> colors.copy(background = color)
ThemeColor.SURFACE -> colors.copy(surface = color)
ThemeColor.TITLE -> colors.copy(title = color)
ThemeColor.PRIMARY_VARIANT2 -> colors.copy(primaryVariant2 = color)
ThemeColor.SENT_MESSAGE -> colors.copy(sentMessage = color)
ThemeColor.SENT_QUOTE -> colors.copy(sentQuote = color)
ThemeColor.RECEIVED_MESSAGE -> colors.copy(receivedMessage = color)
ThemeColor.RECEIVED_QUOTE -> colors.copy(receivedQuote = color)
ThemeColor.WALLPAPER_BACKGROUND -> colors.copy()
ThemeColor.WALLPAPER_TINT -> colors.copy()
}, wallpaper = when (name) {
ThemeColor.WALLPAPER_BACKGROUND -> wallpaper?.copy(background = color)
ThemeColor.WALLPAPER_TINT -> wallpaper?.copy(tint = color)
else -> wallpaper?.copy()
}
)
}
fun toColors(base: DefaultTheme, perChatTheme: ThemeColors?, perUserTheme: ThemeColors?, presetWallpaperTheme: ThemeColors?): Colors {
val baseColors = when (base) {
DefaultTheme.LIGHT -> LightColorPalette
DefaultTheme.DARK -> DarkColorPalette
DefaultTheme.SIMPLEX -> SimplexColorPalette
// shouldn't be here
DefaultTheme.SYSTEM -> LightColorPalette
DefaultTheme.BLACK -> BlackColorPalette
}
return baseColors.copy(
primary = primary?.colorFromReadableHex() ?: baseColors.primary,
primaryVariant = primaryVariant?.colorFromReadableHex() ?: baseColors.primaryVariant,
secondary = secondary?.colorFromReadableHex() ?: baseColors.secondary,
secondaryVariant = secondaryVariant?.colorFromReadableHex() ?: baseColors.secondaryVariant,
background = background?.colorFromReadableHex() ?: baseColors.background,
surface = surface?.colorFromReadableHex() ?: baseColors.surface,
primary = perChatTheme?.primary?.colorFromReadableHex() ?: perUserTheme?.primary?.colorFromReadableHex() ?: colors.primary?.colorFromReadableHex() ?: presetWallpaperTheme?.primary?.colorFromReadableHex() ?: baseColors.primary,
primaryVariant = perChatTheme?.primaryVariant?.colorFromReadableHex() ?: perUserTheme?.primaryVariant?.colorFromReadableHex() ?: colors.primaryVariant?.colorFromReadableHex() ?: presetWallpaperTheme?.primaryVariant?.colorFromReadableHex() ?: baseColors.primaryVariant,
secondary = perChatTheme?.secondary?.colorFromReadableHex() ?: perUserTheme?.secondary?.colorFromReadableHex() ?: colors.secondary?.colorFromReadableHex() ?: presetWallpaperTheme?.secondary?.colorFromReadableHex() ?: baseColors.secondary,
secondaryVariant = perChatTheme?.secondaryVariant?.colorFromReadableHex() ?: perUserTheme?.secondaryVariant?.colorFromReadableHex() ?: colors.secondaryVariant?.colorFromReadableHex() ?: presetWallpaperTheme?.secondaryVariant?.colorFromReadableHex() ?: baseColors.secondaryVariant,
background = perChatTheme?.background?.colorFromReadableHex() ?: perUserTheme?.background?.colorFromReadableHex() ?: colors.background?.colorFromReadableHex() ?: presetWallpaperTheme?.background?.colorFromReadableHex() ?: baseColors.background,
surface = perChatTheme?.surface?.colorFromReadableHex() ?: perUserTheme?.surface?.colorFromReadableHex() ?: colors.surface?.colorFromReadableHex() ?: presetWallpaperTheme?.surface?.colorFromReadableHex() ?: baseColors.surface,
)
}
fun toAppColors(base: DefaultTheme): AppColors {
fun toAppColors(base: DefaultTheme, perChatTheme: ThemeColors?, perChatWallpaperType: WallpaperType?, perUserTheme: ThemeColors?, perUserWallpaperType: WallpaperType?, presetWallpaperTheme: ThemeColors?): AppColors {
val baseColors = when (base) {
DefaultTheme.LIGHT -> LightColorPaletteApp
DefaultTheme.DARK -> DarkColorPaletteApp
DefaultTheme.SIMPLEX -> SimplexColorPaletteApp
// shouldn't be here
DefaultTheme.SYSTEM -> LightColorPaletteApp
DefaultTheme.BLACK -> BlackColorPaletteApp
}
val sentMessageFallback = colors.sentMessage?.colorFromReadableHex() ?: presetWallpaperTheme?.sentMessage?.colorFromReadableHex() ?: baseColors.sentMessage
val sentQuoteFallback = colors.sentQuote?.colorFromReadableHex() ?: presetWallpaperTheme?.sentQuote?.colorFromReadableHex() ?: baseColors.sentQuote
val receivedMessageFallback = colors.receivedMessage?.colorFromReadableHex() ?: presetWallpaperTheme?.receivedMessage?.colorFromReadableHex() ?: baseColors.receivedMessage
val receivedQuoteFallback = colors.receivedQuote?.colorFromReadableHex() ?: presetWallpaperTheme?.receivedQuote?.colorFromReadableHex() ?: baseColors.receivedQuote
return baseColors.copy(
title = title?.colorFromReadableHex() ?: baseColors.title,
sentMessage = sentMessage?.colorFromReadableHex() ?: baseColors.sentMessage,
receivedMessage = receivedMessage?.colorFromReadableHex() ?: baseColors.receivedMessage,
title = perChatTheme?.title?.colorFromReadableHex() ?: perUserTheme?.title?.colorFromReadableHex() ?: colors.title?.colorFromReadableHex() ?: presetWallpaperTheme?.title?.colorFromReadableHex() ?: baseColors.title,
primaryVariant2 = perChatTheme?.primaryVariant2?.colorFromReadableHex() ?: perUserTheme?.primaryVariant2?.colorFromReadableHex() ?: colors.primaryVariant2?.colorFromReadableHex() ?: presetWallpaperTheme?.primaryVariant2?.colorFromReadableHex() ?: baseColors.primaryVariant2,
sentMessage = if (perChatTheme?.sentMessage != null) perChatTheme.sentMessage.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.sentMessage?.colorFromReadableHex() ?: sentMessageFallback
else sentMessageFallback,
sentQuote = if (perChatTheme?.sentQuote != null) perChatTheme.sentQuote.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.sentQuote?.colorFromReadableHex() ?: sentQuoteFallback
else sentQuoteFallback,
receivedMessage = if (perChatTheme?.receivedMessage != null) perChatTheme.receivedMessage.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.receivedMessage?.colorFromReadableHex() ?: receivedMessageFallback
else receivedMessageFallback,
receivedQuote = if (perChatTheme?.receivedQuote != null) perChatTheme.receivedQuote.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.receivedQuote?.colorFromReadableHex() ?: receivedQuoteFallback
else receivedQuoteFallback,
)
}
fun withFilledColors(base: DefaultTheme): ThemeColors {
val c = toColors(base)
val ac = toAppColors(base)
fun toAppWallpaper(themeOverridesForType: WallpaperType?, perChatTheme: ThemeModeOverride?, perUserTheme: ThemeModeOverride?, materialBackgroundColor: Color): AppWallpaper {
val mainType = when {
themeOverridesForType != null -> themeOverridesForType
// type can be null if override is empty `"wallpaper": "{}"`, in this case no wallpaper is needed, empty.
// It's not null to override upper level wallpaper
perChatTheme?.wallpaper != null -> perChatTheme.wallpaper.toAppWallpaper().type
perUserTheme?.wallpaper != null -> perUserTheme.wallpaper.toAppWallpaper().type
else -> wallpaper?.toAppWallpaper()?.type ?: return AppWallpaper()
}
val first: ThemeWallpaper? = if (mainType.sameType(perChatTheme?.wallpaper?.toAppWallpaper()?.type)) perChatTheme?.wallpaper else null
val second: ThemeWallpaper? = if (mainType.sameType(perUserTheme?.wallpaper?.toAppWallpaper()?.type)) perUserTheme?.wallpaper else null
val third: ThemeWallpaper? = if (mainType.sameType(this.wallpaper?.toAppWallpaper()?.type)) this.wallpaper else null
return AppWallpaper(type = when (mainType) {
is WallpaperType.Preset -> mainType.copy(
scale = mainType.scale ?: first?.scale ?: second?.scale ?: third?.scale
)
is WallpaperType.Image -> mainType.copy(
scale = if (themeOverridesForType == null) mainType.scale ?: first?.scale ?: second?.scale ?: third?.scale else second?.scale ?: third?.scale ?: mainType.scale,
scaleType = if (themeOverridesForType == null) mainType.scaleType ?: first?.scaleType ?: second?.scaleType ?: third?.scaleType else second?.scaleType ?: third?.scaleType ?: mainType.scaleType,
filename = if (themeOverridesForType == null) mainType.filename else first?.imageFile ?: second?.imageFile ?: third?.imageFile ?: mainType.filename,
)
is WallpaperType.Empty -> mainType
},
background = (first?.background ?: second?.background ?: third?.background)?.colorFromReadableHex() ?: mainType.defaultBackgroundColor(base, materialBackgroundColor),
tint = (first?.tint ?: second?.tint ?: third?.tint)?.colorFromReadableHex() ?: mainType.defaultTintColor(base)
)
}
fun withFilledColors(base: DefaultTheme, perChatTheme: ThemeColors?, perChatWallpaperType: WallpaperType?, perUserTheme: ThemeColors?, perUserWallpaperType: WallpaperType?, presetWallpaperTheme: ThemeColors?): ThemeColors {
val c = toColors(base, perChatTheme, perUserTheme, presetWallpaperTheme)
val ac = toAppColors(base, perChatTheme, perChatWallpaperType, perUserTheme, perUserWallpaperType, presetWallpaperTheme)
return ThemeColors(
primary = c.primary.toReadableHex(),
primaryVariant = c.primaryVariant.toReadableHex(),
@@ -139,23 +419,71 @@ data class ThemeColors(
background = c.background.toReadableHex(),
surface = c.surface.toReadableHex(),
title = ac.title.toReadableHex(),
primaryVariant2 = ac.primaryVariant2.toReadableHex(),
sentMessage = ac.sentMessage.toReadableHex(),
receivedMessage = ac.receivedMessage.toReadableHex()
sentQuote = ac.sentQuote.toReadableHex(),
receivedMessage = ac.receivedMessage.toReadableHex(),
receivedQuote = ac.receivedQuote.toReadableHex(),
)
}
}
private fun String.colorFromReadableHex(): Color =
Color(this.replace("#", "").toLongOrNull(16) ?: Color.White.toArgb().toLong())
fun List<ThemeOverrides>.getTheme(themeId: String?): ThemeOverrides? =
firstOrNull { it.themeId == themeId }
private fun Color.toReadableHex(): String = "#" + Integer.toHexString(toArgb())
fun List<ThemeOverrides>.getTheme(themeId: String?, type: WallpaperType?, base: DefaultTheme): ThemeOverrides? =
firstOrNull { it.themeId == themeId || it.isSame(type, base.themeName)}
fun List<ThemeOverrides>.replace(theme: ThemeOverrides): List<ThemeOverrides> {
val index = indexOfFirst { it.themeId == theme.themeId ||
// prevent situation when two themes has the same type but different theme id (maybe something was changed in prefs by hand)
it.isSame(WallpaperType.from(theme.wallpaper), theme.base.themeName)
}
return if (index != -1) {
val a = ArrayList(this)
a[index] = theme
a
} else {
this + theme
}
}
fun List<ThemeOverrides>.sameTheme(type: WallpaperType?, themeName: String): ThemeOverrides? = firstOrNull { it.isSame(type, themeName) }
/** See [ThemesTest.testSkipDuplicates] */
fun List<ThemeOverrides>.skipDuplicates(): List<ThemeOverrides> {
val res = ArrayList<ThemeOverrides>()
forEach { theme ->
val themeType = WallpaperType.from(theme.wallpaper)
if (res.none { it.themeId == theme.themeId || it.isSame(themeType, theme.base.themeName) }) {
res.add(theme)
}
}
return res
}
@Serializable
data class ThemeOverrides (
val base: DefaultTheme,
val colors: ThemeColors
data class ThemeModeOverrides (
val light: ThemeModeOverride? = null,
val dark: ThemeModeOverride? = null
) {
fun withUpdatedColor(name: ThemeColor, color: String): ThemeOverrides {
fun preferredMode(darkTheme: Boolean): ThemeModeOverride? = when (darkTheme) {
false -> light
else -> dark
}
}
@Serializable
data class ThemeModeOverride (
val mode: DefaultThemeMode = CurrentColors.value.base.mode,
val colors: ThemeColors = ThemeColors(),
val wallpaper: ThemeWallpaper? = null,
) {
@Transient
val type = WallpaperType.from(wallpaper)
fun withUpdatedColor(name: ThemeColor, color: String?): ThemeModeOverride {
return copy(colors = when (name) {
ThemeColor.PRIMARY -> colors.copy(primary = color)
ThemeColor.PRIMARY_VARIANT -> colors.copy(primaryVariant = color)
@@ -164,9 +492,97 @@ data class ThemeOverrides (
ThemeColor.BACKGROUND -> colors.copy(background = color)
ThemeColor.SURFACE -> colors.copy(surface = color)
ThemeColor.TITLE -> colors.copy(title = color)
ThemeColor.PRIMARY_VARIANT2 -> colors.copy(primaryVariant2 = color)
ThemeColor.SENT_MESSAGE -> colors.copy(sentMessage = color)
ThemeColor.SENT_QUOTE -> colors.copy(sentQuote = color)
ThemeColor.RECEIVED_MESSAGE -> colors.copy(receivedMessage = color)
})
ThemeColor.RECEIVED_QUOTE -> colors.copy(receivedQuote = color)
ThemeColor.WALLPAPER_BACKGROUND -> colors.copy()
ThemeColor.WALLPAPER_TINT -> colors.copy()
}, wallpaper = when (name) {
ThemeColor.WALLPAPER_BACKGROUND -> wallpaper?.copy(background = color)
ThemeColor.WALLPAPER_TINT -> wallpaper?.copy(tint = color)
else -> wallpaper?.copy()
}
)
}
fun removeSameColors(base: DefaultTheme): ThemeModeOverride {
val c = when (base) {
DefaultTheme.LIGHT -> LightColorPalette
DefaultTheme.DARK -> DarkColorPalette
DefaultTheme.SIMPLEX -> SimplexColorPalette
DefaultTheme.BLACK -> BlackColorPalette
}
val ac = when (base) {
DefaultTheme.LIGHT -> LightColorPaletteApp
DefaultTheme.DARK -> DarkColorPaletteApp
DefaultTheme.SIMPLEX -> SimplexColorPaletteApp
DefaultTheme.BLACK -> BlackColorPaletteApp
}
val w = when (val wallpaperType = WallpaperType.from(wallpaper)) {
is WallpaperType.Preset -> {
val p = PresetWallpaper.from(wallpaperType.filename)
ThemeWallpaper(
preset = wallpaperType.filename,
scale = p?.scale ?: wallpaper?.scale,
scaleType = null,
background = p?.background?.get(base)?.toReadableHex(),
tint = p?.tint?.get(base)?.toReadableHex(),
image = null,
imageFile = null,
)
}
is WallpaperType.Image -> {
ThemeWallpaper(
preset = null,
scale = null,
scaleType = WallpaperScaleType.FILL,
background = Color.Transparent.toReadableHex(),
tint = Color.Transparent.toReadableHex(),
image = null,
imageFile = null,
)
}
else -> {
ThemeWallpaper()
}
}
return copy(
colors = ThemeColors(
primary = if (colors.primary?.colorFromReadableHex() != c.primary) colors.primary else null,
primaryVariant = if (colors.primaryVariant?.colorFromReadableHex() != c.primaryVariant) colors.primaryVariant else null,
secondary = if (colors.secondary?.colorFromReadableHex() != c.secondary) colors.secondary else null,
secondaryVariant = if (colors.secondaryVariant?.colorFromReadableHex() != c.secondaryVariant) colors.secondaryVariant else null,
background = if (colors.background?.colorFromReadableHex() != c.background) colors.background else null,
surface = if (colors.surface?.colorFromReadableHex() != c.surface) colors.surface else null,
title = if (colors.title?.colorFromReadableHex() != ac.title) colors.title else null,
primaryVariant2 = if (colors.primaryVariant2?.colorFromReadableHex() != ac.primaryVariant2) colors.primary else null,
sentMessage = if (colors.sentMessage?.colorFromReadableHex() != ac.sentMessage) colors.sentMessage else null,
sentQuote = if (colors.sentQuote?.colorFromReadableHex() != ac.sentQuote) colors.sentQuote else null,
receivedMessage = if (colors.receivedMessage?.colorFromReadableHex() != ac.receivedMessage) colors.receivedMessage else null,
receivedQuote = if (colors.receivedQuote?.colorFromReadableHex() != ac.receivedQuote) colors.receivedQuote else null,
),
wallpaper = wallpaper?.copy(
preset = wallpaper.preset,
scale = if (wallpaper.scale != w.scale) wallpaper.scale else null,
scaleType = if (wallpaper.scaleType != w.scaleType) wallpaper.scaleType else null,
background = if (wallpaper.background != w.background) wallpaper.background else null,
tint = if (wallpaper.tint != w.tint) wallpaper.tint else null,
image = wallpaper.image,
imageFile = wallpaper.imageFile,
)
)
}
companion object {
fun withFilledAppDefaults(mode: DefaultThemeMode, base: DefaultTheme): ThemeModeOverride =
ThemeModeOverride(
mode = mode,
colors = ThemeOverrides(base = base).withFilledColors(base, null, null, null, null, null),
wallpaper = ThemeWallpaper(preset = PresetWallpaper.SCHOOL.filename)
)
}
}
@@ -204,7 +620,6 @@ val DarkColorPalette = darkColors(
// background = Color.Black,
surface = Color(0xFF222222),
// background = Color(0xFF121212),
// surface = Color(0xFF121212),
error = Color.Red,
onBackground = Color(0xFFFFFBFA),
onSurface = Color(0xFFFFFBFA),
@@ -212,8 +627,11 @@ val DarkColorPalette = darkColors(
)
val DarkColorPaletteApp = AppColors(
title = SimplexBlue,
sentMessage = SentMessageColor,
receivedMessage = Color(0x20B1B0B5)
primaryVariant2 = Color(0xFF18262E),
sentMessage = Color(0xFF18262E),
sentQuote = Color(0xFF1D3847),
receivedMessage = Color(0xff262627),
receivedQuote = Color(0xff373739),
)
val LightColorPalette = lightColors(
@@ -231,8 +649,11 @@ val LightColorPalette = lightColors(
)
val LightColorPaletteApp = AppColors(
title = SimplexBlue,
sentMessage = SentMessageColor,
receivedMessage = Color(0x20B1B0B5)
primaryVariant2 = Color(0xFFE9F7FF),
sentMessage = Color(0xFFE9F7FF),
sentQuote = Color(0xFFD6F0FF),
receivedMessage = Color(0xfff5f5f6),
receivedQuote = Color(0xffececee),
)
val SimplexColorPalette = darkColors(
@@ -251,11 +672,39 @@ val SimplexColorPalette = darkColors(
)
val SimplexColorPaletteApp = AppColors(
title = Color(0xFF267BE5),
sentMessage = SentMessageColor,
receivedMessage = Color(0x20B1B0B5)
primaryVariant2 = Color(0xFF172941),
sentMessage = Color(0xFF172941),
sentQuote = Color(0xFF1C3A57),
receivedMessage = Color(0xff25283a),
receivedQuote = Color(0xff36394a),
)
val CurrentColors: MutableStateFlow<ThemeManager.ActiveTheme> = MutableStateFlow(ThemeManager.currentColors(isInNightMode()))
val BlackColorPalette = darkColors(
primary = Color(0xff0077e0), // If this value changes also need to update #0088ff in string resource files
primaryVariant = Color(0xff0077e0),
secondary = HighOrLowlight,
secondaryVariant = DarkGray,
background = Color(0xff070707),
surface = Color(0xff161617),
// background = Color(0xFF121212),
// surface = Color(0xFF121212),
error = Color.Red,
onBackground = Color(0xFFFFFBFA),
onSurface = Color(0xFFFFFBFA),
// onError: Color = Color.Black,
)
val BlackColorPaletteApp = AppColors(
title = Color(0xff0077e0),
primaryVariant2 = Color(0xff243747),
sentMessage = Color(0xFF18262E),
sentQuote = Color(0xFF1D3847),
receivedMessage = Color(0xff1b1b1b),
receivedQuote = Color(0xff29292b),
)
var systemInDarkThemeCurrently: Boolean = isInNightMode()
val CurrentColors: MutableStateFlow<ThemeManager.ActiveTheme> = MutableStateFlow(ThemeManager.currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPreferences.themeOverrides.get()))
@Composable
fun isInDarkTheme(): Boolean = !CurrentColors.collectAsState().value.colors.isLight
@@ -263,31 +712,113 @@ fun isInDarkTheme(): Boolean = !CurrentColors.collectAsState().value.colors.isLi
@Composable
expect fun isSystemInDarkTheme(): Boolean
internal val LocalAppColors = staticCompositionLocalOf { LightColorPaletteApp }
internal val LocalAppWallpaper = staticCompositionLocalOf { AppWallpaper() }
val MaterialTheme.appColors: AppColors
@Composable
@ReadOnlyComposable
get() = LocalAppColors.current
fun AppColors.updateColorsFrom(other: AppColors) {
title = other.title
primaryVariant2 = other.primaryVariant2
sentMessage = other.sentMessage
sentQuote = other.sentQuote
receivedMessage = other.receivedMessage
receivedQuote = other.receivedQuote
}
fun AppWallpaper.updateWallpaperFrom(other: AppWallpaper) {
background = other.background
tint = other.tint
type = other.type
}
val MaterialTheme.wallpaper: AppWallpaper
@Composable
@ReadOnlyComposable
get() = LocalAppWallpaper.current
fun reactOnDarkThemeChanges(isDark: Boolean) {
if (ChatController.appPrefs.currentTheme.get() == DefaultTheme.SYSTEM.name && CurrentColors.value.colors.isLight == isDark) {
systemInDarkThemeCurrently = isDark
if (ChatController.appPrefs.currentTheme.get() == DefaultTheme.SYSTEM_THEME_NAME && CurrentColors.value.colors.isLight == isDark) {
// Change active colors from light to dark and back based on system theme
ThemeManager.applyTheme(DefaultTheme.SYSTEM.name, isDark)
ThemeManager.applyTheme(DefaultTheme.SYSTEM_THEME_NAME)
}
}
@Composable
fun SimpleXTheme(darkTheme: Boolean? = null, content: @Composable () -> Unit) {
LaunchedEffect(darkTheme) {
// For preview
if (darkTheme != null)
CurrentColors.value = ThemeManager.currentColors(darkTheme)
}
val systemDark = isSystemInDarkTheme()
LaunchedEffect(systemDark) {
reactOnDarkThemeChanges(systemDark)
// TODO: Fix preview working with dark/light theme
// LaunchedEffect(darkTheme) {
// // For preview
// if (darkTheme != null)
// CurrentColors.value = ThemeManager.currentColors(darkTheme, null, null, chatModel.currentUser.value?.uiThemes, appPreferences.themeOverrides.get())
// }
val systemDark = rememberUpdatedState(isSystemInDarkTheme())
LaunchedEffect(Unit) {
// snapshotFlow vs LaunchedEffect reduce number of recomposes
snapshotFlow { systemDark.value }
.collect {
reactOnDarkThemeChanges(systemDark.value)
}
}
val theme by CurrentColors.collectAsState()
LaunchedEffect(Unit) {
// snapshotFlow vs LaunchedEffect reduce number of recomposes when user is changed or it's themes
snapshotFlow { chatModel.currentUser.value?.uiThemes }
.collect {
ThemeManager.applyTheme(appPrefs.currentTheme.get()!!)
}
}
MaterialTheme(
colors = theme.colors,
typography = Typography,
shapes = Shapes,
content = {
CompositionLocalProvider(LocalContentColor provides MaterialTheme.colors.onBackground, content = content)
val rememberedAppColors = remember {
// Explicitly creating a new object here so we don't mutate the initial [appColors]
// provided, and overwrite the values set in it.
theme.appColors.copy()
}.apply { updateColorsFrom(theme.appColors) }
val rememberedWallpaper = remember {
// Explicitly creating a new object here so we don't mutate the initial [wallpaper]
// provided, and overwrite the values set in it.
theme.wallpaper.copy()
}.apply { updateWallpaperFrom(theme.wallpaper) }
CompositionLocalProvider(
LocalContentColor provides MaterialTheme.colors.onBackground,
LocalAppColors provides rememberedAppColors,
LocalAppWallpaper provides rememberedWallpaper,
content = content)
}
)
}
@Composable
fun SimpleXThemeOverride(theme: ThemeManager.ActiveTheme, content: @Composable () -> Unit) {
MaterialTheme(
colors = theme.colors,
typography = Typography,
shapes = Shapes,
content = {
val rememberedAppColors = remember {
// Explicitly creating a new object here so we don't mutate the initial [appColors]
// provided, and overwrite the values set in it.
theme.appColors.copy()
}.apply { updateColorsFrom(theme.appColors) }
val rememberedWallpaper = remember {
// Explicitly creating a new object here so we don't mutate the initial [wallpaper]
// provided, and overwrite the values set in it.
theme.wallpaper.copy()
}.apply { updateWallpaperFrom(theme.wallpaper) }
CompositionLocalProvider(
LocalContentColor provides MaterialTheme.colors.onBackground,
LocalAppColors provides rememberedAppColors,
LocalAppWallpaper provides rememberedWallpaper,
content = content)
}
)
}
@@ -1,14 +1,14 @@
package chat.simplex.common.ui.theme
import androidx.compose.material.Colors
import androidx.compose.runtime.MutableState
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.text.font.FontFamily
import chat.simplex.res.MR
import chat.simplex.common.model.AppPreferences
import chat.simplex.common.model.ChatController
import chat.simplex.common.platform.platform
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.common.model.*
import chat.simplex.common.platform.*
import chat.simplex.common.views.helpers.*
import java.io.File
// https://github.com/rsms/inter
// I place it here because IDEA shows an error (but still works anyway) when this declaration inside Type.kt
@@ -18,140 +18,215 @@ expect val EmojiFont: FontFamily
object ThemeManager {
private val appPrefs: AppPreferences = ChatController.appPrefs
data class ActiveTheme(val name: String, val base: DefaultTheme, val colors: Colors, val appColors: AppColors)
data class ActiveTheme(val name: String, val base: DefaultTheme, val colors: Colors, val appColors: AppColors, val wallpaper: AppWallpaper = AppWallpaper())
private fun systemDarkThemeColors(): Pair<Colors, DefaultTheme> = when (appPrefs.systemDarkTheme.get()) {
DefaultTheme.DARK.name -> DarkColorPalette to DefaultTheme.DARK
DefaultTheme.SIMPLEX.name -> SimplexColorPalette to DefaultTheme.SIMPLEX
DefaultTheme.DARK.themeName -> DarkColorPalette to DefaultTheme.DARK
DefaultTheme.SIMPLEX.themeName -> SimplexColorPalette to DefaultTheme.SIMPLEX
DefaultTheme.BLACK.themeName -> BlackColorPalette to DefaultTheme.BLACK
else -> SimplexColorPalette to DefaultTheme.SIMPLEX
}
fun currentColors(darkForSystemTheme: Boolean): ActiveTheme {
private fun nonSystemThemeName(): String {
val themeName = appPrefs.currentTheme.get()!!
val themeOverrides = appPrefs.themeOverrides.get()
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
return if (themeName != DefaultTheme.SYSTEM_THEME_NAME) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
if (systemInDarkThemeCurrently) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.themeName
}
val theme = themeOverrides[nonSystemThemeName]
}
fun defaultActiveTheme(appSettingsTheme: List<ThemeOverrides>): ThemeOverrides? {
val nonSystemThemeName = nonSystemThemeName()
val defaultThemeId = appPrefs.currentThemeIds.get()[nonSystemThemeName]
return appSettingsTheme.getTheme(defaultThemeId)
}
fun defaultActiveTheme(perUserTheme: ThemeModeOverrides?, appSettingsTheme: List<ThemeOverrides>): ThemeModeOverride {
val perUserTheme = if (!CurrentColors.value.colors.isLight) perUserTheme?.dark else perUserTheme?.light
if (perUserTheme != null) {
return perUserTheme
}
val defaultTheme = defaultActiveTheme(appSettingsTheme)
return ThemeModeOverride(colors = defaultTheme?.colors ?: ThemeColors(), wallpaper = defaultTheme?.wallpaper)
}
fun currentColors(themeOverridesForType: WallpaperType?, perChatTheme: ThemeModeOverride?, perUserTheme: ThemeModeOverrides?, appSettingsTheme: List<ThemeOverrides>): ActiveTheme {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = nonSystemThemeName()
val defaultTheme = defaultActiveTheme(appSettingsTheme)
val baseTheme = when (nonSystemThemeName) {
DefaultTheme.LIGHT.name -> Triple(DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp)
DefaultTheme.DARK.name -> Triple(DefaultTheme.DARK, DarkColorPalette, DarkColorPaletteApp)
DefaultTheme.SIMPLEX.name -> Triple(DefaultTheme.SIMPLEX, SimplexColorPalette, SimplexColorPaletteApp)
else -> Triple(DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp)
DefaultTheme.LIGHT.themeName -> ActiveTheme(DefaultTheme.LIGHT.themeName, DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.LIGHT)))
DefaultTheme.DARK.themeName -> ActiveTheme(DefaultTheme.DARK.themeName, DefaultTheme.DARK, DarkColorPalette, DarkColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.DARK)))
DefaultTheme.SIMPLEX.themeName -> ActiveTheme(DefaultTheme.SIMPLEX.themeName, DefaultTheme.SIMPLEX, SimplexColorPalette, SimplexColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.SIMPLEX)))
DefaultTheme.BLACK.themeName -> ActiveTheme(DefaultTheme.BLACK.themeName, DefaultTheme.BLACK, BlackColorPalette, BlackColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.BLACK)))
else -> ActiveTheme(DefaultTheme.LIGHT.themeName, DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.LIGHT)))
}
if (theme == null) {
return ActiveTheme(themeName, baseTheme.first, baseTheme.second, baseTheme.third)
val perUserTheme = if (baseTheme.colors.isLight) perUserTheme?.light else perUserTheme?.dark
val theme = (appSettingsTheme.sameTheme(themeOverridesForType ?: perChatTheme?.type ?: perUserTheme?.type ?: defaultTheme?.wallpaper?.toAppWallpaper()?.type, nonSystemThemeName) ?: defaultTheme)
if (theme == null && perUserTheme == null && perChatTheme == null && themeOverridesForType == null) {
return ActiveTheme(themeName, baseTheme.base, baseTheme.colors, baseTheme.appColors, baseTheme.wallpaper)
}
return ActiveTheme(themeName, baseTheme.first, theme.colors.toColors(theme.base), theme.colors.toAppColors(theme.base))
val presetWallpaperTheme = when {
perChatTheme?.wallpaper != null -> if (perChatTheme.wallpaper.preset != null) PresetWallpaper.from(perChatTheme.wallpaper.preset)?.colors?.get(baseTheme.base) else null
perUserTheme?.wallpaper != null -> if (perUserTheme.wallpaper.preset != null) PresetWallpaper.from(perUserTheme.wallpaper.preset)?.colors?.get(baseTheme.base) else null
else -> if (theme?.wallpaper?.preset != null) PresetWallpaper.from(theme.wallpaper.preset)?.colors?.get(baseTheme.base) else null
}
val themeOrEmpty = theme ?: ThemeOverrides(base = baseTheme.base)
val colors = themeOrEmpty.toColors(themeOrEmpty.base, perChatTheme?.colors, perUserTheme?.colors, presetWallpaperTheme)
return ActiveTheme(
themeName,
baseTheme.base,
colors,
themeOrEmpty.toAppColors(themeOrEmpty.base, perChatTheme?.colors, perChatTheme?.type, perUserTheme?.colors, perUserTheme?.type, presetWallpaperTheme),
themeOrEmpty.toAppWallpaper(themeOverridesForType, perChatTheme, perUserTheme, colors.background)
)
}
fun currentThemeOverridesForExport(darkForSystemTheme: Boolean): ThemeOverrides {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
}
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val nonFilledTheme = overrides[nonSystemThemeName] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
return nonFilledTheme.copy(colors = nonFilledTheme.colors.withFilledColors(CurrentColors.value.base))
fun currentThemeOverridesForExport(perChatTheme: ThemeModeOverride?, perUserTheme: ThemeModeOverrides?): ThemeOverrides {
val current = currentColors(null, perChatTheme, perUserTheme, appPrefs.themeOverrides.get())
val wType = current.wallpaper.type
val wBackground = current.wallpaper.background
val wTint = current.wallpaper.tint
return ThemeOverrides(
themeId = "",
base = current.base,
colors = ThemeColors.from(current.colors, current.appColors),
wallpaper = if (wType !is WallpaperType.Empty) ThemeWallpaper.from(wType, wBackground?.toReadableHex(), wTint?.toReadableHex()).withFilledWallpaperBase64() else null
)
}
// colors, default theme enum, localized name of theme
fun allThemes(darkForSystemTheme: Boolean): List<Triple<Colors, DefaultTheme, String>> {
val allThemes = ArrayList<Triple<Colors, DefaultTheme, String>>()
allThemes.add(
Triple(
if (darkForSystemTheme) systemDarkThemeColors().first else LightColorPalette,
DefaultTheme.SYSTEM,
generalGetString(MR.strings.theme_system)
)
)
allThemes.add(
Triple(
LightColorPalette,
DefaultTheme.LIGHT,
generalGetString(MR.strings.theme_light)
)
)
allThemes.add(
Triple(
DarkColorPalette,
DefaultTheme.DARK,
generalGetString(MR.strings.theme_dark)
)
)
allThemes.add(
Triple(
SimplexColorPalette,
DefaultTheme.SIMPLEX,
generalGetString(MR.strings.theme_simplex)
)
)
return allThemes
}
fun applyTheme(theme: String, darkForSystemTheme: Boolean) {
fun applyTheme(theme: String) {
appPrefs.currentTheme.set(theme)
CurrentColors.value = currentColors(darkForSystemTheme)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
platform.androidSetNightModeIfSupported()
}
fun changeDarkTheme(theme: String, darkForSystemTheme: Boolean) {
fun changeDarkTheme(theme: String) {
appPrefs.systemDarkTheme.set(theme)
CurrentColors.value = currentColors(darkForSystemTheme)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun saveAndApplyThemeColor(name: ThemeColor, color: Color? = null, darkForSystemTheme: Boolean) {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
fun saveAndApplyThemeColor(baseTheme: DefaultTheme, name: ThemeColor, color: Color? = null, pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val nonSystemThemeName = baseTheme.themeName
val overrides = pref.get()
val themeId = appPrefs.currentThemeIds.get()[nonSystemThemeName]
val prevValue = overrides.getTheme(themeId) ?: ThemeOverrides(base = baseTheme)
pref.set(overrides.replace(prevValue.withUpdatedColor(name, color?.toReadableHex())))
val themeIds = appPrefs.currentThemeIds.get().toMutableMap()
themeIds[nonSystemThemeName] = prevValue.themeId
appPrefs.currentThemeIds.set(themeIds)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun applyThemeColor(name: ThemeColor, color: Color? = null, pref: MutableState<ThemeModeOverride>) {
pref.value = pref.value.withUpdatedColor(name, color?.toReadableHex())
}
fun saveAndApplyWallpaper(baseTheme: DefaultTheme, type: WallpaperType?, pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val nonSystemThemeName = baseTheme.themeName
val overrides = pref.get()
val theme = overrides.sameTheme(type, baseTheme.themeName)
val prevValue = theme ?: ThemeOverrides(base = baseTheme)
pref.set(overrides.replace(prevValue.copy(wallpaper = if (type != null && type !is WallpaperType.Empty) ThemeWallpaper.from(type, prevValue.wallpaper?.background, prevValue.wallpaper?.tint) else null)))
val themeIds = appPrefs.currentThemeIds.get().toMutableMap()
themeIds[nonSystemThemeName] = prevValue.themeId
appPrefs.currentThemeIds.set(themeIds)
CurrentColors.value = currentColors( null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun copyFromSameThemeOverrides(type: WallpaperType?, lowerLevelOverride: ThemeModeOverride?, pref: MutableState<ThemeModeOverride>): Boolean {
val overrides = appPrefs.themeOverrides.get()
val sameWallpaper = if (lowerLevelOverride?.type?.sameType(type) == true) lowerLevelOverride.wallpaper else overrides.sameTheme(type, CurrentColors.value.base.themeName)?.wallpaper
if (sameWallpaper == null) {
if (type != null) {
pref.value = ThemeModeOverride(wallpaper = ThemeWallpaper.from(type, null, null).copy(scale = null, scaleType = null))
} else {
// Make an empty wallpaper to override any top level ones
pref.value = ThemeModeOverride(wallpaper = ThemeWallpaper())
}
return true
}
var colorToSet = color
if (colorToSet == null) {
// Setting default color from a base theme
colorToSet = when(nonSystemThemeName) {
DefaultTheme.LIGHT.name -> name.fromColors(LightColorPalette, LightColorPaletteApp)
DefaultTheme.DARK.name -> name.fromColors(DarkColorPalette, DarkColorPaletteApp)
DefaultTheme.SIMPLEX.name -> name.fromColors(SimplexColorPalette, SimplexColorPaletteApp)
// Will not be here
else -> return
var type = sameWallpaper.toAppWallpaper().type
if (type is WallpaperType.Image && sameWallpaper.imageFile == type.filename) {
// same image file. Needs to be copied first in order to be able to remove the file once it's not needed anymore without affecting main theme override
val filename = saveWallpaperFile(File(getWallpaperFilePath(type.filename)).toURI())
if (filename != null) {
type = WallpaperType.Image(filename, type.scale, type.scaleType)
} else {
Log.e(TAG, "Error while copying wallpaper from global overrides to chat overrides")
return false
}
}
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val prevValue = overrides[nonSystemThemeName] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
overrides[nonSystemThemeName] = prevValue.withUpdatedColor(name, colorToSet.toReadableHex())
appPrefs.themeOverrides.set(overrides)
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
val prevValue = pref.value
pref.value = prevValue.copy(
colors = ThemeColors(),
wallpaper = ThemeWallpaper.from(type, null, null).copy(scale = null, scaleType = null)
)
return true
}
fun saveAndApplyThemeOverrides(theme: ThemeOverrides, darkForSystemTheme: Boolean) {
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val prevValue = overrides[theme.base.name] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
overrides[theme.base.name] = prevValue.copy(colors = theme.colors)
appPrefs.themeOverrides.set(overrides)
appPrefs.currentTheme.set(theme.base.name)
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
fun applyWallpaper(type: WallpaperType?, pref: MutableState<ThemeModeOverride>) {
val prevValue = pref.value
pref.value = prevValue.copy(
wallpaper = if (type != null)
ThemeWallpaper.from(type, prevValue.wallpaper?.background, prevValue.wallpaper?.tint)
else null
)
}
fun resetAllThemeColors(darkForSystemTheme: Boolean) {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
fun saveAndApplyThemeOverrides(theme: ThemeOverrides, pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val wallpaper = theme.wallpaper?.importFromString()
val nonSystemThemeName = theme.base.themeName
val overrides = pref.get()
val prevValue = overrides.getTheme(null, wallpaper?.toAppWallpaper()?.type, theme.base) ?: ThemeOverrides(base = theme.base)
if (prevValue.wallpaper?.imageFile != null) {
File(getWallpaperFilePath(prevValue.wallpaper.imageFile)).delete()
}
pref.set(overrides.replace(prevValue.copy(base = theme.base, colors = theme.colors, wallpaper = wallpaper)))
appPrefs.currentTheme.set(nonSystemThemeName)
val currentThemeIds = appPrefs.currentThemeIds.get().toMutableMap()
currentThemeIds[nonSystemThemeName] = prevValue.themeId
appPrefs.currentThemeIds.set(currentThemeIds)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun resetAllThemeColors(pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val nonSystemThemeName = nonSystemThemeName()
val themeId = appPrefs.currentThemeIds.get()[nonSystemThemeName] ?: return
val overrides = pref.get()
val prevValue = overrides.getTheme(themeId) ?: return
pref.set(overrides.replace(prevValue.copy(colors = ThemeColors(), wallpaper = prevValue.wallpaper?.copy(background = null, tint = null))))
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun resetAllThemeColors(pref: MutableState<ThemeModeOverride>) {
val prevValue = pref.value
pref.value = prevValue.copy(colors = ThemeColors(), wallpaper = prevValue.wallpaper?.copy(background = null, tint = null))
}
fun removeTheme(themeId: String?) {
val themes = ArrayList(appPrefs.themeOverrides.get())
themes.removeAll { it.themeId == themeId }
appPrefs.themeOverrides.set(themes)
}
fun String.colorFromReadableHex(): Color =
Color(this.replace("#", "").toLongOrNull(16) ?: Color.White.toArgb().toLong())
fun Color.toReadableHex(): String {
val s = Integer.toHexString(toArgb())
return when {
this == Color.Transparent -> "#00ffffff"
s.length == 1 -> "#ff$s$s$s$s$s$s"
s.length == 2 -> "#ff$s$s$s"
s.length == 3 -> "#ff$s$s"
s.length == 6 && this.alpha == 0f -> "#00$s"
s.length == 6 -> "#ff$s"
else -> "#$s"
}
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val prevValue = overrides[nonSystemThemeName] ?: return
overrides[nonSystemThemeName] = prevValue.copy(colors = ThemeColors())
appPrefs.themeOverrides.set(overrides)
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
}
}
private fun Color.toReadableHex(): String = "#" + Integer.toHexString(toArgb())
@@ -29,6 +29,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatModel.controller
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
@@ -41,6 +42,8 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.datetime.Clock
import kotlinx.serialization.encodeToString
import java.io.File
@Composable
fun ChatInfoView(
@@ -337,6 +340,16 @@ fun ChatInfoLayout(
if (cStats != null && cStats.ratchetSyncAllowed) {
SynchronizeConnectionButton(syncContactConnection)
}
WallpaperButton {
ModalManager.end.showModal {
val chat = remember { derivedStateOf { chatModel.chats.firstOrNull { it.id == chat.id } } }
val c = chat.value
if (c != null) {
ChatWallpaperEditorModal(c)
}
}
}
// } else if (developerTools) {
// SynchronizeConnectionButtonForce(syncContactConnectionForce)
// }
@@ -406,6 +419,19 @@ fun ChatInfoLayout(
SectionView(title = stringResource(MR.strings.section_title_for_console)) {
InfoRow(stringResource(MR.strings.info_row_local_name), chat.chatInfo.localDisplayName)
InfoRow(stringResource(MR.strings.info_row_database_id), chat.chatInfo.apiId.toString())
SectionItemView({
withBGApi {
val info = controller.apiContactQueueInfo(chat.remoteHostId, chat.chatInfo.apiId)
if (info != null) {
AlertManager.shared.showAlertMsg(
title = generalGetString(MR.strings.message_queue_info),
text = queueInfoText(info)
)
}
}
}) {
Text(stringResource(MR.strings.info_row_debug_delivery))
}
}
}
SectionBottomSpacer()
@@ -642,6 +668,15 @@ private fun SendReceiptsOption(currentUser: User, state: State<SendReceipts>, on
)
}
@Composable
fun WallpaperButton(onClick: () -> Unit) {
SettingsActionItem(
painterResource(MR.images.ic_image),
stringResource(MR.strings.settings_section_title_chat_theme),
click = onClick
)
}
@Composable
fun ClearChatButton(onClick: () -> Unit) {
SettingsActionItem(
@@ -675,6 +710,72 @@ fun ShareAddressButton(onClick: () -> Unit) {
)
}
@Composable
fun ModalData.ChatWallpaperEditorModal(chat: Chat) {
val themes = remember(CurrentColors.collectAsState().value.base) {
(chat.chatInfo as? ChatInfo.Direct)?.contact?.uiThemes
?: (chat.chatInfo as? ChatInfo.Group)?.groupInfo?.uiThemes
?: ThemeModeOverrides()
}
val globalThemeUsed = remember { stateGetOrPut("globalThemeUsed") { false } }
val initialTheme = remember(CurrentColors.collectAsState().value.base) {
val preferred = themes.preferredMode(!CurrentColors.value.colors.isLight)
globalThemeUsed.value = preferred == null
preferred ?: ThemeManager.defaultActiveTheme(chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
ChatWallpaperEditor(
initialTheme,
applyToMode = if (themes.light == themes.dark) null else initialTheme.mode,
globalThemeUsed = globalThemeUsed,
save = { applyToMode, newTheme ->
save(applyToMode, newTheme, chatModel.getChat(chat.id) ?: chat)
})
}
suspend fun save(applyToMode: DefaultThemeMode?, newTheme: ThemeModeOverride?, chat: Chat) {
val unchangedThemes: ThemeModeOverrides = ((chat.chatInfo as? ChatInfo.Direct)?.contact?.uiThemes ?: (chat.chatInfo as? ChatInfo.Group)?.groupInfo?.uiThemes) ?: ThemeModeOverrides()
val wallpaperFiles = setOf(unchangedThemes.light?.wallpaper?.imageFile, unchangedThemes.dark?.wallpaper?.imageFile)
var changedThemes: ThemeModeOverrides? = unchangedThemes
val changed = newTheme?.copy(wallpaper = newTheme.wallpaper?.withFilledWallpaperPath())
changedThemes = when (applyToMode) {
null -> changedThemes?.copy(light = changed?.copy(mode = DefaultThemeMode.LIGHT), dark = changed?.copy(mode = DefaultThemeMode.DARK))
DefaultThemeMode.LIGHT -> changedThemes?.copy(light = changed?.copy(mode = applyToMode))
DefaultThemeMode.DARK -> changedThemes?.copy(dark = changed?.copy(mode = applyToMode))
}
changedThemes = if (changedThemes?.light != null || changedThemes?.dark != null) {
val light = changedThemes.light
val dark = changedThemes.dark
val currentMode = CurrentColors.value.base.mode
// same image file for both modes, copy image to make them as different files
if (light?.wallpaper?.imageFile != null && dark?.wallpaper?.imageFile != null && light.wallpaper.imageFile == dark.wallpaper.imageFile) {
val imageFile = if (currentMode == DefaultThemeMode.LIGHT) {
dark.wallpaper.imageFile
} else {
light.wallpaper.imageFile
}
val filePath = saveWallpaperFile(File(getWallpaperFilePath(imageFile)).toURI())
changedThemes = if (currentMode == DefaultThemeMode.LIGHT) {
changedThemes.copy(dark = dark.copy(wallpaper = dark.wallpaper.copy(imageFile = filePath)))
} else {
changedThemes.copy(light = light.copy(wallpaper = light.wallpaper.copy(imageFile = filePath)))
}
}
changedThemes
} else {
null
}
val wallpaperFilesToDelete = wallpaperFiles - changedThemes?.light?.wallpaper?.imageFile - changedThemes?.dark?.wallpaper?.imageFile
wallpaperFilesToDelete.forEach(::removeWallpaperFile)
if (controller.apiSetChatUIThemes(chat.remoteHostId, chat.id, changedThemes)) {
if (chat.chatInfo is ChatInfo.Direct) {
chatModel.updateChatInfo(chat.remoteHostId, chat.chatInfo.copy(contact = chat.chatInfo.contact.copy(uiThemes = changedThemes)))
} else if (chat.chatInfo is ChatInfo.Group) {
chatModel.updateChatInfo(chat.remoteHostId, chat.chatInfo.copy(groupInfo = chat.chatInfo.groupInfo.copy(uiThemes = changedThemes)))
}
}
}
private fun setContactAlias(chat: Chat, localAlias: String, chatModel: ChatModel) = withBGApi {
val chatRh = chat.remoteHostId
chatModel.controller.apiSetContactAlias(chatRh, chat.chatInfo.apiId, localAlias)?.let {
@@ -711,6 +812,12 @@ fun showSyncConnectionForceAlert(syncConnectionForce: () -> Unit) {
)
}
fun queueInfoText(info: Pair<RcvMsgInfo?, QueueInfo>): String {
val (rcvMsgInfo, qInfo) = info
val msgInfo: String = if (rcvMsgInfo != null) json.encodeToString(rcvMsgInfo) else generalGetString(MR.strings.message_queue_info_none)
return generalGetString(MR.strings.message_queue_info_server_info).format(json.encodeToString(qInfo), msgInfo)
}
@Preview
@Composable
fun PreviewChatInfoLayout() {
@@ -42,7 +42,7 @@ sealed class CIInfoTab {
@Composable
fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools: Boolean) {
val sent = ci.chatDir.sent
val appColors = CurrentColors.collectAsState().value.appColors
val appColors = MaterialTheme.appColors
val uriHandler = LocalUriHandler.current
val selection = remember { mutableStateOf<CIInfoTab>(CIInfoTab.History) }
@@ -304,7 +304,7 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
}
@Composable
fun MemberDeliveryStatusView(member: GroupMember, status: CIStatus) {
fun MemberDeliveryStatusView(member: GroupMember, status: CIStatus, sentViaProxy: Boolean?) {
SectionItemView(
padding = PaddingValues(horizontal = 0.dp)
) {
@@ -317,6 +317,18 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
overflow = TextOverflow.Ellipsis
)
Spacer(Modifier.fillMaxWidth().weight(1f))
if (sentViaProxy == true) {
Box(
Modifier.size(36.dp),
contentAlignment = Alignment.Center
) {
Icon(
painterResource(MR.images.ic_arrow_forward),
contentDescription = null,
tint = CurrentColors.value.colors.secondary
)
}
}
val statusIcon = status.statusIcon(MaterialTheme.colors.primary, CurrentColors.value.colors.secondary)
var modifier = Modifier.size(36.dp).clip(RoundedCornerShape(20.dp))
val info = status.statusInto
@@ -357,8 +369,8 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
if (mss.isNotEmpty()) {
SectionView(padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
Text(stringResource(MR.strings.delivery), style = MaterialTheme.typography.h2, modifier = Modifier.padding(bottom = DEFAULT_PADDING))
mss.forEach { (member, status) ->
MemberDeliveryStatusView(member, status)
mss.forEach { (member, status, sentViaProxy) ->
MemberDeliveryStatusView(member, status, sentViaProxy)
}
}
} else {
@@ -482,10 +494,10 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
}
}
private fun membersStatuses(chatModel: ChatModel, memberDeliveryStatuses: List<MemberDeliveryStatus>): List<Pair<GroupMember, CIStatus>> {
private fun membersStatuses(chatModel: ChatModel, memberDeliveryStatuses: List<MemberDeliveryStatus>): List<Triple<GroupMember, CIStatus, Boolean?>> {
return memberDeliveryStatuses.mapNotNull { mds ->
chatModel.getGroupMember(mds.groupMemberId)?.let { mem ->
mem to mds.memberDeliveryStatus
Triple(mem, mds.memberDeliveryStatus, mds.sentViaProxy)
}
}
}
@@ -5,25 +5,25 @@ import androidx.compose.foundation.*
import androidx.compose.foundation.gestures.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.mapSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.*
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.graphics.*
import androidx.compose.ui.platform.*
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.intl.Locale
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.text.*
import androidx.compose.ui.unit.*
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatModel.controller
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.call.*
@@ -118,368 +118,381 @@ fun ChatView(chatId: String, chatModel: ChatModel, onComposed: suspend (chatId:
val clipboard = LocalClipboardManager.current
when (chat.chatInfo) {
is ChatInfo.Direct, is ChatInfo.Group, is ChatInfo.Local -> {
ChatLayout(
chat,
unreadCount,
composeState,
composeView = {
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
if (
chat.chatInfo is ChatInfo.Direct
&& !chat.chatInfo.contact.ready
&& chat.chatInfo.contact.active
&& !chat.chatInfo.contact.nextSendGrpInv
val perChatTheme = remember(chat.chatInfo, CurrentColors.value.base) { if (chat.chatInfo is ChatInfo.Direct) chat.chatInfo.contact.uiThemes?.preferredMode(!CurrentColors.value.colors.isLight) else if (chat.chatInfo is ChatInfo.Group) chat.chatInfo.groupInfo.uiThemes?.preferredMode(!CurrentColors.value.colors.isLight) else null }
val overrides = if (perChatTheme != null) ThemeManager.currentColors(null, perChatTheme, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get()) else null
SimpleXThemeOverride(overrides ?: CurrentColors.collectAsState().value) {
ChatLayout(
chat,
unreadCount,
composeState,
composeView = {
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
generalGetString(MR.strings.contact_connection_pending),
Modifier.padding(top = 4.dp),
fontSize = 14.sp,
color = MaterialTheme.colors.secondary
if (
chat.chatInfo is ChatInfo.Direct
&& !chat.chatInfo.contact.ready
&& chat.chatInfo.contact.active
&& !chat.chatInfo.contact.nextSendGrpInv
) {
Text(
generalGetString(MR.strings.contact_connection_pending),
Modifier.padding(top = 4.dp),
fontSize = 14.sp,
color = MaterialTheme.colors.secondary
)
}
ComposeView(
chatModel, chat, composeState, attachmentOption,
showChooseAttachment = { scope.launch { attachmentBottomSheetState.show() } }
)
}
ComposeView(
chatModel, chat, composeState, attachmentOption,
showChooseAttachment = { scope.launch { attachmentBottomSheetState.show() } }
)
}
},
attachmentOption,
attachmentBottomSheetState,
searchText,
useLinkPreviews = useLinkPreviews,
linkMode = chatModel.simplexLinkMode.value,
back = {
hideKeyboard(view)
AudioPlayer.stop()
chatModel.chatId.value = null
chatModel.groupMembers.clear()
},
info = {
if (ModalManager.end.hasModalsOpen()) {
ModalManager.end.closeModals()
return@ChatLayout
}
hideKeyboard(view)
withBGApi {
// The idea is to preload information before showing a modal because large groups can take time to load all members
var preloadedContactInfo: Pair<ConnectionStats?, Profile?>? = null
var preloadedCode: String? = null
var preloadedLink: Pair<String, GroupMemberRole>? = null
if (chat.chatInfo is ChatInfo.Direct) {
preloadedContactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedCode = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
} else if (chat.chatInfo is ChatInfo.Group) {
setGroupMembers(chatRh, chat.chatInfo.groupInfo, chatModel)
preloadedLink = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
},
attachmentOption,
attachmentBottomSheetState,
searchText,
useLinkPreviews = useLinkPreviews,
linkMode = chatModel.simplexLinkMode.value,
back = {
hideKeyboard(view)
AudioPlayer.stop()
chatModel.chatId.value = null
chatModel.groupMembers.clear()
},
info = {
if (ModalManager.end.hasModalsOpen()) {
ModalManager.end.closeModals()
return@ChatLayout
}
ModalManager.end.showModalCloseable(true) { close ->
val chat = remember { activeChat }.value
if (chat?.chatInfo is ChatInfo.Direct) {
var contactInfo: Pair<ConnectionStats?, Profile?>? by remember { mutableStateOf(preloadedContactInfo) }
var code: String? by remember { mutableStateOf(preloadedCode) }
KeyChangeEffect(chat.id, ChatModel.networkStatuses.toMap()) {
contactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedContactInfo = contactInfo
code = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
preloadedCode = code
}
ChatInfoView(chatModel, (chat.chatInfo as ChatInfo.Direct).contact, contactInfo?.first, contactInfo?.second, chat.chatInfo.localAlias, code, close)
} else if (chat?.chatInfo is ChatInfo.Group) {
var link: Pair<String, GroupMemberRole>? by remember(chat.id) { mutableStateOf(preloadedLink) }
KeyChangeEffect(chat.id) {
setGroupMembers(chatRh, (chat.chatInfo as ChatInfo.Group).groupInfo, chatModel)
link = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
preloadedLink = link
}
GroupChatInfoView(chatModel, chatRh, chat.id, link?.first, link?.second, {
link = it
preloadedLink = it
}, close)
}
}
}
},
showMemberInfo = { groupInfo: GroupInfo, member: GroupMember ->
hideKeyboard(view)
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
val stats = r?.second
val (_, code) = if (member.memberActive) {
val memCode = chatModel.controller.apiGetGroupMemberCode(chatRh, groupInfo.apiId, member.groupMemberId)
member to memCode?.second
} else {
member to null
}
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
remember { derivedStateOf { chatModel.getGroupMember(member.groupMemberId) } }.value?.let { mem ->
GroupMemberInfoView(chatRh, groupInfo, mem, stats, code, chatModel, close, close)
}
}
}
},
loadPrevMessages = {
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout)
val firstId = chatModel.chatItems.value.firstOrNull()?.id
if (c != null && firstId != null) {
hideKeyboard(view)
withBGApi {
apiLoadPrevMessages(c, chatModel, firstId, searchText.value)
}
}
},
deleteMessage = { itemId, mode ->
withBGApi {
val cInfo = chat.chatInfo
val toDeleteItem = chatModel.chatItems.value.firstOrNull { it.id == itemId }
val toModerate = toDeleteItem?.memberToModerate(chat.chatInfo)
val groupInfo = toModerate?.first
val groupMember = toModerate?.second
val deletedChatItem: ChatItem?
val toChatItem: ChatItem?
if (mode == CIDeleteMode.cidmBroadcast && groupInfo != null && groupMember != null) {
val r = chatModel.controller.apiDeleteMemberChatItem(
chatRh,
groupId = groupInfo.groupId,
groupMemberId = groupMember.groupMemberId,
itemId = itemId
)
deletedChatItem = r?.first
toChatItem = r?.second
} else {
val r = chatModel.controller.apiDeleteChatItem(
chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = itemId,
mode = mode
)
deletedChatItem = r?.deletedChatItem?.chatItem
toChatItem = r?.toChatItem?.chatItem
}
if (toChatItem == null && deletedChatItem != null) {
chatModel.removeChatItem(chatRh, cInfo, deletedChatItem)
} else if (toChatItem != null) {
chatModel.upsertChatItem(chatRh, cInfo, toChatItem)
}
}
},
deleteMessages = { itemIds ->
if (itemIds.isNotEmpty()) {
val chatInfo = chat.chatInfo
withBGApi {
val deletedItems: ArrayList<ChatItem> = arrayListOf()
for (itemId in itemIds) {
val di = chatModel.controller.apiDeleteChatItem(
chatRh, chatInfo.chatType, chatInfo.apiId, itemId, CIDeleteMode.cidmInternal
)?.deletedChatItem?.chatItem
if (di != null) {
deletedItems.add(di)
}
}
for (di in deletedItems) {
chatModel.removeChatItem(chatRh, chatInfo, di)
}
}
}
},
receiveFile = { fileId ->
withBGApi { chatModel.controller.receiveFile(chatRh, user, fileId) }
},
cancelFile = { fileId ->
withBGApi { chatModel.controller.cancelFile(chatRh, user, fileId) }
},
joinGroup = { groupId, onComplete ->
withBGApi {
chatModel.controller.apiJoinGroup(chatRh, groupId)
onComplete.invoke()
}
},
startCall = out@{ media ->
withBGApi {
val cInfo = chat.chatInfo
if (cInfo is ChatInfo.Direct) {
val contactInfo = chatModel.controller.apiContactInfo(chat.remoteHostId, cInfo.contact.contactId)
val profile = contactInfo?.second ?: chatModel.currentUser.value?.profile?.toProfile() ?: return@withBGApi
chatModel.activeCall.value = Call(remoteHostId = chatRh, contact = cInfo.contact, callState = CallState.WaitCapabilities, localMedia = media, userProfile = profile)
chatModel.showCallView.value = true
chatModel.callCommand.add(WCallCommand.Capabilities(media))
}
}
},
endCall = {
val call = chatModel.activeCall.value
if (call != null) withBGApi { chatModel.callManager.endCall(call) }
},
acceptCall = { contact ->
hideKeyboard(view)
withBGApi {
val invitation = chatModel.callInvitations.remove(contact.id)
?: controller.apiGetCallInvitations(chatModel.remoteHostId()).firstOrNull { it.contact.id == contact.id }
if (invitation == null) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.call_already_ended))
} else {
chatModel.callManager.acceptIncomingCall(invitation = invitation)
}
}
},
acceptFeature = { contact, feature, param ->
withBGApi {
chatModel.controller.allowFeatureToContact(chatRh, contact, feature, param)
}
},
openDirectChat = { contactId ->
withBGApi {
openDirectChat(chatRh, contactId, chatModel)
}
},
updateContactStats = { contact ->
withBGApi {
val r = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
if (r != null) {
val contactStats = r.first
if (contactStats != null)
chatModel.updateContactConnectionStats(chatRh, contact, contactStats)
}
}
},
updateMemberStats = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
if (r != null) {
val memStats = r.second
if (memStats != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, memStats)
}
}
}
},
syncContactConnection = { contact ->
withBGApi {
val cStats = chatModel.controller.apiSyncContactRatchet(chatRh, contact.contactId, force = false)
if (cStats != null) {
chatModel.updateContactConnectionStats(chatRh, contact, cStats)
}
}
},
syncMemberConnection = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiSyncGroupMemberRatchet(chatRh, groupInfo.apiId, member.groupMemberId, force = false)
if (r != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, r.second)
}
}
},
findModelChat = { chatId ->
chatModel.getChat(chatId)
},
findModelMember = { memberId ->
chatModel.groupMembers.find { it.id == memberId }
},
setReaction = { cInfo, cItem, add, reaction ->
withBGApi {
val updatedCI = chatModel.controller.apiChatItemReaction(
rh = chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = cItem.id,
add = add,
reaction = reaction
)
if (updatedCI != null) {
chatModel.updateChatItem(cInfo, updatedCI)
}
}
},
showItemDetails = { cInfo, cItem ->
suspend fun loadChatItemInfo(): ChatItemInfo? {
val ciInfo = chatModel.controller.apiGetChatItemInfo(chatRh, cInfo.chatType, cInfo.apiId, cItem.id)
if (ciInfo != null) {
if (chat.chatInfo is ChatInfo.Group) {
// The idea is to preload information before showing a modal because large groups can take time to load all members
var preloadedContactInfo: Pair<ConnectionStats?, Profile?>? = null
var preloadedCode: String? = null
var preloadedLink: Pair<String, GroupMemberRole>? = null
if (chat.chatInfo is ChatInfo.Direct) {
preloadedContactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedCode = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
} else if (chat.chatInfo is ChatInfo.Group) {
setGroupMembers(chatRh, chat.chatInfo.groupInfo, chatModel)
preloadedLink = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
}
}
return ciInfo
}
withBGApi {
var initialCiInfo = loadChatItemInfo() ?: return@withBGApi
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(endButtons = {
ShareButton {
clipboard.shareText(itemInfoShareText(chatModel, cItem, initialCiInfo, chatModel.controller.appPrefs.developerTools.get()))
}
}) { close ->
var ciInfo by remember(cItem.id) { mutableStateOf(initialCiInfo) }
ChatItemInfoView(chatRh, cItem, ciInfo, devTools = chatModel.controller.appPrefs.developerTools.get())
LaunchedEffect(cItem.id) {
withContext(Dispatchers.Default) {
for (apiResp in controller.messagesChannel) {
val msg = apiResp.resp
if (apiResp.remoteHostId == chatRh &&
msg is CR.ChatItemStatusUpdated &&
msg.chatItem.chatItem.id == cItem.id
) {
ciInfo = loadChatItemInfo() ?: return@withContext
initialCiInfo = ciInfo
}
ModalManager.end.showModalCloseable(true) { close ->
val chat = remember { activeChat }.value
if (chat?.chatInfo is ChatInfo.Direct) {
var contactInfo: Pair<ConnectionStats?, Profile?>? by remember { mutableStateOf(preloadedContactInfo) }
var code: String? by remember { mutableStateOf(preloadedCode) }
KeyChangeEffect(chat.id, ChatModel.networkStatuses.toMap()) {
contactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedContactInfo = contactInfo
code = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
preloadedCode = code
}
ChatInfoView(chatModel, (chat.chatInfo as ChatInfo.Direct).contact, contactInfo?.first, contactInfo?.second, chat.chatInfo.localAlias, code, close)
} else if (chat?.chatInfo is ChatInfo.Group) {
var link: Pair<String, GroupMemberRole>? by remember(chat.id) { mutableStateOf(preloadedLink) }
KeyChangeEffect(chat.id) {
setGroupMembers(chatRh, (chat.chatInfo as ChatInfo.Group).groupInfo, chatModel)
link = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
preloadedLink = link
}
GroupChatInfoView(chatModel, chatRh, chat.id, link?.first, link?.second, {
link = it
preloadedLink = it
}, close)
} else {
LaunchedEffect(Unit) {
close()
}
}
}
KeyChangeEffect(chatModel.chatId.value) {
close()
}
},
showMemberInfo = { groupInfo: GroupInfo, member: GroupMember ->
hideKeyboard(view)
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
val stats = r?.second
val (_, code) = if (member.memberActive) {
val memCode = chatModel.controller.apiGetGroupMemberCode(chatRh, groupInfo.apiId, member.groupMemberId)
member to memCode?.second
} else {
member to null
}
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
remember { derivedStateOf { chatModel.getGroupMember(member.groupMemberId) } }.value?.let { mem ->
GroupMemberInfoView(chatRh, groupInfo, mem, stats, code, chatModel, close, close)
}
}
}
}
},
addMembers = { groupInfo ->
hideKeyboard(view)
withBGApi {
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
AddGroupMembersView(chatRh, groupInfo, false, chatModel, close)
},
loadPrevMessages = {
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout)
val firstId = chatModel.chatItems.value.firstOrNull()?.id
if (c != null && firstId != null) {
withBGApi {
apiLoadPrevMessages(c, chatModel, firstId, searchText.value)
}
}
}
},
openGroupLink = { groupInfo ->
hideKeyboard(view)
withBGApi {
val link = chatModel.controller.apiGetGroupLink(chatRh, groupInfo.groupId)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) {
GroupLinkView(chatModel, chatRh, groupInfo, link?.first, link?.second, onGroupLinkUpdated = null)
},
deleteMessage = { itemId, mode ->
withBGApi {
val cInfo = chat.chatInfo
val toDeleteItem = chatModel.chatItems.value.firstOrNull { it.id == itemId }
val toModerate = toDeleteItem?.memberToModerate(chat.chatInfo)
val groupInfo = toModerate?.first
val groupMember = toModerate?.second
val deletedChatItem: ChatItem?
val toChatItem: ChatItem?
if (mode == CIDeleteMode.cidmBroadcast && groupInfo != null && groupMember != null) {
val r = chatModel.controller.apiDeleteMemberChatItem(
chatRh,
groupId = groupInfo.groupId,
groupMemberId = groupMember.groupMemberId,
itemId = itemId
)
deletedChatItem = r?.first
toChatItem = r?.second
} else {
val r = chatModel.controller.apiDeleteChatItem(
chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = itemId,
mode = mode
)
deletedChatItem = r?.deletedChatItem?.chatItem
toChatItem = r?.toChatItem?.chatItem
}
if (toChatItem == null && deletedChatItem != null) {
chatModel.removeChatItem(chatRh, cInfo, deletedChatItem)
} else if (toChatItem != null) {
chatModel.upsertChatItem(chatRh, cInfo, toChatItem)
}
}
}
},
markRead = { range, unreadCountAfter ->
chatModel.markChatItemsRead(chat, range, unreadCountAfter)
ntfManager.cancelNotificationsForChat(chat.id)
withBGApi {
chatModel.controller.apiChatRead(
chatRh,
chat.chatInfo.chatType,
chat.chatInfo.apiId,
range
)
}
},
changeNtfsState = { enabled, currentValue -> toggleNotifications(chat, enabled, chatModel, currentValue) },
onSearchValueChanged = { value ->
if (searchText.value == value) return@ChatLayout
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout) ?: return@ChatLayout
withBGApi {
apiFindMessages(c, chatModel, value)
searchText.value = value
}
},
onComposed,
developerTools = chatModel.controller.appPrefs.developerTools.get(),
)
},
deleteMessages = { itemIds ->
if (itemIds.isNotEmpty()) {
val chatInfo = chat.chatInfo
withBGApi {
val deletedItems: ArrayList<ChatItem> = arrayListOf()
for (itemId in itemIds) {
val di = chatModel.controller.apiDeleteChatItem(
chatRh, chatInfo.chatType, chatInfo.apiId, itemId, CIDeleteMode.cidmInternal
)?.deletedChatItem?.chatItem
if (di != null) {
deletedItems.add(di)
}
}
for (di in deletedItems) {
chatModel.removeChatItem(chatRh, chatInfo, di)
}
}
}
},
receiveFile = { fileId ->
withBGApi { chatModel.controller.receiveFile(chatRh, user, fileId) }
},
cancelFile = { fileId ->
withBGApi { chatModel.controller.cancelFile(chatRh, user, fileId) }
},
joinGroup = { groupId, onComplete ->
withBGApi {
chatModel.controller.apiJoinGroup(chatRh, groupId)
onComplete.invoke()
}
},
startCall = out@{ media ->
withBGApi {
val cInfo = chat.chatInfo
if (cInfo is ChatInfo.Direct) {
val contactInfo = chatModel.controller.apiContactInfo(chat.remoteHostId, cInfo.contact.contactId)
val profile = contactInfo?.second ?: chatModel.currentUser.value?.profile?.toProfile() ?: return@withBGApi
chatModel.activeCall.value = Call(remoteHostId = chatRh, contact = cInfo.contact, callState = CallState.WaitCapabilities, localMedia = media, userProfile = profile)
chatModel.showCallView.value = true
chatModel.callCommand.add(WCallCommand.Capabilities(media))
}
}
},
endCall = {
val call = chatModel.activeCall.value
if (call != null) withBGApi { chatModel.callManager.endCall(call) }
},
acceptCall = { contact ->
hideKeyboard(view)
withBGApi {
val invitation = chatModel.callInvitations.remove(contact.id)
?: controller.apiGetCallInvitations(chatModel.remoteHostId()).firstOrNull { it.contact.id == contact.id }
if (invitation == null) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.call_already_ended))
} else {
chatModel.callManager.acceptIncomingCall(invitation = invitation)
}
}
},
acceptFeature = { contact, feature, param ->
withBGApi {
chatModel.controller.allowFeatureToContact(chatRh, contact, feature, param)
}
},
openDirectChat = { contactId ->
withBGApi {
openDirectChat(chatRh, contactId, chatModel)
}
},
forwardItem = { cItem, cInfo ->
chatModel.chatId.value = null
chatModel.sharedContent.value = SharedContent.Forward(cInfo, cItem)
},
updateContactStats = { contact ->
withBGApi {
val r = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
if (r != null) {
val contactStats = r.first
if (contactStats != null)
chatModel.updateContactConnectionStats(chatRh, contact, contactStats)
}
}
},
updateMemberStats = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
if (r != null) {
val memStats = r.second
if (memStats != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, memStats)
}
}
}
},
syncContactConnection = { contact ->
withBGApi {
val cStats = chatModel.controller.apiSyncContactRatchet(chatRh, contact.contactId, force = false)
if (cStats != null) {
chatModel.updateContactConnectionStats(chatRh, contact, cStats)
}
}
},
syncMemberConnection = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiSyncGroupMemberRatchet(chatRh, groupInfo.apiId, member.groupMemberId, force = false)
if (r != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, r.second)
}
}
},
findModelChat = { chatId ->
chatModel.getChat(chatId)
},
findModelMember = { memberId ->
chatModel.groupMembers.find { it.id == memberId }
},
setReaction = { cInfo, cItem, add, reaction ->
withBGApi {
val updatedCI = chatModel.controller.apiChatItemReaction(
rh = chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = cItem.id,
add = add,
reaction = reaction
)
if (updatedCI != null) {
chatModel.updateChatItem(cInfo, updatedCI)
}
}
},
showItemDetails = { cInfo, cItem ->
suspend fun loadChatItemInfo(): ChatItemInfo? {
val ciInfo = chatModel.controller.apiGetChatItemInfo(chatRh, cInfo.chatType, cInfo.apiId, cItem.id)
if (ciInfo != null) {
if (chat.chatInfo is ChatInfo.Group) {
setGroupMembers(chatRh, chat.chatInfo.groupInfo, chatModel)
}
}
return ciInfo
}
withBGApi {
var initialCiInfo = loadChatItemInfo() ?: return@withBGApi
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(endButtons = {
ShareButton {
clipboard.shareText(itemInfoShareText(chatModel, cItem, initialCiInfo, chatModel.controller.appPrefs.developerTools.get()))
}
}) { close ->
var ciInfo by remember(cItem.id) { mutableStateOf(initialCiInfo) }
ChatItemInfoView(chatRh, cItem, ciInfo, devTools = chatModel.controller.appPrefs.developerTools.get())
LaunchedEffect(cItem.id) {
withContext(Dispatchers.Default) {
for (apiResp in controller.messagesChannel) {
val msg = apiResp.resp
if (apiResp.remoteHostId == chatRh &&
msg is CR.ChatItemStatusUpdated &&
msg.chatItem.chatItem.id == cItem.id
) {
ciInfo = loadChatItemInfo() ?: return@withContext
initialCiInfo = ciInfo
}
}
}
}
KeyChangeEffect(chatModel.chatId.value) {
close()
}
}
}
},
addMembers = { groupInfo ->
hideKeyboard(view)
withBGApi {
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
AddGroupMembersView(chatRh, groupInfo, false, chatModel, close)
}
}
},
openGroupLink = { groupInfo ->
hideKeyboard(view)
withBGApi {
val link = chatModel.controller.apiGetGroupLink(chatRh, groupInfo.groupId)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) {
GroupLinkView(chatModel, chatRh, groupInfo, link?.first, link?.second, onGroupLinkUpdated = null)
}
}
},
markRead = { range, unreadCountAfter ->
chatModel.markChatItemsRead(chat, range, unreadCountAfter)
ntfManager.cancelNotificationsForChat(chat.id)
withBGApi {
chatModel.controller.apiChatRead(
chatRh,
chat.chatInfo.chatType,
chat.chatInfo.apiId,
range
)
}
},
changeNtfsState = { enabled, currentValue -> toggleNotifications(chat, enabled, chatModel, currentValue) },
onSearchValueChanged = { value ->
if (searchText.value == value) return@ChatLayout
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout) ?: return@ChatLayout
withBGApi {
apiFindMessages(c, chatModel, value)
searchText.value = value
}
},
onComposed,
developerTools = chatModel.controller.appPrefs.developerTools.get(),
showViaProxy = chatModel.controller.appPrefs.showSentViaProxy.get(),
)
}
}
is ChatInfo.ContactConnection -> {
val close = { chatModel.chatId.value = null }
@@ -533,6 +546,7 @@ fun ChatLayout(
acceptCall: (Contact) -> Unit,
acceptFeature: (Contact, ChatFeature, Int?) -> Unit,
openDirectChat: (Long) -> Unit,
forwardItem: (ChatInfo, ChatItem) -> Unit,
updateContactStats: (Contact) -> Unit,
updateMemberStats: (GroupInfo, GroupMember) -> Unit,
syncContactConnection: (Contact) -> Unit,
@@ -548,6 +562,7 @@ fun ChatLayout(
onSearchValueChanged: (String) -> Unit,
onComposed: suspend (chatId: String) -> Unit,
developerTools: Boolean,
showViaProxy: Boolean
) {
val scope = rememberCoroutineScope()
val attachmentDisabled = remember { derivedStateOf { composeState.value.attachmentDisabled } }
@@ -596,17 +611,27 @@ fun ChatLayout(
floatingActionButton = { floatingButton.value() },
contentColor = LocalContentColor.current,
drawerContentColor = LocalContentColor.current,
backgroundColor = Color.Unspecified
) { contentPadding ->
val wallpaperImage = MaterialTheme.wallpaper.type.image
val wallpaperType = MaterialTheme.wallpaper.type
val backgroundColor = MaterialTheme.wallpaper.background ?: wallpaperType.defaultBackgroundColor(CurrentColors.value.base, MaterialTheme.colors.background)
val tintColor = MaterialTheme.wallpaper.tint ?: wallpaperType.defaultTintColor(CurrentColors.value.base)
BoxWithConstraints(Modifier
.fillMaxHeight()
.fillMaxSize()
.background(MaterialTheme.colors.background)
.then(if (wallpaperImage != null)
Modifier.drawWithCache { chatViewBackground(wallpaperImage, wallpaperType, backgroundColor, tintColor) }
else
Modifier)
.padding(contentPadding)
) {
ChatItemsList(
chat, unreadCount, composeState, searchValue,
useLinkPreviews, linkMode, showMemberInfo, loadPrevMessages, deleteMessage, deleteMessages,
receiveFile, cancelFile, joinGroup, acceptCall, acceptFeature, openDirectChat,
receiveFile, cancelFile, joinGroup, acceptCall, acceptFeature, openDirectChat, forwardItem,
updateContactStats, updateMemberStats, syncContactConnection, syncMemberConnection, findModelChat, findModelMember,
setReaction, showItemDetails, markRead, setFloatingButton, onComposed, developerTools,
setReaction, showItemDetails, markRead, setFloatingButton, onComposed, developerTools, showViaProxy,
)
}
}
@@ -873,6 +898,7 @@ fun BoxWithConstraintsScope.ChatItemsList(
acceptCall: (Contact) -> Unit,
acceptFeature: (Contact, ChatFeature, Int?) -> Unit,
openDirectChat: (Long) -> Unit,
forwardItem: (ChatInfo, ChatItem) -> Unit,
updateContactStats: (Contact) -> Unit,
updateMemberStats: (GroupInfo, GroupMember) -> Unit,
syncContactConnection: (Contact) -> Unit,
@@ -885,6 +911,7 @@ fun BoxWithConstraintsScope.ChatItemsList(
setFloatingButton: (@Composable () -> Unit) -> Unit,
onComposed: suspend (chatId: String) -> Unit,
developerTools: Boolean,
showViaProxy: Boolean
) {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
@@ -975,7 +1002,7 @@ fun BoxWithConstraintsScope.ChatItemsList(
tryOrShowError("${cItem.id}ChatItem", error = {
CIBrokenComposableView(if (cItem.chatDir.sent) Alignment.CenterEnd else Alignment.CenterStart)
}) {
ChatItemView(chat.remoteHostId, chat.chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, range = range, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, setReaction = setReaction, showItemDetails = showItemDetails, developerTools = developerTools)
ChatItemView(chat.remoteHostId, chat.chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, range = range, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, setReaction = setReaction, showItemDetails = showItemDetails, developerTools = developerTools, showViaProxy = showViaProxy)
}
}
@@ -1259,7 +1286,7 @@ val MEMBER_IMAGE_SIZE: Dp = 38.dp
@Composable
fun MemberImage(member: GroupMember) {
ProfileImage(MEMBER_IMAGE_SIZE, member.memberProfile.image)
ProfileImage(MEMBER_IMAGE_SIZE, member.memberProfile.image, backgroundColor = MaterialTheme.colors.background)
}
@Composable
@@ -1528,6 +1555,7 @@ fun PreviewChatLayout() {
acceptCall = { _ -> },
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
updateContactStats = { },
updateMemberStats = { _, _ -> },
syncContactConnection = { },
@@ -1543,6 +1571,7 @@ fun PreviewChatLayout() {
onSearchValueChanged = {},
onComposed = {},
developerTools = false,
showViaProxy = false,
)
}
}
@@ -1600,6 +1629,7 @@ fun PreviewGroupChatLayout() {
acceptCall = { _ -> },
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
updateContactStats = { },
updateMemberStats = { _, _ -> },
syncContactConnection = { },
@@ -1615,6 +1645,7 @@ fun PreviewGroupChatLayout() {
onSearchValueChanged = {},
onComposed = {},
developerTools = false,
showViaProxy = false,
)
}
}
@@ -16,7 +16,7 @@ import dev.icerock.moko.resources.compose.stringResource
@Composable
fun ComposeContextInvitingContactMemberView() {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Row(
Modifier
.height(60.dp)
@@ -16,7 +16,7 @@ import chat.simplex.res.MR
@Composable
fun ComposeFileView(fileName: String, cancelFile: () -> Unit, cancelEnabled: Boolean) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Row(
Modifier
.height(60.dp)
@@ -20,7 +20,7 @@ import chat.simplex.common.views.helpers.UploadContent
@Composable
fun ComposeImageView(media: ComposePreview.MediaPreview, cancelImages: () -> Unit, cancelEnabled: Boolean) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Row(
Modifier
.padding(top = 8.dp)
@@ -408,14 +408,15 @@ fun ComposeView(
composeState.value = composeState.value.copy(inProgress = true)
}
suspend fun forwardItem(rhId: Long?, forwardedItem: ChatItem, fromChatInfo: ChatInfo): ChatItem? {
suspend fun forwardItem(rhId: Long?, forwardedItem: ChatItem, fromChatInfo: ChatInfo, ttl: Int?): ChatItem? {
val chatItem = controller.apiForwardChatItem(
rh = rhId,
toChatType = chat.chatInfo.chatType,
toChatId = chat.chatInfo.apiId,
fromChatType = fromChatInfo.chatType,
fromChatId = fromChatInfo.apiId,
itemId = forwardedItem.id
itemId = forwardedItem.id,
ttl = ttl
)
if (chatItem != null) {
chatModel.addChatItem(rhId, chat.chatInfo, chatItem)
@@ -490,9 +491,9 @@ fun ComposeView(
sendMemberContactInvitation()
sent = null
} else if (cs.contextItem is ComposeContextItem.ForwardingItem) {
sent = forwardItem(chat.remoteHostId, cs.contextItem.chatItem, cs.contextItem.fromChatInfo)
sent = forwardItem(chat.remoteHostId, cs.contextItem.chatItem, cs.contextItem.fromChatInfo, ttl = ttl)
if (cs.message.isNotEmpty()) {
sent = send(chat, checkLinkPreview(), quoted = sent?.id, live = false, ttl = null)
sent = send(chat, checkLinkPreview(), quoted = sent?.id, live = false, ttl = ttl)
}
} else if (cs.contextItem is ComposeContextItem.EditingItem) {
val ei = cs.contextItem.chatItem
@@ -775,7 +776,7 @@ fun ComposeView(
@Composable
fun MsgNotAllowedView(reason: String, icon: Painter) {
val color = CurrentColors.collectAsState().value.appColors.receivedMessage
val color = MaterialTheme.appColors.receivedMessage
Row(Modifier.padding(top = 5.dp).fillMaxWidth().background(color).padding(horizontal = DEFAULT_PADDING_HALF, vertical = DEFAULT_PADDING_HALF * 1.5f), verticalAlignment = Alignment.CenterVertically) {
Icon(icon, null, tint = MaterialTheme.colors.secondary)
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
@@ -861,7 +862,7 @@ fun ComposeView(
}
}
Row(
modifier = Modifier.padding(end = 8.dp),
modifier = Modifier.background(MaterialTheme.colors.background).padding(end = 8.dp),
verticalAlignment = Alignment.Bottom,
) {
val isGroupAndProhibitedFiles = chat.chatInfo is ChatInfo.Group && !chat.chatInfo.groupInfo.fullGroupPreferences.files.on(chat.chatInfo.groupInfo.membership)
@@ -973,7 +974,7 @@ fun ComposeView(
val timedMessageAllowed = remember(chat.chatInfo) { chat.chatInfo.featureEnabled(ChatFeature.TimedMessages) }
val sendButtonColor =
if (chat.chatInfo.incognito)
if (isSystemInDarkTheme()) Indigo else Indigo.copy(alpha = 0.7F)
if (isInDarkTheme()) Indigo else Indigo.copy(alpha = 0.7F)
else MaterialTheme.colors.primary
SendMsgView(
composeState,
@@ -35,7 +35,7 @@ fun ComposeVoiceView(
) {
val progress = rememberSaveable { mutableStateOf(0) }
val duration = rememberSaveable(recordedDurationMs) { mutableStateOf(recordedDurationMs) }
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Box {
Box(
Modifier
@@ -30,8 +30,8 @@ fun ContextItemView(
cancelContextItem: () -> Unit
) {
val sent = contextItem.chatDir.sent
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
@Composable
fun MessageText(attachment: ImageResource?, lines: Int) {
@@ -157,7 +157,7 @@ fun SendMsgView(
fun MenuItems(): List<@Composable () -> Unit> {
val menuItems = mutableListOf<@Composable () -> Unit>()
if (cs.liveMessage == null && !cs.editing && !cs.forwarding && !nextSendGrpInv || sendMsgEnabled) {
if (cs.liveMessage == null && !cs.editing && !nextSendGrpInv || sendMsgEnabled) {
if (
cs.preview !is ComposePreview.VoicePreview &&
cs.contextItem is ComposeContextItem.NoContextItem &&

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