Compare commits

...

15 Commits

Author SHA1 Message Date
Evgeny Poberezkin 06ac15b282 5.7-beta.2: ios 209, android 198, desktop 39 2024-04-23 00:11:37 +01:00
Stanislav Dmitrenko 4c1dfc76d4 android: sound from speaker fix (#4067) 2024-04-22 23:26:01 +01:00
Evgeny Poberezkin bea19f76e9 5.7.0.3 (simplexmq 5.7.0.2) 2024-04-22 22:24:00 +01:00
Stanislav Dmitrenko f80ac6dc50 android: proper hiding keyboard when entering passcode (#4066) 2024-04-22 22:13:14 +01:00
spaced4ndy 2b6764fc36 android: 5.7 what's new (#4064)
* android: 5.7 what's new

* icon

* update LT language name

* Lithuanian

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-22 22:03:18 +01:00
Stanislav Dmitrenko d53aa69691 android: managing audio sources in call in a better way (#4063) 2024-04-22 18:24:26 +01:00
spaced4ndy 9e3f528d44 android: remove experimental PQ toggle (#4060) 2024-04-22 17:50:52 +01:00
spaced4ndy 22fd2d7189 ios: remove experimental PQ toggle (#4051)
* ios: remove experimental PQ toggle

* remove header
2024-04-22 17:50:28 +01:00
spaced4ndy 7567791866 core: enable PQ encryption for contacts (#4049)
* wip

* migration

* remove migration

* remove flag wip

* Revert "remove migration"

This reverts commit 9e64663f9d.

* wip

* remove vrange parameterization

* tests mostly pass

* more tests pass

* enable for upgraded contacts

* remove migration

* core: test large messages (#4061)

* update simplexmq, fix tests

* test test

* another test

* enable tests

* empty

* empty
2024-04-22 17:46:48 +01:00
spaced4ndy 529ba7a0e7 ios: 5.7 what's new (#4062)
* ios: 5.7 what's new

* add about pq

* update

* update

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-22 17:46:14 +01:00
Evgeny Poberezkin 3b3a68da15 core: 5.7.0.2 2024-04-22 08:07:42 +01:00
Evgeny Poberezkin e0e94d78b0 core, ui: revert timeout changes (#4059)
* core, ui: revert timeout changes

* update core library
2024-04-22 07:45:20 +01:00
Evgeny Poberezkin d68369b32a android, desktop: add Lithuanian language 2024-04-21 20:37:14 +01:00
Evgeny Poberezkin d29886dbd2 ui: translations (#4056)
* Translated using Weblate (French)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 99.8% (1693 of 1696 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% (1696 of 1696 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 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 95.0% (1405 of 1478 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% (1696 of 1696 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1696 of 1696 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% (1696 of 1696 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% (1696 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1696 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 82.4% (1218 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1696 of 1696 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% (1478 of 1478 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% (1696 of 1696 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 8.0% (119 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 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% (1478 of 1478 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% (1696 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 10.5% (156 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 6.3% (108 of 1696 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 10.6% (157 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 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% (1696 of 1696 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% (1478 of 1478 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% (1696 of 1696 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 99.8% (1693 of 1696 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% (1696 of 1696 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 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 95.0% (1405 of 1478 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% (1696 of 1696 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1696 of 1696 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% (1696 of 1696 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% (1696 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1696 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 82.4% (1218 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1696 of 1696 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% (1478 of 1478 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% (1696 of 1696 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 8.0% (119 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 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% (1478 of 1478 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% (1696 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 10.5% (156 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 6.3% (108 of 1696 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 10.6% (157 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1696 of 1696 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% (1696 of 1696 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% (1478 of 1478 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% (1696 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Lithuanian)

Currently translated at 64.3% (1091 of 1696 strings)

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

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Lithuanian)

Currently translated at 72.1% (1223 of 1696 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Lithuanian)

Currently translated at 72.4% (1228 of 1696 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (1695 of 1696 strings)

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

* Translated using Weblate (Lithuanian)

Currently translated at 78.4% (1330 of 1696 strings)

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

* Translated using Weblate (Lithuanian)

Currently translated at 100.0% (1696 of 1696 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (1695 of 1696 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% (1478 of 1478 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 6.6% (113 of 1696 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% (1702 of 1702 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (1702 of 1702 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1702 of 1702 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 71.2% (1213 of 1702 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1702 of 1702 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% (1478 of 1478 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 7.2% (124 of 1702 strings)

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

* Update translation files

Updated by "Remove blank strings" hook in Weblate.

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1703 of 1703 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 99.6% (1697 of 1703 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1703 of 1703 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% (1703 of 1703 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% (1703 of 1703 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 99.9% (1702 of 1703 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% (1703 of 1703 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% (1703 of 1703 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% (1703 of 1703 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% (1478 of 1478 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% (1478 of 1478 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 99.8% (1712 of 1715 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% (1715 of 1715 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 99.8% (1713 of 1715 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% (1715 of 1715 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (1714 of 1715 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% (1715 of 1715 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% (1715 of 1715 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% (1715 of 1715 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 99.8% (1713 of 1715 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1715 of 1715 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% (1478 of 1478 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% (1715 of 1715 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1715 of 1715 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (1714 of 1715 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% (1715 of 1715 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% (1478 of 1478 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 7.5% (130 of 1715 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 7.8% (135 of 1715 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1715 of 1715 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% (1478 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1715 of 1715 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% (1478 of 1478 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% (1715 of 1715 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% (1478 of 1478 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% (1478 of 1478 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1715 of 1715 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% (1478 of 1478 strings)

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

* Translated using Weblate (Bulgarian)

Currently translated at 99.8% (1712 of 1715 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1715 of 1715 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% (1478 of 1478 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% (1715 of 1715 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% (1478 of 1478 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1725 of 1725 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% (1725 of 1725 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1725 of 1725 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% (1725 of 1725 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% (1725 of 1725 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% (1725 of 1725 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% (1478 of 1478 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (1724 of 1725 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% (1728 of 1728 strings)

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

* process localizations

* update RU translations

* revert PL changes for "passphrase"

---------

Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com>
Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: Miyu Sakatsuki <miyu-sakatsuki@outlook.jp>
Co-authored-by: z0rden <kaanpeker196@gmail.com>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Andre <andrefeliciano@duck.com>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: tuananh-ng <158744840+tuananh-ng@users.noreply.github.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: Anonimas <qdq5ih+3ewax7y4esw98@cs.email>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: Anonimas <Anonimas3@users.noreply.hosted.weblate.org>
Co-authored-by: Arturro43 <Arturro43.kontakt@gmail.com>
Co-authored-by: Alex <github@lippiece.anonaddy.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kingpin <radoslav.najdenov@gmail.com>
2024-04-21 20:16:08 +01:00
Evgeny Poberezkin 50d3a29715 website: translations (#4057)
* Translated using Weblate (French)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (255 of 255 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% (255 of 255 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (255 of 255 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% (255 of 255 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (255 of 255 strings)

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

* Translated using Weblate (Bulgarian)

Currently translated at 13.7% (35 of 255 strings)

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

---------

Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
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>
Co-authored-by: Alex <github@lippiece.anonaddy.me>
Co-authored-by: Kingpin <radoslav.najdenov@gmail.com>
2024-04-21 11:10:07 +01:00
94 changed files with 2734 additions and 1419 deletions
-13
View File
@@ -272,18 +272,6 @@ func apiGetAppSettings(settings: AppSettings) throws -> AppSettings {
throw r
}
func apiSetPQEncryption(_ enable: Bool) throws {
let r = chatSendCmdSync(.apiSetPQEncryption(enable: enable))
if case .cmdOk = r { return }
throw r
}
func apiSetContactPQ(_ contactId: Int64, _ enable: Bool) async throws -> Contact {
let r = await chatSendCmd(.apiSetContactPQ(contactId: contactId, enable: enable))
if case let .contactPQAllowed(_, contact, _) = r { return contact }
throw r
}
func apiExportArchive(config: ArchiveConfig) async throws {
try await sendCommandOkResp(.apiExportArchive(config: config))
}
@@ -1320,7 +1308,6 @@ func initializeChat(start: Bool, confirmStart: Bool = false, dbKey: String? = ni
try apiSetTempFolder(tempFolder: getTempFilesDirectory().path)
try apiSetFilesFolder(filesFolder: getAppFilesDirectory().path)
try apiSetEncryptLocalFiles(privacyEncryptLocalFilesGroupDefault.get())
try apiSetPQEncryption(pqExperimentalEnabledDefault.get())
m.chatInitialized = true
m.currentUser = try apiGetActiveUser()
if m.currentUser == nil {
+1 -52
View File
@@ -103,7 +103,6 @@ struct ChatInfoView: View {
@State private var sendReceipts = SendReceipts.userDefault(true)
@State private var sendReceiptsUserDefault = true
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@AppStorage(GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED, store: groupDefaults) private var pqExperimentalEnabled = false
enum ChatInfoViewAlert: Identifiable {
case clearChatAlert
@@ -111,7 +110,6 @@ struct ChatInfoView: View {
case switchAddressAlert
case abortSwitchAddressAlert
case syncConnectionForceAlert
case allowContactPQEncryptionAlert
case error(title: LocalizedStringKey, error: LocalizedStringKey = "")
var id: String {
@@ -121,7 +119,6 @@ struct ChatInfoView: View {
case .switchAddressAlert: return "switchAddressAlert"
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
case .allowContactPQEncryptionAlert: return "allowContactPQEncryptionAlert"
case let .error(title, _): return "error \(title)"
}
}
@@ -168,19 +165,9 @@ struct ChatInfoView: View {
}
.disabled(!contact.ready || !contact.active)
if pqExperimentalEnabled,
let conn = contact.activeConn {
if let conn = contact.activeConn {
Section {
infoRow(Text(String("E2E encryption")), conn.connPQEnabled ? "Quantum resistant" : "Standard")
if !conn.pqEncryption {
allowPQButton()
}
} header: {
Text(String("Quantum resistant E2E encryption"))
} footer: {
if !conn.pqEncryption {
Text(String("After allowing quantum resistant encryption, it will be enabled after several messages if your contact also allows it."))
}
}
}
@@ -256,7 +243,6 @@ struct ChatInfoView: View {
case .switchAddressAlert: return switchAddressAlert(switchContactAddress)
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchContactAddress)
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncContactConnection(force: true) })
case .allowContactPQEncryptionAlert: return allowContactPQEncryptionAlert()
case let .error(title, error): return mkAlert(title: title, message: error)
}
}
@@ -430,15 +416,6 @@ struct ChatInfoView: View {
}
}
private func allowPQButton() -> some View {
Button {
alert = .allowContactPQEncryptionAlert
} label: {
Label(String("Allow PQ encryption"), systemImage: "exclamationmark.triangle")
.foregroundColor(.orange)
}
}
private func networkStatusRow() -> some View {
HStack {
Text("Network status")
@@ -572,34 +549,6 @@ struct ChatInfoView: View {
}
}
}
private func allowContactPQEncryption() {
Task {
do {
let ct = try await apiSetContactPQ(contact.apiId, true)
contact = ct
await MainActor.run {
chatModel.updateContact(ct)
dismiss()
}
} catch let error {
logger.error("allowContactPQEncryption apiSetContactPQ error: \(responseError(error))")
let a = getErrorAlert(error, "Error allowing contact PQ encryption")
await MainActor.run {
alert = .error(title: a.title, error: a.message)
}
}
}
}
func allowContactPQEncryptionAlert() -> Alert {
Alert(
title: Text(String("Allow quantum resistant encryption?")),
message: Text(String("This is an experimental feature, it is not recommended to enable it for important chats.")),
primaryButton: .destructive(Text(String("Allow")), action: allowContactPQEncryption),
secondaryButton: .cancel()
)
}
}
func switchAddressAlert(_ switchAddress: @escaping () -> Void) -> Alert {
@@ -375,6 +375,31 @@ private let versionDescriptions: [VersionDescription] = [
description: "Thanks to the users [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!"
),
]
),
VersionDescription(
version: "v5.7",
features: [
FeatureDescription(
icon: "key",
title: "Quantum resistant encryption",
description: "Will be enabled in direct chats!"
),
FeatureDescription(
icon: "arrowshape.turn.up.forward",
title: "Forward and save messages",
description: "Message source remains private."
),
FeatureDescription(
icon: "music.note",
title: "In-call sounds",
description: "When connecting audio and video calls."
),
FeatureDescription(
icon: "antenna.radiowaves.left.and.right",
title: "Network management",
description: "More reliable network connection."
)
]
)
]
@@ -51,7 +51,7 @@ struct AdvancedNetworkSettings: View {
}
.disabled(currentNetCfg == NetCfg.proxyDefaults)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [5_000000, 7_500000, 10_000000, 15_000000, 20_000000, 30_000000, 40_000000], label: secondsLabel)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [10_000000, 15_000000, 20_000000, 25_000000, 35_000000, 50_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: "")
@@ -12,7 +12,6 @@ import SimpleXChat
struct DeveloperView: View {
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@AppStorage(GROUP_DEFAULT_CONFIRM_DB_UPGRADES, store: groupDefaults) private var confirmDatabaseUpgrades = false
@AppStorage(GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED, store: groupDefaults) private var pqExperimentalEnabled = false
@Environment(\.colorScheme) var colorScheme
var body: some View {
@@ -43,33 +42,9 @@ struct DeveloperView: View {
} footer: {
(developerTools ? Text("Show:") : Text("Hide:")) + Text(" ") + Text("Database IDs and Transport isolation option.")
}
if developerTools {
Section {
settingsRow("key") {
Toggle("Post-quantum E2EE", isOn: $pqExperimentalEnabled)
.onChange(of: pqExperimentalEnabled) {
setPQExperimentalEnabled($0)
}
}
} header: {
Text(String("Experimental"))
} footer: {
Text(String("In this version applies only to new contacts."))
}
}
}
}
}
private func setPQExperimentalEnabled(_ enable: Bool) {
do {
try apiSetPQEncryption(enable)
} catch let error {
let err = responseError(error)
logger.error("apiSetPQEncryption \(err)")
}
}
}
struct DeveloperView_Previews: PreviewProvider {
@@ -6003,7 +6003,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>Nutzen Sie das neue Inkognito-Profil</target>
<target>Ein neues Inkognito-Profil nutzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
@@ -109,7 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ downloaded</target>
<target>%@ descargado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -134,7 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ cargado</target>
<target>%@ subido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -354,7 +354,7 @@
</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">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Tenga en cuenta**: usar la misma base de datos en dos dispositivos interrumpirá el descifrado de mensajes de sus conexiones, como protección de seguridad.</target>
<target>**Recuarda**: usar la misma base de datos en dos dispositivos hará que falle el descifrado de mensajes como protección de seguridad.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -635,7 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Los admins pueden bloquear un miembro por todos.</target>
<target>Los administradores pueden bloquear a un miembro para los demás.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." 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>Todos sus contactos, conversaciones y archivos se cifrarán de forma segura y se subirán en fragmentos hacia puntos XFTP configurados.</target>
<target>Todos tus contactos, conversaciones y archivos serán cifrados, divididos y subidos de forma segura a los servidores XFTP configurados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -829,7 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Migración de datos de la aplicación</target>
<target>Migrar datos de la aplicación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -874,7 +874,7 @@
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archivar y transferir</target>
<target>Archivar y subir</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
@@ -1004,7 +1004,7 @@
</trans-unit>
<trans-unit id="Blocked by admin" xml:space="preserve">
<source>Blocked by admin</source>
<target>Bloqueado por el administrador</target>
<target>Bloqueado por administrador</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
@@ -1174,17 +1174,17 @@
</trans-unit>
<trans-unit id="Chat is stopped" xml:space="preserve">
<source>Chat is stopped</source>
<target>Chat está detenido</target>
<target>Chat está parado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." xml:space="preserve">
<source>Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat.</source>
<target>Chat está detenido. Si estás usando esta base de datos en otro dispositivo, deberías transferirla de vuelta antes de iniciarlo.</target>
<target>Chat parado. Si has usado esta base de datos en otro dispositivo, debes transferirla de vuelta antes de iniciar Chat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Chat transferido !</target>
<target>¡Chat migrado!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1209,7 +1209,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>Elija _Migrar desde otro dispositivo_ en el nuevo dispositivo y escanee el código QR.</target>
<target>En el nuevo dispositivo selecciona _Migrar desde otro dispositivo_ y escanéa el código QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1284,7 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Confirmar los ajustes de red</target>
<target>Confirmar configuración de red</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1299,7 +1299,7 @@
</trans-unit>
<trans-unit id="Confirm that you remember database passphrase to migrate it." xml:space="preserve">
<source>Confirm that you remember database passphrase to migrate it.</source>
<target>Confirme que recuerda la frase secreta de la base de datos para migrarla.</target>
<target>Confirma que recuerdas la frase de contraseña de la base de datos para migrarla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
@@ -1568,7 +1568,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Creando enlace de archivo</target>
<target>Creando enlace al archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1766,7 +1766,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Delete chat profile?" xml:space="preserve">
<source>Delete chat profile?</source>
<target>¿Eliminar el perfil?</target>
<target>¿Eliminar perfil?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete connection" xml:space="preserve">
@@ -2092,7 +2092,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Error en la descarga</target>
<target>Descarga fallida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2167,7 +2167,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Activar en chats directos (BETA)!</target>
<target>¡Activar en chats directos (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2291,7 +2291,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Introducir frase de contraseña</target>
<target>Introduce la frase de contraseña</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2571,7 +2571,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error stopping chat" xml:space="preserve">
<source>Error stopping chat</source>
<target>Error al detener Chat</target>
<target>Error al parar Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error switching profile!" xml:space="preserve">
@@ -2701,12 +2701,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="File will be received when your contact completes uploading it." xml:space="preserve">
<source>File will be received when your contact completes uploading it.</source>
<target>El archivo se recibirá cuando tu contacto termine de subirlo.</target>
<target>El archivo se recibirá cuando el contacto termine de subirlo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be received when your contact is online, please wait or check later!" xml:space="preserve">
<source>File will be received when your contact is online, please wait or check later!</source>
<target>El archivo se recibirá cuando tu contacto esté en línea, ¡por favor espera o compruébalo más tarde!</target>
<target>El archivo se recibirá cuando el contacto esté en línea, ¡por favor espera o compruébalo más tarde!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File: %@" xml:space="preserve">
@@ -2726,7 +2726,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>No se permiten archivos y multimedia en este grupo.</target>
<target>Los archivos y multimedia no están permitidos en este grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
@@ -2745,7 +2745,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Finalizar la migración</target>
<target>Finalizar migración</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
@@ -3061,7 +3061,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Interfaz húngara</target>
<target>Interfaz en húngaro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3096,12 +3096,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Image will be received when your contact completes uploading it." xml:space="preserve">
<source>Image will be received when your contact completes uploading it.</source>
<target>La imagen se recibirá cuando tu contacto termine de subirla.</target>
<target>La imagen se recibirá cuando el contacto termine de subirla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Image will be received when your contact is online, please wait or check later!" xml:space="preserve">
<source>Image will be received when your contact is online, please wait or check later!</source>
<target>La imagen se recibirá cuando tu contacto esté en línea, ¡por favor espera o compruébalo más tarde!</target>
<target>La imagen se recibirá cuando el contacto esté en línea, ¡por favor espera o compruébalo más tarde!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Immediately" xml:space="preserve">
@@ -3156,7 +3156,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="In order to continue, chat should be stopped." xml:space="preserve">
<source>In order to continue, chat should be stopped.</source>
<target>Para continuar, el chat debe ser interrumpido.</target>
<target>Para continuar, Chat debe estar parado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3273,7 +3273,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Confirmación de migración inválida</target>
<target>Confirmación de migración no válida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3347,7 +3347,7 @@ This cannot be undone!</source>
2. Message decryption failed, because you or your contact used old database backup.
3. The connection was compromised.</source>
<target>Esto puede suceder cuando:
1. Los mensajes caducan en el cliente saliente tras 2 días o en el servidor tras 30 días.
1. Los mensajes caducan tras 2 días en el cliente saliente o tras 30 días en el servidor.
2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.
3. La conexión ha sido comprometida.</target>
<note>No comment provided by engineer.</note>
@@ -3646,7 +3646,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Mensaje demasiado grande</target>
<target>Mensaje demasiado largo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3666,12 +3666,12 @@ This is your link for group %@!</source>
</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>Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques.</target>
<target>Los mensajes, archivos y llamadas están protegidos mediante **cifrado de extremo a extremo** con secreto perfecto hacía adelante, repudio y recuperación tras ataque.</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>Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques.</target>
<target>Los mensajes, archivos y llamadas están protegidos mediante **cifrado de extremo a extremo resistente a tecnología cuántica** con secreto perfecto hacía adelante, repudio y recuperación tras ataque.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
@@ -3691,12 +3691,12 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Migrar hacia otro dispositivo</target>
<target>Migrar a otro dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Migrar hacia otro dispositivo mediante código QR.</target>
<target>Migrar a otro dispositivo mediante código QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
@@ -4083,7 +4083,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Abrir la migración hacia otro dispositivo</target>
<target>Abrir menú migración a otro dispositivo</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4113,7 +4113,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>O comparta de forma segura el enlace de este archivo</target>
<target>O comparte de forma segura este enlace al archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4232,7 +4232,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Por favor confirme que la configuración de red es correcta para este dispositivo.</target>
<target>Por favor, confirma que la configuración de red es correcta para este dispositivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4294,7 +4294,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>E2EE postcuántica</target>
<target>E2EE post cuántica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4339,7 +4339,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Perfil y conexiones de servidor</target>
<target>Datos del perfil y conexiones</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile image" xml:space="preserve">
@@ -4443,7 +4443,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Cifrado resistente a la tecnología cuántica</target>
<target>Cifrado resistente a tecnología cuántica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4656,7 +4656,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Repetir la carga</target>
<target>Repetir subida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4949,7 +4949,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Send a live message - it will update for the recipient(s) as you type it" xml:space="preserve">
<source>Send a live message - it will update for the recipient(s) as you type it</source>
<target>Envía un mensaje en vivo: se actualizará para el(los) destinatario(s) a medida que se escribe</target>
<target>Envía un mensaje en vivo: se actualizará para el (los) destinatario(s) a medida que se escribe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
@@ -5342,32 +5342,32 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Stop" xml:space="preserve">
<source>Stop</source>
<target>Detener</target>
<target>Parar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop SimpleX" xml:space="preserve">
<source>Stop SimpleX</source>
<target>Detener SimpleX</target>
<target>Parar SimpleX</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Detener el chat</target>
<target>Parar chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
<source>Stop chat to enable database actions</source>
<target>Detén SimpleX para habilitar las acciones sobre la base de datos</target>
<target>Para habilitar las acciones sobre la base de datos, debes parar Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped." xml:space="preserve">
<source>Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped.</source>
<target>Para poder exportar, importar o eliminar la base de datos primero debes detener Chat. Durante el tiempo que esté detenido no podrás recibir ni enviar mensajes.</target>
<target>Para poder exportar, importar o eliminar la base de datos primero debes parar Chat. Mientras tanto no podrás recibir ni enviar mensajes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat?" xml:space="preserve">
<source>Stop chat?</source>
<target>¿Detener Chat?</target>
<target>¿Parar Chat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop file" xml:space="preserve">
@@ -5397,7 +5397,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Detención del chat</target>
<target>Parando chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5534,7 +5534,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
</trans-unit>
<trans-unit id="The app can notify you when you receive messages or contact requests - please open settings to enable." xml:space="preserve">
<source>The app can notify you when you receive messages or contact requests - please open settings to enable.</source>
<target>La aplicación puede notificarte cuando recibas mensajes o solicitudes de contacto: abre la configuración para habilitar.</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 attempt to change database passphrase was not completed." xml:space="preserve">
@@ -5639,7 +5639,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
</trans-unit>
<trans-unit id="This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes." xml:space="preserve">
<source>This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes.</source>
<target>Esta acción es irreversible. Se eliminarán los mensajes enviados y recibidos anteriores a la selección. Puede tardar varios minutos.</target>
<target>Esta acción es irreversible. Se eliminarán los mensajes enviados y recibidos anteriores a la selección. Podría tardar varios minutos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." xml:space="preserve">
@@ -5654,7 +5654,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas.</target>
<target>Este chat está protegido por cifrado de extremo a extremo resistente a tecnología cuántica.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5954,7 +5954,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Error de carga</target>
<target>Error de subida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5964,7 +5964,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Subiendo el archivo</target>
<target>Subiendo archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -6019,7 +6019,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Usar la app durante la llamada.</target>
<target>Usar la aplicación durante la llamada.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -6089,12 +6089,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Video will be received when your contact completes uploading it." xml:space="preserve">
<source>Video will be received when your contact completes uploading it.</source>
<target>El video se recibirá cuando tu contacto termine de subirlo.</target>
<target>El video se recibirá cuando el contacto termine de subirlo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Video will be received when your contact is online, please wait or check later!" xml:space="preserve">
<source>Video will be received when your contact is online, please wait or check later!</source>
<target>El vídeo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.</target>
<target>El vídeo se recibirá cuando el contacto esté en línea, por favor espera o compruébalo más tarde.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Videos and files up to 1gb" xml:space="preserve">
@@ -6163,7 +6163,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</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>Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes</target>
<target>Atención: el inicio del chat en varios dispositivos es incompatible y provocará fallos en la entrega de mensajes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6188,7 +6188,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>El mensaje de bienvenida es demasiado largo</target>
<target>Mensaje de bienvenida demasiado largo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6256,7 +6256,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>**No debe** usar la misma base de datos en dos dispositivos.</target>
<target>**No debes** usar la misma base de datos en dos dispositivos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6348,7 +6348,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Puede intentarlo de nuevo.</target>
<target>Puedes intentarlo de nuevo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6495,7 +6495,7 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="You will be connected when your contact's device is online, please wait or check later!" xml:space="preserve">
<source>You will be connected when your contact's device is online, please wait or check later!</source>
<target>Te conectarás cuando el dispositivo de tu contacto esté en línea, por favor espera o compruébalo más tarde.</target>
<target>Te conectarás cuando el dispositivo del contacto esté en línea, por favor espera o compruébalo más tarde.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will be required to authenticate when you start or resume the app after 30 seconds in background." xml:space="preserve">
@@ -6581,8 +6581,8 @@ Repeat connection request?</source>
<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>Tu contacto debe estar en línea para que se complete la conexión.
Puedes cancelar esta conexión y eliminar el contacto (e intentarlo más tarde con un enlace nuevo).</target>
<target>El contacto debe estar en línea para completar la conexión.
Puedes cancelarla y eliminar el contacto (e intentarlo más tarde con un enlace nuevo).</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">
@@ -6757,12 +6757,12 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="blocked %@" xml:space="preserve">
<source>blocked %@</source>
<target>%@ bloqueado</target>
<target>ha bloqueado a %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="blocked by admin" xml:space="preserve">
<source>blocked by admin</source>
<target>bloqueado por el administrador</target>
<target>bloqueado por administrador</target>
<note>marked deleted chat item preview text</note>
</trans-unit>
<trans-unit id="bold" xml:space="preserve">
@@ -7272,7 +7272,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>cifrado e2e resistente a la cuántica</target>
<target>cifrado e2e resistente a tecnología cuántica</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7380,7 +7380,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="unblocked %@" xml:space="preserve">
<source>unblocked %@</source>
<target>%@ desbloqueado</target>
<target>ha desbloqueado a %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="unknown" xml:space="preserve">
@@ -104,7 +104,7 @@
</trans-unit>
<trans-unit id="%@ connected" xml:space="preserve">
<source>%@ connected</source>
<target>%@ si è connesso/a</target>
<target>%@ connesso/a</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ ダウンロード済</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ アップロード済</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -142,6 +144,7 @@
</trans-unit>
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
<source>%@, %@ and %lld members</source>
<target>%@や%@など%lld人のメンバー</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
@@ -211,6 +214,7 @@
</trans-unit>
<trans-unit id="%lld group events" xml:space="preserve">
<source>%lld group events</source>
<target>%lld件のグループイベント</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld members" xml:space="preserve">
@@ -220,10 +224,12 @@
</trans-unit>
<trans-unit id="%lld messages blocked" xml:space="preserve">
<source>%lld messages blocked</source>
<target>%lld件のメッセージをブロック</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld messages blocked by admin" xml:space="preserve">
<source>%lld messages blocked by admin</source>
<target>%lldのメッセージが管理者によりブロック済</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
@@ -308,10 +314,12 @@
</trans-unit>
<trans-unit id="(new)" xml:space="preserve">
<source>(new)</source>
<target>(新規)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(this device v%@)" xml:space="preserve">
<source>(this device v%@)</source>
<target>(このデバイス v%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=")" xml:space="preserve">
@@ -321,6 +329,7 @@
</trans-unit>
<trans-unit id="**Add contact**: to create a new invitation link, or connect via a link you received." xml:space="preserve">
<source>**Add contact**: to create a new invitation link, or connect via a link you received.</source>
<target>**コンタクトの追加**: 新しい招待リンクを作成するか、受け取ったリンクから接続します。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Add new contact**: to create your one-time QR Code for your contact." xml:space="preserve">
@@ -330,6 +339,7 @@
</trans-unit>
<trans-unit id="**Create group**: to create a new group." xml:space="preserve">
<source>**Create group**: to create a new group.</source>
<target>**グループ作成**: 新しいグループを作成する。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**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." xml:space="preserve">
@@ -344,6 +354,7 @@
</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">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**注意**: 2つの端末で同じデータベースを使用すると、セキュリティ保護として、あなたが接続しているメッセージの復号化が解除されます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -363,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**警告**: アーカイブデータは削除されます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -39,7 +39,7 @@
</trans-unit>
<trans-unit id="!1 colored!" xml:space="preserve">
<source>!1 colored!</source>
<target>!1 kolorowy!</target>
<target>!1 pokolorowany!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="# %@" xml:space="preserve">
@@ -344,32 +344,32 @@
</trans-unit>
<trans-unit id="**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." xml:space="preserve">
<source>**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.</source>
<target>**Bardziej prywatny**: sprawdzanie nowych wiadomości co 20 minut. Token urządzenia jest współdzielony z serwerem SimpleX Chat, ale nie informacje o liczbie kontaktów lub wiadomości.</target>
<target>**Bardziej prywatny**: sprawdzanie nowych wiadomości odbywa się co 20 minut. Współdzielony z serwerem SimpleX Chat jest token urządzenia, lecz nie informacje o liczbie kontaktów lub wiadomości.</target>
<note>No comment provided by engineer.</note>
</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>**Najbardziej prywatny**: nie korzystaj z serwera powiadomień SimpleX Chat, sprawdzaj wiadomości okresowo w tle (zależy jak często korzystasz z aplikacji).</target>
<target>**Najbardziej prywatny**: nie korzystaj z serwera powiadomień SimpleX Chat, wiadomości sprawdzane są co jakiś czas w tle (zależne od tego jak często korzystasz z aplikacji).</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">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>*Uwaga*: używanie tej samej bazy danych na dwóch urządzeniach zepsuje odszyfrowywanie wiadomości twoich połączeń, jako zabezpieczenie.</target>
<target>*Uwaga*: w celach bezpieczeństwa użycie tej samej bazy danych na dwóch różnych urządzeniach spowoduje brak możliwości odszyfrowywania wiadomości z Twoich połączeń.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
<source>**Please note**: you will NOT be able to recover or change passphrase if you lose it.</source>
<target>**Uwaga**: NIE będziesz w stanie odzyskać lub zmienić hasła, jeśli je stracisz.</target>
<target>**Uwaga**: NIE będziesz w stanie odzyskać lub zmienić kodu dostępu, jeśli go stracisz.</target>
<note>No comment provided by engineer.</note>
</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>**Zalecane**: token urządzenia i powiadomienia są wysyłane do serwera powiadomień SimpleX Chat, ale nie treść wiadomości, rozmiar lub od kogo jest.</target>
<target>**Zalecane**: do serwera powiadomień SimpleX Chat wysyłany jest token urządzenia i powiadomienia, lecz nie treść wiadomości, jej rozmiar lub od kogo ona jest.</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">
<source>**Warning**: Instant push notifications require passphrase saved in Keychain.</source>
<target>**Uwaga**: Natychmiastowe powiadomienia push wymagają hasła zapisanego w Keychain.</target>
<target>**Uwaga**: Natychmiastowe powiadomienia push wymagają zapisania kodu dostępu w Keychain.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
@@ -4249,12 +4249,12 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Please enter correct current passphrase." xml:space="preserve">
<source>Please enter correct current passphrase.</source>
<target>Wprowadź poprawne aktualne hasło.</target>
<target>Wprowadź poprawny obecny kod dostępu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please enter the previous password after restoring database backup. This action can not be undone." xml:space="preserve">
<source>Please enter the previous password after restoring database backup. This action can not be undone.</source>
<target>Proszę podać poprzednie hasło po przywróceniu kopii zapasowej bazy danych. Tej czynności nie można cofnąć.</target>
<target>Proszę podać poprzedni kod dostępu po przywróceniu kopii zapasowej bazy danych. Tej czynności nie można cofnąć.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please remember or store it securely - there is no way to recover a lost passcode!" xml:space="preserve">
@@ -4274,12 +4274,12 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Please store passphrase securely, you will NOT be able to access chat if you lose it." xml:space="preserve">
<source>Please store passphrase securely, you will NOT be able to access chat if you lose it.</source>
<target>Prosimy o bezpieczne przechowywanie hasła, w przypadku jego utraty NIE będzie można uzyskać dostępu do czatu.</target>
<target>Przechowuj kod dostępu w bezpieczny sposób, w przypadku jego utraty NIE będzie można uzyskać dostępu do czatu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please store passphrase securely, you will NOT be able to change it if you lose it." xml:space="preserve">
<source>Please store passphrase securely, you will NOT be able to change it if you lose it.</source>
<target>Prosimy o bezpieczne przechowywanie hasła, w przypadku jego utraty NIE będzie można go zmienić.</target>
<target>Przechowuj kod dostępu w bezpieczny sposób, w przypadku jego utraty NIE będzie można go zmienić.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
@@ -4294,7 +4294,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>Postkwantowe E2EE</target>
<target>Postkwantowe szyfrowanie E2E</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -610,160 +610,197 @@ Available in v5.1</source>
<source>Can't delete user profile!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contact!" xml:space="preserve">
<trans-unit id="Can't invite contact!" xml:space="preserve" approved="no">
<source>Can't invite contact!</source>
<target state="translated">Não é possível convidar contato!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contacts!" xml:space="preserve">
<trans-unit id="Can't invite contacts!" xml:space="preserve" approved="no">
<source>Can't invite contacts!</source>
<target state="translated">Não é possível convidar contatos!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel" xml:space="preserve">
<trans-unit id="Cancel" xml:space="preserve" approved="no">
<source>Cancel</source>
<target state="translated">Cancelar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve" approved="no">
<source>Cannot access keychain to save database password</source>
<target state="translated">Não é possível acessar as chaves para salvar a senha do banco de dados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot receive file" xml:space="preserve">
<trans-unit id="Cannot receive file" xml:space="preserve" approved="no">
<source>Cannot receive file</source>
<target state="translated">Não é possível receber o arquivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<trans-unit id="Change" xml:space="preserve" approved="no">
<source>Change</source>
<target state="translated">Mudar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change passcode" xml:space="preserve">
<source>Change passcode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change database passphrase?" xml:space="preserve">
<trans-unit id="Change database passphrase?" xml:space="preserve" approved="no">
<source>Change database passphrase?</source>
<target state="translated">Alterar a senha do banco de dados?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change lock mode" xml:space="preserve">
<trans-unit id="Change lock mode" xml:space="preserve" approved="no">
<source>Change lock mode</source>
<target state="translated">Alterar modo de bloqueio</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change member role?" xml:space="preserve">
<trans-unit id="Change member role?" xml:space="preserve" approved="no">
<source>Change member role?</source>
<target state="translated">Alterar a função do membro?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change passcode" xml:space="preserve">
<trans-unit id="Change passcode" xml:space="preserve" approved="no">
<source>Change passcode</source>
<target state="translated">Alterar senha</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Change receiving address" xml:space="preserve">
<trans-unit id="Change receiving address" xml:space="preserve" approved="no">
<source>Change receiving address</source>
<target state="translated">Alterar endereço de recebimento</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change receiving address?" xml:space="preserve">
<trans-unit id="Change receiving address?" xml:space="preserve" approved="no">
<source>Change receiving address?</source>
<target state="translated">Alterar endereço de recebimento?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change role" xml:space="preserve">
<trans-unit id="Change role" xml:space="preserve" approved="no">
<source>Change role</source>
<target state="translated">Mudar função</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat archive" xml:space="preserve">
<trans-unit id="Chat archive" xml:space="preserve" approved="no">
<source>Chat archive</source>
<target state="translated">Arquivar conversa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat console" xml:space="preserve">
<trans-unit id="Chat console" xml:space="preserve" approved="no">
<source>Chat console</source>
<target state="translated">Console da conversa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat database" xml:space="preserve">
<trans-unit id="Chat database" xml:space="preserve" approved="no">
<source>Chat database</source>
<target state="translated">Banco de Dados da conversa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat database deleted" xml:space="preserve">
<trans-unit id="Chat database deleted" xml:space="preserve" approved="no">
<source>Chat database deleted</source>
<target state="translated">Banco de Dados da conversa apagado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat database imported" xml:space="preserve">
<trans-unit id="Chat database imported" xml:space="preserve" approved="no">
<source>Chat database imported</source>
<target state="translated">Banco de Dados da conversa importado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat is running" xml:space="preserve">
<trans-unit id="Chat is running" xml:space="preserve" approved="no">
<source>Chat is running</source>
<target state="translated">A conversa está em execução</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat is stopped" xml:space="preserve">
<source>Chat is stopped</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
<trans-unit id="Chat preferences" xml:space="preserve" approved="no">
<source>Chat preferences</source>
<target state="translated">Preferências da conversa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<trans-unit id="Chats" xml:space="preserve" approved="no">
<source>Chats</source>
<target state="translated">Conversas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check server address and try again." xml:space="preserve">
<trans-unit id="Check server address and try again." xml:space="preserve" approved="no">
<source>Check server address and try again.</source>
<target state="translated">Verifique o endereço do servidor e tente novamente.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chinese and Spanish interface" xml:space="preserve">
<trans-unit id="Chinese and Spanish interface" xml:space="preserve" approved="no">
<source>Chinese and Spanish interface</source>
<target state="translated">Interface em Chinês e Espanhol</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
<trans-unit id="Choose file" xml:space="preserve" approved="no">
<source>Choose file</source>
<target state="translated">Escolher arquivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose from library" xml:space="preserve">
<trans-unit id="Choose from library" xml:space="preserve" approved="no">
<source>Choose from library</source>
<target state="translated">Escolha da biblioteca</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear" xml:space="preserve">
<trans-unit id="Clear" xml:space="preserve" approved="no">
<source>Clear</source>
<target state="translated">Limpar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear conversation" xml:space="preserve">
<trans-unit id="Clear conversation" xml:space="preserve" approved="no">
<source>Clear conversation</source>
<target state="translated">Limpar conversa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear conversation?" xml:space="preserve">
<trans-unit id="Clear conversation?" xml:space="preserve" approved="no">
<source>Clear conversation?</source>
<target state="translated">Limpar conversa?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear verification" xml:space="preserve">
<trans-unit id="Clear verification" xml:space="preserve" approved="no">
<source>Clear verification</source>
<target state="translated">Limpar verificação</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Colors" xml:space="preserve">
<trans-unit id="Colors" xml:space="preserve" approved="no">
<source>Colors</source>
<target state="translated">Cores</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Compare file" xml:space="preserve">
<trans-unit id="Compare file" xml:space="preserve" approved="no">
<source>Compare file</source>
<target state="translated">Comparar arquivo</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Compare security codes with your contacts." xml:space="preserve">
<trans-unit id="Compare security codes with your contacts." xml:space="preserve" approved="no">
<source>Compare security codes with your contacts.</source>
<target state="translated">Compare os códigos de segurança com seus contatos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configure ICE servers" xml:space="preserve">
<trans-unit id="Configure ICE servers" xml:space="preserve" approved="no">
<source>Configure ICE servers</source>
<target state="translated">Configurar servidores ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<trans-unit id="Confirm" xml:space="preserve" approved="no">
<source>Confirm</source>
<target state="translated">Confirme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm Passcode" xml:space="preserve">
<trans-unit id="Confirm Passcode" xml:space="preserve" approved="no">
<source>Confirm Passcode</source>
<target state="translated">Confirmar senha</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
<trans-unit id="Confirm database upgrades" xml:space="preserve" approved="no">
<source>Confirm database upgrades</source>
<target state="translated">Confirmar atualizações do banco de dados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
<trans-unit id="Confirm new passphrase…" xml:space="preserve" approved="no">
<source>Confirm new passphrase…</source>
<target state="translated">Confirme a nova senha…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm password" xml:space="preserve">
@@ -4447,6 +4484,62 @@ SimpleX servers cannot see your profile.</source>
<target state="translated">Permitir apagar irreversivelmente as mensagens enviadas. (24 horas)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve" approved="no">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target state="translated">Escolha _Migrar de outro dispositivo_ no novo dispositivo e leia o código QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve" approved="no">
<source>Cancel migration</source>
<target state="translated">Cancelar migração</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Camera not available" xml:space="preserve" approved="no">
<source>Camera not available</source>
<target state="translated">Câmera não disponível</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change self-destruct passcode" xml:space="preserve" approved="no">
<source>Change self-destruct passcode</source>
<target state="translated">Alterar a senha de autodestruição</target>
<note>authentication reason
set passcode view</note>
</trans-unit>
<trans-unit id="Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." xml:space="preserve" approved="no">
<source>Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat.</source>
<target state="translated">A conversa foi interrompida. Se você já usou esse banco de dados em outro dispositivo, deverá transferi-lo de volta antes de iniciar a conversa.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve" approved="no">
<source>Chat migrated!</source>
<target state="translated">Conversa migrada!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear private notes?" xml:space="preserve" approved="no">
<source>Clear private notes?</source>
<target state="translated">Limpar notas privadas?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve" approved="no">
<source>Confirm network settings</source>
<target state="translated">Confirme as configurações de rede</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm that you remember database passphrase to migrate it." xml:space="preserve" approved="no">
<source>Confirm that you remember database passphrase to migrate it.</source>
<target state="translated">Confirme se você se lembra da senha do banco de dados para migrá-lo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change self-destruct mode" xml:space="preserve" approved="no">
<source>Change self-destruct mode</source>
<target state="translated">Alterar modo de autodestruição</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve" approved="no">
<source>Confirm upload</source>
<target state="translated">Confirmar envio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pt" datatype="plaintext">
+26 -26
View File
@@ -29,11 +29,11 @@
5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; };
5C13730B28156D2700F43030 /* ContactConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C13730A28156D2700F43030 /* ContactConnectionView.swift */; };
5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; };
5C2217842BD4465500A8B0E7 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C22177F2BD4465500A8B0E7 /* libgmpxx.a */; };
5C2217852BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217802BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a */; };
5C2217862BD4465500A8B0E7 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217812BD4465500A8B0E7 /* libgmp.a */; };
5C2217872BD4465500A8B0E7 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217822BD4465500A8B0E7 /* libffi.a */; };
5C2217882BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217832BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a */; };
5C2217A22BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C22179D2BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD-ghc9.6.3.a */; };
5C2217A32BD7132100A8B0E7 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C22179E2BD7132100A8B0E7 /* libgmpxx.a */; };
5C2217A42BD7132100A8B0E7 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C22179F2BD7132100A8B0E7 /* libffi.a */; };
5C2217A52BD7132100A8B0E7 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217A02BD7132100A8B0E7 /* libgmp.a */; };
5C2217A62BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217A12BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD.a */; };
5C2E260727A2941F00F70299 /* SimpleXAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260627A2941F00F70299 /* SimpleXAPI.swift */; };
5C2E260B27A30CFA00F70299 /* ChatListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260A27A30CFA00F70299 /* ChatListView.swift */; };
5C2E260F27A30FDC00F70299 /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260E27A30FDC00F70299 /* ChatView.swift */; };
@@ -279,11 +279,11 @@
5C13730A28156D2700F43030 /* ContactConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactConnectionView.swift; sourceTree = "<group>"; };
5C13730C2815740A00F43030 /* DebugJSON.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DebugJSON.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemView.swift; sourceTree = "<group>"; };
5C22177F2BD4465500A8B0E7 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C2217802BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a"; sourceTree = "<group>"; };
5C2217812BD4465500A8B0E7 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C2217822BD4465500A8B0E7 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C2217832BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a"; sourceTree = "<group>"; };
5C22179D2BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD-ghc9.6.3.a"; sourceTree = "<group>"; };
5C22179E2BD7132100A8B0E7 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C22179F2BD7132100A8B0E7 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C2217A02BD7132100A8B0E7 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C2217A12BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD.a"; sourceTree = "<group>"; };
5C245F3C2B501E98001CC39F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
5C245F3D2B501F13001CC39F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = "tr.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
5C245F3E2B501F13001CC39F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -525,13 +525,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5C2217842BD4465500A8B0E7 /* libgmpxx.a in Frameworks */,
5C2217872BD4465500A8B0E7 /* libffi.a in Frameworks */,
5C2217862BD4465500A8B0E7 /* libgmp.a in Frameworks */,
5C2217882BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a in Frameworks */,
5C2217A32BD7132100A8B0E7 /* libgmpxx.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
5C2217A22BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD-ghc9.6.3.a in Frameworks */,
5C2217A42BD7132100A8B0E7 /* libffi.a in Frameworks */,
5C2217A52BD7132100A8B0E7 /* libgmp.a in Frameworks */,
5C2217A62BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
5C2217852BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -595,11 +595,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
5C2217822BD4465500A8B0E7 /* libffi.a */,
5C2217812BD4465500A8B0E7 /* libgmp.a */,
5C22177F2BD4465500A8B0E7 /* libgmpxx.a */,
5C2217802BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a */,
5C2217832BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a */,
5C22179F2BD7132100A8B0E7 /* libffi.a */,
5C2217A02BD7132100A8B0E7 /* libgmp.a */,
5C22179E2BD7132100A8B0E7 /* libgmpxx.a */,
5C22179D2BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD-ghc9.6.3.a */,
5C2217A12BD7132100A8B0E7 /* libHSsimplex-chat-5.7.0.3-1gdwVzNNUlPBAUpdkOuWsD.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -1544,7 +1544,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 208;
CURRENT_PROJECT_VERSION = 209;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1593,7 +1593,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 208;
CURRENT_PROJECT_VERSION = 209;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1679,7 +1679,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 208;
CURRENT_PROJECT_VERSION = 209;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -1716,7 +1716,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 208;
CURRENT_PROJECT_VERSION = 209;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -1753,7 +1753,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 208;
CURRENT_PROJECT_VERSION = 209;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1804,7 +1804,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 208;
CURRENT_PROJECT_VERSION = 209;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
+3 -12
View File
@@ -32,8 +32,6 @@ public enum ChatCommand {
case setTempFolder(tempFolder: String)
case setFilesFolder(filesFolder: String)
case apiSetEncryptLocalFiles(enable: Bool)
case apiSetPQEncryption(enable: Bool)
case apiSetContactPQ(contactId: Int64, enable: Bool)
case apiExportArchive(config: ArchiveConfig)
case apiImportArchive(config: ArchiveConfig)
case apiDeleteStorage
@@ -172,8 +170,6 @@ public enum ChatCommand {
case let .setTempFolder(tempFolder): return "/_temp_folder \(tempFolder)"
case let .setFilesFolder(filesFolder): return "/_files_folder \(filesFolder)"
case let .apiSetEncryptLocalFiles(enable): return "/_files_encrypt \(onOff(enable))"
case let .apiSetPQEncryption(enable): return "/pq \(onOff(enable))"
case let .apiSetContactPQ(contactId, enable): return "/_pq @\(contactId) \(onOff(enable))"
case let .apiExportArchive(cfg): return "/_db export \(encodeJSON(cfg))"
case let .apiImportArchive(cfg): return "/_db import \(encodeJSON(cfg))"
case .apiDeleteStorage: return "/_db delete"
@@ -326,8 +322,6 @@ public enum ChatCommand {
case .setTempFolder: return "setTempFolder"
case .setFilesFolder: return "setFilesFolder"
case .apiSetEncryptLocalFiles: return "apiSetEncryptLocalFiles"
case .apiSetPQEncryption: return "apiSetPQEncryption"
case .apiSetContactPQ: return "apiSetContactPQ"
case .apiExportArchive: return "apiExportArchive"
case .apiImportArchive: return "apiImportArchive"
case .apiDeleteStorage: return "apiDeleteStorage"
@@ -653,7 +647,6 @@ public enum ChatResponse: Decodable, Error {
case remoteCtrlConnected(remoteCtrl: RemoteCtrlInfo)
case remoteCtrlStopped(rcsState: RemoteCtrlSessionState, rcStopReason: RemoteCtrlStopReason)
// pq
case contactPQAllowed(user: UserRef, contact: Contact, pqEncryption: Bool)
case contactPQEnabled(user: UserRef, contact: Contact, pqEnabled: Bool)
// misc
case versionInfo(versionInfo: CoreVersionInfo, chatMigrations: [UpMigration], agentMigrations: [UpMigration])
@@ -809,8 +802,7 @@ public enum ChatResponse: Decodable, Error {
case .remoteCtrlSessionCode: return "remoteCtrlSessionCode"
case .remoteCtrlConnected: return "remoteCtrlConnected"
case .remoteCtrlStopped: return "remoteCtrlStopped"
case .contactPQAllowed: return "contactPQAllowed"
case .contactPQEnabled: return "contactPQAllowed"
case .contactPQEnabled: return "contactPQEnabled"
case .versionInfo: return "versionInfo"
case .cmdOk: return "cmdOk"
case .chatCmdError: return "chatCmdError"
@@ -967,7 +959,6 @@ public enum ChatResponse: Decodable, Error {
case let .remoteCtrlSessionCode(remoteCtrl_, sessionCode): return "remoteCtrl_:\n\(String(describing: remoteCtrl_))\nsessionCode: \(sessionCode)"
case let .remoteCtrlConnected(remoteCtrl): return String(describing: remoteCtrl)
case .remoteCtrlStopped: return noDetails
case let .contactPQAllowed(u, contact, pqEncryption): return withUser(u, "contact: \(String(describing: contact))\npqEncryption: \(pqEncryption)")
case let .contactPQEnabled(u, contact, pqEnabled): return withUser(u, "contact: \(String(describing: contact))\npqEnabled: \(pqEnabled)")
case let .versionInfo(versionInfo, chatMigrations, agentMigrations): return "\(String(describing: versionInfo))\n\nchat migrations: \(chatMigrations.map(\.upName))\n\nagent migrations: \(agentMigrations.map(\.upName))"
case .cmdOk: return noDetails
@@ -1266,7 +1257,7 @@ public struct NetCfg: Codable, Equatable {
public static let defaults: NetCfg = NetCfg(
socksProxy: nil,
sessionMode: TransportSessionMode.user,
tcpConnectTimeout: 10_000_000,
tcpConnectTimeout: 25_000_000,
tcpTimeout: 15_000_000,
tcpTimeoutPerKb: 10_000,
rcvConcurrency: 12,
@@ -1279,7 +1270,7 @@ public struct NetCfg: Codable, Equatable {
public static let proxyDefaults: NetCfg = NetCfg(
socksProxy: nil,
sessionMode: TransportSessionMode.user,
tcpConnectTimeout: 20_000_000,
tcpConnectTimeout: 35_000_000,
tcpTimeout: 20_000_000,
tcpTimeoutPerKb: 15_000,
rcvConcurrency: 8,
+1 -3
View File
@@ -41,7 +41,7 @@ let GROUP_DEFAULT_STORE_DB_PASSPHRASE = "storeDBPassphrase"
public let GROUP_DEFAULT_INITIAL_RANDOM_DB_PASSPHRASE = "initialRandomDBPassphrase"
public let GROUP_DEFAULT_CONFIRM_DB_UPGRADES = "confirmDBUpgrades"
public let GROUP_DEFAULT_CALL_KIT_ENABLED = "callKitEnabled"
public let GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED = "pqExperimentalEnabled"
public let GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED = "pqExperimentalEnabled" // no longer used
public let APP_GROUP_NAME = "group.chat.simplex.app"
@@ -199,8 +199,6 @@ public let confirmDBUpgradesGroupDefault = BoolDefault(defaults: groupDefaults,
public let callKitEnabledGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_CALL_KIT_ENABLED)
public let pqExperimentalEnabledDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED)
public class DateDefault {
var defaults: UserDefaults
var key: String
+1 -1
View File
@@ -3461,7 +3461,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleX групов линк";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleX линкове";
/* No comment provided by engineer. */
+1 -1
View File
@@ -2903,7 +2903,7 @@
/* simplex link type */
"SimpleX group link" = "Skupinový odkaz SimpleX";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "Odkazy na SimpleX";
/* No comment provided by engineer. */
+2 -2
View File
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleX Gruppen-Link";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleX-Links";
/* No comment provided by engineer. */
@@ -3948,7 +3948,7 @@
"Use iOS call interface" = "iOS Anrufschnittstelle nutzen";
/* No comment provided by engineer. */
"Use new incognito profile" = "Nutzen Sie das neue Inkognito-Profil";
"Use new incognito profile" = "Ein neues Inkognito-Profil nutzen";
/* No comment provided by engineer. */
"Use only local notifications?" = "Nur lokale Benachrichtigungen nutzen?";
+69 -69
View File
@@ -86,7 +86,7 @@
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Más privado**: no se usa el servidor de notificaciones de SimpleX Chat, los mensajes se comprueban periódicamente en segundo plano (dependiendo de la frecuencia con la que utilices la aplicación).";
/* 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." = "**Tenga en cuenta**: usar la misma base de datos en dos dispositivos interrumpirá el descifrado de mensajes de sus conexiones, como protección de seguridad.";
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Recuarda**: usar la misma base de datos en dos dispositivos hará que falle el descifrado de mensajes como protección de seguridad.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Atención**: NO podrás recuperar o cambiar la contraseña si la pierdes.";
@@ -143,7 +143,7 @@
"%@ connected" = "%@ conectado";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ downloaded";
"%@ downloaded" = "%@ descargado";
/* notification title */
"%@ is connected!" = "%@ ¡está conectado!";
@@ -158,7 +158,7 @@
"%@ servers" = "Servidores %@";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ cargado";
"%@ uploaded" = "%@ subido";
/* notification title */
"%@ wants to connect!" = "¡ %@ quiere contactar!";
@@ -390,7 +390,7 @@
"admin" = "administrador";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Los admins pueden bloquear un miembro por todos.";
"Admins can block a member for all." = "Los administradores pueden bloquear a un miembro para los demás.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Los administradores pueden crear enlaces para unirse a grupos.";
@@ -432,7 +432,7 @@
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Todos tus contactos permanecerán conectados. La actualización del perfil se enviará a tus contactos.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Todos sus contactos, conversaciones y archivos se cifrarán de forma segura y se subirán en fragmentos hacia puntos XFTP configurados.";
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Todos tus contactos, conversaciones y archivos serán cifrados, divididos y subidos de forma segura a los servidores XFTP configurados.";
/* No comment provided by engineer. */
"Allow" = "Se permite";
@@ -516,7 +516,7 @@
"App build: %@" = "Compilación app: %@";
/* No comment provided by engineer. */
"App data migration" = "Migración de datos de la aplicación";
"App data migration" = "Migrar datos de la aplicación";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Cifrado de los nuevos archivos locales (excepto vídeos).";
@@ -543,7 +543,7 @@
"Apply" = "Aplicar";
/* No comment provided by engineer. */
"Archive and upload" = "Archivar y transferir";
"Archive and upload" = "Archivar y subir";
/* No comment provided by engineer. */
"Archiving database" = "Archivando base de datos";
@@ -636,13 +636,13 @@
"blocked" = "bloqueado";
/* rcv group event chat item */
"blocked %@" = "%@ bloqueado";
"blocked %@" = "ha bloqueado a %@";
/* marked deleted chat item preview text */
"blocked by admin" = "bloqueado por el administrador";
"blocked by admin" = "bloqueado por administrador";
/* No comment provided by engineer. */
"Blocked by admin" = "Bloqueado por el administrador";
"Blocked by admin" = "Bloqueado por administrador";
/* No comment provided by engineer. */
"bold" = "negrita";
@@ -772,13 +772,13 @@
"Chat is running" = "Chat está en ejecución";
/* No comment provided by engineer. */
"Chat is stopped" = "Chat está detenido";
"Chat is stopped" = "Chat está parado";
/* 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." = "Chat está detenido. Si estás usando esta base de datos en otro dispositivo, deberías transferirla de vuelta antes de iniciarlo.";
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Chat parado. Si has usado esta base de datos en otro dispositivo, debes transferirla de vuelta antes de iniciar Chat.";
/* No comment provided by engineer. */
"Chat migrated!" = "Chat transferido !";
"Chat migrated!" = "¡Chat migrado!";
/* No comment provided by engineer. */
"Chat preferences" = "Preferencias de Chat";
@@ -793,7 +793,7 @@
"Chinese and Spanish interface" = "Interfaz en chino y español";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Elija _Migrar desde otro dispositivo_ en el nuevo dispositivo y escanee el código QR.";
"Choose _Migrate from another device_ on the new device and scan QR code." = "En el nuevo dispositivo selecciona _Migrar desde otro dispositivo_ y escanéa el código QR.";
/* No comment provided by engineer. */
"Choose file" = "Elije archivo";
@@ -841,7 +841,7 @@
"Confirm database upgrades" = "Confirmar actualizaciones de la bases de datos";
/* No comment provided by engineer. */
"Confirm network settings" = "Confirmar los ajustes de red";
"Confirm network settings" = "Confirmar configuración de red";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Confirme nueva contraseña…";
@@ -853,7 +853,7 @@
"Confirm password" = "Confirmar contraseña";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Confirme que recuerda la frase secreta de la base de datos para migrarla.";
"Confirm that you remember database passphrase to migrate it." = "Confirma que recuerdas la frase de contraseña de la base de datos para migrarla.";
/* No comment provided by engineer. */
"Confirm upload" = "Confirmar subida";
@@ -1057,7 +1057,7 @@
"Created on %@" = "Creado en %@";
/* No comment provided by engineer. */
"Creating archive link" = "Creando enlace de archivo";
"Creating archive link" = "Creando enlace al archivo";
/* No comment provided by engineer. */
"Creating link…" = "Creando enlace…";
@@ -1189,7 +1189,7 @@
"Delete chat profile" = "Eliminar perfil";
/* No comment provided by engineer. */
"Delete chat profile?" = "¿Eliminar el perfil?";
"Delete chat profile?" = "¿Eliminar perfil?";
/* No comment provided by engineer. */
"Delete connection" = "Eliminar conexión";
@@ -1402,7 +1402,7 @@
"Downgrade and open chat" = "Degradar y abrir Chat";
/* No comment provided by engineer. */
"Download failed" = "Error en la descarga";
"Download failed" = "Descarga fallida";
/* server test step */
"Download file" = "Descargar archivo";
@@ -1447,7 +1447,7 @@
"Enable for all" = "Activar para todos";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Activar en chats directos (BETA)!";
"Enable in direct chats (BETA)!" = "¡Activar en chats directos (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "¿Activar notificación instantánea?";
@@ -1564,7 +1564,7 @@
"Enter Passcode" = "Introduce Código";
/* No comment provided by engineer. */
"Enter passphrase" = "Introducir frase de contraseña";
"Enter passphrase" = "Introduce la frase de contraseña";
/* No comment provided by engineer. */
"Enter passphrase…" = "Introduce la contraseña…";
@@ -1735,7 +1735,7 @@
"Error starting chat" = "Error al iniciar Chat";
/* No comment provided by engineer. */
"Error stopping chat" = "Error al detener Chat";
"Error stopping chat" = "Error al parar Chat";
/* No comment provided by engineer. */
"Error switching profile!" = "¡Error al cambiar perfil!";
@@ -1816,10 +1816,10 @@
"File will be deleted from servers." = "El archivo será eliminado de los servidores.";
/* No comment provided by engineer. */
"File will be received when your contact completes uploading it." = "El archivo se recibirá cuando tu contacto termine de subirlo.";
"File will be received when your contact completes uploading it." = "El archivo se recibirá cuando el contacto termine de subirlo.";
/* No comment provided by engineer. */
"File will be received when your contact is online, please wait or check later!" = "El archivo se recibirá cuando tu contacto esté en línea, ¡por favor espera o compruébalo más tarde!";
"File will be received when your contact is online, please wait or check later!" = "El archivo se recibirá cuando el contacto esté en línea, ¡por favor espera o compruébalo más tarde!";
/* No comment provided by engineer. */
"File: %@" = "Archivo: %@";
@@ -1831,7 +1831,7 @@
"Files and media" = "Archivos y multimedia";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "No se permiten archivos y multimedia en este grupo.";
"Files and media are prohibited in this group." = "Los archivos y multimedia no están permitidos en este grupo.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "¡Archivos y multimedia no permitidos!";
@@ -1840,7 +1840,7 @@
"Filter unread and favorite chats." = "Filtra chats no leídos y favoritos.";
/* No comment provided by engineer. */
"Finalize migration" = "Finalizar la migración";
"Finalize migration" = "Finalizar migración";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Finalizar la migración en otro dispositivo.";
@@ -2029,7 +2029,7 @@
"How to use your servers" = "Cómo usar los servidores";
/* No comment provided by engineer. */
"Hungarian interface" = "Interfaz húngara";
"Hungarian interface" = "Interfaz en húngaro";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "Servidores ICE (uno por línea)";
@@ -2050,10 +2050,10 @@
"Ignore" = "Ignorar";
/* No comment provided by engineer. */
"Image will be received when your contact completes uploading it." = "La imagen se recibirá cuando tu contacto termine de subirla.";
"Image will be received when your contact completes uploading it." = "La imagen se recibirá cuando el contacto termine de subirla.";
/* No comment provided by engineer. */
"Image will be received when your contact is online, please wait or check later!" = "La imagen se recibirá cuando tu contacto esté en línea, ¡por favor espera o compruébalo más tarde!";
"Image will be received when your contact is online, please wait or check later!" = "La imagen se recibirá cuando el contacto esté en línea, ¡por favor espera o compruébalo más tarde!";
/* No comment provided by engineer. */
"Immediately" = "Inmediatamente";
@@ -2086,7 +2086,7 @@
"Improved server configuration" = "Configuración del servidor mejorada";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Para continuar, el chat debe ser interrumpido.";
"In order to continue, chat should be stopped." = "Para continuar, Chat debe estar parado.";
/* No comment provided by engineer. */
"In reply to" = "En respuesta a";
@@ -2173,7 +2173,7 @@
"Invalid link" = "Enlace no válido";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Confirmación de migración inválida";
"Invalid migration confirmation" = "Confirmación de migración no válida";
/* No comment provided by engineer. */
"Invalid name!" = "¡Nombre no válido!";
@@ -2239,7 +2239,7 @@
"It can happen when you or your connection used the old database backup." = "Puede ocurrir cuando tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Esto puede suceder cuando:\n1. Los mensajes caducan en el cliente saliente tras 2 días o en el servidor tras 30 días.\n2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.\n3. La conexión ha sido comprometida.";
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Esto puede suceder cuando:\n1. Los mensajes caducan tras 2 días en el cliente saliente o tras 30 días en el servidor.\n2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.\n3. La conexión ha sido comprometida.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Parece que ya estás conectado mediante este enlace. Si no es así ha habido un error (%@).";
@@ -2440,7 +2440,7 @@
"Message text" = "Contacto y texto";
/* No comment provided by engineer. */
"Message too large" = "Mensaje demasiado grande";
"Message too large" = "Mensaje demasiado largo";
/* No comment provided by engineer. */
"Messages" = "Mensajes";
@@ -2452,10 +2452,10 @@
"Messages from %@ will be shown!" = "¡Los mensajes de %@ serán mostrados!";
/* 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." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques.";
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos mediante **cifrado de extremo a extremo** con secreto perfecto hacía adelante, repudio y recuperación tras ataque.";
/* 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." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques.";
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos mediante **cifrado de extremo a extremo resistente a tecnología cuántica** con secreto perfecto hacía adelante, repudio y recuperación tras ataque.";
/* No comment provided by engineer. */
"Migrate device" = "Migrar dispositivo";
@@ -2467,10 +2467,10 @@
"Migrate here" = "Migrar aquí";
/* No comment provided by engineer. */
"Migrate to another device" = "Migrar hacia otro dispositivo";
"Migrate to another device" = "Migrar a otro dispositivo";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Migrar hacia otro dispositivo mediante código QR.";
"Migrate to another device via QR code." = "Migrar a otro dispositivo mediante código QR.";
/* No comment provided by engineer. */
"Migrating" = "Migrando";
@@ -2739,7 +2739,7 @@
"Open group" = "Grupo abierto";
/* authentication reason */
"Open migration to another device" = "Abrir la migración hacia otro dispositivo";
"Open migration to another device" = "Abrir menú migración a otro dispositivo";
/* No comment provided by engineer. */
"Open Settings" = "Abrir Configuración";
@@ -2760,7 +2760,7 @@
"Or scan QR code" = "O escanear código QR";
/* No comment provided by engineer. */
"Or securely share this file link" = "O comparta de forma segura el enlace de este archivo";
"Or securely share this file link" = "O comparte de forma segura este enlace al archivo";
/* No comment provided by engineer. */
"Or show this code" = "O mostrar este código";
@@ -2835,7 +2835,7 @@
"Please check yours and your contact preferences." = "Comprueba tus preferencias y las de tu contacto.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Por favor confirme que la configuración de red es correcta para este dispositivo.";
"Please confirm that network settings are correct for this device." = "Por favor, confirma que la configuración de red es correcta para este dispositivo.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Por favor, contacta con los desarrolladores.\nError: %@";
@@ -2871,7 +2871,7 @@
"Possibly, certificate fingerprint in server address is incorrect" = "Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "E2EE postcuántica";
"Post-quantum E2EE" = "E2EE post cuántica";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Conserva el último borrador del mensaje con los datos adjuntos.";
@@ -2898,7 +2898,7 @@
"Private notes" = "Notas privadas";
/* No comment provided by engineer. */
"Profile and server connections" = "Perfil y conexiones de servidor";
"Profile and server connections" = "Datos del perfil y conexiones";
/* No comment provided by engineer. */
"Profile image" = "Imagen del perfil";
@@ -2958,10 +2958,10 @@
"Push server" = "Servidor push";
/* chat item text */
"quantum resistant e2e encryption" = "cifrado e2e resistente a la cuántica";
"quantum resistant e2e encryption" = "cifrado e2e resistente a tecnología cuántica";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Cifrado resistente a la tecnología cuántica";
"Quantum resistant encryption" = "Cifrado resistente a tecnología cuántica";
/* No comment provided by engineer. */
"Rate the app" = "Valora la aplicación";
@@ -3108,7 +3108,7 @@
"Repeat join request?" = "¿Repetir solicitud de admisión?";
/* No comment provided by engineer. */
"Repeat upload" = "Repetir la carga";
"Repeat upload" = "Repetir subida";
/* chat item action */
"Reply" = "Responder";
@@ -3288,7 +3288,7 @@
"Send" = "Enviar";
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Envía un mensaje en vivo: se actualizará para el(los) destinatario(s) a medida que se escribe";
"Send a live message - it will update for the recipient(s) as you type it" = "Envía un mensaje en vivo: se actualizará para el (los) destinatario(s) a medida que se escribe";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Enviar confirmaciones de entrega a";
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "Enlace de grupo SimpleX";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "Enlaces SimpleX";
/* No comment provided by engineer. */
@@ -3537,19 +3537,19 @@
"starting…" = "inicializando…";
/* No comment provided by engineer. */
"Stop" = "Detener";
"Stop" = "Parar";
/* No comment provided by engineer. */
"Stop chat" = "Detener el chat";
"Stop chat" = "Parar chat";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Detén SimpleX para habilitar las acciones sobre la base de datos";
"Stop chat to enable database actions" = "Para habilitar las acciones sobre la base de datos, debes parar Chat";
/* No comment provided by engineer. */
"Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped." = "Para poder exportar, importar o eliminar la base de datos primero debes detener Chat. Durante el tiempo que esté detenido no podrás recibir ni enviar mensajes.";
"Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped." = "Para poder exportar, importar o eliminar la base de datos primero debes parar Chat. Mientras tanto no podrás recibir ni enviar mensajes.";
/* No comment provided by engineer. */
"Stop chat?" = "¿Detener Chat?";
"Stop chat?" = "¿Parar Chat?";
/* cancel file action */
"Stop file" = "Detener archivo";
@@ -3567,10 +3567,10 @@
"Stop sharing address?" = "¿Dejar de compartir la dirección?";
/* authentication reason */
"Stop SimpleX" = "Detener SimpleX";
"Stop SimpleX" = "Parar SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Detención del chat";
"Stopping chat" = "Parando chat";
/* No comment provided by engineer. */
"strike" = "tachado";
@@ -3651,7 +3651,7 @@
"The 1st platform without any user identifiers private by design." = "La primera plataforma sin identificadores de usuario: diseñada para la privacidad.";
/* 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: abre la configuración para habilitar.";
"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 attempt to change database passphrase was not completed." = "El intento de cambiar la contraseña de la base de datos no se ha completado.";
@@ -3717,7 +3717,7 @@
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Esta acción es irreversible. Se eliminarán todos los archivos y multimedia recibidos y enviados. Las imágenes de baja resolución permanecerán.";
/* No comment provided by engineer. */
"This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes." = "Esta acción es irreversible. Se eliminarán los mensajes enviados y recibidos anteriores a la selección. Puede tardar varios minutos.";
"This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes." = "Esta acción es irreversible. Se eliminarán los mensajes enviados y recibidos anteriores a la selección. Podría tardar varios minutos.";
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Esta acción es irreversible. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente.";
@@ -3726,7 +3726,7 @@
"This chat is protected by end-to-end encryption." = "Este chat está protegido por cifrado de extremo a extremo.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas.";
"This chat is protected by quantum resistant end-to-end encryption." = "Este chat está protegido por cifrado de extremo a extremo resistente a tecnología cuántica.";
/* notification title */
"this contact" = "este contacto";
@@ -3825,7 +3825,7 @@
"Unblock member?" = "¿Desbloquear miembro?";
/* rcv group event chat item */
"unblocked %@" = "%@ desbloqueado";
"unblocked %@" = "ha desbloqueado a %@";
/* item status description */
"Unexpected error: %@" = "Error inesperado: %@";
@@ -3921,13 +3921,13 @@
"Upgrade and open chat" = "Actualizar y abrir Chat";
/* No comment provided by engineer. */
"Upload failed" = "Error de carga";
"Upload failed" = "Error de subida";
/* server test step */
"Upload file" = "Subir archivo";
/* No comment provided by engineer. */
"Uploading archive" = "Subiendo el archivo";
"Uploading archive" = "Subiendo archivo";
/* No comment provided by engineer. */
"Use .onion hosts" = "Usar hosts .onion";
@@ -3960,7 +3960,7 @@
"Use SimpleX Chat servers?" = "¿Usar servidores SimpleX Chat?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Usar la app durante la llamada.";
"Use the app while in the call." = "Usar la aplicación durante la llamada.";
/* No comment provided by engineer. */
"User profile" = "Perfil de usuario";
@@ -4023,10 +4023,10 @@
"video call (not e2e encrypted)" = "videollamada (sin cifrar)";
/* No comment provided by engineer. */
"Video will be received when your contact completes uploading it." = "El video se recibirá cuando tu contacto termine de subirlo.";
"Video will be received when your contact completes uploading it." = "El video se recibirá cuando el contacto termine de subirlo.";
/* No comment provided by engineer. */
"Video will be received when your contact is online, please wait or check later!" = "El vídeo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.";
"Video will be received when your contact is online, please wait or check later!" = "El vídeo se recibirá cuando el contacto esté en línea, por favor espera o compruébalo más tarde.";
/* No comment provided by engineer. */
"Videos and files up to 1gb" = "Vídeos y archivos de hasta 1Gb";
@@ -4074,7 +4074,7 @@
"wants to connect to you!" = "¡quiere contactar contigo!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes";
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Atención: el inicio del chat en varios dispositivos es incompatible y provocará fallos en la entrega de mensajes";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Atención: ¡puedes perder algunos datos!";
@@ -4092,7 +4092,7 @@
"Welcome message" = "Mensaje de bienvenida";
/* No comment provided by engineer. */
"Welcome message is too long" = "El mensaje de bienvenida es demasiado largo";
"Welcome message is too long" = "Mensaje de bienvenida demasiado largo";
/* No comment provided by engineer. */
"What's new" = "Novedades";
@@ -4131,7 +4131,7 @@
"You" = "Tú";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "**No debe** usar la misma base de datos en dos dispositivos.";
"You **must not** use the same database on two devices." = "**No debes** usar la misma base de datos en dos dispositivos.";
/* No comment provided by engineer. */
"You accepted connection" = "Has aceptado la conexión";
@@ -4194,7 +4194,7 @@
"You can enable them later via app Privacy & Security settings." = "Puedes activarlos más tarde en la configuración de Privacidad y Seguridad.";
/* No comment provided by engineer. */
"You can give another try." = "Puede intentarlo de nuevo.";
"You can give another try." = "Puedes intentarlo de nuevo.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Puedes ocultar o silenciar un perfil deslizándolo a la derecha.";
@@ -4308,7 +4308,7 @@
"You will be connected when your connection request is accepted, please wait or check later!" = "Te conectarás cuando tu solicitud se acepte, por favor espera o compruébalo más tarde.";
/* No comment provided by engineer. */
"You will be connected when your contact's device is online, please wait or check later!" = "Te conectarás cuando el dispositivo de tu contacto esté en línea, por favor espera o compruébalo más tarde.";
"You will be connected when your contact's device is online, please wait or check later!" = "Te conectarás cuando el dispositivo del contacto esté en línea, por favor espera o compruébalo más tarde.";
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Se te pedirá identificarte cuándo inicies o continues usando la aplicación tras 30 segundos en segundo plano.";
@@ -4350,7 +4350,7 @@
"Your chat profiles" = "Mis perfiles";
/* 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)." = "Tu contacto debe estar en línea para que se complete la conexión.\nPuedes cancelar esta conexión y eliminar el contacto (e intentarlo más tarde con un enlace nuevo).";
"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)." = "El contacto debe estar en línea para completar la conexión.\nPuedes cancelarla y eliminar el contacto (e intentarlo más tarde con un enlace nuevo).";
/* No comment provided by engineer. */
"Your contact sent a file that is larger than currently supported maximum size (%@)." = "El contacto ha enviado un archivo mayor al máximo admitido (%@).";
+1 -1
View File
@@ -2867,7 +2867,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleX-ryhmän linkki";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleX-linkit";
/* No comment provided by engineer. */
+1 -1
View File
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "Lien de groupe SimpleX";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "Liens SimpleX";
/* No comment provided by engineer. */
+2 -2
View File
@@ -140,7 +140,7 @@
"%@ at %@:" = "%1$@ alle %2$@:";
/* No comment provided by engineer. */
"%@ connected" = "%@ si è connesso/a";
"%@ connected" = "%@ connesso/a";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ scaricati";
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "Link gruppo SimpleX";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "Link di SimpleX";
/* No comment provided by engineer. */
+37 -1
View File
@@ -40,6 +40,12 @@
/* No comment provided by engineer. */
"(" = "(";
/* No comment provided by engineer. */
"(new)" = "(新規)";
/* No comment provided by engineer. */
"(this device v%@)" = "(このデバイス v%@)";
/* No comment provided by engineer. */
")" = ")";
@@ -52,9 +58,15 @@
/* No comment provided by engineer. */
"[Star on GitHub](https://github.com/simplex-chat/simplex-chat)" = "[GitHub でスターを付ける](https://github.com/simplex-chat/simplex-chat)";
/* No comment provided by engineer. */
"**Add contact**: to create a new invitation link, or connect via a link you received." = "**コンタクトの追加**: 新しい招待リンクを作成するか、受け取ったリンクから接続します。";
/* No comment provided by engineer. */
"**Add new contact**: to create your one-time QR Code for your contact." = "**新しい連絡先を追加**: 連絡先のワンタイム QR コードまたはリンクを作成します。";
/* No comment provided by engineer. */
"**Create group**: to create a new group." = "**グループ作成**: 新しいグループを作成する。";
/* No comment provided by engineer. */
"**e2e encrypted** audio call" = "**e2e 暗号化**音声通話";
@@ -67,6 +79,9 @@
/* 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)." = "**最もプライベート**: SimpleX Chat 通知サーバーを使用せず、バックグラウンドで定期的にメッセージをチェックします (アプリの使用頻度によって異なります)。";
/* 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." = "**注意**: 2つの端末で同じデータベースを使用すると、セキュリティ保護として、あなたが接続しているメッセージの復号化が解除されます。";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**注意**: パスフレーズを紛失すると、パスフレーズを復元または変更できなくなります。";
@@ -76,6 +91,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**警告**: 即時の プッシュ通知には、キーチェーンに保存されたパスフレーズが必要です。";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**警告**: アーカイブデータは削除されます。";
/* No comment provided by engineer. */
"*bold*" = "\\*太字*";
@@ -118,6 +136,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ 接続中";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ ダウンロード済";
/* notification title */
"%@ is connected!" = "%@ 接続中!";
@@ -130,9 +151,15 @@
/* No comment provided by engineer. */
"%@ servers" = "%@ サーバー";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ アップロード済";
/* notification title */
"%@ wants to connect!" = "%@ が接続を希望しています!";
/* No comment provided by engineer. */
"%@, %@ and %lld members" = "%@や%@など%lld人のメンバー";
/* No comment provided by engineer. */
"%@, %@ and %lld other members connected" = "%@, %@ および %lld 人のメンバーが接続中";
@@ -172,9 +199,18 @@
/* No comment provided by engineer. */
"%lld file(s) with total size of %@" = "%lld 個のファイル(合計サイズ: %@)";
/* No comment provided by engineer. */
"%lld group events" = "%lld件のグループイベント";
/* No comment provided by engineer. */
"%lld members" = "%lld 人のメンバー";
/* No comment provided by engineer. */
"%lld messages blocked" = "%lld件のメッセージをブロック";
/* No comment provided by engineer. */
"%lld messages blocked by admin" = "%lldのメッセージが管理者によりブロック済";
/* No comment provided by engineer. */
"%lld messages marked deleted" = "%lld 件のメッセージが削除されました";
@@ -2867,7 +2903,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleXグループリンク";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleXリンク";
/* No comment provided by engineer. */
+1 -1
View File
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleX groep link";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleX links";
/* No comment provided by engineer. */
+13 -13
View File
@@ -38,7 +38,7 @@
": " = ": ";
/* No comment provided by engineer. */
"!1 colored!" = "!1 kolorowy!";
"!1 colored!" = "!1 pokolorowany!";
/* No comment provided by engineer. */
"." = ".";
@@ -80,22 +80,22 @@
"**e2e encrypted** video call" = "**szyfrowane e2e** połączenie wideo";
/* No comment provided by engineer. */
"**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." = "**Bardziej prywatny**: sprawdzanie nowych wiadomości co 20 minut. Token urządzenia jest współdzielony z serwerem SimpleX Chat, ale nie informacje o liczbie kontaktów lub wiadomości.";
"**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." = "**Bardziej prywatny**: sprawdzanie nowych wiadomości odbywa się co 20 minut. Współdzielony z serwerem SimpleX Chat jest token urządzenia, lecz nie informacje o liczbie kontaktów lub wiadomości.";
/* 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)." = "**Najbardziej prywatny**: nie korzystaj z serwera powiadomień SimpleX Chat, sprawdzaj wiadomości okresowo w tle (zależy jak często korzystasz z aplikacji).";
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Najbardziej prywatny**: nie korzystaj z serwera powiadomień SimpleX Chat, wiadomości sprawdzane są co jakiś czas w tle (zależne od tego jak często korzystasz z aplikacji).";
/* 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." = "*Uwaga*: używanie tej samej bazy danych na dwóch urządzeniach zepsuje odszyfrowywanie wiadomości twoich połączeń, jako zabezpieczenie.";
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "*Uwaga*: w celach bezpieczeństwa użycie tej samej bazy danych na dwóch różnych urządzeniach spowoduje brak możliwości odszyfrowywania wiadomości z Twoich połączeń.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Uwaga**: NIE będziesz w stanie odzyskać lub zmienić hasła, jeśli je stracisz.";
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Uwaga**: NIE będziesz w stanie odzyskać lub zmienić kodu dostępu, jeśli go stracisz.";
/* 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." = "**Zalecane**: token urządzenia i powiadomienia są wysyłane do serwera powiadomień SimpleX Chat, ale nie treść wiadomości, rozmiar lub od kogo jest.";
"**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." = "**Zalecane**: do serwera powiadomień SimpleX Chat wysyłany jest token urządzenia i powiadomienia, lecz nie treść wiadomości, jej rozmiar lub od kogo ona jest.";
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Uwaga**: Natychmiastowe powiadomienia push wymagają hasła zapisanego w Keychain.";
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Uwaga**: Natychmiastowe powiadomienia push wymagają zapisania kodu dostępu w Keychain.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Ostrzeżenie**: archiwum zostanie usunięte.";
@@ -2844,10 +2844,10 @@
"Please contact group admin." = "Skontaktuj się z administratorem grupy.";
/* No comment provided by engineer. */
"Please enter correct current passphrase." = "Wprowadź poprawne aktualne hasło.";
"Please enter correct current passphrase." = "Wprowadź poprawny obecny kod dostępu.";
/* No comment provided by engineer. */
"Please enter the previous password after restoring database backup. This action can not be undone." = "Proszę podać poprzednie hasło po przywróceniu kopii zapasowej bazy danych. Tej czynności nie można cofnąć.";
"Please enter the previous password after restoring database backup. This action can not be undone." = "Proszę podać poprzedni kod dostępu po przywróceniu kopii zapasowej bazy danych. Tej czynności nie można cofnąć.";
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Prosimy o jego zapamiętanie lub bezpieczne przechowywanie - nie ma możliwości odzyskania utraconego pinu!";
@@ -2859,10 +2859,10 @@
"Please restart the app and migrate the database to enable push notifications." = "Uruchom ponownie aplikację i przeprowadź migrację bazy danych, aby włączyć powiadomienia push.";
/* No comment provided by engineer. */
"Please store passphrase securely, you will NOT be able to access chat if you lose it." = "Prosimy o bezpieczne przechowywanie hasła, w przypadku jego utraty NIE będzie można uzyskać dostępu do czatu.";
"Please store passphrase securely, you will NOT be able to access chat if you lose it." = "Przechowuj kod dostępu w bezpieczny sposób, w przypadku jego utraty NIE będzie można uzyskać dostępu do czatu.";
/* No comment provided by engineer. */
"Please store passphrase securely, you will NOT be able to change it if you lose it." = "Prosimy o bezpieczne przechowywanie hasła, w przypadku jego utraty NIE będzie można go zmienić.";
"Please store passphrase securely, you will NOT be able to change it if you lose it." = "Przechowuj kod dostępu w bezpieczny sposób, w przypadku jego utraty NIE będzie można go zmienić.";
/* No comment provided by engineer. */
"Polish interface" = "Polski interfejs";
@@ -2871,7 +2871,7 @@
"Possibly, certificate fingerprint in server address is incorrect" = "Możliwe, że odcisk palca certyfikatu w adresie serwera jest nieprawidłowy";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "Postkwantowe E2EE";
"Post-quantum E2EE" = "Postkwantowe szyfrowanie E2E";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Zachowaj ostatnią wersję roboczą wiadomości wraz z załącznikami.";
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "Link grupy SimpleX";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "Linki SimpleX";
/* No comment provided by engineer. */
+1 -1
View File
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleX ссылка группы";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleX ссылки";
/* No comment provided by engineer. */
+1 -1
View File
@@ -2789,7 +2789,7 @@
/* simplex link type */
"SimpleX group link" = "ลิงค์กลุ่ม SimpleX";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "ลิงก์ SimpleX";
/* No comment provided by engineer. */
+1 -1
View File
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleX grup bağlantısı";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleX bağlantıları";
/* No comment provided by engineer. */
+1 -1
View File
@@ -3482,7 +3482,7 @@
/* simplex link type */
"SimpleX group link" = "Посилання на групу SimpleX";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "Посилання SimpleX";
/* No comment provided by engineer. */
+1 -1
View File
@@ -3185,7 +3185,7 @@
/* simplex link type */
"SimpleX group link" = "SimpleX 群组链接";
/* No comment provided by engineer. */
/* chat feature */
"SimpleX links" = "SimpleX 链接";
/* No comment provided by engineer. */
@@ -94,6 +94,7 @@ android {
"it",
"iw",
"ja",
"lt",
"nl",
"pl",
"pt-rBR",
@@ -67,10 +67,13 @@ actual fun getKeyboardState(): State<KeyboardState> {
return keyboardState
}
actual fun hideKeyboard(view: Any?) {
actual fun hideKeyboard(view: Any?, clearFocus: Boolean) {
// LALAL
// LocalSoftwareKeyboardController.current?.hide()
if (view is View) {
if (clearFocus) {
view.clearFocus()
}
(androidAppContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view.windowToken, 0)
}
}
@@ -18,7 +18,7 @@ interface CallAudioDeviceManagerInterface {
fun start()
fun stop()
// AudioDeviceInfo.AudioDeviceType
fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyNonEarpiece: Boolean)
fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyExternal: Boolean)
// AudioDeviceInfo.AudioDeviceType
fun selectDevice(id: Int)
@@ -64,6 +64,7 @@ class PostSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
}
override fun start() {
am.mode = AudioManager.MODE_IN_COMMUNICATION
am.registerAudioDeviceCallback(audioCallback, null)
am.addOnCommunicationDeviceChangedListener(Executors.newSingleThreadExecutor(), listener)
}
@@ -73,32 +74,30 @@ class PostSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
am.removeOnCommunicationDeviceChangedListener(listener)
}
override fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyNonEarpiece: Boolean) {
override fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyExternal: Boolean) {
Log.d(TAG, "selectLastExternalDeviceOrDefault: set audio mode, speaker enabled: $speaker")
am.mode = AudioManager.MODE_IN_COMMUNICATION
val commDevice = am.communicationDevice
if (keepAnyNonEarpiece && commDevice != null && commDevice.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) {
// some external device or speaker selected already, no need to change it
if (keepAnyExternal && commDevice != null && commDevice.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE && commDevice.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
// some external device selected already, no need to change it
return
}
val preferredSecondaryDevice = if (speaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val externalDevice = devices.value.lastOrNull { it.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER && it.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE }
val preferredInternalDevice = if (speaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val externalDevice = devices.value.lastOrNull { it.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE && it.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER }
// External device already selected
if (externalDevice != null && externalDevice.type == am.communicationDevice?.type) {
return
}
if (externalDevice != null) {
am.setCommunicationDevice(externalDevice)
} else if (am.communicationDevice?.type != preferredSecondaryDevice) {
am.availableCommunicationDevices.firstOrNull { it.type == preferredSecondaryDevice }?.let {
} else if (am.communicationDevice?.type != preferredInternalDevice) {
am.availableCommunicationDevices.firstOrNull { it.type == preferredInternalDevice }?.let {
am.setCommunicationDevice(it)
}
}
}
override fun selectDevice(id: Int) {
am.mode = AudioManager.MODE_IN_COMMUNICATION
val device = devices.value.lastOrNull { it.id == id }
if (device != null && am.communicationDevice?.id != id ) {
am.setCommunicationDevice(device)
@@ -115,58 +114,50 @@ class PreSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Added audio devices: ${addedDevices.map { it.type }}")
super.onAudioDevicesAdded(addedDevices)
val wasSize = devices.value.size
devices.value += addedDevices.filter { it.hasSupportedType() }
val addedCount = devices.value.size - wasSize
//if (addedCount > 0 && chatModel.activeCall.value?.callState == CallState.Connected) {
// Setting params in Connected state makes sure that Bluetooth will NOT be broken on Android < 12
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.supportsVideo() == true, false)
//}
devices.value = am.getDevices(AudioManager.GET_DEVICES_OUTPUTS).filter { it.hasSupportedType() }.excludeSameType().excludeEarpieceIfWired()
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.supportsVideo() == true, false)
}
override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Removed audio devices: ${removedDevices.map { it.type }}")
super.onAudioDevicesRemoved(removedDevices)
val wasSize = devices.value.size
devices.value = devices.value.filterNot { removedDevices.any { rm -> rm.id == it.id } }
//val removedCount = wasSize - devices.value.size
//if (devices.value.count { it.hasSupportedType() } == 2 && chatModel.activeCall.value?.callState == CallState.Connected) {
// Setting params in Connected state makes sure that Bluetooth will NOT be broken on Android < 12
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.supportsVideo() == true, true)
//}
devices.value = am.getDevices(AudioManager.GET_DEVICES_OUTPUTS).filter { it.hasSupportedType() }.excludeSameType().excludeEarpieceIfWired()
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.supportsVideo() == true, true)
}
}
override fun start() {
am.mode = AudioManager.MODE_IN_COMMUNICATION
am.registerAudioDeviceCallback(audioCallback, null)
}
override fun stop() {
am.unregisterAudioDeviceCallback(audioCallback)
am.stopBluetoothSco()
}
override fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyNonEarpiece: Boolean) {
override fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyExternal: Boolean) {
Log.d(TAG, "selectLastExternalDeviceOrDefault: set audio mode, speaker enabled: $speaker")
val preferredSecondaryDevice = if (speaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val externalDevice = devices.value.lastOrNull { it.hasSupportedType() && it.isSource && it.isSink && it.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER && it.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE }
val preferredInternalDevice = if (speaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val externalDevice = devices.value.lastOrNull { it.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE && it.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER }
if (externalDevice != null) {
selectDevice(externalDevice.id)
} else {
am.stopBluetoothSco()
am.isWiredHeadsetOn = false
am.isSpeakerphoneOn = preferredSecondaryDevice == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
am.isSpeakerphoneOn = preferredInternalDevice == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
am.isBluetoothScoOn = false
val newCurrentDevice = devices.value.firstOrNull { it.type == preferredSecondaryDevice }
val newCurrentDevice = devices.value.firstOrNull { it.type == preferredInternalDevice }
adaptToCurrentlyActiveDevice(newCurrentDevice)
}
}
override fun selectDevice(id: Int) {
val device = devices.value.lastOrNull { it.id == id }
val isExternalDevice = device != null && device.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER && device.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val isExternalDevice = device != null && device.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE && device.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
if (isExternalDevice) {
am.isSpeakerphoneOn = false
if (device?.type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES) {
if (device?.type == AudioDeviceInfo.TYPE_WIRED_HEADSET || device?.type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES) {
am.isWiredHeadsetOn = true
am.stopBluetoothSco()
am.isBluetoothScoOn = false
@@ -194,11 +185,18 @@ class PreSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER -> true
AudioDeviceInfo.TYPE_BLUETOOTH_SCO -> true
AudioDeviceInfo.TYPE_BLE_HEADSET -> true
AudioDeviceInfo.TYPE_BLE_SPEAKER -> true
AudioDeviceInfo.TYPE_WIRED_HEADPHONES -> true
else -> false
}
private fun List<AudioDeviceInfo>.excludeSameType(): List<AudioDeviceInfo> =
groupBy { it.type }.flatMap { devices -> listOf(devices.value.minByOrNull { it.id }!!) }
// Earpiece will not work if there is a wired connection
private fun List<AudioDeviceInfo>.excludeEarpieceIfWired(): List<AudioDeviceInfo> =
if (any { it.type == AudioDeviceInfo.TYPE_WIRED_HEADSET || it.type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES })
filter { it.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE }
else this
}
val AudioDeviceInfo.icon: ImageResource
@@ -225,11 +223,15 @@ val AudioDeviceInfo.name: StringResource?
AudioDeviceInfo.TYPE_BLUETOOTH_SCO,
AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
AudioDeviceInfo.TYPE_BLE_HEADSET,
AudioDeviceInfo.TYPE_BLE_SPEAKER -> null // Use product name instead
AudioDeviceInfo.TYPE_BLE_SPEAKER -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// Use product name instead
null
} else {
MR.strings.audio_device_bluetooth
}
AudioDeviceInfo.TYPE_WIRED_HEADPHONES -> MR.strings.audio_device_wired_headphones
AudioDeviceInfo.TYPE_USB_HEADSET, AudioDeviceInfo.TYPE_USB_DEVICE -> null // Use product name instead
else -> null // Use product name instead
}
@@ -26,7 +26,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@@ -87,7 +86,9 @@ actual fun ActiveCallView() {
}
val callAudioDeviceManager = remember { CallAudioDeviceManagerInterface.new() }
DisposableEffect(Unit) {
callAudioDeviceManager.start()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
callAudioDeviceManager.start()
}
onDispose {
CallSoundsPlayer.stop()
if (wasConnected.value) {
@@ -120,13 +121,24 @@ actual fun ActiveCallView() {
val callType = CallType(call.localMedia, r.capabilities)
chatModel.controller.apiSendCallInvitation(callRh, call.contact, callType)
updateActiveCall(call) { it.copy(callState = CallState.InvitationSent, localCapabilities = r.capabilities) }
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
// Starting is delayed to make Android <= 11 working good with Bluetooth
callAudioDeviceManager.start()
} else {
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.supportsVideo(), true)
}
CallSoundsPlayer.startConnectingCallSound(scope)
activeCallWaitDeliveryReceipt(scope)
}
is WCallResponse.Offer -> withBGApi {
chatModel.controller.apiSendCallOffer(callRh, call.contact, r.offer, r.iceCandidates, call.localMedia, r.capabilities)
updateActiveCall(call) { it.copy(callState = CallState.OfferSent, localCapabilities = r.capabilities) }
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
// Starting is delayed to make Android <= 11 working good with Bluetooth
callAudioDeviceManager.start()
} else {
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.supportsVideo(), true)
}
}
is WCallResponse.Answer -> withBGApi {
chatModel.controller.apiSendCallAnswer(callRh, call.contact, r.answer, r.iceCandidates)
@@ -141,7 +153,6 @@ actual fun ActiveCallView() {
val callStatus = json.decodeFromString<WebRTCCallStatus>("\"${r.state.connectionState}\"")
if (callStatus == WebRTCCallStatus.Connected) {
updateActiveCall(call) { it.copy(callState = CallState.Connected, connectedAt = Clock.System.now()) }
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
}
withBGApi { chatModel.controller.apiCallStatus(callRh, call.contact, callStatus) }
} catch (e: Throwable) {
@@ -149,9 +160,6 @@ actual fun ActiveCallView() {
}
is WCallResponse.Connected -> {
updateActiveCall(call) { it.copy(callState = CallState.Connected, connectionInfo = r.connectionInfo) }
scope.launch {
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
}
}
is WCallResponse.End -> {
withBGApi { chatModel.callManager.endCall(call) }
@@ -232,11 +240,10 @@ private fun ActiveCallOverlay(call: Call, chatModel: ChatModel, callAudioDeviceM
selectDevice = { callAudioDeviceManager.selectDevice(it.id) },
toggleVideo = { chatModel.callCommand.add(WCallCommand.Media(CallMediaType.Video, enable = !call.videoEnabled)) },
toggleSound = {
var call = chatModel.activeCall.value
if (call != null) {
call = call.copy(soundSpeaker = !call.soundSpeaker)
chatModel.activeCall.value = call
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
val enableSpeaker = callAudioDeviceManager.currentDevice.value?.type == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val preferredInternalDevice = callAudioDeviceManager.devices.value.firstOrNull { it.type == if (enableSpeaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE }
if (preferredInternalDevice != null) {
callAudioDeviceManager.selectDevice(preferredInternalDevice.id)
}
},
flipCamera = { chatModel.callCommand.add(WCallCommand.Camera(call.localCamera.flipped)) }
@@ -299,7 +306,8 @@ private fun ActiveCallOverlayLayout(
currentDevice.value == null ||
devices.none { it.id == currentDevice.value?.id }
) {
ToggleSoundButton(call, enabled, toggleSound)
val isSpeaker = currentDevice.value?.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
ToggleSoundButton(call, enabled, isSpeaker, toggleSound)
} else {
ExposedDropDownSettingWithIcon(
devices.map { Triple(it, it.icon, if (it.name != null) generalGetString(it.name!!) else it.productName.toString()) },
@@ -395,8 +403,8 @@ private fun ToggleAudioButton(call: Call, enabled: Boolean = true, toggleAudio:
}
@Composable
private fun ToggleSoundButton(call: Call, enabled: Boolean, toggleSound: () -> Unit) {
if (call.soundSpeaker) {
private fun ToggleSoundButton(call: Call, enabled: Boolean, speaker: Boolean, toggleSound: () -> Unit) {
if (speaker) {
ControlButton(call, painterResource(MR.images.ic_volume_up), MR.strings.icon_descr_speaker_off, enabled, toggleSound)
} else {
ControlButton(call, painterResource(MR.images.ic_volume_down), MR.strings.icon_descr_speaker_on, enabled, toggleSound)
@@ -163,7 +163,6 @@ class AppPreferences {
val confirmDBUpgrades = mkBoolPreference(SHARED_PREFS_CONFIRM_DB_UPGRADES, false)
val selfDestruct = mkBoolPreference(SHARED_PREFS_SELF_DESTRUCT, false)
val selfDestructDisplayName = mkStrPreference(SHARED_PREFS_SELF_DESTRUCT_DISPLAY_NAME, null)
val pqExperimentalEnabled = mkBoolPreference(SHARED_PREFS_PQ_EXPERIMENTAL_ENABLED, false)
val currentTheme = mkStrPreference(SHARED_PREFS_CURRENT_THEME, DefaultTheme.SYSTEM.name)
val systemDarkTheme = mkStrPreference(SHARED_PREFS_SYSTEM_DARK_THEME, DefaultTheme.SIMPLEX.name)
@@ -328,7 +327,7 @@ class AppPreferences {
private const val SHARED_PREFS_CONFIRM_DB_UPGRADES = "ConfirmDBUpgrades"
private const val SHARED_PREFS_SELF_DESTRUCT = "LocalAuthenticationSelfDestruct"
private const val SHARED_PREFS_SELF_DESTRUCT_DISPLAY_NAME = "LocalAuthenticationSelfDestructDisplayName"
private const val SHARED_PREFS_PQ_EXPERIMENTAL_ENABLED = "PQExperimentalEnabled"
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_SYSTEM_DARK_THEME = "SystemDarkTheme"
private const val SHARED_PREFS_THEMES = "Themes"
@@ -680,15 +679,6 @@ object ChatController {
throw Exception("failed to get app settings: ${r.responseType} ${r.details}")
}
suspend fun apiSetPQEncryption(enable: Boolean) = sendCommandOkResp(null, CC.ApiSetPQEncryption(enable))
suspend fun apiSetContactPQ(rh: Long?, contactId: Long, enable: Boolean): Contact? {
val r = sendCmd(rh, CC.ApiSetContactPQ(contactId, enable))
if (r is CR.ContactPQAllowed) return r.contact
apiErrorAlert("apiSetContactPQ", "Error allowing contact PQ", r)
return null
}
suspend fun apiExportArchive(config: ArchiveConfig) {
val r = sendCmd(null, CC.ApiExportArchive(config))
if (r is CR.CmdOk) return
@@ -2393,8 +2383,6 @@ sealed class CC {
class SetFilesFolder(val filesFolder: String): CC()
class SetRemoteHostsFolder(val remoteHostsFolder: String): CC()
class ApiSetEncryptLocalFiles(val enable: Boolean): CC()
class ApiSetPQEncryption(val enable: Boolean): CC()
class ApiSetContactPQ(val contactId: Long, val enable: Boolean): CC()
class ApiExportArchive(val config: ArchiveConfig): CC()
class ApiImportArchive(val config: ArchiveConfig): CC()
class ApiDeleteStorage: CC()
@@ -2532,8 +2520,6 @@ sealed class CC {
is SetFilesFolder -> "/_files_folder $filesFolder"
is SetRemoteHostsFolder -> "/remote_hosts_folder $remoteHostsFolder"
is ApiSetEncryptLocalFiles -> "/_files_encrypt ${onOff(enable)}"
is ApiSetPQEncryption -> "/pq ${onOff(enable)}"
is ApiSetContactPQ -> "/_pq @$contactId ${onOff(enable)}"
is ApiExportArchive -> "/_db export ${json.encodeToString(config)}"
is ApiImportArchive -> "/_db import ${json.encodeToString(config)}"
is ApiDeleteStorage -> "/_db delete"
@@ -2676,8 +2662,6 @@ sealed class CC {
is SetFilesFolder -> "setFilesFolder"
is SetRemoteHostsFolder -> "setRemoteHostsFolder"
is ApiSetEncryptLocalFiles -> "apiSetEncryptLocalFiles"
is ApiSetPQEncryption -> "apiSetPQEncryption"
is ApiSetContactPQ -> "apiSetContactPQ"
is ApiExportArchive -> "apiExportArchive"
is ApiImportArchive -> "apiImportArchive"
is ApiDeleteStorage -> "apiDeleteStorage"
@@ -3064,7 +3048,7 @@ data class NetCfg(
hostMode = HostMode.OnionViaSocks,
requiredHostMode = false,
sessionMode = TransportSessionMode.User,
tcpConnectTimeout = 10_000_000,
tcpConnectTimeout = 25_000_000,
tcpTimeout = 15_000_000,
tcpTimeoutPerKb = 10_000,
rcvConcurrency = 12,
@@ -3079,7 +3063,7 @@ data class NetCfg(
hostMode = HostMode.OnionViaSocks,
requiredHostMode = false,
sessionMode = TransportSessionMode.User,
tcpConnectTimeout = 20_000_000,
tcpConnectTimeout = 35_000_000,
tcpTimeout = 20_000_000,
tcpTimeoutPerKb = 15_000,
rcvConcurrency = 8,
@@ -94,7 +94,6 @@ suspend fun initChatController(useKey: String? = null, confirmMigrations: Migrat
controller.apiSetRemoteHostsFolder(remoteHostsDir.absolutePath)
}
controller.apiSetEncryptLocalFiles(controller.appPrefs.privacyEncryptLocalFiles.get())
controller.apiSetPQEncryption(controller.appPrefs.pqExperimentalEnabled.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)
val user = chatController.apiGetActiveUser(null)
@@ -13,7 +13,7 @@ expect fun LocalMultiplatformView(): Any?
@Composable
expect fun getKeyboardState(): State<KeyboardState>
expect fun hideKeyboard(view: Any?)
expect fun hideKeyboard(view: Any?, clearFocus: Boolean = false)
expect fun androidIsFinishingMainActivity(): Boolean
@@ -20,7 +20,6 @@ data class Call(
val sharedKey: String? = null,
val audioEnabled: Boolean = true,
val videoEnabled: Boolean = localMedia == CallMediaType.Video,
val soundSpeaker: Boolean = localMedia == CallMediaType.Video,
var localCamera: VideoCamera = VideoCamera.User,
val connectionInfo: ConnectionInfo? = null,
var connectedAt: Instant? = null,
@@ -58,7 +58,6 @@ fun ChatInfoView(
val currentUser = remember { chatModel.currentUser }.value
val connStats = remember(contact.id, connectionStats) { mutableStateOf(connectionStats) }
val developerTools = chatModel.controller.appPrefs.developerTools.get()
val pqExperimentalEnabled = chatModel.controller.appPrefs.pqExperimentalEnabled.get()
if (chat != null && currentUser != null) {
val contactNetworkStatus = remember(chatModel.networkStatuses.toMap(), contact) {
mutableStateOf(chatModel.contactNetworkStatus(contact))
@@ -81,7 +80,6 @@ fun ChatInfoView(
localAlias,
connectionCode,
developerTools,
pqExperimentalEnabled,
onLocalAliasChanged = {
setContactAlias(chat, it, chatModel)
},
@@ -140,17 +138,6 @@ fun ChatInfoView(
}
})
},
allowContactPQ = {
showAllowContactPQAlert(allowContactPQ = {
withBGApi {
val ct = chatModel.controller.apiSetContactPQ(chatRh, contact.contactId, true)
if (ct != null) {
chatModel.updateContact(chatRh, ct)
}
close.invoke()
}
})
},
verifyClicked = {
ModalManager.end.showModalCloseable { close ->
remember { derivedStateOf { (chatModel.getContactChat(contact.contactId)?.chatInfo as? ChatInfo.Direct)?.contact } }.value?.let { ct ->
@@ -301,7 +288,6 @@ fun ChatInfoLayout(
localAlias: String,
connectionCode: String?,
developerTools: Boolean,
pqExperimentalEnabled: Boolean,
onLocalAliasChanged: (String) -> Unit,
openPreferences: () -> Unit,
deleteContact: () -> Unit,
@@ -310,7 +296,6 @@ fun ChatInfoLayout(
abortSwitchContactAddress: () -> Unit,
syncContactConnection: () -> Unit,
syncContactConnectionForce: () -> Unit,
allowContactPQ: () -> Unit,
verifyClicked: () -> Unit,
) {
val cStats = connStats.value
@@ -360,13 +345,9 @@ fun ChatInfoLayout(
}
val conn = contact.activeConn
if (pqExperimentalEnabled && conn != null) {
SectionView("Quantum resistant E2E encryption") {
if (conn != null) {
SectionView {
InfoRow("E2E encryption", if (conn.connPQEnabled) "Quantum resistant" else "Standard")
if (!conn.pqEncryption) {
AllowContactPQButton(allowContactPQ)
SectionTextFooter("After allowing quantum resistant e2e encryption, it will be enabled after several messages if your contact also allows it.")
}
SectionDividerSpaced()
}
}
@@ -627,17 +608,6 @@ fun SynchronizeConnectionButtonForce(syncConnectionForce: () -> Unit) {
)
}
@Composable
fun AllowContactPQButton(allowContactPQ: () -> Unit) {
SettingsActionItem(
painterResource(MR.images.ic_warning),
"Allow PQ encryption",
click = allowContactPQ,
textColor = WarningOrange,
iconColor = WarningOrange
)
}
@Composable
fun VerifyCodeButton(contactVerified: Boolean, onClick: () -> Unit) {
SettingsActionItem(
@@ -741,16 +711,6 @@ fun showSyncConnectionForceAlert(syncConnectionForce: () -> Unit) {
)
}
fun showAllowContactPQAlert(allowContactPQ: () -> Unit) {
AlertManager.shared.showAlertDialog(
title = "Allow quantum resistant encryption?",
text = "This is an experimental feature, it is not recommended to enable it for important chats.",
confirmText = "Allow",
onConfirm = allowContactPQ,
destructive = true,
)
}
@Preview
@Composable
fun PreviewChatInfoLayout() {
@@ -768,7 +728,6 @@ fun PreviewChatInfoLayout() {
localAlias = "",
connectionCode = "123",
developerTools = false,
pqExperimentalEnabled = false,
connStats = remember { mutableStateOf(null) },
contactNetworkStatus = NetworkStatus.Connected(),
onLocalAliasChanged = {},
@@ -780,7 +739,6 @@ fun PreviewChatInfoLayout() {
abortSwitchContactAddress = {},
syncContactConnection = {},
syncContactConnectionForce = {},
allowContactPQ = {},
verifyClicked = {},
)
}
@@ -135,7 +135,9 @@ fun PasscodeView(
if (!buttonsEnabled.value) {
ProgressIndicator()
}
val view = LocalMultiplatformView()
LaunchedEffect(Unit) {
hideKeyboard(view, true)
focusRequester.requestFocus()
// Disallow to steal a focus by clicking on buttons or using Tab
focusRequester.captureFocus()
@@ -521,6 +521,37 @@ private val versionDescriptions: List<VersionDescription> = listOf(
)
)
),
VersionDescription(
version = "v5.7",
features = listOf(
FeatureDescription(
icon = MR.images.ic_vpn_key_filled,
titleId = MR.strings.v5_6_quantum_resistant_encryption,
descrId = MR.strings.v5_7_quantum_resistant_encryption_descr
),
FeatureDescription(
icon = MR.images.ic_forward,
titleId = MR.strings.v5_7_forward,
descrId = MR.strings.v5_7_forward_descr
),
FeatureDescription(
icon = MR.images.ic_music_note,
titleId = MR.strings.v5_7_call_sounds,
descrId = MR.strings.v5_7_call_sounds_descr
),
FeatureDescription(
icon = MR.images.ic_wifi_tethering,
titleId = MR.strings.v5_7_network,
descrId = MR.strings.v5_7_network_descr
),
FeatureDescription(
icon = MR.images.ic_translate,
titleId = MR.strings.v5_7_new_interface_languages,
descrId = MR.strings.whats_new_thanks_to_users_contribute_weblate,
link = "https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat"
)
)
),
)
private val lastVersion = versionDescriptions.last().version
@@ -159,7 +159,7 @@ fun AdvancedNetworkSettingsView(chatModel: ChatModel) {
SectionItemView {
TimeoutSettingRow(
stringResource(MR.strings.network_option_tcp_connection_timeout), networkTCPConnectTimeout,
listOf(5_000000, 7_500000, 10_000000, 15_000000, 20_000000, 30_000000, 40_000000), secondsLabel
listOf(10_000000, 15_000000, 20_000000, 25_000000, 35_000000, 50_000000), secondsLabel
)
}
SectionItemView {
@@ -212,6 +212,7 @@ object AppearanceScope {
"it" to "Italiano",
"iw" to "עִברִית",
"ja" to "日本語",
"lt" to "Lietuvių",
"nl" to "Nederlands",
"pl" to "Polski",
"pt-BR" to "Português, Brasil",
@@ -57,14 +57,6 @@ fun DeveloperView(
SettingsPreferenceItem(painterResource(MR.images.ic_report), stringResource(MR.strings.show_internal_errors), appPreferences.showInternalErrors)
SettingsPreferenceItem(painterResource(MR.images.ic_avg_pace), stringResource(MR.strings.show_slow_api_calls), appPreferences.showSlowApiCalls)
}
SectionSpacer()
SectionView("Experimental".uppercase()) {
SettingsPreferenceItem(painterResource(MR.images.ic_vpn_key_filled), "Post-quantum E2EE", m.controller.appPrefs.pqExperimentalEnabled, onChange = { enable ->
withBGApi { m.controller.apiSetPQEncryption(enable) }
})
SectionTextFooter("In this version applies only to new contacts.")
}
}
SectionBottomSpacer()
}
@@ -1325,7 +1325,7 @@
<string name="icon_descr_video_on">الفيديو مُشغَّل</string>
<string name="v4_2_auto_accept_contact_requests_desc">مع رسالة ترحيب اختيارية.</string>
<string name="in_developing_title">قريباً!</string>
<string name="in_developing_desc">هذه الميزة ليست مدعومة حتى الآن. جرب الإصدار التالي.</string>
<string name="in_developing_desc">هذه الميزة ليست مدعومة بعد. جرب الإصدار القادم.</string>
<string name="receipts_groups_disable_keep_overrides">تعطيل (الاحتفاظ بتجاوزات المجموعة)</string>
<string name="receipts_groups_enable_for_all">تفعيل لجميع المجموعات</string>
<string name="receipts_groups_override_enabled">إرسال الإيصالات مفعّلة لـ%d مجموعات</string>
@@ -1645,4 +1645,100 @@
<string name="migrate_to_device_apply_onion">طبّق</string>
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>يُرجى ملاحظة</b>: استخدام نفس قاعدة البيانات على جهازين سيؤدي إلى كسر فك تعمية الرسائل من اتصالاتك، كحماية أمنية.]]></string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>تحذير</b>: سيتم حذف الأرشيف.]]></string>
<string name="e2ee_info_no_pq"><![CDATA[تتم حماية الرسائل والملفات والمكالمات عن طريق <b>التعمية بين الطرفين</b> مع توفير السرية التامة لإعادة التوجيه والرفض واستعادة عمليات الاقتحام.]]></string>
<string name="e2ee_info_pq"><![CDATA[تتم حماية الرسائل والملفات والمكالمات عن طريق <b>التعمية بين الطرفين المقاوم للكم</b> مع توفير السرية التامة لإعادة التوجيه والرفض واستعادة عمليات الاقتحام.]]></string>
<string name="e2ee_info_no_pq_short">هذه الدردشة محمية بالتعمية بين الطرفين.</string>
<string name="e2ee_info_pq_short">هذه الدردشة محمية بالتعمية بين الطرفين المقاوم للكم.</string>
<string name="auth_open_migration_to_another_device">افتح شاشة الترحيل</string>
<string name="set_passphrase">عيّن عبارة المرور</string>
<string name="conn_event_enabled_pq">التعمية بين الطرفين المقاوم للكم</string>
<string name="conn_event_disabled_pq">التعمية القياسية بين الطرفين</string>
<string name="migrate_to_device_migrating">جارِ الترحيل</string>
<string name="migrate_to_device_downloading_details">جارِ تنزيل تفاصيل الرابط</string>
<string name="migrate_to_device_downloading_archive">جارِ تنزيل الأرشيف</string>
<string name="migrate_to_device_bytes_downloaded">نُزّل %s</string>
<string name="migrate_to_device_download_failed">فشل التنزيل</string>
<string name="migrate_to_device_repeat_download">كرر التنزيل</string>
<string name="migrate_to_device_import_failed">فشل الاستيراد</string>
<string name="migrate_to_device_repeat_import">كرر الاستيراد</string>
<string name="migrate_to_device_enter_passphrase">أدخل عبارة المرور</string>
<string name="migrate_to_device_file_delete_or_link_invalid">حُذف الملف أو الرابط غير صالح</string>
<string name="migrate_to_device_chat_migrated">رحّلت الدردشة!</string>
<string name="migrate_to_device_confirm_network_settings">أكّد إعدادات الشبكة</string>
<string name="migrate_to_device_finalize_migration">إنهاء الترحيل على جهاز آخر.</string>
<string name="migrate_from_device_to_another_device">رحّل إلى جهاز آخر</string>
<string name="migrate_from_device_database_init">جارِ تحضير الرفع</string>
<string name="migrate_from_device_error_uploading_archive">حدث خطأ أثناء رفع الأرشيف</string>
<string name="migrate_from_device_error_deleting_database">خطأ في حذف قاعدة البيانات</string>
<string name="v5_6_quantum_resistant_encryption">التعمية المقاوم للكم</string>
<string name="v5_6_quantum_resistant_encryption_descr">فعّل في الدردشات المباشرة (تجريبي)!</string>
<string name="paste_archive_link">ألصق رابط الأرشيف</string>
<string name="migrate_to_device_try_again">يمكنك إعطاء محاولة أخرى.</string>
<string name="migrate_to_device_error_downloading_archive">حدث خطأ أثناء تنزيل الأرشيف</string>
<string name="migrate_from_device_exported_file_doesnt_exist">الملف المُصدر غير موجود</string>
<string name="migrate_from_device_verify_passphrase">تحقق من عبارة المرور</string>
<string name="migrate_from_device_confirm_you_remember_passphrase">تأكد من أنك تتذكر عبارة مرور قاعدة البيانات لترحيلها.</string>
<string name="migrate_from_device_verify_database_passphrase">التحقق من عبارة مرور قاعدة البيانات</string>
<string name="error_showing_desktop_notification">خطأ في عرض الإشعار، تواصل بالمطورين.</string>
<string name="v5_6_picture_in_picture_calls">مكالمات صورة في صورة</string>
<string name="v5_6_picture_in_picture_calls_descr">استخدم التطبيق أثناء المكالمة.</string>
<string name="v5_6_app_data_migration_descr">رحّل إلى جهاز آخر عبر رمز QR.</string>
<string name="v5_6_safer_groups">مجموعات أكثر أمانا</string>
<string name="migrate_to_device_title">رحّل هنا</string>
<string name="migrate_to_device_database_init">جارِ تحضير التنزيل</string>
<string name="or_paste_archive_link">أو ألصِق رابط الأرشيف</string>
<string name="migrate_to_device_importing_archive">جارِ استيراد الأرشيف</string>
<string name="invalid_file_link">الرابط غير صالح</string>
<string name="migrate_from_device_error_saving_settings">خطأ في حفظ الإعدادات</string>
<string name="migrate_from_device_title">رحّل الجهاز</string>
<string name="migrate_from_device_confirm_upload">أكّد الرفع</string>
<string name="migrate_from_device_creating_archive_link">جارِ إنشاء رابط الأرشيف</string>
<string name="migrate_from_device_cancel_migration">ألغِ الترحيل</string>
<string name="migrate_from_device_delete_database_from_device">احذف قاعدة البيانات من هذا الجهاز</string>
<string name="migrate_from_device_start_chat">ابدأ الدردشة</string>
<string name="migrate_from_device_migration_complete">اكتمل الترحيل</string>
<string name="migrate_from_device_check_connection_and_try_again">تحقق من اتصالك بالإنترنت وحاول مرة أخرى</string>
<string name="migrate_from_device_error_verifying_passphrase">خطأ في التحقق من عبارة المرور:</string>
<string name="migrate_from_device_finalize_migration">إنهاء الترحيل</string>
<string name="permissions_grant">منح الإذن/ونات لإجراء المكالمات</string>
<string name="migrate_to_device_confirm_network_settings_footer">الرجاء التأكد من صحة إعدادات الشبكة لهذا الجهاز.</string>
<string name="permissions_camera">الكاميرا</string>
<string name="permissions_camera_and_record_audio">الكاميرا والميكروفون</string>
<string name="permissions_find_in_settings_and_grant">ابحث عن هذا الإذن في إعدادات أندرويد وامنحه يدويًا.</string>
<string name="permissions_grant_in_settings">منح في الإعدادات</string>
<string name="permissions_required">منح الأذونات</string>
<string name="permissions_record_audio">الميكروفون</string>
<string name="migrate_from_another_device">رحّل من جهاز آخر</string>
<string name="permissions_open_settings">افتح الإعدادات</string>
<string name="migrate_from_device_error_exporting_archive">حدث خطأ أثناء تصدير قاعدة بيانات الدردشة</string>
<string name="migrate_from_device_chat_should_be_stopped">للاستمرار، يجب إيقاف الدردشة.</string>
<string name="migrate_from_device_or_share_this_file_link">أو شارك رابط الملف هذا بشكل آمن</string>
<string name="migrate_from_device_repeat_upload">كرر الرفع</string>
<string name="migrate_from_device_stopping_chat">جارِ إيقاف الدردشة</string>
<string name="migrate_from_device_bytes_uploaded">رُفع %s</string>
<string name="migrate_from_device_upload_failed">فشل الرفع</string>
<string name="migrate_from_device_uploading_archive">جارِ الرفع الأرشيف</string>
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[<b>لا يجوز</b> استخدام نفس قاعدة البيانات على جهازين.]]></string>
<string name="migrate_from_device_try_again">يمكنك إعطاء محاولة أخرى.</string>
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[اختر <i>رحّل من جهاز آخر</i> على الجهاز الجديد و امسح رمز QR ضوئيًا.]]></string>
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">تحذير: بدء الدردشة على أجهزة متعددة غير مدعوم وسيؤدي إلى فشل تسليم الرسائل</string>
<string name="settings_section_title_network_connection">إتصال شبكة</string>
<string name="forwarded_description">محوّلة</string>
<string name="network_type_cellular">خلوي</string>
<string name="network_type_ethernet">إيثرنت سلكية</string>
<string name="network_type_no_network_connection">لا إتصال شبكة</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_other">أخرى</string>
<string name="simplex_links_not_allowed">روابط SimpleX غير مسموح بها</string>
<string name="voice_messages_not_allowed">الرسائل الصوتية غير مسموح بها</string>
<string name="simplex_links">روابط SimpleX</string>
<string name="allow_to_send_simplex_links">السماح بإرسال روابط SimpleX.</string>
<string name="prohibit_sending_simplex_links">منع إرسال روابط SimpleX</string>
<string name="feature_roles_all_members">كل الأعضاء</string>
<string name="group_members_can_send_simplex_links">يمكن لأعضاء المجموعة إرسال روابط SimpleX.</string>
<string name="simplex_links_are_prohibited_in_group">روابط SimpleX محظورة في هذه المجموعة.</string>
<string name="feature_roles_admins">المشرفين</string>
<string name="feature_enabled_for">مفعّل لـ</string>
<string name="feature_roles_owners">المالكون</string>
<string name="files_and_media_not_allowed">الملفات والوسائط غير مسموح بها</string>
</resources>
@@ -839,6 +839,7 @@
<string name="audio_device_earpiece">Earpiece</string>
<string name="audio_device_speaker">Speaker</string>
<string name="audio_device_wired_headphones">Headphones</string>
<string name="audio_device_bluetooth">Bluetooth</string>
<!-- SimpleXInfo -->
<string name="next_generation_of_private_messaging">The next generation of private messaging</string>
@@ -1764,6 +1765,14 @@
<string name="v5_6_picture_in_picture_calls_descr">Use the app while in the call.</string>
<string name="v5_6_safer_groups">Safer groups</string>
<string name="v5_6_safer_groups_descr">Admins can block a member for all.</string>
<string name="v5_7_quantum_resistant_encryption_descr">Will be enabled in direct chats!</string>
<string name="v5_7_forward">Forward and save messages</string>
<string name="v5_7_forward_descr">Message source remains private.</string>
<string name="v5_7_call_sounds">In-call sounds</string>
<string name="v5_7_call_sounds_descr">When connecting audio and video calls.</string>
<string name="v5_7_network">Network management</string>
<string name="v5_7_network_descr">More reliable network connection.</string>
<string name="v5_7_new_interface_languages">Lithuanian UI</string>
<!-- CustomTimePicker -->
<string name="custom_time_unit_seconds">seconds</string>
@@ -1712,4 +1712,34 @@
<string name="migrate_from_device_check_connection_and_try_again">Проверете вашата интернет връзка и опитайте отново</string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Внимание</b>: архивът ще бъде изтрит.]]></string>
<string name="v5_6_quantum_resistant_encryption_descr">Активиране в личните чатове (БЕТА)!</string>
<string name="allow_to_send_simplex_links">Разрешаване на SimpleX изпращане на връзки /линкове/.</string>
<string name="forwarded_description">1. препратено
\n2. предадено</string>
<string name="error_showing_desktop_notification">Грешка при показване на уведомление
\nГрешка при показване на съобщение</string>
<string name="permissions_open_settings">Отворени настройки</string>
<string name="permissions_find_in_settings_and_grant">"Намерете това разрешение /права/ в настройките на Android и го задайте ръчно."</string>
<string name="network_type_other">Друг
\nДруги</string>
<string name="network_type_cellular">Мобилна мрежа</string>
<string name="network_type_no_network_connection">Няма мрежова връзка</string>
<string name="network_type_network_wifi">Безжична мрежа</string>
<string name="network_type_ethernet">Кабелна мрежа /кабелна технология/</string>
<string name="simplex_links_not_allowed">SimpleX връзките не са разрешени</string>
<string name="voice_messages_not_allowed">Гласовите съобщения не са разрешени</string>
<string name="permissions_grant_in_settings">Предоставян в настройките</string>
<string name="settings_section_title_network_connection">Мрежова връзка</string>
<string name="simplex_links">SimpleX връзки
\nСимпълХикс връзки</string>
<string name="prohibit_sending_simplex_links">Забранено изпращането на SimpleX връзки</string>
<string name="group_members_can_send_simplex_links">Членовете на групата могат да изпращат връзки към SimpleX.</string>
<string name="simplex_links_are_prohibited_in_group">SimpleX връзки са забранени в тази група.</string>
<string name="feature_enabled_for">Активиране на
\nАктивиране за</string>
<string name="feature_roles_owners">Собственици</string>
<string name="permissions_camera">Камера</string>
<string name="permissions_camera_and_record_audio">Камера и микрофон</string>
<string name="permissions_required">Предоставени разрешения</string>
<string name="permissions_grant">Дадени разрешение(я) за извършване на повикване</string>
<string name="permissions_record_audio">Микрофон</string>
</resources>
@@ -1430,8 +1430,8 @@
<string name="connect_via_member_address_alert_desc">An dieses Gruppenmitglied wird eine Verbindungsanfrage gesendet.</string>
<string name="connect_via_member_address_alert_title">Direkt verbinden\?</string>
<string name="connect_via_link_incognito">Inkognito verbinden</string>
<string name="connect_use_current_profile">Nutzen Sie das aktuelle Profil</string>
<string name="connect_use_new_incognito_profile">Nutzen Sie das neue Inkognito-Profil</string>
<string name="connect_use_current_profile">Das aktuelle Profil nutzen</string>
<string name="connect_use_new_incognito_profile">Ein neues Inkognito-Profil nutzen</string>
<string name="system_restricted_background_in_call_warn"><![CDATA[Wählen Sie bitte in den App-Einstellungen <b>App-Akkuverbrauch</b> / <b>Unbeschränkt</b> , um Anrufe im Hintergrund zu führen.]]></string>
<string name="paste_the_link_you_received_to_connect_with_your_contact">Fügen Sie den erhaltenen Link ein, um sich mit Ihrem Kontakt zu verbinden…</string>
<string name="connect__a_new_random_profile_will_be_shared">Es wird ein neues Zufallsprofil geteilt.</string>
@@ -1797,4 +1797,31 @@
<string name="conn_event_disabled_pq">Standard-Ende-zu-Ende-Verschlüsselung</string>
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[Sie dürfen die selbe Datenbank <b>nicht</b> auf zwei Geräten nutzen.]]></string>
<string name="error_showing_desktop_notification">Fehler beim Anzeigen der Benachrichtigung. Bitte kontaktieren Sie die Entwickler.</string>
<string name="permissions_find_in_settings_and_grant">Sie finden diese Berechtigung in den Android Einstellungen vor und müssen Sie manuell erteilen.</string>
<string name="permissions_grant_in_settings">In den Einstellungen erteilen</string>
<string name="permissions_required">Berechtigungen erteilen</string>
<string name="permissions_record_audio">Mikrofon</string>
<string name="permissions_open_settings">Einstellungen öffnen</string>
<string name="permissions_camera">Kamera</string>
<string name="permissions_camera_and_record_audio">Kamera und Mikrofon</string>
<string name="permissions_grant">Erteilen Sie die Berechtigung(en), um Anrufe zu tätigen</string>
<string name="forwarded_description">weitergeleitet</string>
<string name="settings_section_title_network_connection">Netzwerkverbindung</string>
<string name="network_type_no_network_connection">Keine Netzwerkverbindung</string>
<string name="network_type_cellular">Zellulär</string>
<string name="network_type_other">Andere</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">Kabelgebundenes Ethernet</string>
<string name="files_and_media_not_allowed">Dateien und Medien sind nicht erlaubt</string>
<string name="simplex_links_not_allowed">SimpleX-Links sind nicht erlaubt</string>
<string name="voice_messages_not_allowed">Sprachnachrichten sind nicht erlaubt</string>
<string name="simplex_links">SimpleX-Links</string>
<string name="group_members_can_send_simplex_links">Gruppenmitglieder können SimpleX-Links senden.</string>
<string name="feature_roles_admins">Administratoren</string>
<string name="feature_roles_all_members">Alle Mitglieder</string>
<string name="feature_enabled_for">Für aktiviert</string>
<string name="feature_roles_owners">Eigentümer</string>
<string name="simplex_links_are_prohibited_in_group">In dieser Gruppe sind SimpleX-Links verboten.</string>
<string name="prohibit_sending_simplex_links">Das Senden von SimpleX-Links verbieten</string>
<string name="allow_to_send_simplex_links">Das Senden von SimpleX-Links erlauben.</string>
</resources>
@@ -15,7 +15,7 @@
<string name="smp_servers_preset_add">Añadir servidores predefinidos</string>
<string name="all_group_members_will_remain_connected">Todos los miembros del grupo permanecerán conectados.</string>
<string name="allow_irreversible_message_deletion_only_if">Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también lo permite para tí. (24 horas)</string>
<string name="keychain_allows_to_receive_ntfs">Android Keystore se usará para almacenar de forma segura la contraseña después de reiniciar la aplicación o cambiar la frase de contraseña - permitirá recibir notificaciones.</string>
<string name="keychain_allows_to_receive_ntfs">Android Keystore se usará para almacenar de forma segura la frase de contraseña después de cambiarla o reiniciar la aplicación - permitirá recibir notificaciones.</string>
<string name="allow_your_contacts_to_send_disappearing_messages">Permites a tus contactos enviar mensajes temporales</string>
<string name="allow_your_contacts_to_send_voice_messages">Permites a tus contactos enviar mensajes de voz.</string>
<string name="chat_preferences_always">siempre</string>
@@ -36,8 +36,8 @@
<string name="appearance_settings">Apariencia</string>
<string name="app_version_title">Versión</string>
<string name="network_session_mode_user_description"><![CDATA[Se usará una conexión TCP (y credenciales SOCKS) independiente <b>por cada perfil que tengas en la aplicación</b>.]]></string>
<string name="network_session_mode_entity_description">Se usará una conexión TCP (y credenciales SOCKS) independiente <b>por cada contacto y miembro del grupo</b>.
\n<b>Atención</b>: si tienes muchas conexiones, el consumo de batería y tráfico pueden ser sustancialmente mayores y algunas conexiones pueden fallar.</string>
<string name="network_session_mode_entity_description">Se usará una conexión TCP (y credenciales SOCKS) independiente <b>por cada contacto y miembro del grupo</b>.
\n<b>Recuerda</b>: si tienes muchas conexiones, el consumo de batería y tráfico pueden ser sustancialmente mayores y algunas conexiones pueden fallar.</string>
<string name="a_plus_b">a + b</string>
<string name="about_simplex">Acerca de SimpleX</string>
<string name="bold_text">negrita</string>
@@ -53,7 +53,7 @@
<string name="users_delete_all_chats_deleted">Se eliminarán todos los chats y mensajes. ¡No podrá deshacerse!</string>
<string name="accept_feature">Aceptar</string>
<string name="allow_to_send_disappearing">Se permiten mensajes temporales.</string>
<string name="keychain_is_storing_securely">Android Keystore se usará para almacenar de forma segura la contraseña - permite que el servicio de notificación funcione.</string>
<string name="keychain_is_storing_securely">Android Keystore se usará para almacenar de forma segura la frase de contraseña - permite que el servicio de notificación funcione.</string>
<string name="users_add">Añadir perfil</string>
<string name="color_primary">Color</string>
<string name="allow_your_contacts_irreversibly_delete">Permites a tus contactos eliminar irreversiblemente los mensajes enviados. (24 horas)</string>
@@ -73,7 +73,7 @@
<string name="smp_servers_add_to_another_device">Añadir a otro dispositivo</string>
<string name="app_version_name">Versión de la aplicación: v%s</string>
<string name="icon_descr_asked_to_receive">Solicita recibir la imagen</string>
<string name="impossible_to_recover_passphrase"><![CDATA[<b>Atención</b>: NO podrás recuperar o cambiar la contraseña si la pierdes.]]></string>
<string name="impossible_to_recover_passphrase"><![CDATA[<b>Recuerda</b>: NO podrás recuperar o cambiar la frase de contraseña si la pierdes.]]></string>
<string name="both_you_and_your_contact_can_send_voice">Tanto tú como tu contacto podéis enviar mensajes de voz.</string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>¡Consume más batería!</b> El servicio en segundo plano se ejecuta continuamente y las notificaciones se mostrarán de inmediato.]]></string>
<string name="both_you_and_your_contacts_can_delete">Tanto tú como tu contacto podéis eliminar los mensajes enviados de forma irreversible. (24 horas)</string>
@@ -87,7 +87,7 @@
<string name="database_will_be_encrypted_and_passphrase_stored">La base de datos será cifrada y la contraseña se guardará en Keystore.</string>
<string name="delete_contact_question">¿Eliminar contacto\?</string>
<string name="delete_message__question">¿Eliminar mensaje\?</string>
<string name="delete_chat_profile_question">¿Eliminar perfil de chat?</string>
<string name="delete_chat_profile_question">¿Eliminar perfil?</string>
<string name="rcv_group_event_group_deleted">grupo eliminado</string>
<string name="delete_group_question">¿Eliminar grupo\?</string>
<string name="delete_messages_after">Eliminar en</string>
@@ -194,7 +194,7 @@
<string name="delete_chat_archive_question">¿Eliminar archivo del chat\?</string>
<string name="create_group_link">Crear enlace de grupo</string>
<string name="delete_link">Eliminar enlace</string>
<string name="users_delete_question">¿Eliminar perfil de chat?</string>
<string name="users_delete_question">¿Eliminar perfil?</string>
<string name="ttl_hour">%d hora</string>
<string name="ttl_day">%d día</string>
<string name="v4_5_multiple_chat_profiles_descr">Nombre y avatar diferentes, aislamiento de transporte.</string>
@@ -271,14 +271,14 @@
<string name="database_initialization_error_title">No se puede iniciar la base de datos</string>
<string name="clear_chat_question">¿Vaciar chat\?</string>
<string name="network_session_mode_user">por perfil</string>
<string name="chat_is_stopped_indication">Chat está detenido</string>
<string name="chat_is_stopped_indication">Chat está parado</string>
<string name="rcv_group_event_changed_member_role">rol de %s cambiado a %s</string>
<string name="change_role">Cambiar rol</string>
<string name="v4_5_transport_isolation_descr">Mediante perfil (por defecto) o por conexión (BETA)</string>
<string name="snd_conn_event_switch_queue_phase_changing">cambiando de servidor…</string>
<string name="chat_preferences">Preferencias de Chat</string>
<string name="feature_cancelled_item">cancelado %s</string>
<string name="chat_is_stopped">Chat está detenido</string>
<string name="chat_is_stopped">Chat está parado</string>
<string name="settings_section_title_calls">LLAMADAS</string>
<string name="chat_is_running">Chat está en ejecución</string>
<string name="rcv_conn_event_switch_queue_phase_changing">está cambiando de servidor…</string>
@@ -309,7 +309,7 @@
<string name="confirm_new_passphrase">Confirma la contraseña nueva…</string>
<string name="network_disable_socks_info">Si confirmas los servidores de mensajería podrán ver tu IP, y tu proveedor de acceso a internet a qué servidores te estás conectando.</string>
<string name="image_saved">Imagen guardada en la Galería</string>
<string name="file_will_be_received_when_contact_is_online">El archivo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="file_will_be_received_when_contact_is_online">El archivo se recibirá cuando el contacto esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="add_contact">Enlace de invitación de un uso</string>
<string name="paste_the_link_you_received">Pegar el enlace recibido</string>
<string name="error_saving_group_profile">Error al guardar perfil de grupo</string>
@@ -337,7 +337,7 @@
<string name="failed_to_active_user_title">¡Error al cambiar perfil!</string>
<string name="smp_servers_enter_manually">Introduce el servidor manualmente</string>
<string name="how_to_use_your_servers">Cómo usar los servidores</string>
<string name="error_stopping_chat">Error al detener Chat</string>
<string name="error_stopping_chat">Error al parar Chat</string>
<string name="enter_correct_passphrase">Introduce la contraseña correcta.</string>
<string name="enter_passphrase">Introduce la contraseña…</string>
<string name="icon_descr_group_inactive">Grupo inactivo</string>
@@ -353,7 +353,7 @@
<string name="gallery_image_button">Imagen</string>
<string name="gallery_video_button">Vídeo</string>
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">Si has recibido un enlace de invitación a SimpleX Chat puedes abrirlo en tu navegador:</string>
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Si eliges rechazar, el remitente NO será notificado.</string>
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Si seleccionas rechazar, el remitente NO será notificado.</string>
<string name="invalid_contact_link">¡Enlace no válido!</string>
<string name="if_you_cannot_meet_in_person_scan_QR_in_video_call_or_ask_for_invitation_link"><![CDATA[Si no puedes reunirte en persona, puedes <b>escanear el código QR en la videollamada</b>, o tu contacto puede compartir un enlace de invitación.]]></string>
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel"><![CDATA[Si no puedes reunirte en persona, <b>muestra el código QR en la videollamada</b>, o comparte el enlace.]]></string>
@@ -382,7 +382,7 @@
<string name="for_everybody">Para todos</string>
<string name="icon_descr_file">Archivo</string>
<string name="icon_descr_image_snd_complete">Imagen enviada</string>
<string name="image_will_be_received_when_contact_is_online">La imagen se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="image_will_be_received_when_contact_is_online">La imagen se recibirá cuando el contacto esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="image_descr_link_preview">vista previa del enlace</string>
<string name="error_saving_ICE_servers">Error al guardar servidores ICE</string>
<string name="enter_one_ICE_server_per_line">Servidores ICE (uno por línea)</string>
@@ -459,8 +459,8 @@
<string name="message_deletion_prohibited">La eliminación irreversible de mensajes no está permitida en este chat.</string>
<string name="message_deletion_prohibited_in_chat">La eliminación irreversible de mensajes no está permitida en este grupo.</string>
<string name="v4_3_improved_server_configuration">Configuración del servidor mejorada</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Esto puede suceder cuando:
\n1. Los mensajes caducan en el cliente saliente tras 2 días o en el servidor tras 30 días.
<string name="alert_text_skipped_messages_it_can_happen_when">Esto puede ocurrir cuando:
\n1. Los mensajes hayan caducado en el cliente saliente tras 2 días o en el servidor tras 30 días.
\n2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.
\n3. La conexión ha sido comprometida.</string>
<string name="notification_preview_mode_message">Contacto y texto</string>
@@ -510,7 +510,7 @@
<string name="mute_chat">Silenciar</string>
<string name="ensure_ICE_server_address_are_correct_format_and_unique">Asegúrate de que las direcciones del servidor WebRTC ICE tienen el formato correcto, están separadas por líneas y no duplicadas.</string>
<string name="network_use_onion_hosts_required_desc">Se requieren hosts .onion para la conexión
\nAtención: no podrás conectarte a servidores que no tengan dirección .onion.</string>
\nRecuerda: no podrás conectarte a servidores que no tengan dirección .onion.</string>
<string name="network_use_onion_hosts_prefer_desc_in_alert">Se usarán hosts .onion si están disponibles.</string>
<string name="immune_to_spam_and_abuse">Inmune a spam y abuso</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Muchos se preguntarán: <i>si SimpleX no tiene identificadores de usuario, ¿cómo puede entregar los mensajes\?</i>]]></string>
@@ -570,7 +570,7 @@
<string name="thousand_abbreviation">k</string>
<string name="marked_deleted_description">marcado eliminado</string>
<string name="icon_descr_call_missed">Llamada perdida</string>
<string name="notifications_will_be_hidden">¡Las notificaciones seguirán enviándose hasta que la aplicación se detenga!</string>
<string name="notifications_will_be_hidden">¡Las notificaciones seguirán enviándose hasta que la aplicación se pare!</string>
<string name="leave_group_button">Salir</string>
<string name="leave_group_question">¿Salir del grupo\?</string>
<string name="group_member_role_owner">propietario</string>
@@ -621,7 +621,7 @@
<string name="icon_descr_record_voice_message">Grabar mensaje de voz</string>
<string name="rcv_group_event_member_deleted">ha expulsado a %1$s</string>
<string name="send_link_previews">Enviar previsualizacion de enlaces</string>
<string name="send_live_message_desc">Envía un mensaje en vivo: se actualizará para el(los) destinatario(s) a medida que se escribe</string>
<string name="send_live_message_desc">Envía un mensaje en vivo: se actualizará para el (los) destinatario(s) a medida que se escribe</string>
<string name="icon_descr_sent_msg_status_send_failed">error de envío</string>
<string name="sending_via">Enviando vía</string>
<string name="contact_developers">Por favor, actualiza la aplicación y ponte en contacto con los desarrolladores.</string>
@@ -673,7 +673,7 @@
<string name="receiving_via">Recibiendo vía</string>
<string name="network_option_protocol_timeout">Tiempo de espera del protocolo</string>
<string name="network_option_seconds_label">seg</string>
<string name="users_delete_with_connections">Perfil y conexiones de servidor</string>
<string name="users_delete_with_connections">Datos del perfil y conexiones</string>
<string name="prohibit_sending_disappearing_messages">No se permiten mensajes temporales.</string>
<string name="only_you_can_send_voice">Sólo tú puedes enviar mensajes de voz.</string>
<string name="only_your_contact_can_send_voice">Sólo tu contacto puede enviar mensajes de voz.</string>
@@ -694,7 +694,7 @@
<string name="open_chat">Abrir chat</string>
<string name="restore_database">Restaurar copia de seguridad de la base de datos</string>
<string name="save_passphrase_and_open_chat">Guardar contraseña y abrir el chat</string>
<string name="restore_passphrase_not_found_desc">La contraseña no se ha encontrado en Keystore, introdúzcala manualmente. Esto puede haber ocurrido si has restaurado los datos de la aplicación con una herramienta de copia de seguridad. Si no es así, por favor ponte en contacto con los desarrolladores.</string>
<string name="restore_passphrase_not_found_desc">La contraseña no se ha encontrado en Keystore, introdúcela manualmente. Esto puede haber ocurrido si has restaurado los datos de la aplicación con una herramienta de copia de seguridad. Si no es así, por favor ponte en contacto con los desarrolladores.</string>
<string name="remove_member_confirmation">Expulsar</string>
<string name="button_remove_member">Expulsar miembro</string>
<string name="button_send_direct_message">Enviar mensaje directo</string>
@@ -722,7 +722,7 @@
<string name="use_chat">Abrir SimpleX</string>
<string name="settings_section_title_socks">PROXY SOCKS</string>
<string name="settings_section_title_themes">TEMAS</string>
<string name="stop_chat_confirmation">Detener</string>
<string name="stop_chat_confirmation">Parar</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Esta acción es irreversible. Tu perfil, contactos, mensajes y archivos se perderán.</string>
<string name="skip_inviting_button">Omitir invitación a miembros</string>
<string name="settings_notification_preview_mode_title">Vista previa</string>
@@ -746,7 +746,7 @@
<string name="share_invitation_link">Compartir enlace de un uso</string>
<string name="update_network_session_mode_question">¿Actualizar el modo de aislamiento de transporte\?</string>
<string name="icon_descr_speaker_on">Altavoz activado</string>
<string name="stop_chat_to_enable_database_actions">Detén SimpleX para habilitar las acciones sobre la base de datos.</string>
<string name="stop_chat_to_enable_database_actions">Para habilitar las acciones sobre la base de datos, debes parar Chat</string>
<string name="connection_you_accepted_will_be_cancelled">¡La conexión que has aceptado se cancelará!</string>
<string name="database_initialization_error_desc">La base de datos no funciona correctamente. Pulsa para saber más</string>
<string name="moderate_message_will_be_marked_warning">El mensaje será marcado como moderado para todos los miembros.</string>
@@ -759,7 +759,7 @@
<string name="icon_descr_settings">Configuración</string>
<string name="icon_descr_speaker_off">Altavoz desactivado</string>
<string name="add_contact_or_create_group">Inciar chat nuevo</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">Para exportar, importar o eliminar la base de datos debes detener Chat. Durante la parada no podrás recibir o enviar mensajes.</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">Para exportar, importar o eliminar la base de datos debes parar Chat. Mientra tanto no podrás recibir o enviar mensajes.</string>
<string name="thank_you_for_installing_simplex">Gracias por instalar SimpleX Chat!</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Para proteger tu privacidad, en lugar de los identificadores de usuario que usan el resto de plataformas, SimpleX dispone de identificadores para las colas de mensajes, independientes para cada uno de tus contactos.</string>
<string name="la_notice_to_protect_your_information_turn_on_simplex_lock_you_will_be_prompted_to_complete_authentication_before_this_feature_is_enabled">Para proteger tu información, activa el Bloqueo SimpleX.
@@ -776,7 +776,7 @@
<string name="notification_preview_mode_message_desc">Se muestran el nombre del contacto y el mensaje</string>
<string name="notification_preview_mode_contact_desc">Se muestra sólo el nombre del contacto</string>
<string name="auth_simplex_lock_turned_on">Bloqueo SimpleX activado</string>
<string name="auth_stop_chat">Detener chat</string>
<string name="auth_stop_chat">Parar Chat</string>
<string name="moderate_message_will_be_deleted_warning">El mensaje se eliminará para todos los miembros.</string>
<string name="share_file">Compartir archivo…</string>
<string name="images_limit_title">¡Demasiadas imágenes!</string>
@@ -806,7 +806,7 @@
<string name="callstate_starting">inicializando…</string>
<string name="alert_title_skipped_messages">Mensajes omitidos</string>
<string name="settings_section_title_settings">CONFIGURACIÓN</string>
<string name="stop_chat_question">¿Detener Chat\?</string>
<string name="stop_chat_question">¿Parar Chat?</string>
<string name="chat_item_ttl_seconds">%s segundo(s)</string>
<string name="group_invitation_tap_to_join">Pulsa para unirte</string>
<string name="rcv_group_event_updated_group_profile">ha actualizado el perfil del grupo</string>
@@ -871,14 +871,14 @@
<string name="waiting_for_image">Esperando imagen</string>
<string name="webrtc_ice_servers">Servidores WebRTC ICE</string>
<string name="contact_wants_to_connect_via_call">%1$s quiere conectarse contigo mediante</string>
<string name="failed_to_create_user_duplicate_desc">Ya tienes un perfil con este nombre mostrado. Por favor, elige otro nombre.</string>
<string name="failed_to_create_user_duplicate_desc">Ya tienes un perfil con este nombre mostrado. Por favor, selecciona otro nombre.</string>
<string name="you_can_also_connect_by_clicking_the_link"><![CDATA[También puedes conectarte pulsando el enlace. Si se abre en el navegador, pulsa en <b>Abrir en aplicación móvil</b>.]]></string>
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[Puedes <font color="#0088ff">ponerte en contacto con los desarrolladores de SimpleX Chat para consultas y para recibir actualizaciones</font>.]]></string>
<string name="observer_cant_send_message_title">¡No puedes enviar mensajes!</string>
<string name="you_can_use_markdown_to_format_messages__prompt">Puedes usar la sintaxis markdown para dar formato a tus mensajes:</string>
<string name="you_must_use_the_most_recent_version_of_database">Debes usar la versión más reciente de tu base de datos ÚNICAMENTE en un dispositivo, de lo contrario podrías dejar de recibir mensajes de algunos contactos.</string>
<string name="alert_text_connection_pending_they_need_to_be_online_can_delete_and_retry">Tu contacto debe estar en línea para que se complete la conexión.
\nPuedes cancelar esta conexión y eliminar el contacto (e intentarlo más tarde con un enlace nuevo).</string>
<string name="alert_text_connection_pending_they_need_to_be_online_can_delete_and_retry">El contacto debe estar en línea para completar la conexión.
\nPuedes cancelarla y eliminar el contacto (e intentarlo más tarde con un enlace nuevo).</string>
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">La base de datos actual será ELIMINADA y SUSTITUIDA por la importada.
\nEsta acción es irreversible. Tu perfil, contactos, mensajes y archivos actuales se perderán.</string>
<string name="incognito_random_profile">Tu perfil aleatorio</string>
@@ -1012,23 +1012,23 @@
<string name="mtr_error_no_down_migration">la versión de la base de datos es más reciente que la aplicación, pero no hay migración hacia versión anterior para: %s</string>
<string name="settings_section_title_experimenta">EXPERIMENTAL</string>
<string name="developer_options">IDs de la base de datos y opciónes de aislamiento de transporte.</string>
<string name="file_will_be_received_when_contact_completes_uploading">El archivo se recibirá cuando tu contacto termine de subirlo.</string>
<string name="image_will_be_received_when_contact_completes_uploading">La imagen se recibirá cuando tu contacto termine de subirla.</string>
<string name="file_will_be_received_when_contact_completes_uploading">El archivo se recibirá cuando el contacto termine de subirlo.</string>
<string name="image_will_be_received_when_contact_completes_uploading">La imagen se recibirá cuando el contacto termine de subirla.</string>
<string name="show_developer_options">Mostrar opciones de desarrollador</string>
<string name="hide_dev_options">Ocultar:</string>
<string name="show_dev_options">Mostrar:</string>
<string name="delete_chat_profile">Eliminar perfil de chat</string>
<string name="delete_chat_profile">Eliminar perfil</string>
<string name="profile_password">Contraseña del perfil</string>
<string name="unhide_chat_profile">Mostrar perfil oculto</string>
<string name="unhide_profile">Mostrar perfil</string>
<string name="delete_profile">Eliminar perfil</string>
<string name="video_descr">Vídeo</string>
<string name="video_will_be_received_when_contact_is_online">El vídeo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="video_will_be_received_when_contact_is_online">El vídeo se recibirá cuando el contacto esté en línea, por favor espera o compruébalo más tarde.</string>
<string name="waiting_for_video">Esperando el vídeo</string>
<string name="icon_descr_video_asked_to_receive">Ha pedido recibir el video</string>
<string name="videos_limit_title">¡Demasiados vídeos!</string>
<string name="icon_descr_video_snd_complete">Vídeo enviado</string>
<string name="video_will_be_received_when_contact_completes_uploading">El vídeo se recibirá cuando tu contacto termine de subirlo.</string>
<string name="video_will_be_received_when_contact_completes_uploading">El vídeo se recibirá cuando el contacto termine de subirlo.</string>
<string name="videos_limit_desc">Sólo se pueden enviar 10 vídeos de forma simultánea</string>
<string name="icon_descr_waiting_for_video">Esperando el vídeo</string>
<string name="error_saving_xftp_servers">Error al guardar servidores SMP</string>
@@ -1081,7 +1081,7 @@
<string name="la_mode_system">Sistema</string>
<string name="decryption_error">Error descifrado</string>
<string name="alert_text_msg_bad_id">El ID del siguiente mensaje es incorrecto (menor o igual que el anterior).
\nPuede ocurrir por algún error o si la conexión está comprometida.</string>
\nPodría ocurrir por algún error o si la conexión está comprometida.</string>
<string name="alert_text_fragment_please_report_to_developers">Por favor, informa a los desarrolladores.</string>
<string name="alert_text_decryption_error_too_many_skipped">%1$d mensaje(s) omitido(s).</string>
<string name="alert_title_msg_bad_hash">Hash de mensaje incorrecto</string>
@@ -1264,7 +1264,7 @@
<string name="abort_switch_receiving_address">Cancelar cambio de dirección</string>
<string name="files_and_media">Archivos y multimedia</string>
<string name="prohibit_sending_files">No se permite el envío de archivos y multimedia.</string>
<string name="files_are_prohibited_in_group">No se permiten archivos y multimedia en este grupo.</string>
<string name="files_are_prohibited_in_group">Los archivos y multimedia no están permitidos en este grupo.</string>
<string name="group_members_can_send_files">Los miembros del grupo pueden enviar archivos y multimedia.</string>
<string name="allow_to_send_files">Se permite enviar archivos y multimedia</string>
<string name="favorite_chat">Favorito</string>
@@ -1383,7 +1383,7 @@
<string name="rcv_group_event_open_chat">Abrir</string>
<string name="v5_3_encrypt_local_files">Cifra archivos almacenados y multimedia</string>
<string name="error_creating_member_contact">Error al establecer contacto con el miembro</string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>Atención</b>: los servidores de retransmisión están conectados mediante SOCKS proxy. Las llamadas y las previsualizaciones de enlaces usan conexión directa.]]></string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>Recuerda</b>: los servidores de retransmisión están conectados mediante SOCKS proxy. Las llamadas y las previsualizaciones de enlaces usan conexión directa.]]></string>
<string name="encrypt_local_files">Cifra archivos locales</string>
<string name="v5_3_new_desktop_app">Nueva aplicación para ordenador!</string>
<string name="v5_3_new_interface_languages">6 idiomas nuevos para el interfaz</string>
@@ -1556,14 +1556,14 @@
<string name="tap_to_paste_link">Pulsa para pegar enlace</string>
<string name="search_or_paste_simplex_link">Buscar o pegar enlace SimpleX</string>
<string name="v5_5_message_delivery_descr">Con uso reducido de batería.</string>
<string name="blocked_by_admin_item_description">bloqueado por el administrador</string>
<string name="blocked_by_admin_item_description">bloqueado por administrador</string>
<string name="blocked_by_admin_items_description">%d mensajes bloqueados por el administrador</string>
<string name="error_creating_message">Error al crear mensaje</string>
<string name="error_deleting_note_folder">Error al borrar notas privadas</string>
<string name="clear_note_folder_question">¿Borrar notas privadas?</string>
<string name="error_deleting_note_folder">Error al eliminar notas privadas</string>
<string name="clear_note_folder_question">¿Eliminar notas privadas?</string>
<string name="developer_options_section">Opciones desarrollador</string>
<string name="rcv_group_event_member_blocked">%s bloqueado</string>
<string name="rcv_group_event_member_unblocked">%s desbloqueado</string>
<string name="rcv_group_event_member_blocked">ha bloqueado a %s</string>
<string name="rcv_group_event_member_unblocked">ha desbloqueado a %s</string>
<string name="snd_group_event_member_blocked">has bloqueado a %s</string>
<string name="snd_group_event_member_unblocked">has desbloqueado a %s</string>
<string name="group_member_status_unknown_short">desconocido</string>
@@ -1574,14 +1574,14 @@
<string name="unblock_for_all_question">¿Desbloquear miembro para todos?</string>
<string name="unblock_for_all">Desbloquear para todos</string>
<string name="member_info_member_blocked">bloqueado</string>
<string name="member_blocked_by_admin">Bloqueado por el administrador</string>
<string name="member_blocked_by_admin">bloqueado por administrador</string>
<string name="error_blocking_member_for_all">Error al bloqear el miembro para todos</string>
<string name="v5_5_private_notes_descr">Con cifrado de archivos y multimedia.</string>
<string name="remote_host_error_timeout"><![CDATA[Tiempo de espera para conectar con el móvil <b>%s</b> agotado]]></string>
<string name="chat_is_stopped_you_should_transfer_database">Chat detenido. Si has usado esta base de datos en otro dispositivo, deberías transferirla de vuelta antes de iniciar el chat.</string>
<string name="failed_to_create_user_invalid_desc">Éste nombre mostrado no es válido. Por favor, elije otro nombre.</string>
<string name="remote_host_was_disconnected_title">Conexión detenida</string>
<string name="remote_ctrl_was_disconnected_title">Conexión detenida</string>
<string name="chat_is_stopped_you_should_transfer_database">Chat parado. Si has usado esta base de datos en otro dispositivo, debes transferirla de vuelta antes de iniciar Chat.</string>
<string name="failed_to_create_user_invalid_desc">Este nombre mostrado no es válido. Por favor, selecciona otro nombre.</string>
<string name="remote_host_was_disconnected_title">Conexión parada</string>
<string name="remote_ctrl_was_disconnected_title">Conexión parada</string>
<string name="remote_host_disconnected_from"><![CDATA[Desconectado del móvil <b>%s</b> debido a: %s]]></string>
<string name="remote_ctrl_disconnected_with_reason">Desconectado debido a: %s</string>
<string name="remote_host_error_bad_state"><![CDATA[La conexión con el móvil <b>%s</b> es deficiente]]></string>
@@ -1597,7 +1597,7 @@
<string name="remote_ctrl_error_disconnected">El ordenador ha sido desconectado</string>
<string name="group_member_status_unknown">estado desconocido</string>
<string name="database_migration_in_progress">Migración de la base de datos en progreso.
\nPuede tardar varios minutos.</string>
\nPodría tardar varios minutos.</string>
<string name="remote_ctrl_error_bad_version">El ordenador tiene una versión sin soporte. Por favor, asegúrate de usar la misma versión en ambos dispositivos</string>
<string name="profile_update_event_contact_name_changed">el contacto %1$s ha cambiado a %2$s</string>
<string name="profile_update_event_updated_profile">perfil actualizado</string>
@@ -1613,7 +1613,7 @@
<string name="v5_5_simpler_connect_ui_descr">La barra de búsqueda acepta enlaces de invitación.</string>
<string name="v5_5_join_group_conversation">Unirse a la conversación del grupo</string>
<string name="v5_5_join_group_conversation_descr">Historial reciente y bot del directorio mejorado.</string>
<string name="v5_5_new_interface_languages">Interfaz en Turco y en Húngaro</string>
<string name="v5_5_new_interface_languages">Interfaz en turco y húngaro</string>
<string name="remote_host_error_inactive"><![CDATA[El móvil <b>%s</b> está inactivo]]></string>
<string name="remote_host_error_missing"><![CDATA[El móvil <b>%s</b> no se encuentra]]></string>
<string name="remote_host_error_busy"><![CDATA[El móvil <b>%s</b> está ocupado]]></string>
@@ -1638,82 +1638,120 @@
<string name="call_service_notification_audio_call">Llamada</string>
<string name="call_service_notification_end_call">Llamada finalizada</string>
<string name="call_service_notification_video_call">Videollamada</string>
<string name="unable_to_open_browser_title">Error al abrir el navegador</string>
<string name="unable_to_open_browser_title">Error al abrir navegador</string>
<string name="unable_to_open_browser_desc">Para llamadas se requiere el navegador web predeterminado. Por favor, configura el navegador predeterminado en el sistema y comparte más información con los desarrolladores.</string>
<string name="migrate_from_device_archiving_database">Archivando base de datos</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Todos tus contactos, conversaciones y archivos serán cifrados, divididos y subidos de forma segura a los servidores XFTP configurados.</string>
<string name="v5_6_safer_groups_descr">Los administradores pueden bloquear un miembro para el resto</string>
<string name="migrate_to_device_chat_migrated">Chat migrado!</string>
<string name="v5_6_app_data_migration">Migración de los datos de la app</string>
<string name="v5_6_safer_groups_descr">Los administradores pueden bloquear a un miembro para los demás</string>
<string name="migrate_to_device_chat_migrated">¡Chat migrado!</string>
<string name="v5_6_app_data_migration">Migrar datos de la aplicación</string>
<string name="migrate_to_device_apply_onion">Aplicar</string>
<string name="migrate_from_device_archive_and_upload">Archivar y subir</string>
<string name="migrate_from_device_cancel_migration">Cancelar migración</string>
<string name="e2ee_info_no_pq_short">Este chat está protegido por cifrado de extremo a extremo.</string>
<string name="migrate_from_another_device">Migrar desde otro dispositivo</string>
<string name="conn_event_enabled_pq">cifrado e2e resistente a tecnologías cuánticas</string>
<string name="conn_event_enabled_pq">cifrado e2e resistente a tecnología cuántica</string>
<string name="conn_event_disabled_pq">cifrado estándar de extremo a extremo</string>
<string name="migrate_to_device_bytes_downloaded">%s descargado</string>
<string name="migrate_from_device_or_share_this_file_link">O comparta de forma segura este enlace de archivo</string>
<string name="migrate_from_device_or_share_this_file_link">O comparte de forma segura este enlace al archivo</string>
<string name="migrate_from_device_migration_complete">Migración completada</string>
<string name="migrate_from_device_start_chat">Empezar chat</string>
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes.</string>
<string name="migrate_from_device_verify_passphrase">Verificar la frase de contraseña</string>
<string name="migrate_from_device_verify_database_passphrase">Verificar la contraseña de la base de datos</string>
<string name="v5_6_quantum_resistant_encryption_descr">¡Habilitar en chats directos (BETA)!</string>
<string name="migrate_from_device_start_chat">Iniciar chat</string>
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">Atención: el inicio del chat en varios dispositivos es incompatible y provocará fallos en la entrega de mensajes.</string>
<string name="migrate_from_device_verify_passphrase">Verificar frase de contraseña</string>
<string name="migrate_from_device_verify_database_passphrase">Verificar contraseña de la base de datos</string>
<string name="v5_6_quantum_resistant_encryption_descr">¡Activar en chats directos (BETA)!</string>
<string name="v5_6_picture_in_picture_calls_descr">Usar la aplicación durante la llamada.</string>
<string name="v5_6_safer_groups">Grupos más seguros</string>
<string name="migrate_to_device_downloading_details">Descargando detalles del enlace</string>
<string name="invalid_file_link">Enlace inválido</string>
<string name="invalid_file_link">Enlace no válido</string>
<string name="migrate_to_device_migrating">Migrando</string>
<string name="paste_archive_link">Pegar enlace de archivo</string>
<string name="migrate_to_device_database_init">Preparando descarga</string>
<string name="migrate_to_device_repeat_download">Repetir descarga</string>
<string name="migrate_to_device_try_again">Puedes intentarlo de nuevo.</string>
<string name="migrate_to_device_enter_passphrase">Introducir frase de contraseña</string>
<string name="migrate_to_device_enter_passphrase">Introduce la frase de contraseña</string>
<string name="migrate_to_device_error_downloading_archive">Error al descargar el archivo</string>
<string name="migrate_to_device_file_delete_or_link_invalid">El archivo se ha eliminado o el enlace no es válido</string>
<string name="migrate_to_device_finalize_migration">Finalizar la migración en otro dispostivo.</string>
<string name="migrate_to_device_file_delete_or_link_invalid">El archivo ha sido eliminado o el enlace no es válido</string>
<string name="migrate_to_device_finalize_migration">Finalizar migración en otro dispostivo.</string>
<string name="migrate_to_device_import_failed">Error de importación</string>
<string name="migrate_to_device_importing_archive">Importando archivo</string>
<string name="migrate_to_device_repeat_import">Repetir importación</string>
<string name="migrate_from_device_title">Migrar dispositivo</string>
<string name="migrate_to_device_confirm_network_settings_footer">Por favor confirme que la configuración de red es correcta para este dispositivo.</string>
<string name="migrate_from_device_error_deleting_database">Error al borrar la base de datos</string>
<string name="migrate_to_device_confirm_network_settings_footer">Por favor, confirma que la configuración de red es correcta para este dispositivo.</string>
<string name="migrate_from_device_error_deleting_database">Error al eliminar base de datos</string>
<string name="migrate_from_device_error_uploading_archive">Error al subir el archivo</string>
<string name="migrate_from_device_stopping_chat">Deteniendo chat</string>
<string name="migrate_from_device_repeat_upload">Repetir la carga</string>
<string name="migrate_from_device_bytes_uploaded">%s subidos</string>
<string name="migrate_from_device_stopping_chat">Parando chat</string>
<string name="migrate_from_device_repeat_upload">Repetir subida</string>
<string name="migrate_from_device_bytes_uploaded">%s subido</string>
<string name="migrate_from_device_upload_failed">Error de subida</string>
<string name="migrate_from_device_uploading_archive">Subiendo archivo</string>
<string name="migrate_from_device_try_again">Puedes intentarlo de nuevo.</string>
<string name="migrate_from_device_creating_archive_link">Creando enlace de archivo</string>
<string name="migrate_from_device_delete_database_from_device">Borrar la base de datos de este dispositivo</string>
<string name="migrate_from_device_finalize_migration">Finalizar la migración</string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Atención</b>: el archivo se elimina.]]></string>
<string name="migrate_from_device_check_connection_and_try_again">Compruebe su conexión a Internet y vuelva a intentarlo</string>
<string name="migrate_from_device_confirm_you_remember_passphrase">Confirme que recuerda la contraseña de la base de datos para migrarla.</string>
<string name="migrate_from_device_error_verifying_passphrase">Error al verificar la contraseña:</string>
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Ten en cuenta</b>: usar la misma base de datos en dos dispositivos romperá el descifrado de mensajes de tus conexiones, como protección de seguridad.]]></string>
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Elige <i>Migrar desde otro dispositivo</i> en el nuevo dispositivo y escanea el código QR.]]></string>
<string name="migrate_to_device_confirm_network_settings">Confirmar la configuración de red</string>
<string name="migrate_from_device_confirm_upload">Confirmar carga</string>
<string name="migrate_from_device_creating_archive_link">Creando enlace al archivo</string>
<string name="migrate_from_device_delete_database_from_device">Eliminar base de datos de este dispositivo</string>
<string name="migrate_from_device_finalize_migration">Finalizar migración</string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Atención</b>: el archivo se eliminado.]]></string>
<string name="migrate_from_device_check_connection_and_try_again">Comprueba tu conexión a internet y vuelve a intentarlo</string>
<string name="migrate_from_device_confirm_you_remember_passphrase">Confirma que recuerdas la frase de contraseña de la base de datos para migrarla.</string>
<string name="migrate_from_device_error_verifying_passphrase">Error al verificar la frase de contraseña:</string>
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Recuerda</b>: usar la misma base de datos en dos dispositivos hará que falle el descifrado de mensajes como protección de seguridad.]]></string>
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[En el nuevo dispositivo selecciona <i>Migrar desde otro dispositivo</i> y escanea el código QR.]]></string>
<string name="migrate_to_device_confirm_network_settings">Confirmar configuración de red</string>
<string name="migrate_from_device_confirm_upload">Confirmar subida</string>
<string name="migrate_to_device_download_failed">Descarga fallida</string>
<string name="migrate_to_device_downloading_archive">Descargando archivo</string>
<string name="migrate_from_device_error_exporting_archive">Error al exportar la base de datos de chats</string>
<string name="migrate_from_device_error_saving_settings">Error al guardar los ajustes</string>
<string name="migrate_from_device_error_exporting_archive">Error al exportar base de datos del chat</string>
<string name="migrate_from_device_error_saving_settings">Error al guardar ajustes</string>
<string name="migrate_from_device_exported_file_doesnt_exist">El archivo exportado no existe</string>
<string name="migrate_from_device_chat_should_be_stopped">Para continuar, el chat debe detenerse.</string>
<string name="e2ee_info_no_pq"><![CDATA[Los mensajes, archivos y llamadas están protegidos por <b>cifrado de extremo a extremo</b> con perfecta confidencialidad, repudio y recuperación tras ataques.]]></string>
<string name="e2ee_info_pq"><![CDATA[Los mensajes, archivos y llamadas están protegidos por <b>cifrado de extremo a extremo resistente a computación cuántica</b> con perfecta confidencialidad, repudio y recuperación tras ataques.]]></string>
<string name="migrate_from_device_chat_should_be_stopped">Para continuar, Chat debe estar parado.</string>
<string name="e2ee_info_no_pq"><![CDATA[Los mensajes, archivos y llamadas están protegidos mediante <b>cifrado de extremo a extremo</b> con secreto perfecto hacía adelante, repudio y recuperación tras ataque.]]></string>
<string name="e2ee_info_pq"><![CDATA[Los mensajes, archivos y llamadas están protegidos mediante <b>cifrado de extremo a extremo resistente a tecnología cuántica</b> con secreto perfecto hacía adelante, repudio y recuperación tras ataque.]]></string>
<string name="migrate_to_device_title">Migrar aquí</string>
<string name="migrate_from_device_to_another_device">Migrar hacia otro dispositivo</string>
<string name="v5_6_app_data_migration_descr">Migrar hacia otro dispositivo mediante código QR.</string>
<string name="auth_open_migration_to_another_device">Abrir pantalla de migración</string>
<string name="migrate_from_device_to_another_device">Migrar a otro dispositivo</string>
<string name="v5_6_app_data_migration_descr">Migrar a otro dispositivo mediante código QR.</string>
<string name="auth_open_migration_to_another_device">Abrir menú migración</string>
<string name="or_paste_archive_link">O pegar enlace del archivo</string>
<string name="v5_6_picture_in_picture_calls">Llamadas picture-in-picture</string>
<string name="migrate_from_device_database_init">Preparando subida</string>
<string name="v5_6_quantum_resistant_encryption">Cifrado resistente a tecnologías cuánticas</string>
<string name="v5_6_quantum_resistant_encryption">Cifrado resistente a tecnología cuántica</string>
<string name="set_passphrase">Establecer frase de contraseña</string>
<string name="e2ee_info_pq_short">Este chat está protegido por un cifrado de extremo a extremo resistente a tecnología cuántica.</string>
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[<b>No debes</b> utilizar la misma base de datos en dos dispositivos.]]></string>
<string name="e2ee_info_pq_short">Este chat está protegido por cifrado de extremo a extremo resistente a tecnología cuántica.</string>
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[<b>No debes</b> usar la misma base de datos en dos dispositivos.]]></string>
<string name="error_showing_desktop_notification">Error al mostrar notificación, contacta con los desarrolladores.</string>
<string name="permissions_camera_and_record_audio">Cámara y micrófono</string>
<string name="permissions_grant_in_settings">Concédelo en ajustes.</string>
<string name="permissions_required">Conceder permisos</string>
<string name="permissions_camera">Cámara</string>
<string name="permissions_find_in_settings_and_grant">Busca este permiso en los ajustes de Android y concédelo manualmente.</string>
<string name="permissions_grant">Conceder permiso(s) para hacer llamadas</string>
<string name="permissions_record_audio">Micrófono</string>
<string name="permissions_open_settings">Abrir ajustes</string>
<string name="settings_section_title_network_connection">Conexión de red</string>
<string name="forwarded_description">reenviado</string>
<string name="files_and_media_not_allowed">Archivos y multimedia no permitidos</string>
<string name="simplex_links_not_allowed">Enlaces SimpleX no permitidos</string>
<string name="voice_messages_not_allowed">Mensajes de voz no permitidos</string>
<string name="simplex_links">Enlaces SimpleX</string>
<string name="group_members_can_send_simplex_links">Los miembros del grupo pueden enviar enlaces SimpleX</string>
<string name="simplex_links_are_prohibited_in_group">Los enlaces SimpleX no se permiten en este grupo.</string>
<string name="feature_roles_owners">propietarios</string>
<string name="network_type_cellular">Móvil</string>
<string name="network_type_no_network_connection">Sin conexión de red</string>
<string name="network_type_other">Otro</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">Ethernet por cable</string>
<string name="feature_roles_admins">administradores</string>
<string name="feature_enabled_for">Activar para</string>
<string name="prohibit_sending_simplex_links">No permitir el envío de enlaces SimpleX</string>
<string name="feature_roles_all_members">todos los miembros</string>
<string name="allow_to_send_simplex_links">Permitir enviar enlaces SimpleX.</string>
<string name="saved_description">guardado</string>
<string name="saved_from_description">guardado desde %s</string>
<string name="saved_chat_item_info_tab">Guardado</string>
<string name="saved_from_chat_item_info_title">Guardado desde</string>
<string name="forwarded_from_chat_item_info_title">Reenviado por</string>
<string name="download_file">Descargar</string>
<string name="forward_chat_item">Reenviar</string>
<string name="forwarded_chat_item_info_tab">Reenviado</string>
<string name="forward_message">Mensaje reenviado…</string>
<string name="recipients_can_not_see_who_message_from">Los destinatarios no ven de quién procede este mensaje.</string>
</resources>
@@ -1715,4 +1715,32 @@
<string name="migrate_from_device_verify_passphrase">Vérifier la phrase secrète</string>
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">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</string>
<string name="migrate_to_device_try_again">Vous pouvez faire un nouvel essai.</string>
<string name="error_showing_desktop_notification">Erreur lors de l\'affichage de la notification, contacter les développeurs.</string>
<string name="permissions_camera_and_record_audio">Caméra et microphone</string>
<string name="permissions_grant_in_settings">Accorder dans les paramètres</string>
<string name="permissions_required">Octroyer les permissions</string>
<string name="permissions_grant">Accorder la/les permission(s) pour passer des appels</string>
<string name="permissions_record_audio">Microphone</string>
<string name="permissions_open_settings">Ouvrir les paramètres</string>
<string name="permissions_camera">Caméra</string>
<string name="permissions_find_in_settings_and_grant">Retrouvez cette permission dans les paramètres d\'Android et octroyez-la manuellement.</string>
<string name="forwarded_description">transféré</string>
<string name="settings_section_title_network_connection">Connexion au réseau</string>
<string name="network_type_cellular">Cellulaire</string>
<string name="files_and_media_not_allowed">Fichiers et médias non autorisés</string>
<string name="simplex_links_not_allowed">Les liens SimpleX ne sont pas autorisés</string>
<string name="voice_messages_not_allowed">Les messages vocaux ne sont pas autorisés</string>
<string name="feature_roles_admins">admins</string>
<string name="feature_roles_all_members">tous les membres</string>
<string name="allow_to_send_simplex_links">Autorise l\'envoi de liens SimpleX.</string>
<string name="feature_enabled_for">Activé pour</string>
<string name="group_members_can_send_simplex_links">Les membres du groupe peuvent envoyer des liens SimpleX.</string>
<string name="feature_roles_owners">propriétaires</string>
<string name="prohibit_sending_simplex_links">Interdire l\'envoi de liens SimpleX</string>
<string name="simplex_links_are_prohibited_in_group">Les liens SimpleX sont interdits dans ce groupe.</string>
<string name="network_type_no_network_connection">Pas de connexion au réseau</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">Ethernet câblé</string>
<string name="simplex_links">Liens SimpleX</string>
<string name="network_type_other">Autres</string>
</resources>
@@ -2,7 +2,7 @@
<resources>
<string name="alert_text_decryption_error_n_messages_failed_to_decrypt">%1$d üzenet visszafejtése sikertelen.</string>
<string name="alert_text_decryption_error_too_many_skipped">%1$d üzenet kihagyva.</string>
<string name="integrity_msg_skipped">%1$d kihagyott üzenet</string>
<string name="integrity_msg_skipped">%1$d üzenet kihagyva</string>
<string name="group_info_section_title_num_members">%1$s TAG</string>
<string name="chat_item_ttl_month">1 hónap</string>
<string name="chat_item_ttl_week">1 hét</string>
@@ -24,8 +24,8 @@
<string name="network_enable_socks_info">Hozzáférés a kiszolgálókhoz SOCKS proxy segítségével a %d porton? A proxyt el kell indítani, mielőtt engedélyezné ezt az opciót.</string>
<string name="accept_feature">Elfogadás</string>
<string name="accept_call_on_lock_screen">Elfogadás</string>
<string name="above_then_preposition_continuation">fentről, utána:</string>
<string name="accept_contact_incognito_button">Fogadás inkognítóban</string>
<string name="above_then_preposition_continuation">gombra fent, majd:</string>
<string name="accept_contact_incognito_button">Elfogadás inkognítóban</string>
<string name="accept_connection_request__question">Kapcsolatfelvétel elfogadása?</string>
<string name="accept_contact_button">Elfogadás</string>
<string name="accept">Elfogadás</string>
@@ -40,7 +40,7 @@
<string name="calls_prohibited_with_this_contact">A hang- és videóhívások le vannak tiltva.</string>
<string name="network_session_mode_entity_description">Külön TCP kapcsolat (és SOCKS bejelentkezési adatok) lesz használva <b>minden ismerős és csoporttag számára</b>.
\n<b>Figyelem</b>: ha sok ismerőse van, az akkumulátor- és adathasználat jelentősen megnövekedhet és néhány kapcsolódási kísérlet sikertelen lehet.</string>
<string name="icon_descr_cancel_link_preview">Hivatkozás előnézet megszakítása</string>
<string name="icon_descr_cancel_link_preview">hivatkozás előnézet megszakítása</string>
<string name="network_session_mode_user_description"><![CDATA[Külön TCP kapcsolat (és SOCKS bejelentkezési adatok) lesz használva <b>az alkalmazásban minden csevegési profiljához </b>.]]></string>
<string name="both_you_and_your_contact_can_send_disappearing">Mindkét fél küldhet eltűnő üzeneteket.</string>
<string name="keychain_is_storing_securely">Az Android Keystore-t a jelmondat biztonságos tárolására használják - lehetővé teszi az értesítési szolgáltatás működését.</string>
@@ -69,17 +69,17 @@
<string name="snd_conn_event_ratchet_sync_started">a(z) %s titkosításának elfogadása…</string>
<string name="available_in_v51">"
\nElérhető a v5.1-ben"</string>
<string name="both_you_and_your_contacts_can_delete">Mindkét fél visszafordíthatatlanul törölheti az elküldött üzeneteket. (24 óra)</string>
<string name="both_you_and_your_contacts_can_delete">Mindkét fél véglegesen törölheti az elküldött üzeneteket. (24 óra)</string>
<string name="v5_4_better_groups">Javított csoportok</string>
<string name="clear_chat_warning">Minden üzenet törlésre kerül - ezt nem vonható vissza! Az üzenetek CSAK az ön számára törlődnek.</string>
<string name="clear_chat_warning">Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az ön számára törlődnek.</string>
<string name="icon_descr_call_ended">Hívás befejeződött</string>
<string name="settings_section_title_calls">HÍVÁSOK</string>
<string name="rcv_group_and_other_events">és %d egyéb esemény</string>
<string name="rcv_group_and_other_events">és %d további esemény</string>
<string name="address_section_title">Cím</string>
<string name="connect_plan_already_joining_the_group">Csatlakozás folyamatban!</string>
<string name="auto_accept_contact">Automatikus elfogadás</string>
<string name="notifications_mode_service_desc">A háttérszolgáltatás mindig fut - az értesítések azonnal megjelennek, amint üzenetek vannak.</string>
<string name="allow_to_delete_messages">Az elküldött üzenetek visszafordíthatatlan törlése engedélyezve van. (24 óra)</string>
<string name="allow_to_delete_messages">Az elküldött üzenetek végleges törlése engedélyezve van. (24 óra)</string>
<string name="both_you_and_your_contact_can_send_voice">Mindkét fél küldhet hangüzeneteket.</string>
<string name="alert_title_msg_bad_id">Téves üzenet ID</string>
<string name="allow_your_contacts_adding_message_reactions">Ismerősök általi üzenetreakciók küldésének engedélyezése.</string>
@@ -99,7 +99,7 @@
<string name="smp_servers_add_to_another_device">Hozzáadás egy másik eszközhöz</string>
<string name="allow_message_reactions">Az üzenetreakciók küldése engedélyezve van.</string>
<string name="icon_descr_cancel_file_preview">Fájl előnézet megszakítása</string>
<string name="all_group_members_will_remain_connected">Minden csoporttag csatlakoztatva marad.</string>
<string name="all_group_members_will_remain_connected">Minden csoporttag csatlakozva marad.</string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Több akkumulátort használ</b>! Háttérszolgáltatás mindig fut - az értesítések megjelennek, amint az üzenetek elérhetővé válnak.]]></string>
<string name="block_member_confirmation">Letiltás</string>
<string name="group_member_role_admin">admin</string>
@@ -110,7 +110,7 @@
<string name="v5_2_more_things">Még néhány dolog</string>
<string name="authentication_cancelled">Hitelesítés megszakítva</string>
<string name="allow_to_send_files">A fájlok- és a médiatartalom küldése engedélyezve van.</string>
<string name="users_delete_all_chats_deleted">Minden csevegés és üzenet törlésre kerül - ez nem vonható vissza!</string>
<string name="users_delete_all_chats_deleted">Minden csevegés és üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="icon_descr_audio_call">hanghívás</string>
<string name="bold_text">félkövér</string>
<string name="app_passcode_replaced_with_self_destruct">Az alkalmazás jelkód helyettesítésre kerül egy önmegsemmisítő jelkóddal.</string>
@@ -135,7 +135,7 @@
<string name="callstatus_ended">%1$s hívása befejeződött</string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>Jó akkumulátoridő</b>. A háttérszolgáltatás 10 percenként ellenőrzi az új üzeneteket. Előfordulhat, hogy hívásokról, vagy a sürgős üzenetekről marad le.]]></string>
<string name="group_member_role_author">szerző</string>
<string name="allow_your_contacts_irreversibly_delete">Elküldött üzenetek visszafordíthatatlan törlésének engedélyezése az ismerősei számára. (24 óra)</string>
<string name="allow_your_contacts_irreversibly_delete">Elküldött üzenetek végleges törlésének engedélyezése az ismerősei számára. (24 óra)</string>
<string name="cancel_verb">Megszakítás</string>
<string name="notifications_mode_off_desc">Az alkalmazás csak akkor tud értesítéseket fogadni amikor fut, háttérszolgáltatás nem indul el</string>
<string name="v5_1_better_messages">Jobb üzenetek</string>
@@ -179,27 +179,27 @@
<string name="confirm_password">Jelszó megerősítése</string>
<string name="change_member_role_question">Csoport szerepkör megváltoztatása?</string>
<string name="change_lock_mode">Zárolási mód megváltoztatása</string>
<string name="notification_contact_connected">Kapcsolódva</string>
<string name="rcv_group_event_member_connected">kapcsolódva</string>
<string name="notification_contact_connected">Csatlakozott</string>
<string name="rcv_group_event_member_connected">csatlakozva</string>
<string name="connect_via_link_verb">Kapcsolódás</string>
<string name="group_member_status_connected">kapcsolódva</string>
<string name="group_member_status_connected">csatlakozva</string>
<string name="connected_mobile">Csatlakoztatott telefon</string>
<string name="server_connected">kapcsolódva</string>
<string name="change_role">Szerepkör megváltoztatása</string>
<string name="icon_descr_server_status_connected">Kapcsolódva</string>
<string name="auth_confirm_credential">Belépési adatok megerősítése</string>
<string name="switch_receiving_address_question">Megváltoztatja a fogadó címet?</string>
<string name="rcv_conn_event_switch_queue_phase_completed">Cím megváltoztatva</string>
<string name="rcv_conn_event_switch_queue_phase_completed">cím megváltoztatva</string>
<string name="change_self_destruct_mode">Önmegsemmisítő mód megváltoztatása</string>
<string name="rcv_group_event_changed_your_role">megváltoztatta az ön szerepkörét erre: %s</string>
<string name="connect_button">Kapcsolódás</string>
<string name="connect_via_member_address_alert_title">Közvetlen kapcsolódás?</string>
<string name="connect_via_member_address_alert_title">Közvetlen csatlakozás?</string>
<string name="smp_server_test_connect">Kapcsolódás</string>
<string name="rcv_group_event_member_created_contact">közvetlenül kapcsolódva</string>
<string name="rcv_group_event_member_created_contact">közvetlenül csatlakozva</string>
<string name="connection_local_display_name">kapcsolat %1$d</string>
<string name="status_contact_has_e2e_encryption">az ismerős e2e titkosítással rendelkezik</string>
<string name="v5_4_incognito_groups_descr">Csoport létrehozása véletlenszerű profillal.</string>
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">Az ismerős és az összes üzenet törlésre kerül - ez nem vonható vissza!</string>
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">Az ismerős és az összes üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="contacts_can_mark_messages_for_deletion">Az ismerősök törlésre jelölhetnek üzeneteket ; megtekintheti őket.</string>
<string name="connect_via_invitation_link">Kapcsolódás egyszer használatos hivatkozással?</string>
<string name="connect_via_link_or_qr">Kapcsolódás egy hivatkozás / QR-kód által</string>
@@ -225,7 +225,7 @@
<string name="contact_preferences">Ismerős beállításai</string>
<string name="info_row_connection">Kapcsolat</string>
<string name="desktop_connection_terminated">Kapcsolat megszakítva</string>
<string name="display_name_connection_established">Kapcsolat létrehozva</string>
<string name="display_name_connection_established">kapcsolat létrehozva</string>
<string name="status_contact_has_no_e2e_encryption">az ismerősnek nincs e2e titkosítása</string>
<string name="chat_preferences_contact_allows">Ismerős engedélyezi</string>
<string name="notification_preview_somebody">Ismerős elrejtve:</string>
@@ -237,24 +237,24 @@
<string name="alert_title_contact_connection_pending">Az ismerős még nem csatlakozott!</string>
<string name="v5_3_discover_join_groups_descr">- kapcsolódás könyvtár szolgáltatáshoz (BÉTA)!
\n- kézbesítési jelentések (20 tagig).
\n- gyorsabb és stabilabb</string>
\n- gyorsabb és stabilabb.</string>
<string name="contribute">Hozzájárulás</string>
<string name="group_member_status_intro_invitation">csatlakozás (bemutatkozás meghívó)</string>
<string name="group_member_status_intro_invitation">csatlakozás (bemutatkozó meghívó)</string>
<string name="create_simplex_address">SimpleX azonosító létrehozása</string>
<string name="rcv_direct_event_contact_deleted">törölt ismerős</string>
<string name="delete_member_message__question">Csoporttag üzenet törlése?</string>
<string name="chat_is_running">A csevegés fut</string>
<string name="share_one_time_link">Egyszer használatos meghívó hivatkozás létrehozása</string>
<string name="delete_link">Törlés</string>
<string name="notifications_mode_periodic_desc">Új üzenetek ellenőrzése 10 percenként, legfeljebb 1 percen keresztül.</string>
<string name="notifications_mode_periodic_desc">Új üzenetek ellenőrzése 10 percenként, legfeljebb 1 percen keresztül</string>
<string name="delete_database">Adatbázis törlése</string>
<string name="create_group_button">Csoport létrehozása</string>
<string name="network_session_mode_user">Csevegési profil</string>
<string name="create_another_profile_button">Profil létrehozása</string>
<string name="connected_desktop">Csatlakoztatott számítógép</string>
<string name="connected_desktop">Társított számítógép</string>
<string name="share_text_deleted_at">Törölve ekkor: %s</string>
<string name="info_row_deleted_at">Törölve ekkor</string>
<string name="v4_6_chinese_spanish_interface">Kínai és spanyol kezelőfelület.</string>
<string name="info_row_deleted_at">Törölve ekkor:</string>
<string name="v4_6_chinese_spanish_interface">Kínai és spanyol kezelőfelület</string>
<string name="alert_title_cant_invite_contacts">Ismerősök meghívása nem lehetséges!</string>
<string name="chat_is_stopped_indication">A csevegés leállt</string>
<string name="theme_dark">Sötét</string>
@@ -284,10 +284,10 @@
<string name="icon_descr_close_button">Bezárás gomb</string>
<string name="chat_is_stopped">A csevegés leállt</string>
<string name="item_info_current">(jelenlegi)</string>
<string name="v5_1_custom_themes_descr">Témák személyre szabása és megosztása</string>
<string name="v5_1_custom_themes_descr">Témák személyre szabása és megosztása.</string>
<string name="delete_chat_profile_question">Csevegési profil törlése?</string>
<string name="create_group">Titkos csoport létrehozása</string>
<string name="connected_to_desktop">Csatlakozva a számítógéphez</string>
<string name="connected_to_desktop">Kapcsolódva a számítógéphez</string>
<string name="configure_ICE_servers">ICE kiszolgálók beállítása</string>
<string name="button_delete_group">Csoport törlése</string>
<string name="clear_verification">Hitelesítés törlése</string>
@@ -318,7 +318,7 @@
<string name="delete_link_question">Hivatkozás törlése?</string>
<string name="server_connecting">kapcsolódás</string>
<string name="send_disappearing_message_custom_time">Személyreszabott idő</string>
<string name="connect_via_link_incognito">Inkognítóban csatlakozva</string>
<string name="connect_via_link_incognito">Csatlakozás inkognitóban</string>
<string name="settings_section_title_chats">CSEVEGÉSEK</string>
<string name="v5_3_new_desktop_app_descr">Új profil létrehozása a számítógép alkalmazásban. 💻</string>
<string name="group_member_status_announced">kapcsolódás (bejelentve)</string>
@@ -394,7 +394,7 @@
<string name="ttl_w">%dhét</string>
<string name="discover_on_network">Felfedezés helyi hálózaton keresztül</string>
<string name="v5_3_discover_join_groups">Helyi csoportok felfedezése és csatlakozás</string>
<string name="moderated_items_description">%1$d üzenet moderálva %2$s által</string>
<string name="moderated_items_description">%1$d üzenet moderálva lett %2$s által</string>
<string name="disappearing_message">Eltűnő üzenet</string>
<string name="dont_create_address">Ne hozzon létre azonosítót</string>
<string name="dont_show_again">Ne mutasd újra</string>
@@ -410,7 +410,7 @@
<string name="ttl_mth">%dhónap</string>
<string name="direct_messages_are_prohibited_in_chat">Ebben a csoportban tiltott a tagok közötti közvetlen üzenetek küldése.</string>
<string name="ttl_min">%d perc</string>
<string name="set_password_to_export_desc">Az adatbázis egy véletlenszerű jelmondattal van titkosítva. Exportálás előtti módosítás szükséges!</string>
<string name="set_password_to_export_desc">Az adatbázis egy véletlenszerű jelmondattal van titkosítva. Exportálás előtt változtassa meg a jelmondatot.</string>
<string name="receipts_groups_title_disable">Üzenet kézbesítés jelentéseket letiltása a csoportok számára?</string>
<string name="custom_time_unit_days">nap</string>
<string name="ttl_day">%d nap</string>
@@ -419,7 +419,7 @@
<string name="receipts_contacts_disable_keep_overrides">Letiltás (felülírások megtartásával)</string>
<string name="database_upgrade">Adatbázis fejlesztése</string>
<string name="blocked_items_description">%d üzenet letiltva</string>
<string name="info_row_disappears_at">Eltűnik ekkor</string>
<string name="info_row_disappears_at">Eltűnik ekkor:</string>
<string name="ttl_weeks">%d hét</string>
<string name="feature_enabled_for_you">engedélyezve az ön számára</string>
<string name="timed_messages">Eltűnő üzenetek</string>
@@ -433,7 +433,7 @@
<string name="database_will_be_encrypted_and_passphrase_stored">Az adatbázis titkosításra kerül és a jelmondat eltárolásra a Keystore-ban.</string>
<string name="enable_automatic_deletion_question">Automatikus üzenet törlés engedélyezése?</string>
<string name="delete_contact_menu_action">Törlés</string>
<string name="mtr_error_no_down_migration">az adatbázis verzió újabb, mint az alkalmazás, de nincs lefelé migráció eddig: %s</string>
<string name="mtr_error_no_down_migration">az adatbázis verziója újabb, mint az alkalmazásé, visszafelé átköltöztetés nem lehetséges a következőhöz: %s</string>
<string name="simplex_link_mode_description">Leírás</string>
<string name="ttl_hour">%d óra</string>
<string name="ttl_m">%dp</string>
@@ -497,7 +497,7 @@
<string name="enable_self_destruct">Önmegsemmisítés engedélyezése</string>
<string name="v5_2_favourites_filter_descr">Olvasatlan és kedvenc csevegésekre való szűrés.</string>
<string name="failed_to_parse_chats_title">A csevegések betöltése sikertelen</string>
<string name="connect_plan_group_already_exists">A csoport már létezik!</string>
<string name="connect_plan_group_already_exists">Már tagja a csoportnak!</string>
<string name="v4_4_french_interface">Francia kezelőfelület</string>
<string name="v4_2_group_links">Csoport hivatkozások</string>
<string name="v5_1_message_reactions_descr">Végre, megvannak! 🚀</string>
@@ -521,7 +521,7 @@
<string name="settings_experimental_features">Kísérleti funkciók</string>
<string name="receipts_contacts_enable_keep_overrides">Engedélyezés (felülírások megtartásával)</string>
<string name="enter_correct_passphrase">Helyes jelmondat bevitele.</string>
<string name="delete_group_for_self_cannot_undo_warning">A csoport törlésre kerül az ön részére - ez nem vonható vissza!</string>
<string name="delete_group_for_self_cannot_undo_warning">A csoport törlésre kerül az ön részére - ez a művelet nem vonható vissza!</string>
<string name="encrypt_database_question">Adatbázis titkosítása?</string>
<string name="allow_accepting_calls_from_lock_screen">A zárolási képernyőn megjelenő hívások engedélyezése a Beállításokban.</string>
<string name="conn_event_ratchet_sync_agreed">titkosítás egyeztetve</string>
@@ -549,22 +549,22 @@
<string name="enter_password_to_show">Jelszó megadása a keresőben</string>
<string name="file_will_be_received_when_contact_completes_uploading">A fájl akkor érkezik meg, amikor az ismerőse befejezte annak feltöltését.</string>
<string name="smp_server_test_download_file">Fájl letöltése</string>
<string name="failed_to_parse_chat_title">Csevegés betöltése sikertelen</string>
<string name="failed_to_parse_chat_title">A csevegés betöltése sikertelen</string>
<string name="smp_servers_enter_manually">Kiszolgáló megadása kézzel</string>
<string name="file_will_be_received_when_contact_is_online">A fájl akkor érkezik meg, amikor az ismerőse online lesz, várjon, vagy ellenőrizze később!</string>
<string name="error_creating_link_for_group">Hiba a csoport hivatkozásának létrehozásakor</string>
<string name="from_gallery_button">A Galériából</string>
<string name="receipts_groups_enable_keep_overrides">Engedélyezés (csoport felülírások megtartásával)</string>
<string name="error_deleting_contact">Hiba az ismerős törlésekor</string>
<string name="group_members_can_delete">Csoporttagok visszafordíthatatlanul törölhetik az elküldött üzeneteket. (24 óra)</string>
<string name="group_members_can_delete">A csoport tagjai véglegesen törölhetik az elküldött üzeneteiket. (24 óra)</string>
<string name="error_changing_role">Hiba a szerepkör megváltoztatásakor</string>
<string name="fix_connection_confirm">Javítás</string>
<string name="group_members_can_send_disappearing">Csoporttagok küldhetnek eltűnő üzeneteket.</string>
<string name="group_members_can_send_disappearing">A csoport tagjai küldhetnek eltűnő üzeneteket.</string>
<string name="fix_connection">Kapcsolat javítása</string>
<string name="failed_to_create_user_title">Hiba a profil létrehozásakor!</string>
<string name="error_adding_members">Hiba a tag(-ok) hozzáadásakor</string>
<string name="icon_descr_file">Fájl</string>
<string name="group_members_can_send_files">Csoporttagok küldhetnek fájlokat és médiatartalmakat.</string>
<string name="group_members_can_send_files">A csoport tagjai küldhetnek fájlokat és médiatartalmakat.</string>
<string name="delete_after">Törlés miután</string>
<string name="error_changing_message_deletion">Hiba a beállítás megváltoztatásakor</string>
<string name="error_updating_link_for_group">Hiba a csoport hivatkozás frissítésekor</string>
@@ -574,18 +574,18 @@
<string name="error_importing_database">Hiba a csevegési adatbázis importálásakor</string>
<string name="error_enabling_delivery_receipts">Hiba a kézbesítési jelentések engedélyezésekor!</string>
<string name="error_saving_xftp_servers">Hiba az XFTP kiszolgálók mentésekor</string>
<string name="group_members_can_send_dms">Csoporttagok küldhetnek közvetlen üzeneteket.</string>
<string name="group_members_can_send_dms">A csoport tagjai küldhetnek egymásnak közvetlen üzeneteket.</string>
<string name="error_removing_member">Hiba a tag eltávolításakor</string>
<string name="callstate_ended">befejeződött</string>
<string name="v4_6_group_welcome_message">Csoport üdvözlő üzenete</string>
<string name="group_display_name_field">Csoport neve:</string>
<string name="error_sending_message_contact_invitation">Hiba a meghívó küldésekor</string>
<string name="display_name">Adja meg nevét:</string>
<string name="display_name">Adjon meg egy nevet:</string>
<string name="error_saving_user_password">Hiba a felhasználó jelszavának mentésekor</string>
<string name="export_theme">Téma exportálása</string>
<string name="enter_this_device_name">Eszköznév megadása…</string>
<string name="error">Hiba</string>
<string name="alert_message_group_invitation_expired">A csoport meghívó már nem érvényes, el lett távolítva a küldője által.</string>
<string name="alert_message_group_invitation_expired">A csoport meghívó már nem érvényes, a küldője törölte.</string>
<string name="group_full_name_field">A csoport teljes neve:</string>
<string name="icon_descr_help">segítség</string>
<string name="enabled_self_destruct_passcode">Önmegsemmisítő jelkód engedélyezése</string>
@@ -598,18 +598,18 @@
<string name="fix_connection_not_supported_by_contact">Ismerős általi javítás nem támogatott</string>
<string name="file_not_found">Fájl nem található</string>
<string name="smp_server_test_disconnect">Kapcsolat bontása</string>
<string name="group_members_can_add_message_reactions">Csoporttagok üzenetreakciókat adhatnak hozzá.</string>
<string name="group_members_can_add_message_reactions">A csoport tagjai üzenetreakciókat adhatnak hozzá.</string>
<string name="export_database">Adatbázis exportálása</string>
<string name="full_name__field">Teljes név:</string>
<string name="v4_6_reduced_battery_usage">Tovább csökkentett akkumulátor használat</string>
<string name="error_stopping_chat">Hiba a csevegés megállításakor</string>
<string name="snd_conn_event_ratchet_sync_ok">titkosítás rendben %s számára</string>
<string name="delete_group_for_all_members_cannot_undo_warning">Csoport törlésre kerül minden tag számára - ez nem vonható vissza!</string>
<string name="delete_group_for_all_members_cannot_undo_warning">Csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!</string>
<string name="v5_2_fix_encryption_descr">Titkosítás javítása az adatmentések helyreállítása után.</string>
<string name="error_deleting_database">Hiba a csevegési adatbázis törlésekor</string>
<string name="simplex_link_mode_full">Teljes hivatkozás</string>
<string name="error_changing_address">Hiba az azonosító megváltoztatásakor</string>
<string name="group_members_can_send_voice">Csoporttagok küldhetnek hangüzeneteket.</string>
<string name="group_members_can_send_voice">A csoport tagjai küldhetnek hangüzeneteket.</string>
<string name="group_preferences">Csoport beállítások</string>
<string name="error_with_info">Hiba: %s</string>
<string name="v4_4_disappearing_messages">Eltűnő üzenetek</string>
@@ -650,7 +650,7 @@
<string name="notification_preview_mode_hidden">Rejtett</string>
<string name="host_verb">Házigazda</string>
<string name="initial_member_role">Kezdeti szerepkör</string>
<string name="invalid_chat">Érvénytelen csevegés</string>
<string name="invalid_chat">érvénytelen csevegés</string>
<string name="custom_time_unit_hours">óra</string>
<string name="incognito">Inkognitó</string>
<string name="how_to_use_simplex_chat">Használati útmutató</string>
@@ -672,12 +672,12 @@
<string name="error_creating_member_contact">Hiba az ismerőssel történő kapcsolat létrehozásában</string>
<string name="enter_one_ICE_server_per_line">ICE-kiszolgálók (soronként egy)</string>
<string name="if_you_cannot_meet_in_person_scan_QR_in_video_call_or_ask_for_invitation_link"><![CDATA[Ha nem tud személyesen találkozni, <b>beolvashatja a QR-kódot a videohívásban</b>, vagy az ismerőse megoszthat egy meghívó hivatkozást.]]></string>
<string name="if_you_enter_passcode_data_removed">Ha az alkalmazás megnyitásakor megadja ezt a jelkódot, az összes alkalmazásadat visszafordíthatatlanul törlődik!</string>
<string name="if_you_enter_passcode_data_removed">Ha az alkalmazás megnyitásakor megadja ezt a jelkódot, az összes alkalmazásadat véglegesen törlődik!</string>
<string name="if_you_cant_meet_in_person">Ha nem tud személyesen találkozni, mutassa meg a QR-kódot egy videohívás során, vagy ossza meg a hivatkozást.</string>
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel"><![CDATA[Ha nem tud személyesen találkozni, <b>mutassa meg a QR-kódot a videohívásban</b>, vagy ossza meg a hivatkozást.]]></string>
<string name="network_disable_socks_info">Megerősítés esetén az üzenetküldő kiszolgálók látni fogják az IP-címét és a szolgáltatóját azt, hogy mely kiszolgálókhoz csatlakozik.</string>
<string name="image_will_be_received_when_contact_completes_uploading">A kép akkor érkezik meg, amikor az ismerőse befejezte annak feltöltését.</string>
<string name="desktop_scan_QR_code_from_app_via_scan_QR_code"><![CDATA[💻 asztali számítógép: a megjelenített QR-kód beolvasása az alkalmazásból, a <b>QR kód beolvasásával</b>]]></string>
<string name="desktop_scan_QR_code_from_app_via_scan_QR_code"><![CDATA[💻 asztali számítógép: a megjelenített QR-kód beolvasása az alkalmazásból, a <b>QR kód beolvasásával</b>.]]></string>
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">Kapott SimpleX Chat meghívó hivatkozását megnyithatja böngészőjében:</string>
<string name="if_you_enter_self_destruct_code">Ha az alkalmazás megnyitásakor az önmegsemmisítő jelkódot megadásra kerül:</string>
<string name="found_desktop">Megtalált számítógép</string>
@@ -690,20 +690,20 @@
<string name="if_you_choose_to_reject_the_sender_will_not_be_notified">Elutasítás esetén a feladó NEM kap értesítést.</string>
<string name="icon_descr_expand_role">Szerepkör kiválasztásának bővítése</string>
<string name="image_will_be_received_when_contact_is_online">A kép akkor érkezik meg, amikor az ismerőse elérhető lesz, várjon, vagy ellenőrizze később!</string>
<string name="group_member_status_invited">meghívott</string>
<string name="group_member_status_invited">meghívta</string>
<string name="invalid_connection_link">Érvénytelen kapcsolati hivatkozás</string>
<string name="mute_chat">Némítás</string>
<string name="no_details">nincsenek részletek</string>
<string name="icon_descr_call_missed">Nem fogadott hívás</string>
<string name="theme_light">Világos</string>
<string name="delete_message_cannot_be_undone_warning">Az üzenet törlésre kerül - ez nem vonható vissza!</string>
<string name="delete_message_cannot_be_undone_warning">Az üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="markdown_help">Markdown segítség</string>
<string name="notification_preview_new_message">új üzenet</string>
<string name="old_database_archive">Régi adatbázis archívum</string>
<string name="network_settings_title">Hálózati beállítások</string>
<string name="no_info_on_delivery">Nincs kézbesítési információ</string>
<string name="moderated_description">moderált</string>
<string name="member_will_be_removed_from_group_cannot_be_undone">A tag eltávolítása a csoportból - ez nem vonható vissza!</string>
<string name="member_will_be_removed_from_group_cannot_be_undone">A tag eltávolítása a csoportból - ez a művelet nem vonható vissza!</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Győződjön meg róla, hogy az XFTP-kiszolgáló címei megfelelő formátumúak, sorszeparáltak és nem duplikáltak.</string>
<string name="no_contacts_selected">Nem kerültek ismerősök kiválasztásra</string>
<string name="no_received_app_files">Nincsenek fogadott, vagy küldött fájlok</string>
@@ -721,7 +721,7 @@
<string name="info_row_local_name">Helyi név</string>
<string name="network_and_servers">Hálózat és kiszolgálók</string>
<string name="settings_notification_preview_title">Értesítés előnézet</string>
<string name="v5_4_link_mobile_desktop">Társítsa össze a mobil és az asztali alkalmazásokat! 🔗!</string>
<string name="v5_4_link_mobile_desktop">Társítsa össze a mobil és az asztali alkalmazásokat! 🔗</string>
<string name="conn_level_desc_indirect">közvetett (%1$s)</string>
<string name="v4_6_reduced_battery_usage_descr">Hamarosan további fejlesztések érkeznek!</string>
<string name="message_reactions_prohibited_in_this_chat">Az üzenetreakciók ebben a csevegésben le vannak tiltva.</string>
@@ -731,7 +731,7 @@
<string name="v4_6_group_moderation_descr">Most már az adminok is:
\n- törölhetik a tagok üzeneteit.
\n- letilthatnak tagokat (\"megfigyelő\" szerepkör)</string>
<string name="rcv_group_event_member_added">%1$s meghívott</string>
<string name="rcv_group_event_member_added">meghívta %1$s-t</string>
<string name="message_reactions_are_prohibited">Ebben a csoportban az üzenetreakciók le vannak tiltva.</string>
<string name="network_use_onion_hosts_no">Nem</string>
<string name="item_info_no_text">nincs szöveg</string>
@@ -754,8 +754,8 @@
<string name="notification_new_contact_request">Új kapcsolattartási kérelem</string>
<string name="joining_group">Csatlakozás a csoporthoz</string>
<string name="linked_desktop_options">Összekapcsolt számítógép beállítások</string>
<string name="rcv_group_event_invited_via_your_group_link">meghívott a csoport hivatkozásán keresztül</string>
<string name="rcv_group_event_member_left">elhagyta</string>
<string name="rcv_group_event_invited_via_your_group_link">meghívta a csoport hivatkozásán keresztül</string>
<string name="rcv_group_event_member_left">elhagyta a csoportot</string>
<string name="linked_desktops">Összekapcsolt számítógépek</string>
<string name="la_no_app_password">Nincs alkalmazás jelkód</string>
<string name="muted_when_inactive">Némítás, ha inaktív!</string>
@@ -764,19 +764,19 @@
<string name="moderate_verb">Moderálás</string>
<string name="chat_preferences_on">be</string>
<string name="v5_1_japanese_portuguese_interface">Japán és Portugál kezelőfelület</string>
<string name="message_deletion_prohibited_in_chat">Ebben a csoportban az üzenetek visszafordíthatatlan törlése le van tiltva.</string>
<string name="message_deletion_prohibited_in_chat">Ebben a csoportban az üzenetek végleges törlése le van tiltva.</string>
<string name="network_use_onion_hosts_no_desc_in_alert">Onion kiszolgálók nem lesznek használva.</string>
<string name="remote_host_was_disconnected_toast"><![CDATA[A(z) <b>%s</b> eszközzel megszakadt a kapcsolat]]></string>
<string name="custom_time_unit_months">hónap</string>
<string name="privacy_message_draft">Üzenetvázlat</string>
<string name="v5_2_disappear_one_message">Egy üzenet eltüntetése</string>
<string name="v4_3_irreversible_message_deletion">Visszafordíthatatlan üzenettörlés</string>
<string name="v4_3_irreversible_message_deletion">Végleges üzenettörlés</string>
<string name="videos_limit_desc">Egyszerre csak 10 videó küldhető el</string>
<string name="only_you_can_add_message_reactions">Csak ön adhat hozzá üzenetreakciókat.</string>
<string name="group_member_status_left">elhagyta</string>
<string name="message_deletion_prohibited">Ebben a csevegésben az üzenetek visszafordíthatatlan törlése le van tiltva.</string>
<string name="group_member_status_left">elhagyta a csoportot</string>
<string name="message_deletion_prohibited">Ebben a csevegésben az üzenetek végleges törlése le van tiltva.</string>
<string name="v4_3_voice_messages_desc">Max 40 másodperc, azonnal fogadható.</string>
<string name="description_via_contact_address_link_incognito">inkognitó a ismerős azonosító hivatkozáson keresztül</string>
<string name="description_via_contact_address_link_incognito">inkognitó az ismerős azonosító hivatkozásán keresztül</string>
<string name="network_use_onion_hosts_required_desc">A kapcsolódáshoz Onion kiszolgálókra lesz szükség.
\nFigyelem: .onion cím nélkül nem fog tudni kapcsolódni a kiszolgálókhoz.</string>
<string name="v4_5_italian_interface">Olasz kezelőfelület</string>
@@ -788,19 +788,19 @@
<string name="leave_group_button">Elhagy</string>
<string name="ok">Rendben</string>
<string name="no_filtered_chats">Nincsenek szűrt csevegések</string>
<string name="invalid_data">Érvénytelen adat</string>
<string name="invalid_data">érvénytelen adat</string>
<string name="ensure_ICE_server_address_are_correct_format_and_unique">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.</string>
<string name="only_owners_can_enable_files_and_media">Csak a csoporttulajdonosok engedélyezhetik a fájlok- és a médiatartalmak küldését.</string>
<string name="loading_remote_file_title">A fájl betöltése</string>
<string name="no_contacts_to_add">Nincs hozzáadandó ismerős</string>
<string name="v4_5_message_draft">Üzenetvázlat</string>
<string name="display_name_invited_to_connect">meghívott, hogy csatlakozzon</string>
<string name="display_name_invited_to_connect">meghívta</string>
<string name="add_contact">Egyszer használatos meghívó hivatkozás</string>
<string name="notifications">Értesítések</string>
<string name="images_limit_desc">Egyszerre csak 10 kép küldhető el</string>
<string name="feature_offered_item_with_param">ajánlott %s: %2s</string>
<string name="not_compatible">Nem kompatibilis!</string>
<string name="make_profile_private">Tegye priváttá profilját!</string>
<string name="make_profile_private">Tegye priváttá a profilját!</string>
<string name="message_delivery_error_title">Üzenetkézbesítési hiba</string>
<string name="v4_5_multiple_chat_profiles">Több csevegőprofil</string>
<string name="marked_deleted_description">töröltnek jelölve</string>
@@ -820,7 +820,7 @@
<string name="auth_log_in_using_credential">Bejelentkezés hitelesítő adatokkal</string>
<string name="invalid_message_format">érvénytelen üzenet formátum</string>
<string name="join_group_button">Csatlakozás</string>
<string name="shutdown_alert_desc">Az értesítések az alkalmazás elindításáig nem fognak működni.</string>
<string name="shutdown_alert_desc">Az értesítések az alkalmazás elindításáig nem fognak működni</string>
<string name="chat_preferences_off">ki</string>`
<string name="this_device_version"><![CDATA[<i>(ez az eszköz) v%s)</i>]]></string>
<string name="feature_offered_item">ajánlott %s</string>
@@ -840,12 +840,12 @@
<string name="group_preview_join_as">csatlakozás mint %s</string>
<string name="no_selected_chat">Nincs kiválasztott csevegés</string>
<string name="users_delete_data_only">Csak helyi profiladatok</string>
<string name="description_via_one_time_link_incognito">inkognitó egyszer használatos hivatkozás által</string>
<string name="share_text_moderated_at">Moderálva ekkor: %s</string>
<string name="description_via_one_time_link_incognito">inkognitó az egyszer használatos hivatkozáson keresztül</string>
<string name="share_text_moderated_at">Moderálva lett ekkor: %s</string>
<string name="one_time_link">Egyszer használatos meghívó hivatkozás</string>
<string name="invalid_name">Érvénytelen név!</string>
<string name="email_invite_subject">Beszélgessünk a SimpleX Chat-ben</string>
<string name="info_row_moderated_at">Moderálva ekkor</string>
<string name="info_row_moderated_at">Moderálva lett ekkor:</string>
<string name="v4_4_live_messages">Élő üzenetek</string>
<string name="mark_code_verified">Ellenőrzöttként jelölve</string>
<string name="v5_2_message_delivery_receipts">Üzenetkézbesítési bizonylatok!</string>
@@ -866,7 +866,7 @@
<string name="settings_section_title_messages">ÜZENETEK ÉS FÁJLOK</string>
<string name="group_member_role_member">tag</string>
<string name="make_private_connection">Privát kapcsolat létrehozása</string>
<string name="moderated_item_description">Moderálva %s által</string>
<string name="moderated_item_description">moderálva lett %s által</string>
<string name="import_theme_error_desc">Győződjön meg arról, hogy a fájl helyes YAML-szintaxist tartalmaz. Exportálja a témát, hogy legyen egy példa a téma fájl szerkezetére.</string>
<string name="italic_text">dőlt</string>
<string name="non_content_uri_alert_title">Érvénytelen fájl elérési útvonal</string>
@@ -879,12 +879,12 @@
<string name="incoming_audio_call">Bejövő hanghívás</string>
<string name="keychain_error">Kulcstartó hiba</string>
<string name="join_group_question">Csatlakozik a csoporthoz?</string>
<string name="incognito_info_protects">Az inkognitómód védi személyes adatait azáltal, hogy minden ismerőshöz új véletlenszerű profilt használ.</string>
<string name="incognito_info_protects">Az inkognitó mód védi személyes adatait azáltal, hogy minden ismerőshöz új véletlenszerű profilt használ.</string>
<string name="v5_2_more_things_descr">- stabilabb üzenetkézbesítés.
\n- valamivel jobb csoportok.
\n- és még sok más!</string>
<string name="v5_1_message_reactions">Üzenetreakciók</string>
<string name="no_connected_mobile">Nincs csatlakoztatott mobil eszköz</string>
<string name="no_connected_mobile">Nincs társított mobil eszköz</string>
<string name="network_status">Hálózat állapota</string>
<string name="new_passcode">Új jelkód</string>
<string name="message_delivery_error_desc">Valószínűleg ez az ismerős törölte önnel a kapcsolatot.</string>
@@ -894,7 +894,7 @@
<string name="onboarding_notifications_mode_periodic">Rendszeres</string>
<string name="feature_received_prohibited">fogadott, tiltott</string>
<string name="connect_plan_repeat_connection_request">Kapcsolódási kérés megismétlése?</string>
<string name="only_you_can_delete_messages">Visszafordíthatatlanul csak ön törölhet üzeneteket (ismerőse csak törlésre jelölheti őket ). (24 óra)</string>
<string name="only_you_can_delete_messages">Véglegesen csak ön törölhet üzeneteket (ismerőse csak törlésre jelölheti őket ). (24 óra)</string>
<string name="role_in_group">Szerepkör</string>
<string name="simplex_link_contact">SimpleX ismerős azonosítója</string>
<string name="stop_file__confirm">Megállítás</string>
@@ -921,7 +921,7 @@
<string name="update_network_settings_confirmation">Frissítés</string>
<string name="icon_descr_video_snd_complete">Videó elküldve</string>
<string name="update_database_passphrase">Adatbázis jelmondat megváltoztatása</string>
<string name="turn_off_system_restriction_button">App beállítások megnyitása</string>
<string name="turn_off_system_restriction_button">Alkalmazás beállítások megnyitása</string>
<string name="passcode_not_changed">A jelkód nem változott!</string>
<string name="refresh_qr_code">Frissítés</string>
<string name="custom_time_picker_select">Választás</string>
@@ -939,7 +939,7 @@
<string name="share_verb">Megosztás</string>
<string name="received_message">Fogadott üzenet</string>
<string name="button_welcome_message">Üdvözlő üzenet</string>
<string name="rcv_group_event_n_members_connected">%s, %s és %d további tag csatlakozott</string>
<string name="rcv_group_event_n_members_connected">%s, %s és további %d tag csatlakozott</string>
<string name="only_your_contact_can_make_calls">Csak az ismerőse tud hívást indítani.</string>
<string name="settings_section_title_themes">TÉMÁK</string>
<string name="videos_limit_title">Túl sok videó!</string>
@@ -982,27 +982,27 @@
<string name="revoke_file__confirm">Visszavon</string>
<string name="ask_your_contact_to_enable_voice">Ismerős felkérése, hogy engedélyezze a hangüzenetek küldését.</string>
<string name="description_you_shared_one_time_link">egyszer használatos hivatkozást osztott meg</string>
<string name="simplex_link_mode_browser_warning">A hivatkozás megnyitása böngészőben gyengítheti az adatvédelem és biztonság szintjét. A megbízhatatlan SimpleX hivatkozások vörössel vannak kiemelve.</string>
<string name="simplex_link_mode_browser_warning">A hivatkozás megnyitása a böngészőben gyengítheti az adatvédelmet és a biztonságot. A megbízhatatlan SimpleX hivatkozások pirossal vannak kiemelve.</string>
<string name="your_ice_servers">ICE kiszolgálók</string>
<string name="you_accepted_connection">Kapcsolódás elfogadva</string>
<string name="reject_contact_button">Elutasítás</string>
<string name="notification_preview_mode_message_desc">Ismerős és üzenet mutatása</string>
<string name="notification_preview_mode_message_desc">Ismerős és üzenet megjelenítése</string>
<string name="settings_section_title_settings">BEÁLLÍTÁSOK</string>
<string name="save_profile_password">Felhasználói fiók jelszavának mentése</string>
<string name="stop_snd_file__title">Fájl küldés megszakítása?</string>
<string name="unlink_desktop_question">Számítógép leválasztása?</string>
<string name="voice_messages_prohibited">A hangüzenetek le vannak tilva!</string>
<string name="compose_send_direct_message_to_connect">A kapcsolódáshoz közvetlen üzenet küldése</string>
<string name="compose_send_direct_message_to_connect">Közvetlen üzenet küldése a csatlakozáshoz</string>
<string name="network_option_ping_count">PING számláló</string>
<string name="show_developer_options">Fejlesztői beállítások mutatása</string>
<string name="rcv_group_event_1_member_connected">%s csatlakozva</string>
<string name="show_developer_options">Fejlesztői beállítások megjelenítése</string>
<string name="rcv_group_event_1_member_connected">%s csatlakozott</string>
<string name="theme_system">Rendszer</string>
<string name="network_use_onion_hosts_prefer">Amikor elérhető</string>
<string name="voice_message_with_duration">Hangüzenet (%1$s)</string>
<string name="current_version_timestamp">%s (jelenlegi)</string>
<string name="smp_servers_your_server">Saját kiszolgáló</string>
<string name="random_port">Véletlen</string>
<string name="share_with_contacts">Megosztás ismerősökkel...</string>
<string name="share_with_contacts">Megosztás az ismerősökkel</string>
<string name="sender_you_pronoun">ön</string>
<string name="you_have_no_chats">Nincsenek csevegési üzenetek</string>
<string name="send_disappearing_message_send">Küldés</string>
@@ -1039,7 +1039,7 @@
<string name="submit_passcode">Elküldés</string>
<string name="security_code">Biztonsági kód</string>
<string name="enter_correct_current_passphrase">Adja meg a helyes aktuális jelmondatát.</string>
<string name="prohibit_message_deletion">Az elküldött üzenetek visszafordíthatatlan törlése le van tiltva.</string>
<string name="prohibit_message_deletion">Az elküldött üzenetek végleges törlése le van tiltva.</string>
<string name="prohibit_message_reactions">Üzenetreakció tiltása.</string>
<string name="use_random_passphrase">Véletlenszerű jelmondat használata</string>
<string name="call_connection_peer_to_peer">egyenrangú</string>
@@ -1048,11 +1048,11 @@
<string name="smp_save_servers_question">Kiszolgálók mentése?</string>
<string name="v4_2_security_assessment_desc">A SimpleX Chat biztonsága a Trail of Bits által lett auditálva.</string>
<string name="rcv_group_event_updated_group_profile">módosított csoport profil</string>
<string name="settings_section_title_support">TÁMOGASSA A SIMPLEX CHATET!</string>
<string name="settings_section_title_support">TÁMOGASSA A SIMPLEX CHATET</string>
<string name="simplex_service_notification_title">SimpleX Chat szolgáltatás</string>
<string name="observer_cant_send_message_title">Nem lehet üzeneteket küldeni!</string>
<string name="is_verified">%s ellenőrzött</string>
<string name="password_to_show">Jelszó mutatása</string>
<string name="password_to_show">Jelszó megjelenítése</string>
<string name="privacy_and_security">Adatvédelem és biztonság</string>
<string name="button_remove_member">Tag eltávolítása</string>
<string name="passcode_set">A jelkód beállítva!</string>
@@ -1072,7 +1072,7 @@
<string name="shutdown_alert_question">Leállítás?</string>
<string name="enter_passphrase_notification_title">Jelmondat szükséges</string>
<string name="onboarding_notifications_mode_title">Privát értesítések</string>
<string name="you_invited_a_contact">Meghívott egy ismerőst</string>
<string name="you_invited_a_contact">Meghívta egy ismerősét</string>
<string name="is_not_verified">%s nincs ellenőrizve</string>
<string name="contact_tap_to_connect">Koppintson a csatlakozáshoz</string>
<string name="this_device_name">Ennek az eszköznek a neve</string>
@@ -1093,13 +1093,13 @@
<string name="your_chat_profiles">Csevegési profilok</string>
<string name="group_member_role_owner">tulajdonos</string>
<string name="la_notice_turn_on">Bekapcsolás</string>
<string name="rcv_group_event_3_members_connected">%s, %s és %s csatlakozott</string>
<string name="rcv_group_event_3_members_connected">%s, %s és %s csatlakoztak</string>
<string name="simplex_link_invitation">SimpleX egyszer használatos meghívó</string>
<string name="your_calls">Hívások</string>
<string name="icon_descr_sent_msg_status_send_failed">küldés sikertelen</string>
<string name="theme_colors_section_title">TÉMA SZÍNEK</string>
<string name="network_options_revert">Visszaállít</string>
<string name="restore_database_alert_desc">Előző jelszó megadása az adatbázis biztonsági mentésének visszaállítása után. Ez a művelet nem visszavonható.</string>
<string name="restore_database_alert_desc">Előző jelszó megadása az adatbázis biztonsági mentésének visszaállítása után. Ez a művelet nem vonható vissza.</string>
<string name="color_secondary">Másodlagos</string>
<string name="settings_section_title_socks">SOCKS PROXY</string>
<string name="save_servers_button">Mentés</string>
@@ -1134,7 +1134,7 @@
<string name="settings_section_title_use_from_desktop">Használat számítógépről</string>
<string name="settings_section_title_you">ÖN</string>
<string name="network_proxy_port">port %d</string>
<string name="to_connect_via_link_title">Kapcsolódás hivatkozás által</string>
<string name="to_connect_via_link_title">Csatlakozás hivatkozáson keresztül</string>
<string name="share_address">Azonosító megosztása</string>
<string name="smp_servers_scan_qr">A kiszolgáló QR-kódjának beolvasása</string>
<string name="stop_chat_confirmation">Megállítás</string>
@@ -1147,17 +1147,17 @@
<string name="verify_security_code">Biztonsági kód ellenőrzése</string>
<string name="rcv_group_event_user_deleted">eltávolítottak</string>
<string name="simplex_address">SimpleX azonosító</string>
<string name="show_dev_options">Mutat:</string>
<string name="show_dev_options">Megjelenítés:</string>
<string name="callstate_received_answer">fogadott válasz…</string>
<string name="restore_database_alert_title">Adatbázismentés visszaállítása?</string>
<string name="simplex_service_notification_text">Üzenetek fogadása…</string>
<string name="rcv_group_event_2_members_connected">%s és %s csatlakozva</string>
<string name="rcv_group_event_2_members_connected">%s és %s csatlakoztak</string>
<string name="you_are_observer">megfigyelő szerep</string>
<string name="port_verb">Port</string>
<string name="set_passcode">Jelkód beállítása</string>
<string name="whats_new">Változáslista</string>
<string name="connect_plan_open_group">Csoport megnyitása</string>
<string name="info_row_sent_at">Elküldve ekkor</string>
<string name="info_row_sent_at">Elküldve ekkor:</string>
<string name="prohibit_sending_voice">Hangüzenetek küldése le van tiltva.</string>
<string name="privacy_show_last_messages">Utolsó üzenetek megjelenítése</string>
<string name="smp_servers_preset_address">Az előre beállított kiszolgáló címe</string>
@@ -1184,7 +1184,7 @@
<string name="periodic_notifications">Rendszeres értesítések</string>
<string name="alert_title_skipped_messages">Kihagyott üzenetek</string>
<string name="prohibit_sending_voice_messages">A hangüzenetek küldése le van tiltva.</string>
<string name="set_contact_name">Ismerős nevének beállítása...</string>
<string name="set_contact_name">Ismerős nevének beállítása</string>
<string name="only_you_can_send_disappearing">Csak ön tud eltűnő üzeneteket küldeni.</string>
<string name="share_image">Kép/videó megoszása…</string>
<string name="group_info_member_you">ön: %1$s</string>
@@ -1203,13 +1203,13 @@
<string name="send_live_message">Élő üzenet küldése</string>
<string name="privacy_redefined">Adatvédelem újraértelmezve</string>
<string name="voice_message_send_text">Hangüzenet…</string>
<string name="protect_app_screen">App képernyőjének védelme</string>
<string name="protect_app_screen">Alkalmazás képernyőjének védelme</string>
<string name="show_QR_code">QR-kód megjelenítése</string>
<string name="icon_descr_video_call">videóhívás</string>
<string name="unfavorite_chat">Nem kedvenc</string>
<string name="send_receipts">Üzenet kézbesítési jelentések küldése</string>
<string name="icon_descr_address">SimpleX azonosító</string>
<string name="chat_help_tap_button">Koppintson a gombra</string>
<string name="chat_help_tap_button">Koppintson a</string>
<string name="save_and_notify_contact">Mentés és ismerős értesítése</string>
<string name="icon_descr_call_rejected">Elutasított hívás</string>
<string name="network_socks_proxy_settings">SOCKS proxy beállítások</string>
@@ -1234,7 +1234,7 @@
<string name="network_enable_socks">SOCKS proxy használata?</string>
<string name="icon_descr_speaker_off">Hangszóró kikapcsolva</string>
<string name="custom_time_unit_weeks">hét</string>
<string name="show_call_on_lock_screen">Mutasd</string>
<string name="show_call_on_lock_screen">Megjelenítés</string>
<string name="webrtc_ice_servers">WebRTC ICE kiszolgálók</string>
<string name="revoke_file__title">Fájl visszavonása?</string>
<string name="button_send_direct_message">Közvetlen üzenet küldése</string>
@@ -1262,7 +1262,7 @@
<string name="reset_verb">Alaphelyzetbe állítás</string>
<string name="only_your_contact_can_add_message_reactions">Csak az ismerőse tud üzenetreakciókat küldeni.</string>
<string name="voice_messages">Hangüzenetek</string>
<string name="snd_group_event_user_left">elhagyta</string>
<string name="snd_group_event_user_left">elhagyta a csoportot</string>
<string name="icon_descr_record_voice_message">Hangüzenet rögzítése</string>
<string name="auth_simplex_lock_turned_on">SimpleX zárolás bekapcsolva</string>
<string name="member_contact_send_direct_message">közvetlen üzenet küldése</string>
@@ -1273,38 +1273,38 @@
<string name="lock_not_enabled">SimpleX zárolás nincs engedélyezve!</string>
<string name="chat_lock">SimpleX zárolás</string>
<string name="your_settings">Beállítások</string>
<string name="your_chat_database">Csevegési adatbázisa</string>
<string name="your_chat_database">Csevegési adatbázis</string>
<string name="rcv_group_event_member_deleted">%1$s eltávolítva</string>
<string name="smp_servers_test_failed">A kiszolgáló tesztje sikertelen!</string>
<string name="verify_connection">Kapcsolat ellenőrzése</string>
<string name="whats_new_read_more">Tudjon meg többet</string>
<string name="sender_cancelled_file_transfer">A küldő megszakította a fájl átvitelt.</string>
<string name="stop_chat_question">Csevegési szolgáltatás megállítása?</string>
<string name="info_row_received_at">Fogadva ekkor</string>
<string name="info_row_received_at">Fogadva ekkor:</string>
<string name="accept_feature_set_1_day">Beállítva 1 nap</string>
<string name="user_unhide">Felfedés</string>
<string name="color_received_message">Fogadott üzenet</string>
<string name="only_your_contact_can_delete">Csak az ismerős tud visszafordíthatatlanul törölni üzeneteket (megjelölheti őket törlésre). (24 óra)</string>
<string name="only_your_contact_can_delete">Csak az ismerőse tudja az üzeneteket véglegesen törölni (ön csak törlésre jelölheti meg azokat). (24 óra)</string>
<string name="self_destruct_passcode_changed">Az önmegsemmisítési jelkód megváltozott!</string>
<string name="using_simplex_chat_servers">SimpleX Chat kiszolgálók használatban.</string>
<string name="use_simplex_chat_servers__question">SimpleX Chat kiszolgálók használata?</string>
<string name="unhide_chat_profile">Csevegési profil felfedése</string>
<string name="v5_0_large_files_support">Videók és fájlok 1Gb méretig</string>
<string name="network_option_tcp_connection_timeout">TCP kapcsolat időtúllépés</string>
<string name="connect__your_profile_will_be_shared">A %1$s SimpleX azonosítója megosztásra kerül.</string>
<string name="you_are_already_connected_to_vName_via_this_link">Már csatlakozott: %1$s.</string>
<string name="connect__your_profile_will_be_shared">A(z) %1$s nevű profiljának SimpleX azonosítója megosztásra fog kerülni.</string>
<string name="you_are_already_connected_to_vName_via_this_link">Ön már csatlakozott ehhez: %1$s.</string>
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">Jelenlegi csevegési adatbázis TÖRLÉSRE és FELCSERÉLÉSRE kerül az importált által!
\nEz a művelet nem visszavonható - profilok, ismerősök, csevegési üzenetek és fájlok véglegesen elvesznek!</string>
\nEz a művelet nem vonható vissza - profiljai, ismerősei, csevegési üzenetei és fájljai véglegesen törölve lesznek!</string>
<string name="chat_with_the_founder">Ötletek és javaslatok</string>
<string name="database_downgrade_warning">Figyelmeztetés: néhány adat elveszhet!</string>
<string name="tap_to_start_new_chat">Koppintson az új csevegés indításához</string>
<string name="waiting_for_desktop">Várakozás a számítógépre…</string>
<string name="next_generation_of_private_messaging">A privát üzenetküldés következő generációja</string>
<string name="update_network_settings_question">Hálózati beállítások megváltoztatása?</string>
<string name="waiting_for_mobile_to_connect">Várakozás a mobiltelefon csatlakozására:</string>
<string name="waiting_for_mobile_to_connect">Várakozás a mobiltelefon társítására:</string>
<string name="v4_4_verify_connection_security">Kapcsolat biztonságának ellenőrzése</string>
<string name="sending_files_not_yet_supported">fájlok küldése egyelőre még nem támogatott</string>
<string name="snd_conn_event_switch_queue_phase_completed_for_member">Azonosítója erre változott: %s</string>
<string name="snd_conn_event_switch_queue_phase_completed_for_member">azonosítója erre változott: %s</string>
<string name="receiving_files_not_yet_supported">fájlok fogadása egyelőre még nem támogatott</string>
<string name="save_group_profile">Csoport profil mentése</string>
<string name="network_options_reset_to_defaults">Alaphelyzetbe állítás</string>
@@ -1357,8 +1357,8 @@
<string name="connected_to_server_to_receive_messages_from_contact">Kiszolgálóhoz történő csatlakozás, mely az adott ismerőstől érkező üzenetek fogadására szolgál.</string>
<string name="you_can_enable_delivery_receipts_later">Később engedélyezheti a Beállításokban</string>
<string name="you_will_be_connected_when_group_host_device_is_online">Akkor tud csatlakozni a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!</string>
<string name="mtr_error_different">eltérő migráció az appban/adatbázisban: %s / %s</string>
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[Már csatlakozik a következőhöz: <b>%1$s</b>.]]></string>
<string name="mtr_error_different">különböző átköltöztetés az alkalmazásban/adatbázisban: %s / %s</string>
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[Ön már csatlakozik a következőhöz: <b>%1$s</b>.]]></string>
<string name="unhide_profile">Profil felfedése</string>
<string name="this_link_is_not_a_valid_connection_link">Ez a hivatkozás nem érvényes kapcsolati hivatkozás!</string>
<string name="to_verify_compare">A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy szkennelje be) az ismerőse eszközén lévő kódot.</string>
@@ -1384,9 +1384,9 @@
<string name="system_restricted_background_in_call_warn"><![CDATA[A háttérben való hívásokhoz válassza ki az <b>Alkalmazás akkumulátor használata</b> / <b>Korlátlan</b> módot az alkalmazás beállításaiban.]]></string>
<string name="v5_4_link_mobile_desktop_descr">Biztonságos kvantumrezisztens protokollon keresztül.</string>
<string name="v5_1_better_messages_descr">- hangüzenetek 5 percig.
\n- egyedi eltűnési időhatár
\n- előzmény szerkesztése</string>
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[Megnyitás a <i>Használat számítógépről</i> gombra a mobil appban és olvassa be a QR-kódot!]]></string>
\n- egyedi eltűnési időhatár.
\n- előzmény szerkesztése.</string>
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[Válassza a <i>Használat számítógépről</i> menüpontot a mobil alkalmazásban és olvassa be a QR-kódot.]]></string>
<string name="sender_at_ts">%s at %s</string>
<string name="you_will_be_connected_when_your_contacts_device_is_online">Akkor csatlakozik, amikor az ismerősének az eszköze online lesz, várjon, vagy ellenőrizze később!</string>
<string name="v5_4_block_group_members_descr">Kéretlen üzenetek elrejtése.</string>
@@ -1402,37 +1402,37 @@
<string name="update_network_session_mode_question">Kapcsolat izolációs mód frissítése?</string>
<string name="network_session_mode_transport_isolation">Kapcsolat izolációs mód</string>
<string name="you_will_stop_receiving_messages_from_this_group_chat_history_will_be_preserved">Ettől a csoporttól nem fog értesítéseket kapni. A csevegési előzmények megmaradnak.</string>
<string name="database_is_not_encrypted">A csevegési adatbázis nem titkosított - állítson be egy jelmondatot annak védelméhez!</string>
<string name="database_is_not_encrypted">A csevegési adatbázis nem titkosított - állítson be egy jelmondatot annak védelméhez.</string>
<string name="network_disable_socks">Közvetlen internet kapcsolat használata?</string>
<string name="you_will_still_receive_calls_and_ntfs">Továbbra is kap hívásokat és értesítéseket a némított profiloktól, ha azok aktívak.</string>
<string name="group_main_profile_sent">A fő csevegési profilja megküldésre kerül a csoporttagok számára.</string>
<string name="group_main_profile_sent">A fő csevegési profilja megküldésre kerül a csoporttagok számára</string>
<string name="you_can_enable_delivery_receipts_later_alert">Később engedélyezheti őket az alkalmazás Adatvédelem és biztonság menüpontban.</string>
<string name="to_reveal_profile_enter_password">Rejtett profiljának felfedéséhez írja be a teljes jelszót a Csevegési profilok oldal keresőmezőjébe.</string>
<string name="upgrade_and_open_chat">A csevegés frissítése és megnyitása</string>
<string name="you_need_to_allow_to_send_voice">Hangüzeneteket küldéséhez engedélyeznie kell azok küldését az ismerősei számára.</string>
<string name="you_control_servers_to_receive_your_contacts_to_send"><![CDATA[Beállíthatja, hogy mely kiszolgáló(ko)n keresztül <b>fogadja</b> az üzeneteket, ismerősöket a kiszolgálók, amelyeket az üzenetküldéshez használ.]]></string>
<string name="connect_plan_you_are_already_in_group_vName"><![CDATA[Már a(z) <b>%1$s</b> csoport tagja.]]></string>
<string name="snd_conn_event_switch_queue_phase_completed">Azonosítója megváltoztatva</string>
<string name="snd_conn_event_switch_queue_phase_completed">azonosítója megváltoztatva</string>
<string name="v4_3_irreversible_message_deletion_desc">Ismerősei engedélyezhetik a teljes üzenet törlést.</string>
<string name="you_have_to_enter_passphrase_every_time">A jelmondatot minden alkalommal meg kell adnia, amikor az alkalmazás elindul - nem az eszközön kerül tárolásra.</string>
<string name="open_port_in_firewall_desc">Ha engedélyezni szeretné, hogy egy mobilalkalmazás csatlakozzon a számítógéphez, akkor nyissa meg ezt a portot a tűzfalában, ha engedélyezte azt</string>
<string name="your_profile_is_stored_on_your_device">Profilja, ismerősök és az elküldött üzenetek az eszközön kerülnek tárolásra.</string>
<string name="your_profile_is_stored_on_your_device">Profilja, ismerősei és az elküldött üzenetei az eszközön kerülnek tárolásra.</string>
<string name="system_restricted_background_warn"><![CDATA[Az értesítések engedélyezéséhez válassza ki az <b>Alkalmazás akkumulátor használata</b> / <b>Korlátlan</b> módot az alkalmazás beállításaiban.]]></string>
<string name="this_string_is_not_a_connection_link">Ez a karakterlánc nem egy meghívó hivatkozás!</string>
<string name="to_start_a_new_chat_help_header">Új csevegés kezdése</string>
<string name="connect_plan_you_are_already_connecting_via_this_one_time_link">Már csatlakozik ezen az egyszer használatos hivatkozáson keresztül!</string>
<string name="connect_plan_you_are_already_connecting_via_this_one_time_link">Ön már csatlakozik ezen az egyszer használatos hivatkozáson keresztül!</string>
<string name="you_wont_lose_your_contacts_if_delete_address">Nem veszíti el az ismerőseit, ha később törli az azonosítóját.</string>
<string name="updating_settings_will_reconnect_client_to_all_servers">A beállítások frissítése a kiszolgálókhoz való újra kapcsolódással jár.</string>
<string name="contact_wants_to_connect_with_you">kapcsolatba akar lépni veled!</string>
<string name="snd_group_event_changed_role_for_yourself">Saját szerepköre erre változott: %s</string>
<string name="snd_group_event_changed_role_for_yourself">saját szerepköre erre változott: %s</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">A csevegési szolgáltatás elindítható a Beállítások / Adatbázis menüpontban vagy az alkalmazás újraindításával.</string>
<string name="verify_code_on_mobile">Kód ellenőrzése a mobilon</string>
<string name="youve_accepted_group_invitation_connecting_to_inviting_group_member">Csatlakozott ehhez a csoporthoz. Kapcsolódás a meghívó csoporttaghoz.</string>
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[Kapcsolatba léphet <font color="#0088ff">a SimpleX Chat fejlesztőivel, ahol bármiről kérdezhet és értesülhet az újdonságokról</font>.]]></string>
<string name="v4_2_auto_accept_contact_requests_desc">Opcionális üdvözlő üzenettel.</string>
<string name="unknown_database_error_with_info">Ismeretlen adatbázis hiba: %s</string>
<string name="you_can_hide_or_mute_user_profile">Elrejthet vagy némíthat egy felhasználói profilt - tartsa lenyomva a menühöz!</string>
<string name="v5_3_simpler_incognito_mode_descr">Inkognító mód csatlakozáskor</string>
<string name="you_can_hide_or_mute_user_profile">Elrejthet vagy némíthat egy felhasználói profilt - tartsa lenyomva a menühöz.</string>
<string name="v5_3_simpler_incognito_mode_descr">Inkognító mód csatlakozáskor.</string>
<string name="update_onion_hosts_settings_question">Tor .onion host beállítások frissítése?</string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Megoszthat egy hivatkozást vagy QR-kódot - így bárki csatlakozhat a csoporthoz. Ha a csoport később törlésre kerül, akkor nem fogja elveszíteni annak tagjait.</string>
<string name="you_joined_this_group">Csatlakozott ehhez a csoporthoz</string>
@@ -1442,11 +1442,11 @@
<string name="verify_code_with_desktop">Kód ellenőrzése a számítógépen</string>
<string name="v4_5_private_filenames_descr">Az időzóna védelme érdekében a kép-/hangfájlok UTC-t használnak.</string>
<string name="connect_via_member_address_alert_desc">Csoporttag részére a csatlakozási kérelem eküldésre kerül.</string>
<string name="incognito_info_share">Inkognitóprofil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</string>
<string name="incognito_info_share">Inkognitó profil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</string>
<string name="connect_plan_you_have_already_requested_connection_via_this_address">Már kért egy csatlakozást ezen az azonosítón keresztül!</string>
<string name="you_can_share_this_address_with_your_contacts">Megoszthatja ezt a SimpleX azonosítót ismerőseivel, hogy kapcsolatba léphessenek ezzel: %s.</string>
<string name="you_can_share_this_address_with_your_contacts">Megoszthatja ezt a SimpleX azonosítót ismerőseivel, hogy kapcsolatba léphessenek vele: %s.</string>
<string name="you_can_accept_or_reject_connection">Csatlakozási kérelmek esetében, elfogadhatja vagy elutasíthatja azokat.</string>
<string name="v4_6_group_welcome_message_descr">Megjelenő üzenetet beállítása új tagok részére!</string>
<string name="v4_6_group_welcome_message_descr">Megjelenő üzenetek beállítása az új tagok számára!</string>
<string name="whats_new_thanks_to_users_contribute_weblate">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="sending_delivery_receipts_will_be_enabled">A kézbesítési jelentés küldése minden ismerős számára engedélyezésre kerül.</string>
<string name="network_option_protocol_timeout_per_kb">Protokoll időkorlát KB-onként</string>
@@ -1460,7 +1460,7 @@
<string name="sending_via">Küldés ezen keresztül:</string>
<string name="v5_0_polish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="sending_delivery_receipts_will_be_enabled_all_profiles">A kézbesítési jelentések küldése engedélyezésre kerül az összes látható csevegési profilban lévő minden ismerős számára.</string>
<string name="v4_6_audio_video_calls_descr">Bluetooth támogatás és egyéb fejlesztések.</string>
<string name="v4_6_audio_video_calls_descr">Bluetooth támogatás és további fejlesztések.</string>
<string name="in_developing_desc">Ez a funkció még nem támogatott. Próbálja meg a következő kiadásban.</string>
<string name="share_text_updated_at">A bejegyzés frissítve: %s</string>
<string name="skip_inviting_button">Tagok meghívásának kihagyása</string>
@@ -1468,7 +1468,7 @@
<string name="contact_you_shared_link_with_wont_be_able_to_connect">Ismerőse NEM fog tudni csatlakozni, akivel megosztotta ezt a hivatkozást!</string>
<string name="you_can_change_it_later">A véletlenszerű jelmondat egyszerű szövegként van tárolva a beállításokban.
\nEz később megváltoztatható.</string>
<string name="group_invitation_tap_to_join_incognito">Koppintson az inkognitómódhoz való csatlakozáshoz</string>
<string name="group_invitation_tap_to_join_incognito">Koppintson az inkognitóban való csatlakozáshoz</string>
<string name="set_password_to_export">Jelmondat beállítása az exportáláshoz</string>
<string name="receipts_groups_override_disabled">Kézbesítési jelentések le vannak tiltva a(z) %d csoportban</string>
<string name="non_fatal_errors_occured_during_import">Néhány nem végzetes hiba történt az importálás során további részletekért a csevegési konzolban olvashat.</string>
@@ -1507,12 +1507,12 @@
<string name="smp_servers_per_user">A jelenlegi csevegési profilhoz tartozó új kapcsolatok kiszolgálói</string>
<string name="receiving_via">Fogadás ezen keresztül:</string>
<string name="store_passphrase_securely_without_recover">Tárolja el biztonságosan jelmondát, mert ha elveszti azt, akkor NEM férhet hozzá a csevegéshez.</string>
<string name="member_role_will_be_changed_with_invitation">A szerepkör \"%s\"-re fog változni. A tag új meghívót kap.</string>
<string name="member_role_will_be_changed_with_invitation">A tag szerepköre erre fog változni: \"%s\". A tag új meghívót fog kapni.</string>
<string name="icon_descr_profile_image_placeholder">profilkép helyőrző</string>
<string name="sync_connection_force_desc">A titkosítás működik, és új titkosítási egyezményre nincs szükség. Ez kapcsolati hibákat eredményezhet!</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Ez a művelet nem vonható vissza - profilok, ismerősök, üzenetek és fájlok visszafordíthatatlanul törlésre kerülnek.</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Ez a művelet nem vonható vissza - profiljai, ismerősei, üzenetei és fájljai véglegesen törlésre kerülnek.</string>
<string name="info_row_updated_at">A bejegyzés frissítve</string>
<string name="read_more_in_user_guide_with_link"><![CDATA[További információ a <font color="#0088ff">Felhasználói útmutatóban</font> olvasható.]]></string>
<string name="read_more_in_user_guide_with_link"><![CDATA[További információ a <font color="#0088ff">Használati útmutatóban</font> olvasható.]]></string>
<string name="settings_is_storing_in_clear_text">A jelmondat a beállításokban egyszerű szövegként van tárolva.</string>
<string name="terminal_always_visible">Konzol megjelenítése új ablakban</string>
<string name="alert_text_msg_bad_hash">Az előző üzenet hash-e más.</string>
@@ -1522,7 +1522,7 @@
<string name="error_showing_content">hiba a tartalom megjelenítése közben</string>
<string name="error_showing_message">hiba az üzenet megjelenítésekor</string>
<string name="you_can_make_address_visible_via_settings">Láthatóvá teheti SimpleX beli ismerősei számára a Beállításokban.</string>
<string name="recent_history_is_sent_to_new_members">Legfeljebb az utolsó 100 üzenet kerül elküldésre az új tagoknak.</string>
<string name="recent_history_is_sent_to_new_members">Legfeljebb az utolsó 100 üzenet kerüljön elküldésre az új tagok számára.</string>
<string name="code_you_scanned_is_not_simplex_link_qr_code">A beolvasott kód nem egy SimpleX hivatkozás QR-kód.</string>
<string name="the_text_you_pasted_is_not_a_link">A beillesztett szöveg nem egy SimpleX hivatkozás.</string>
<string name="you_can_view_invitation_link_again">A meghívó hivatkozását újra megtekintheti a kapcsolat részleteinél.</string>
@@ -1535,11 +1535,11 @@
<string name="add_contact_button_to_create_link_or_connect_via_link"><![CDATA[<b>Ismerős hozzáadása</b>: új meghívó hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő csatlakozáshoz.]]></string>
<string name="create_group_button_to_create_new_group"><![CDATA[<b>Csoport létrehozása</b>: új csoport létrehozásához.]]></string>
<string name="chat_is_stopped_you_should_transfer_database">A csevegés leállt. Ha már használta ezt az adatbázist egy másik eszközön, úgy visszaállítás szükséges a csevegés megkezdése előtt.</string>
<string name="recent_history_is_not_sent_to_new_members">Az előzmények nem kerülnek elküldésre új tagok részére.</string>
<string name="recent_history_is_not_sent_to_new_members">Az előzmények nem kerülnek elküldésre az új tagok számára.</string>
<string name="retry_verb">Újrapróbálkozás</string>
<string name="camera_not_available">A fényképező nem elérhető</string>
<string name="enable_sending_recent_history">Az utolsó 100 üzenet elküldése az új tagoknak.</string>
<string name="disable_sending_recent_history">Ne küldjön előzményeket az új tagok részére.</string>
<string name="enable_sending_recent_history">Az utolsó 100 üzenet elküldése az új tagok számára.</string>
<string name="disable_sending_recent_history">Az előzmények ne kerüljenek elküldésre az új tagok számára.</string>
<string name="or_show_this_qr_code">Vagy mutassa meg ezt a kódot</string>
<string name="enable_camera_access">Kamera hozzáférés engedélyezése</string>
<string name="keep_unused_invitation_question">Fel nem használt meghívó megtartása?</string>
@@ -1602,12 +1602,12 @@
<string name="info_row_created_at">Létrehozva ekkor:</string>
<string name="saved_message_title">Mentett üzenet</string>
<string name="share_text_created_at">Megosztva ekkor: %s</string>
<string name="clear_note_folder_warning">Minden üzenet törlésre kerül ez nem vonható vissza!</string>
<string name="clear_note_folder_warning">Minden üzenet törlésre kerül ez a művelet nem vonható vissza!</string>
<string name="v5_5_message_delivery">Továbbfejlesztett üzenetküldés</string>
<string name="v5_5_join_group_conversation">Csatlakozás csoportos beszélgetésekhez</string>
<string name="v5_5_simpler_connect_ui">Hivatkozás beillesztése a csatlakozáshoz!</string>
<string name="v5_5_private_notes">Privát jegyzetek</string>
<string name="v5_5_simpler_connect_ui_descr">A keresősáv fogadja a meghívó hivatkozásokat.</string>
<string name="v5_5_simpler_connect_ui_descr">A keresősáv elfogadja a meghívó hivatkozásokat.</string>
<string name="v5_5_private_notes_descr">Titkosított fájlokkal és médiatartalommal.</string>
<string name="v5_5_message_delivery_descr">Csökkentett akkumulátorhasználattal.</string>
<string name="v5_5_new_interface_languages">Magyar és török felhasználói felület</string>
@@ -1627,7 +1627,7 @@
<string name="error_blocking_member_for_all">Hiba a tag mindenki számára való letiltása során</string>
<string name="message_too_large">Az üzenet túl nagy</string>
<string name="welcome_message_is_too_long">Az üdvözlő üzenet túl hosszú</string>
<string name="database_migration_in_progress">Az adatbázis migrációja folyamatban van.
<string name="database_migration_in_progress">Az adatbázis átköltöztetése folyamatban van.
\nEz eltarthat néhány percig.</string>
<string name="call_service_notification_audio_call">Hanghívás</string>
<string name="call_service_notification_end_call">A hívás befejeződött</string>
@@ -1711,4 +1711,44 @@
<string name="e2ee_info_no_pq"><![CDATA[Az üzeneteket, fájlokat és hívásokat <b>végpontok közötti titkosítással</b> é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.]]></string>
<string name="e2ee_info_pq"><![CDATA[Az üzeneteket, fájlokat és hívásokat <b>végpontok közötti kvantumrezisztens titkosítással</b> é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.]]></string>
<string name="error_showing_desktop_notification">Hiba az értesítés megjelenítésekor, lépjen kapcsolatba a fejlesztőkkel.</string>
<string name="permissions_find_in_settings_and_grant">Keresse meg ezt az engedélyt az Android beállításaiban, és adja meg kézzel.</string>
<string name="permissions_grant_in_settings">Engedélyezés a beállításokban</string>
<string name="permissions_grant">Engedély(ek) megadása a hívások kezdeményezéséhez</string>
<string name="permissions_record_audio">Mikrofon</string>
<string name="permissions_open_settings">Beállítások megnyitása</string>
<string name="permissions_camera">Kamera</string>
<string name="permissions_camera_and_record_audio">Kamera és mikrofon</string>
<string name="permissions_required">Engedélyek megadása</string>
<string name="network_type_ethernet">Vezetékes Ethernet</string>
<string name="network_type_cellular">Mobilhálózat</string>
<string name="settings_section_title_network_connection">Internetkapcsolat</string>
<string name="network_type_no_network_connection">Nincs hálózati kapcsolat</string>
<string name="network_type_other">További</string>
<string name="network_type_network_wifi">Wi-Fi</string>
<string name="forwarded_description">továbbküldve</string>
<string name="simplex_links_not_allowed">A SimpleX hivatkozások küldése le van tiltva</string>
<string name="group_members_can_send_simplex_links">A csoport tagjai küldhetnek SimpleX hivatkozásokat.</string>
<string name="feature_roles_owners">tulajdonosok</string>
<string name="feature_roles_admins">adminok</string>
<string name="feature_roles_all_members">minden tag</string>
<string name="simplex_links">SimpleX hivatkozás</string>
<string name="voice_messages_not_allowed">A hangüzenetek küldése le van tiltva</string>
<string name="simplex_links_are_prohibited_in_group">A SimpleX hivatkozások küldése ebben a csoportban le van tiltva.</string>
<string name="prohibit_sending_simplex_links">A SimpleX hivatkozások küldése le van tiltva</string>
<string name="files_and_media_not_allowed">Fájlok és média tartalom küldése le van tiltva</string>
<string name="allow_to_send_simplex_links">A SimpleX hivatkozások küldése engedélyezve van.</string>
<string name="feature_enabled_for">Számukra engedélyezve:</string>
<string name="saved_description">mentett</string>
<string name="saved_from_description">mentve innen: %s</string>
<string name="forwarded_from_chat_item_info_title">Továbbítva innen:</string>
<string name="recipients_can_not_see_who_message_from">A címzett(ek) nem látja(k), hogy kitől származik ez az üzenet.</string>
<string name="saved_chat_item_info_tab">Mentett</string>
<string name="saved_from_chat_item_info_title">Mentve innen:</string>
<string name="download_file">Letöltés</string>
<string name="forward_chat_item">Továbbítás</string>
<string name="forwarded_chat_item_info_tab">Továbbított</string>
<string name="forward_message">Üzenet továbbítása…</string>
<string name="audio_device_wired_headphones">Fejhallgató</string>
<string name="audio_device_speaker">Hangszóró</string>
<string name="audio_device_earpiece">Fülhallgató</string>
</resources>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M393.814-125q-62.314 0-104.564-42.381Q247-209.762 247-272q0-62.237 42.25-104.619Q331.5-419 394-419q27.5 0 50.25 8t39.25 22.5v-418q0-11.925 8-20.213Q499.5-835 512-835h172.5q12.5 0 20.75 8.24 8.25 8.239 8.25 20.093V-733q0 12.5-8.25 20.75T684.5-704H541v432q0 62.238-42.436 104.619T393.814-125Z"/></svg>

After

Width:  |  Height:  |  Size: 396 B

@@ -1715,4 +1715,42 @@
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[<b>Non devi</b> usare lo stesso database su due dispositivi.]]></string>
<string name="migrate_to_device_try_again">Puoi fare un altro tentativo.</string>
<string name="migrate_from_device_try_again">Puoi fare un altro tentativo.</string>
<string name="error_showing_desktop_notification">Errore nel mostrare la notifica, contatta gli sviluppatori.</string>
<string name="permissions_find_in_settings_and_grant">Trova questa autorizzazione nelle impostazioni di Android e concedila a mano.</string>
<string name="permissions_camera">Fotocamera</string>
<string name="permissions_camera_and_record_audio">Fotocamera e microfono</string>
<string name="permissions_required">Concedi autorizzazioni</string>
<string name="permissions_grant_in_settings">Concedi nelle impostazioni</string>
<string name="permissions_grant">Concedi la/le autorizzazione/i per effettuare chiamate</string>
<string name="permissions_record_audio">Microfono</string>
<string name="permissions_open_settings">Apri le impostazioni</string>
<string name="forwarded_description">inoltrato</string>
<string name="settings_section_title_network_connection">Connessione di rete</string>
<string name="network_type_no_network_connection">Nessuna connessione di rete</string>
<string name="network_type_cellular">Mobile</string>
<string name="network_type_other">Altro</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">Cavo ethernet</string>
<string name="simplex_links_not_allowed">Link di SimpleX non consentiti</string>
<string name="files_and_media_not_allowed">File e multimediali non consentiti</string>
<string name="voice_messages_not_allowed">Messaggi vocali non consentiti</string>
<string name="simplex_links">Link di SimpleX</string>
<string name="allow_to_send_simplex_links">Consenti di inviare link di SimpleX.</string>
<string name="prohibit_sending_simplex_links">Vieta l\'invio di link di SimpleX</string>
<string name="feature_enabled_for">Attivo per</string>
<string name="group_members_can_send_simplex_links">I membri del gruppo possono inviare link di Simplex.</string>
<string name="feature_roles_owners">proprietari</string>
<string name="feature_roles_admins">amministratori</string>
<string name="feature_roles_all_members">tutti i membri</string>
<string name="simplex_links_are_prohibited_in_group">I link di SimpleX sono vietati in questo gruppo.</string>
<string name="saved_description">salvato</string>
<string name="saved_from_chat_item_info_title">Salvato da</string>
<string name="forward_message">Inoltra messaggio…</string>
<string name="forwarded_chat_item_info_tab">Inoltrato</string>
<string name="forwarded_from_chat_item_info_title">Inoltrato da</string>
<string name="download_file">Scarica</string>
<string name="forward_chat_item">Inoltra</string>
<string name="recipients_can_not_see_who_message_from">I destinatari non possono vedere da chi proviene questo messaggio.</string>
<string name="saved_chat_item_info_tab">Salvato</string>
<string name="saved_from_description">salvato da %s</string>
</resources>
@@ -116,7 +116,7 @@
<string name="contact_developers">アプリを更新し、開発者にご連絡ください。</string>
<string name="service_notifications">即時通知!</string>
<string name="service_notifications_disabled">即時通知が無効になってます!</string>
<string name="enter_passphrase_notification_title">暗証フレーズが必要</string>
<string name="enter_passphrase_notification_title">パスフレーズが必要</string>
<string name="notification_preview_mode_hidden">プライベート</string>
<string name="notification_preview_mode_contact">連絡先の名前</string>
<string name="notification_preview_somebody">連絡先が非表示:</string>
@@ -192,8 +192,8 @@
<string name="v4_3_improved_privacy_and_security">プライバシーとセキュリティ強化</string>
<string name="settings_section_title_incognito">シークレットモード</string>
<string name="new_in_version">%s の新機能</string>
<string name="new_passphrase">新しい暗証フレーズ</string>
<string name="chat_item_ttl_none">一度も</string>
<string name="new_passphrase">新しいパスフレーズ</string>
<string name="chat_item_ttl_none">なし</string>
<string name="notification_preview_new_message">新しいメッセージ</string>
<string name="network_use_onion_hosts_no">いいえ</string>
<string name="notifications">通知</string>
@@ -235,8 +235,8 @@
<string name="only_your_contact_can_send_voice">音声メッセージを送れるのはあなたの連絡相手だけです。</string>
<string name="database_encryption_will_be_updated">データベース暗号化のパスフレーズが更新され、キーストア (暗証キー保管庫)に保存されます。</string>
<string name="database_error">データベースエラー</string>
<string name="set_password_to_export_desc">データベースはランダムな暗証フレーズで暗号化済みです。エスポートする前に更新してください。</string>
<string name="passphrase_is_different">データベース暗証フレーズはキーストア (暗証キー保管庫) に保存された暗証フレーズと異なります。</string>
<string name="set_password_to_export_desc">データベースはランダムなパスフレーズで暗号化済みです。エスポートする前に更新してください。</string>
<string name="passphrase_is_different">データベースパスフレーズはキーストア (暗証キー保管庫) に保存されたパスフレーズと異なります。</string>
<string name="ttl_d">%d日</string>
<string name="ttl_day">%d 日</string>
<string name="delete_group_menu_action">削除</string>
@@ -268,7 +268,7 @@
<string name="image_descr_qr_code">QRコード</string>
<string name="please_check_correct_link_and_maybe_ask_for_a_new_one">リンクが正しいかどうかご確認ください。または、連絡相手にもう一度リンクをお求めください。</string>
<string name="network_error_desc">%1$s との接続を確認し、もう一度お試しください。</string>
<string name="enter_correct_current_passphrase">現在の正しい暗証フレーズを入力してください。</string>
<string name="enter_correct_current_passphrase">現在の正しいパスフレーズを入力してください。</string>
<string name="smp_servers_preset_server">プレセットサーバ</string>
<string name="smp_servers_preset_address">プレセットサーバのアドレス</string>
<string name="display_name_connecting">接続待ち…</string>
@@ -352,8 +352,8 @@
<string name="settings_section_title_calls">通話</string>
<string name="chat_is_running">チャットは稼働中</string>
<string name="chat_is_stopped">チャットが停止してます。</string>
<string name="database_passphrase">データベース暗証フレーズ</string>
<string name="export_database">データベースをエスポート</string>
<string name="database_passphrase">データベースパスフレーズ</string>
<string name="export_database">データベースをエスポート</string>
<string name="delete_database">データベースを削除</string>
<string name="import_database">データベースを読み込みますか?</string>
<string name="new_database_archive">新しいデータベースのアーカイブ</string>
@@ -363,14 +363,14 @@
<string name="total_files_count_and_size">%d ファイル|合計: %s</string>
<string name="encrypt_database">暗号化する</string>
<string name="remove_passphrase">削除</string>
<string name="current_passphrase">現在の暗証フレーズ</string>
<string name="current_passphrase">現在のパスフレーズ</string>
<string name="encrypted_with_random_passphrase">データベースはランダムなパスフレーズで暗号化済みで、変更可能です。</string>
<string name="change_database_passphrase_question">データベースの暗証フレーズを更新しますか?</string>
<string name="change_database_passphrase_question">データベースのパスフレーズを更新しますか?</string>
<string name="database_will_be_encrypted">データベースが暗号化されます。</string>
<string name="database_will_be_encrypted_and_passphrase_stored">データベースが暗号化され、パスフレーズがキーストア (暗証キー保管庫) にほぞんされます。</string>
<string name="cannot_access_keychain">キーストア (暗証キーの保管庫) にアクセスできないため、データベースのパスワードが保存できません。</string>
<string name="database_passphrase_will_be_updated">データベース暗号化のパスフレーズが更新されます。</string>
<string name="database_passphrase_is_required">チャットを開くにはデータベース暗証フレーズが必要です。</string>
<string name="database_passphrase_is_required">チャットを開くにはデータベースパスフレーズが必要です。</string>
<string name="file_with_path">ファイル: %s</string>
<string name="archive_created_on_ts">作成日時 %1$s</string>
<string name="delete_archive">アーカイブを削除</string>
@@ -448,7 +448,7 @@
<string name="core_version">コアのバージョン: v%s</string>
<string name="edit_image">画像を編集</string>
<string name="callstatus_missed">不在着信</string>
<string name="always_use_relay">リレー経由で繋がる。</string>
<string name="always_use_relay">常にリレーを使用</string>
<string name="status_e2e_encrypted">エンドツーエンド暗号化済み</string>
<string name="chat_database_deleted">チャットのデータベースが削除されました。</string>
<string name="delete_messages_after">次の期間が経ったら、メッセージを削除:</string>
@@ -458,10 +458,10 @@
<string name="error_encrypting_database">データベース暗号化でエラー発生</string>
<string name="confirm_new_passphrase">新しいパスフレーズを確認…</string>
<string name="encrypt_database_question">データベースを暗号化しますか?</string>
<string name="store_passphrase_securely_without_recover">暗証フレーズを失くさないように保管してください。失くすとチャットにアクセスできなくなります。</string>
<string name="enter_correct_passphrase">正しい暗証フレーズを入力</string>
<string name="enter_passphrase">暗証フレーズを入力</string>
<string name="restore_passphrase_not_found_desc">キーストア (暗証キー保管庫) に暗証フレーズが見つかりません。入力してください。アプリのデータをバックアップツールで復元させると暗証フレーズが見つかりかねます。そうではない場合は開発者にご連絡ください。</string>
<string name="store_passphrase_securely_without_recover">パスフレーズを失くさないように保管してください。失くすとチャットにアクセスできなくなります。</string>
<string name="enter_correct_passphrase">正しいパスフレーズを入力</string>
<string name="enter_passphrase">パスフレーズを入力</string>
<string name="restore_passphrase_not_found_desc">キーストア (パスキー保管庫) にパスフレーズが見つかりません。手動で入力してください。これは、バックアップツールを使用してアプリのデータを復元した場合に発生する可能性があります。そうではない場合は開発者にご連絡ください。</string>
<string name="button_create_group_link">リンクを発行する</string>
<string name="info_row_group">グループ</string>
<string name="error_saving_group_profile">グループのプロフィール保存でエラー発生</string>
@@ -523,7 +523,7 @@
<string name="delete_pending_connection__question">接続待ちの繋がりを削除しますか?</string>
<string name="connect_button">接続</string>
<string name="one_time_link">使い捨ての招待リンク</string>
<string name="database_passphrase_and_export">データベース暗証フレーズとエスポート</string>
<string name="database_passphrase_and_export">データベースパスフレーズとエスポート</string>
<string name="how_to_use_simplex_chat">使い方</string>
<string name="markdown_help">マークダウン (書式編集) ガイド</string>
<string name="smp_servers_enter_manually">サーバを手動で入力</string>
@@ -585,7 +585,7 @@
<string name="conn_level_desc_indirect">間接 (%1$s)</string>
<string name="incognito">シークレットモード</string>
<string name="incognito_info_protects">シークレット モードでは、連絡先ごとに新しいランダムなプロファイルを使用してプライバシーを保護します。</string>
<string name="chat_preferences_no">いいえ</string>
<string name="chat_preferences_no">オフ</string>
<string name="chat_preferences_on">オン</string>
<string name="direct_messages">ダイレクトメッセージ</string>
<string name="timed_messages">消えるメッセージ</string>
@@ -612,9 +612,9 @@
<string name="notifications_will_be_hidden">アプリが起動中のみに通知が出ます!</string>
<string name="encrypted_database">暗号化データベース</string>
<string name="keychain_error">キーチェーンのエラー</string>
<string name="store_passphrase_securely">暗証フレーズを失くさないように保管してください。失くすと変更できなくなります。</string>
<string name="store_passphrase_securely">パスフレーズを失くさないように保管してください。失くすと変更できなくなります。</string>
<string name="error_with_info">エラー: %s</string>
<string name="restore_database_alert_desc">データベースのバックアップで復旧する際に前の暗証フレーズを入力してください。行われたら元に戻せません。</string>
<string name="restore_database_alert_desc">データベースのバックアップで復旧する際に前のパスフレーズを入力してください。行われたら元に戻せません。</string>
<string name="icon_descr_add_members">メンバーを招待する</string>
<string name="rcv_group_event_member_left">脱退しました。</string>
<string name="rcv_group_event_changed_member_role">%s の役割を %s に変えました。</string>
@@ -685,7 +685,7 @@
<string name="sender_may_have_deleted_the_connection_request">送信元が繋がりリクエストを削除したかもしれません。</string>
<string name="error_smp_test_server_auth">このサーバで待ち行列を作るには認証が必要です。パスワードをご確認ください。</string>
<string name="la_notice_title_simplex_lock">SimpleXロック</string>
<string name="enter_passphrase_notification_desc">通知を受けるには、データベースの暗証フレーズを入力してください。</string>
<string name="enter_passphrase_notification_desc">通知を受けるには、データベースのパスフレーズを入力してください。</string>
<string name="simplex_service_notification_title">SimpleX Chat サービス</string>
<string name="auth_simplex_lock_turned_on">SimpleXロック:オン</string>
<string name="auth_you_will_be_required_to_authenticate_when_you_start_or_resume">起動時、または非アクティブ状態で30秒が経った後に戻ると、認証する必要となります。</string>
@@ -739,9 +739,9 @@
<string name="network_use_onion_hosts">.onionホストを使う</string>
<string name="network_use_onion_hosts_prefer">利用可能時に</string>
<string name="network_session_mode_transport_isolation">トランスポート隔離</string>
<string name="save_and_notify_contact">保存して連絡先に公開</string>
<string name="save_and_notify_contact">保存して連絡先に公開</string>
<string name="your_current_profile">現在のプロフィール</string>
<string name="save_and_notify_contacts">保存して連絡先に公開</string>
<string name="save_and_notify_contacts">保存して連絡先に公開</string>
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">あなたのプライバシーとセキュリティを守るメッセージとアプリのプラットフォーム</string>
<string name="we_do_not_store_contacts_or_messages_on_servers">連絡先情報と届けたメッセージをサーバに保存することは一切ありません。</string>
<string name="you_control_your_chat">あなたのチャットはあなたが決めます!</string>
@@ -768,7 +768,7 @@
<string name="delete_files_and_media_desc">ファイルとメディアが全て削除されます (※元に戻せません※)。低解像度の画像が残ります。</string>
<string name="enable_automatic_deletion_message">選択中の以前の送受信したメッセージが削除されます (※元に戻せません※)。数分かかります。</string>
<string name="update_database">更新</string>
<string name="database_is_not_encrypted">チャットデータベースが暗号化されてません。暗証フレーズを設定して保管してください。</string>
<string name="database_is_not_encrypted">チャットデータベースが暗号化されてません。パスフレーズを設定して保管してください。</string>
<string name="restore_database">データベースを復元</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">アプリの設定・データベース経由で、またはアプリの再起動でチャットを始められます。</string>
<string name="you_are_invited_to_group_join_to_connect_with_group_members">グループ招待が届きました。参加してグループのメンバーとお繋がりください。</string>
@@ -827,12 +827,12 @@
<string name="your_calls">あなたの通話</string>
<string name="integrity_msg_skipped">%1$dスキップしたメッセージ</string>
<string name="send_link_previews">リンクのプレビューを送信</string>
<string name="set_password_to_export">暗証フレーズを設定してからエスポート</string>
<string name="set_password_to_export">パスフレーズを設定してからエスポート</string>
<string name="stop_chat_question">チャットを閉じますか?</string>
<string name="save_passphrase_in_keychain">暗証フレーズをキーストア (暗証キー保管庫) に保存</string>
<string name="save_passphrase_in_keychain">パスフレーズをキーストア (パスキー保管庫) に保存</string>
<string name="wrong_passphrase">不正なパスフレーズ</string>
<string name="unknown_error">不明なエラー</string>
<string name="save_passphrase_and_open_chat">暗証フレーズを保存して、チャットを開始</string>
<string name="save_passphrase_and_open_chat">パスフレーズを保存して、チャットを開始</string>
<string name="unknown_database_error_with_info">不明なデータベースのエラー: %s</string>
<string name="wrong_passphrase_title">不正なパスフレーズです!</string>
<string name="you_are_invited_to_group">グループ招待が届きました</string>
@@ -881,8 +881,8 @@
<string name="icon_descr_speaker_on">スピーカーオン</string>
<string name="your_privacy">あなたのプライバシー</string>
<string name="messages_section_description">この設定は現在のチャットプロフィールのメッセージに適応されます。</string>
<string name="you_have_to_enter_passphrase_every_time">アプリ起動時に暗証フレーズを入力しなければなりません。端末に保存されてません。</string>
<string name="database_backup_can_be_restored">データベースの暗証フレーズ変更が完了してません。</string>
<string name="you_have_to_enter_passphrase_every_time">アプリ起動時にパスフレーズを入力しなければなりません。端末に保存されてません。</string>
<string name="database_backup_can_be_restored">データベースのパスフレーズ変更が完了してません。</string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">リンク、またはQRコードを共有できます。誰でもグループに参加できます。後で削除しても、グループのメンバーがそのままのこります。</string>
<string name="network_options_revert">元に戻す</string>
<string name="update_network_settings_confirmation">更新</string>
@@ -893,7 +893,7 @@
<string name="v4_5_transport_isolation">トランスポート隔離</string>
<string name="restore_database_alert_confirm">復元</string>
<string name="restore_database_alert_title">データベースを復元しますか?</string>
<string name="save_and_notify_group_members">保存してグループのメンバーに知らせる</string>
<string name="save_and_notify_group_members">保存してグループのメンバーに知らせる</string>
<string name="send_us_an_email">メールを送る</string>
<string name="share_image">メディア共有…</string>
<string name="simplex_link_mode">SimpleXリンク</string>
@@ -924,9 +924,9 @@
<string name="incognito_random_profile">あなたのランダム・プロフィール</string>
<string name="v4_3_voice_messages">音声メッセージ</string>
<string name="settings_section_title_socks">SOCKSプロキシ</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">データベースのエスポート、読み込み、削除するにはチャット機能を停止する必要があります。チャット機能を停止すると送受信ができなくなります。</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">データベースのエスポート、読み込み、削除するにはチャット機能を停止する必要があります。チャット機能を停止すると送受信ができなくなります。</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">あなたのプロフィール、連絡先、メッセージ、ファイルが完全削除されます (※元に戻せません※)。</string>
<string name="update_database_passphrase">データベース暗証フレーズを更新</string>
<string name="update_database_passphrase">データベースパスフレーズを更新</string>
<string name="save_archive">アーカイブを保存</string>
<string name="snd_group_event_changed_role_for_yourself">あなたが自分の役割を次に変えました:%s</string>
<string name="snd_conn_event_switch_queue_phase_completed">アドレスを変えました</string>
@@ -1156,8 +1156,8 @@
<string name="error_setting_address">アドレス設定エラー</string>
<string name="you_can_share_your_address">アドレスをリンクまたは QR コードとして共有すると、誰でもあなたに接続できます。</string>
<string name="you_wont_lose_your_contacts_if_delete_address">後でアドレスを削除しても、連絡先が失われることはありません。</string>
<string name="your_contacts_will_remain_connected">連絡先との接続がそのまま続きます。</string>
<string name="all_your_contacts_will_remain_connected_update_sent">連絡先との接続がそのまま続きます。 プロフィールの更新が連絡先に共有されます。</string>
<string name="your_contacts_will_remain_connected">連絡先との接続は維持されます。</string>
<string name="all_your_contacts_will_remain_connected_update_sent">連絡先との接続は維持されます。 プロフィールの更新が連絡先に共有されます。</string>
<string name="create_simplex_address">SimpleX のアドレスを作成</string>
<string name="share_with_contacts">連絡先に公開する</string>
<string name="profile_update_will_be_sent_to_contacts">プロフィールの更新は連絡先に送信されます。</string>
@@ -1378,7 +1378,7 @@
<string name="passphrase_will_be_saved_in_settings">パスフレーズを変更するかアプリを再起動すると、平文として設定に保存されます。</string>
<string name="settings_is_storing_in_clear_text">パスフレーズは平文として設定に保存されます。</string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>注意</b>: メッセージとファイルのリレーは SOCKS プロキシ経由で接続されます。 通話とリンク プレビューの送信には直接接続が使用されます。]]></string>
<string name="encrypt_local_files">ローカルファイルを暗号化する</string>
<string name="encrypt_local_files">ローカルファイルを暗号化</string>
<string name="rcv_group_event_open_chat">開く</string>
<string name="v5_3_encrypt_local_files">保存されたファイルとメディアを暗号化する</string>
<string name="error_creating_member_contact">メンバー連絡先の作成中にエラーが発生</string>
@@ -1509,7 +1509,7 @@
<string name="unblock_member_question">メンバーのブロックを解除?</string>
<string name="create_group_button_to_create_new_group"><![CDATA[<b>グループ作成</b>:新しいグループを作成する。]]></string>
<string name="open_port_in_firewall_desc">モバイルアプリからデスクトップへの接続を許可するには、ファイアウォールでこのポートを開いてください。</string>
<string name="block_member_button">ブロックしたメンバー</string>
<string name="block_member_button">メンバーのブロック</string>
<string name="recent_history">表示可能な履歴</string>
<string name="settings_section_title_use_from_desktop">デスクトップから使用</string>
<string name="session_code">セッションコード</string>
@@ -1603,7 +1603,7 @@
<string name="call_service_notification_end_call">通話終了</string>
<string name="unable_to_open_browser_title">ブラウザ起動エラー</string>
<string name="migrate_from_another_device">別の端末から移行</string>
<string name="set_passphrase">暗証フレーズを設定</string>
<string name="set_passphrase">パスフレーズを設定</string>
<string name="snd_group_event_member_blocked">%s をブロック済</string>
<string name="member_blocked_by_admin">管理者によりブロック済</string>
<string name="v5_5_private_notes_descr">暗号化されたファイルとメディア</string>
@@ -1716,4 +1716,29 @@
<string name="saved_message_title">メッセージ保存済</string>
<string name="migrate_from_device_stopping_chat">チャット停止中</string>
<string name="error_showing_desktop_notification">エラーが表示された場合は、開発者に連絡してください。</string>
<string name="permissions_find_in_settings_and_grant">Androidの設定から権限を設定見つけ、手動で許可。</string>
<string name="permissions_grant_in_settings">設定で付与</string>
<string name="permissions_required">権限の付与</string>
<string name="permissions_camera">カメラ</string>
<string name="permissions_camera_and_record_audio">カメラとマイク</string>
<string name="permissions_record_audio">マイク</string>
<string name="permissions_grant">通話許可を付与</string>
<string name="permissions_open_settings">設定を開く</string>
<string name="network_type_cellular">モバイル回線</string>
<string name="network_type_no_network_connection">ネットワーク接続なし</string>
<string name="network_type_network_wifi">Wi-Fi</string>
<string name="network_type_ethernet">有線イーサネット</string>
<string name="settings_section_title_network_connection">ネットワーク接続</string>
<string name="network_type_other">その他</string>
<string name="group_members_can_send_simplex_links">グループメンバーはSimpleXリンクを送信できます。</string>
<string name="feature_roles_owners">オーナー</string>
<string name="simplex_links_are_prohibited_in_group">このグループではSimpleXリンクは禁止されています。</string>
<string name="simplex_links_not_allowed">SimpleXtリンクは許可されていません</string>
<string name="feature_roles_admins">管理者</string>
<string name="feature_roles_all_members">全てのメンバー</string>
<string name="allow_to_send_simplex_links">SimpleXリンクの送信を許可</string>
<string name="voice_messages_not_allowed">音声メッセージは許可されていません</string>
<string name="files_and_media_not_allowed">ファイルとメディアは許可されていません</string>
<string name="prohibit_sending_simplex_links">SimpleXリンクの送信禁止</string>
<string name="simplex_links">SimpleXリンク</string>
</resources>
File diff suppressed because it is too large Load Diff
@@ -1714,4 +1714,41 @@
<string name="set_passphrase">Wachtwoord instellen</string>
<string name="e2ee_info_pq_short">Deze chat wordt beschermd door quantum bestendige end-to-end codering.</string>
<string name="error_showing_desktop_notification">Fout bij weergeven van melding. Neem contact op met ontwikkelaars.</string>
<string name="permissions_find_in_settings_and_grant">Zoek deze toestemming in de Android-instellingen en verleen deze handmatig.</string>
<string name="permissions_grant_in_settings">Verlenen in instellingen</string>
<string name="permissions_required">Machtigingen verlenen</string>
<string name="permissions_grant">Verleen toestemming(en) om te bellen</string>
<string name="permissions_record_audio">Microfoon</string>
<string name="permissions_camera">Camera</string>
<string name="permissions_camera_and_record_audio">Camera en microfoon</string>
<string name="permissions_open_settings">Open instellingen</string>
<string name="network_type_cellular">Mobiel</string>
<string name="forwarded_description">doorgestuurd</string>
<string name="settings_section_title_network_connection">Netwerkverbinding</string>
<string name="network_type_no_network_connection">Geen netwerkverbinding</string>
<string name="network_type_other">Ander</string>
<string name="network_type_network_wifi">Wifi</string>
<string name="network_type_ethernet">Wired ethernet</string>
<string name="files_and_media_not_allowed">Bestanden en media niet toegestaan</string>
<string name="simplex_links_not_allowed">SimpleX-links zijn niet toegestaan</string>
<string name="voice_messages_not_allowed">Spraakberichten niet toegestaan</string>
<string name="simplex_links">SimpleX-links</string>
<string name="prohibit_sending_simplex_links">Verbied het verzenden van SimpleX-links</string>
<string name="feature_roles_admins">beheerders</string>
<string name="feature_roles_all_members">alle leden</string>
<string name="feature_roles_owners">eigenaren</string>
<string name="simplex_links_are_prohibited_in_group">SimpleX-links zijn in deze groep verboden.</string>
<string name="feature_enabled_for">Ingeschakeld voor</string>
<string name="allow_to_send_simplex_links">Sta het verzenden van SimpleX-links toe.</string>
<string name="group_members_can_send_simplex_links">Groepsleden kunnen SimpleX-links verzenden.</string>
<string name="saved_description">opgeslagen</string>
<string name="saved_from_description">opgeslagen van %s</string>
<string name="forward_chat_item">Doorsturen</string>
<string name="forwarded_chat_item_info_tab">Doorgestuurd</string>
<string name="recipients_can_not_see_who_message_from">Ontvanger(s) kunnen niet zien van wie dit bericht afkomstig is.</string>
<string name="saved_from_chat_item_info_title">Opgeslagen van</string>
<string name="forward_message">Bericht doorsturen…</string>
<string name="download_file">Downloaden</string>
<string name="forwarded_from_chat_item_info_title">Doorgestuurd vanuit</string>
<string name="saved_chat_item_info_tab">Opgeslagen</string>
</resources>
@@ -21,8 +21,8 @@
<string name="thousand_abbreviation">k</string>
<string name="live">NA ŻYWO</string>
<string name="marked_deleted_description">zaznaczona jako usunięta</string>
<string name="moderated_description">moderowany</string>
<string name="moderated_item_description">moderowany przez %s</string>
<string name="moderated_description">zmoderowane</string>
<string name="moderated_item_description">zmoderowane przez %s</string>
<string name="sending_files_not_yet_supported">wysyłanie plików nie jest jeszcze obsługiwane</string>
<string name="receiving_files_not_yet_supported">odbieranie plików nie jest jeszcze obsługiwane</string>
<string name="trying_to_connect_to_server_to_receive_messages">Próbowanie połączenia z serwerem używanym do odbierania wiadomości od tego kontaktu.</string>
@@ -303,8 +303,8 @@
<string name="smp_servers_invalid_address">Nieprawidłowy adres serwera!</string>
<string name="markdown_help">Pomoc markdown</string>
<string name="markdown_in_messages">Markdown w wiadomościach</string>
<string name="smp_servers_preset_server">Wstępnie ustawiony serwer</string>
<string name="smp_servers_preset_address">Wstępnie ustawiony adres serwera</string>
<string name="smp_servers_preset_server">Predefiniowany serwer</string>
<string name="smp_servers_preset_address">Adres predefiniowanego serwera</string>
<string name="rate_the_app">Oceń aplikację</string>
<string name="saved_ICE_servers_will_be_removed">Zapisane serwery WebRTC ICE zostaną usunięte.</string>
<string name="smp_servers_save">Zapisz serwery</string>
@@ -435,7 +435,7 @@
<string name="onboarding_notifications_mode_subtitle">Można to później zmienić w ustawieniach.</string>
<string name="make_private_connection">Nawiąż prywatne połączenie</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Wiele osób pytało: <i>jeśli SimpleX nie ma identyfikatora użytkownika, jak może dostarczać wiadomości\?</i>]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Tylko urządzenia klienckie przechowują profile użytkowników, kontakty, grupy i wiadomości wysyłane za pomocą <b>2-warstwowego szyfrowania end-to-end</b>.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Tylko urządzenia klienckie przechowują profile użytkowników, kontakty, grupy i wiadomości wysyłane za pomocą <b>dwuwarstwowego szyfrowania end-to-end</b>.]]></string>
<string name="onboarding_notifications_mode_periodic">Okresowo</string>
<string name="onboarding_notifications_mode_title">Prywatne powiadomienia</string>
<string name="read_more_in_github_with_link"><![CDATA[Przeczytaj więcej na naszym <font color="#0088ff">repozytorium GitHub</font>.]]></string>
@@ -449,8 +449,8 @@
<string name="paste_the_link_you_received">Wklej link, który otrzymałeś</string>
<string name="video_call_no_encryption">połączenie wideo (bez szyfrowania e2e)</string>
<string name="accept">Akceptuj</string>
<string name="encrypted_audio_call">zaszyfrowane e2e połączenie audio</string>
<string name="encrypted_video_call">zaszyfrowane e2e połączenie wideo</string>
<string name="encrypted_audio_call">połączenie audio zaszyfrowane e2e</string>
<string name="encrypted_video_call">połączenie wideo zaszyfrowane e2e</string>
<string name="ignore">Ignoruj</string>
<string name="reject">Odrzuć</string>
<string name="always_use_relay">Zawsze używaj przekaźnika</string>
@@ -477,7 +477,7 @@
<string name="status_contact_has_e2e_encryption">kontakt posiada szyfrowanie e2e</string>
<string name="status_contact_has_no_e2e_encryption">kontakt nie posiada szyfrowania e2e</string>
<string name="integrity_msg_duplicate">zduplikowana wiadomość</string>
<string name="status_e2e_encrypted">zaszyfrowany e2e</string>
<string name="status_e2e_encrypted">zaszyfrowane e2e</string>
<string name="allow_accepting_calls_from_lock_screen">Włącz połączenia z ekranu blokady poprzez Ustawienia.</string>
<string name="icon_descr_flip_camera">Odwróć aparat</string>
<string name="icon_descr_hang_up">Rozłącz się</string>
@@ -494,7 +494,7 @@
<string name="call_connection_via_relay">przez przekaźnik</string>
<string name="icon_descr_video_off">Wideo wyłączone</string>
<string name="icon_descr_video_on">Wideo włączone</string>
<string name="integrity_msg_skipped">%1$d wiadomość(i) pominięta(e)</string>
<string name="integrity_msg_skipped">%1$d pominięta(ych) wiadomość(i)</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Może to nastąpić, gdy:
\n1. Wiadomości wygasły w wysyłającym kliencie po 2 dniach lub na serwerze po 30 dniach.
\n2. Odszyfrowanie wiadomości nie powiodło się, ponieważ Ty lub Twój kontakt użyliście starej kopii zapasowej bazy danych.
@@ -904,7 +904,7 @@
<string name="v4_3_improved_server_configuration_desc">Dodaj serwery, skanując kody QR.</string>
<string name="button_add_welcome_message">Dodaj wiadomość powitalną</string>
<string name="users_delete_all_chats_deleted">Wszystkie czaty i wiadomości zostaną usunięte - nie można tego cofnąć!</string>
<string name="allow_verb">Pozwól</string>
<string name="allow_verb">Zezwól</string>
<string name="chat_preferences_always">zawsze</string>
<string name="notifications_mode_service">Zawsze włączona</string>
<string name="allow_irreversible_message_deletion_only_if">Zezwalaj na nieodwracalne usuwanie wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli. (24 godziny)</string>
@@ -997,7 +997,7 @@
<string name="stop_chat_to_export_import_or_delete_chat_database">Zatrzymaj czat, aby wyeksportować, zaimportować lub usunąć bazę danych czatu. Podczas zatrzymania chatu nie będzie można odbierać ani wysyłać wiadomości.</string>
<string name="smp_servers_test_some_failed">Niektóre serwery nie przeszły testu:</string>
<string name="thank_you_for_installing_simplex">Dziękujemy za zainstalowanie SimpleX Chat!</string>
<string name="moderate_message_will_be_marked_warning">Wiadomość zostanie oznaczona jako moderowana dla wszystkich członków.</string>
<string name="moderate_message_will_be_marked_warning">Wiadomość zostanie oznaczona jako zmoderowana dla wszystkich członków.</string>
<string name="member_role_will_be_changed_with_notification">Rola zostanie zmieniona na \"%s\". Wszyscy w grupie zostaną powiadomieni.</string>
<string name="delete_files_and_media_desc">Tego działania nie można cofnąć - wszystkie odebrane i wysłane pliki oraz media zostaną usunięte. Obrazy o niskiej rozdzielczości pozostaną.</string>
<string name="switch_receiving_address_desc">Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.</string>
@@ -1215,7 +1215,7 @@
<string name="received_message">Otrzymano wiadomość</string>
<string name="sent_message">Wyślij wiadomość</string>
<string name="info_row_deleted_at">Usunięto o</string>
<string name="info_row_moderated_at">Moderowany o</string>
<string name="info_row_moderated_at">Zmoderowane o</string>
<string name="share_text_received_at">Otrzymane o: %s</string>
<string name="info_row_updated_at">Rekord zaktualizowany o</string>
<string name="info_row_sent_at">Wysłano o</string>
@@ -1226,7 +1226,7 @@
<string name="info_row_disappears_at">Znika o</string>
<string name="share_text_disappears_at">Znika o: %s</string>
<string name="info_menu">Info</string>
<string name="share_text_moderated_at">Moderowany o: %s</string>
<string name="share_text_moderated_at">Zmoderowane o: %s</string>
<string name="edit_history">Historia</string>
<string name="info_row_received_at">Otrzymane o</string>
<string name="current_version_timestamp">%s (aktualny)</string>
@@ -1349,7 +1349,7 @@
<string name="connect_via_member_address_alert_desc">Prośba o połączenie zostanie wysłana do tego członka grupy.</string>
<string name="connect_via_member_address_alert_title">Połączyć bezpośrednio\?</string>
<string name="connect_use_current_profile">Użyj obecnego profilu</string>
<string name="turn_off_battery_optimization_button">Pozwól</string>
<string name="turn_off_battery_optimization_button">Zezwól</string>
<string name="disable_notifications_button">Wyłącz powiadomienia</string>
<string name="turn_off_system_restriction_button">Otwórz ustawienia aplikacji</string>
<string name="system_restricted_background_in_call_title">Brak rozmów w tle</string>
@@ -1639,8 +1639,8 @@
<string name="call_service_notification_video_call">Połączenie wideo</string>
<string name="unable_to_open_browser_title">Błąd podczas otwierania przeglądarki</string>
<string name="unable_to_open_browser_desc">Do połączeń wymagana jest domyślna przeglądarka. Proszę skonfigurować domyślną przeglądarkę systemową, i podzielić się informacją z twórcami.</string>
<string name="e2ee_info_pq_short">Ten czat jest chroniony przez kwantowo odporne szyfrowanie end-to-end.</string>
<string name="e2ee_info_no_pq"><![CDATA[Wiadomości, pliki i połączenia są chronione przez <b>szyfrowanie end-to-end</b> z doskonałym utajnianiem z wyprzedzeniem i odzyskiem po złamaniu.]]></string>
<string name="e2ee_info_pq_short">Ten czat jest chroniony przez szyfrowanie e2e odporne na ataki kwantowe.</string>
<string name="e2ee_info_no_pq"><![CDATA[Wiadomości, pliki i połączenia są chronione przez <b>szyfrowanie end-to-end</b> z perfect forward secrecy, zaprzeczalnością i odzyskiwaniem bezpieczeństwa po kompromitacji.]]></string>
<string name="auth_open_migration_to_another_device">Otwórz ekran migrowania</string>
<string name="migrate_from_another_device">Zmigruj z innego urządzenia</string>
<string name="set_passphrase">Ustaw hasło</string>
@@ -1650,7 +1650,7 @@
<string name="v5_6_safer_groups">Bezpieczniejsze grupy</string>
<string name="v5_6_picture_in_picture_calls_descr">Używaj aplikacji podczas połączenia.</string>
<string name="v5_6_picture_in_picture_calls">Połączenia obraz-w-obrazie</string>
<string name="v5_6_safer_groups_descr">Administratorzy mogą blokować członka dla wszystkich.</string>
<string name="v5_6_safer_groups_descr">Administratorzy mogą zablokować członka dla wszystkich członków.</string>
<string name="invalid_file_link">Nieprawidłowy link</string>
<string name="migrate_to_device_title">Zmigruj tutaj</string>
<string name="migrate_to_device_migrating">Migrowanie</string>
@@ -1686,7 +1686,7 @@
<string name="migrate_from_device_confirm_you_remember_passphrase">Potwierdź, że pamiętasz hasło do bazy danych, aby ją zmigrować.</string>
<string name="migrate_from_device_verify_database_passphrase">Zweryfikuj hasło bazy danych</string>
<string name="migrate_from_device_check_connection_and_try_again">Sprawdź swoje połączenie z internetem i spróbuj ponownie</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Wszystkie twoje kontakty, konwersacje i pliki będą bezpiecznie szyfrowane i wgrywane w kawałkach do skonfigurowanych przekaźników XFTP.</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Wszystkie twoje kontakty, konwersacje i pliki zostaną bezpiecznie zaszyfrowane i wgrane w kawałkach do skonfigurowanych przekaźników XFTP.</string>
<string name="migrate_from_device_archive_and_upload">Archiwizuj i prześlij</string>
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Uwaga</b>: używanie tej samej bazy danych na dwóch urządzeniach zepsuje odszyfrowywanie wiadomości twoich połączeń, jako zabezpieczenie.]]></string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Ostrzeżenie</b>: archiwum zostanie usunięte.]]></string>
@@ -1713,6 +1713,44 @@
<string name="e2ee_info_pq"><![CDATA[Wiadomości, pliki i połączenia są chronione przez <b>kwantowo odporne szyfrowanie end-to-end</b> z doskonałym utajnianiem z wyprzedzeniem i odzyskiem po złamaniu.]]></string>
<string name="v5_6_app_data_migration_descr">Zmigruj do innego urządzenia przez kod QR.</string>
<string name="migrate_to_device_confirm_network_settings_footer">Proszę potwierdzić, że ustawienia sieciowe są prawidłowe dla tego urządzenia.</string>
<string name="conn_event_enabled_pq">kwantowo odporne szyfrowanie e2e</string>
<string name="v5_6_quantum_resistant_encryption">Kwantowo odporne szyfrowanie</string>
<string name="conn_event_enabled_pq">szyfrowanie e2e odporne na ataki kwantowe</string>
<string name="v5_6_quantum_resistant_encryption">Szyfrowanie odporne na ataki kwantowe</string>
<string name="permissions_find_in_settings_and_grant">Znajdź to uprawnienie w ustawieniach Androida i przydziel je manualnie.</string>
<string name="permissions_grant_in_settings">Zezwól w ustawieniach</string>
<string name="permissions_required">Przydziel uprawnienia</string>
<string name="permissions_camera">Aparat</string>
<string name="permissions_camera_and_record_audio">Aparat i mikrofon</string>
<string name="error_showing_desktop_notification">Błąd podczas pokazywania powiadomienia, skontaktuj się z deweloperami.</string>
<string name="permissions_grant">Przydziel uprawnienia, by wykonywać połączenia</string>
<string name="permissions_record_audio">Mikrofon</string>
<string name="permissions_open_settings">Otwórz ustawienia</string>
<string name="forwarded_description">przekazane dalej</string>
<string name="settings_section_title_network_connection">Połączenie z siecią</string>
<string name="files_and_media_not_allowed">Pliki i multimedia nie są dozwolone</string>
<string name="simplex_links_not_allowed">Linki SimpleX są niedozwolone</string>
<string name="voice_messages_not_allowed">Wiadomości głosowe są niedozwolone</string>
<string name="feature_enabled_for">Włączony dla</string>
<string name="feature_roles_owners">właściciele</string>
<string name="simplex_links_are_prohibited_in_group">Linki SimpleX są zablokowane na tej grupie.</string>
<string name="network_type_other">Inne</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">Połączenie ethernet (po kablu)</string>
<string name="feature_roles_admins">administratorzy</string>
<string name="feature_roles_all_members">wszyscy członkowie</string>
<string name="allow_to_send_simplex_links">Zezwól na wysyłanie linków SimpleX.</string>
<string name="network_type_cellular">Sieć komórkowa</string>
<string name="group_members_can_send_simplex_links">Członkowie grupy mogą wysyłać linki SimpleX.</string>
<string name="network_type_no_network_connection">Brak połączenia z siecią</string>
<string name="prohibit_sending_simplex_links">Zabroń wysyłania linków SimpleX</string>
<string name="simplex_links">Linki SimpleX</string>
<string name="forwarded_chat_item_info_tab">Przekazane dalej</string>
<string name="forwarded_from_chat_item_info_title">Przekazane dalej od</string>
<string name="recipients_can_not_see_who_message_from">Odbiorca/y nie mogą zobaczyć od kogo jest ta wiadomość.</string>
<string name="saved_from_chat_item_info_title">Zapisane od</string>
<string name="download_file">Pobierz</string>
<string name="forward_chat_item">Przekaż dalej</string>
<string name="forward_message">Przekaż wiadomość…</string>
<string name="saved_chat_item_info_tab">Zapisane</string>
<string name="saved_description">zapisane</string>
<string name="saved_from_description">zapisane od %s</string>
</resources>
@@ -1798,4 +1798,19 @@
\nЭто может занять несколько минут.</string>
<string name="unable_to_open_browser_title">Ошибка открытия браузера</string>
<string name="unable_to_open_browser_desc">Для звонков требуется веб-браузер по умолчанию. Пожалуйста, настройте браузер по умолчанию в системе и поделитесь дополнительной информацией с разработчиками.</string>
<string name="network_type_other">Другaя сеть</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">Проводная сеть</string>
<string name="network_type_cellular">Мобильная сеть</string>
<string name="settings_section_title_network_connection">Интернет-соединение</string>
<string name="network_type_no_network_connection">Нет интернет-соединения</string>
<string name="error_showing_desktop_notification">Ошибка при показе уведомления, свяжитесь с разработчиками.</string>
<string name="permissions_camera">Камера</string>
<string name="permissions_camera_and_record_audio">Камера и микрофон</string>
<string name="permissions_find_in_settings_and_grant">Найдите это разрешение в настройках Android и добавьте его вручную.</string>
<string name="permissions_grant_in_settings">Разрешить в настройках</string>
<string name="permissions_required">Дать разрешение</string>
<string name="permissions_grant">Дать разрешение для совершения звонков</string>
<string name="permissions_record_audio">Микрофон</string>
<string name="permissions_open_settings">Открыть настройки</string>
</resources>
@@ -1652,7 +1652,7 @@
<string name="v5_6_quantum_resistant_encryption_descr">Doğrudan sohbetlerde etkinleştir (BETA)!</string>
<string name="v5_6_quantum_resistant_encryption">Kuantuma dayanıklı şifreleme</string>
<string name="v5_6_safer_groups_descr">Yöneticiler bir üyeyi tamamen engelleyebilirler.</string>
<string name="v5_6_app_data_migration">Uygulama veri göçü.</string>
<string name="v5_6_app_data_migration">Uygulama verisi taşıma</string>
<string name="v5_6_app_data_migration_descr">QR kodu aracılığıyla başka bir cihaza geçiş yapın.</string>
<string name="v5_6_picture_in_picture_calls">Resim içinde resim çağrıları</string>
<string name="v5_6_safer_groups">Daha güvenli gruplar</string>
@@ -1716,4 +1716,13 @@
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[Aynı veritabanını iki cihazda <b>kullanmamalısınız</b>.]]></string>
<string name="migrate_from_device_try_again">Bir kez daha deneyebilirsiniz.</string>
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Yeni cihazda <i>Başka bir cihazdan taşı</i>\'yı seçin ve QR kodunu tarayın.]]></string>
<string name="permissions_find_in_settings_and_grant">Bu izni Android ayarlarında bulun ve manuel olarak izin verin.</string>
<string name="permissions_required">İzinleri verin</string>
<string name="permissions_grant">Arama yapmak için izin(ler)i verin</string>
<string name="permissions_record_audio">Mikrofon</string>
<string name="permissions_open_settings">Ayarları</string>
<string name="permissions_camera">Kamera</string>
<string name="permissions_camera_and_record_audio">Kamera ve mikrofon</string>
<string name="error_showing_desktop_notification">Bildirim gösterilirken hata oluştu, geliştiricilerle irtibata geçin.</string>
<string name="permissions_grant_in_settings">Ayarlarda izin verin</string>
</resources>
@@ -96,4 +96,38 @@
<string name="settings_section_title_app">ỨNG DỤNG</string>
<string name="v5_6_app_data_migration">Di chuyển dữ liệu ứng dụng</string>
<string name="full_backup">Sao lưu dữ liệu ứng dụng</string>
<string name="app_passcode_replaced_with_self_destruct">Mật mã ứng dụng đã được thay thế bằng mật mã tự hủy.</string>
<string name="v5_3_encrypt_local_files_descr">Ứng dụng mã hóa các tệp cục bộ mới (trừ video).</string>
<string name="migrate_to_device_apply_onion">Áp dụng</string>
<string name="la_app_passcode">Mật mã ứng dụng</string>
<string name="settings_section_title_icon">BIỂU TƯỢNG ỨNG DỤNG</string>
<string name="v5_0_app_passcode">Mật mã ứng dụng</string>
<string name="app_version_name">Phiên bản ứng dụng: v%s</string>
<string name="app_version_title">Phiên bản ứng dụng</string>
<string name="v5_3_new_interface_languages_descr">Tiếng Ả Rập, tiếng Bungari, tiếng Phần Lan, tiếng Do Thái, tiếng Thái và tiếng Ukraina - trân thành gửi lời cảm ơn tới các tình nguyện viên dịch thuật và Weblate.</string>
<string name="migrate_from_device_archiving_database">Lưu trữ cơ sở dữ liệu</string>
<string name="migrate_from_device_archive_and_upload">Lưu trữ và tải lên</string>
<string name="icon_descr_audio_on">Mở âm</string>
<string name="icon_descr_video_asked_to_receive">Yêu cầu để nhận video</string>
<string name="attach">Gắn</string>
<string name="call_service_notification_audio_call">Cuộc gọi thoại</string>
<string name="audio_call_no_encryption">cuộc gọi thoại (không được mã hóa đầu cuối)</string>
<string name="icon_descr_audio_off">Tắt âm</string>
<string name="icon_descr_asked_to_receive">Yêu cầu để nhận hình ảnh</string>
<string name="network_session_mode_user_description"><![CDATA[Một kết nối TCP riêng biệt (và thông tin xác thực SOCKS) sẽ được sử dụng <b>cho mỗi hồ sơ trò chuyện bạn có trong ứng dụng</b>.]]></string>
<string name="network_session_mode_entity_description">Một kết nối TCP riêng biệt (và thông tin xác thực SOCKS) sẽ được sử dụng <b>cho từng liên hệ và thành viên nhóm</b>.
\n<b>Xin lưu ý</b>: nếu bạn có nhiều kết nối, mức tiêu thụ pin và lưu lượng truy cập của bạn có thể cao hơn đáng kể và một số kết nối có thể không thành công.</string>
<string name="icon_descr_audio_call">cuộc gọi thoại</string>
<string name="v4_6_audio_video_calls">Các cuộc gọi thoại và video</string>
<string name="settings_audio_video_calls">Các cuộc gọi thoại và video</string>
<string name="audio_video_calls">Các cuộc gọi thoại/video</string>
<string name="feature_roles_all_members">tất cả các thành viên</string>
<string name="calls_prohibited_with_this_contact">Các cuộc gọi thoại/video bị cấm.</string>
<string name="allow_to_send_simplex_links">Cho phép gửi liên kết SimpleX.</string>
<string name="feature_roles_admins">quản trị viên</string>
<string name="group_member_role_author">tác giả</string>
<string name="authentication_cancelled">Quá trình xác thực đã bị hủy bỏ</string>
<string name="la_authenticate">Xác thực</string>
<string name="auth_unavailable">Quá trình xác thực không có sẵn</string>
<string name="la_auth_failed">Quá trình xác thực đã thất bại</string>
</resources>
@@ -1715,4 +1715,42 @@
<string name="migrate_to_device_try_again">你可以再试一次。</string>
<string name="migrate_from_device_try_again">你可以再试一次。</string>
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>请注意</b>: 作为安全保护措施,在两部设备上使用同一数据库会破坏解密来自你联系人的消息。]]></string>
<string name="error_showing_desktop_notification">显示通知出错,请联系开发者。</string>
<string name="permissions_find_in_settings_and_grant">在 Android 系统设置中找到此权限并手动授予权限。</string>
<string name="permissions_grant_in_settings">在系统设置中授予</string>
<string name="permissions_grant">要进行通话请授予一项或多项权限</string>
<string name="permissions_camera">相机</string>
<string name="permissions_record_audio">麦克风</string>
<string name="permissions_camera_and_record_audio">相机和麦克风</string>
<string name="permissions_open_settings">打开设置</string>
<string name="permissions_required">授予权限</string>
<string name="settings_section_title_network_connection">网络连接</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">有线以太网</string>
<string name="network_type_cellular">移动网络</string>
<string name="network_type_no_network_connection">无网络连接</string>
<string name="network_type_other">其他</string>
<string name="forwarded_description">已转发</string>
<string name="simplex_links_not_allowed">不允许SimpleX 链接</string>
<string name="files_and_media_not_allowed">不允许文件和媒体</string>
<string name="voice_messages_not_allowed">不允许语音消息</string>
<string name="simplex_links">SimpleX 链接</string>
<string name="allow_to_send_simplex_links">允许发送 SimpleX 链接。</string>
<string name="group_members_can_send_simplex_links">群成员可发送 SimpleX 链接。</string>
<string name="prohibit_sending_simplex_links">禁止发送 SimpleX 链接</string>
<string name="simplex_links_are_prohibited_in_group">此群禁止 SimpleX 链接。</string>
<string name="feature_roles_owners">所有者</string>
<string name="feature_enabled_for">启用对象</string>
<string name="feature_roles_admins">管理员</string>
<string name="feature_roles_all_members">所有成员</string>
<string name="download_file">下载</string>
<string name="forward_message">转发消息…</string>
<string name="forward_chat_item">转发</string>
<string name="recipients_can_not_see_who_message_from">收件人看不到这条消息来自何人。</string>
<string name="saved_description">已保存</string>
<string name="saved_chat_item_info_tab">已保存</string>
<string name="saved_from_chat_item_info_title">保存自</string>
<string name="saved_from_description">保存自%s</string>
<string name="forwarded_chat_item_info_tab">已转发</string>
<string name="forwarded_from_chat_item_info_title">转发自</string>
</resources>
@@ -16,7 +16,7 @@ actual fun LocalMultiplatformView(): Any? = null
@Composable
actual fun getKeyboardState(): State<KeyboardState> = remember { mutableStateOf(KeyboardState.Opened) }
actual fun hideKeyboard(view: Any?) {}
actual fun hideKeyboard(view: Any?, clearFocus: Boolean) {}
actual fun androidIsFinishingMainActivity(): Boolean = false
+4 -4
View File
@@ -26,11 +26,11 @@ android.enableJetifier=true
kotlin.mpp.androidSourceSetLayoutVersion=2
kotlin.jvm.target=11
android.version_name=5.7-beta.1
android.version_code=197
android.version_name=5.7-beta.2
android.version_code=198
desktop.version_name=5.7-beta.1
desktop.version_code=38
desktop.version_name=5.7-beta.2
desktop.version_code=39
kotlin.version=1.9.23
gradle.plugin.version=8.2.0
+1 -1
View File
@@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd
source-repository-package
type: git
location: https://github.com/simplex-chat/simplexmq.git
tag: 3d40393ae83260245c7122b850fb42cd4243deba
tag: daa866f3331cf882f1030ae636f9e27a2498ca8b
source-repository-package
type: git
+1 -1
View File
@@ -1,5 +1,5 @@
name: simplex-chat
version: 5.7.0.1
version: 5.7.0.3
#synopsis:
#description:
homepage: https://github.com/simplex-chat/simplex-chat#readme
+1 -1
View File
@@ -1,5 +1,5 @@
{
"https://github.com/simplex-chat/simplexmq.git"."3d40393ae83260245c7122b850fb42cd4243deba" = "0hkfz5k8kn1lqq0ms0b266pzsk48pq1gkfm7wgw6w5mr1pw149ay";
"https://github.com/simplex-chat/simplexmq.git"."daa866f3331cf882f1030ae636f9e27a2498ca8b" = "1bfzw8q8jgblpqh0vjvhs3ddyvgxrdpv18gy84yr6kmvssmdgs76";
"https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38";
"https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d";
"https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl";
+1 -1
View File
@@ -5,7 +5,7 @@ cabal-version: 1.12
-- see: https://github.com/sol/hpack
name: simplex-chat
version: 5.7.0.1
version: 5.7.0.3
category: Web, System, Services, Cryptography
homepage: https://github.com/simplex-chat/simplex-chat#readme
author: simplex.chat
+63 -81
View File
@@ -103,7 +103,7 @@ import Simplex.Messaging.Client (defaultNetworkConfig)
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Crypto.File (CryptoFile (..), CryptoFileArgs (..))
import qualified Simplex.Messaging.Crypto.File as CF
import Simplex.Messaging.Crypto.Ratchet (PQEncryption (..), PQSupport (..), pattern IKNoPQ, pattern IKPQOff, pattern PQEncOff, pattern PQEncOn, pattern PQSupportOff, pattern PQSupportOn)
import Simplex.Messaging.Crypto.Ratchet (PQEncryption (..), PQSupport (..), pattern IKPQOff, pattern IKPQOn, pattern PQEncOff, pattern PQEncOn, pattern PQSupportOff, pattern PQSupportOn)
import qualified Simplex.Messaging.Crypto.Ratchet as CR
import Simplex.Messaging.Encoding
import Simplex.Messaging.Encoding.String
@@ -250,7 +250,6 @@ newChatController
encryptLocalFiles <- newTVarIO False
tempDirectory <- newTVarIO optTempDirectory
contactMergeEnabled <- newTVarIO True
pqExperimentalEnabled <- newTVarIO PQSupportOff
pure
ChatController
{ firstTime,
@@ -287,8 +286,7 @@ newChatController
encryptLocalFiles,
tempDirectory,
logFilePath = logFile,
contactMergeEnabled,
pqExperimentalEnabled
contactMergeEnabled
}
where
configServers :: DefaultAgentServers
@@ -408,7 +406,7 @@ subscribeUsers onlyNeeded users = do
subscribe vr us
subscribe vr us'
where
subscribe :: (PQSupport -> VersionRangeChat) -> [User] -> CM' ()
subscribe :: VersionRangeChat -> [User] -> CM' ()
subscribe vr = mapM_ $ runExceptT . subscribeUserConnections vr onlyNeeded Agent.subscribeConnections
startFilesToReceive :: [User] -> CM' ()
@@ -492,7 +490,7 @@ processChatCommand cmd =
chatVersionRange >>= (`processChatCommand'` cmd)
{-# INLINE processChatCommand #-}
processChatCommand' :: (PQSupport -> VersionRangeChat) -> ChatCommand -> CM ChatResponse
processChatCommand' :: VersionRangeChat -> ChatCommand -> CM ChatResponse
processChatCommand' vr = \case
ShowActiveUser -> withUser' $ pure . CRActiveUser
CreateActiveUser NewUser {profile, sameServers, pastTimestamp} -> do
@@ -634,20 +632,6 @@ processChatCommand' vr = \case
ok_
APISetEncryptLocalFiles on -> chatWriteVar encryptLocalFiles on >> ok_
SetContactMergeEnabled onOff -> chatWriteVar contactMergeEnabled onOff >> ok_
APISetPQEncryption onOff -> chatWriteVar pqExperimentalEnabled onOff >> ok_
APISetContactPQ ctId pqEnc -> withUser $ \user -> do
ct@Contact {activeConn} <- withStore $ \db -> getContact db vr user ctId
case activeConn of
Just conn@Connection {connId, pqSupport, pqEncryption}
| pqEncryption == pqEnc -> pure $ CRContactPQAllowed user ct pqEnc
| otherwise -> do
let pqSup = PQSupport $ pqEnc == PQEncOn || pqSupport == PQSupportOn
conn' = conn {pqSupport = pqSup, pqEncryption = pqEnc} :: Connection
ct' = ct {activeConn = Just conn'} :: Contact
withStore' $ \db -> updateConnSupportPQ db connId pqSup pqEnc
pure $ CRContactPQAllowed user ct' pqEnc
Nothing -> throwChatError $ CEContactNotActive ct
SetContactPQ cName pqEnc -> withContactName cName (`APISetContactPQ` pqEnc)
APIExportArchive cfg -> checkChatStopped $ lift (exportArchive cfg) >> ok_
ExportArchive -> do
ts <- liftIO getCurrentTime
@@ -1470,10 +1454,9 @@ processChatCommand' vr = \case
-- [incognito] generate profile for connection
incognitoProfile <- if incognito then Just <$> liftIO generateRandomProfile else pure Nothing
subMode <- chatReadVar subscriptionMode
pqSup <- chatReadVar pqExperimentalEnabled
(connId, cReq) <- withAgent $ \a -> createConnection a (aUserId user) True SCMInvitation Nothing (IKNoPQ pqSup) subMode
(connId, cReq) <- withAgent $ \a -> createConnection a (aUserId user) True SCMInvitation Nothing IKPQOn subMode
-- TODO PQ pass minVersion from the current range
conn <- withStore' $ \db -> createDirectConnection db user connId cReq ConnNew incognitoProfile subMode initialChatVersion pqSup
conn <- withStore' $ \db -> createDirectConnection db user connId cReq ConnNew incognitoProfile subMode initialChatVersion PQSupportOn
pure $ CRInvitation user cReq conn
AddContact incognito -> withUser $ \User {userId} ->
processChatCommand $ APIAddContact userId incognito
@@ -1499,8 +1482,7 @@ processChatCommand' vr = \case
-- [incognito] generate profile to send
incognitoProfile <- if incognito then Just <$> liftIO generateRandomProfile else pure Nothing
let profileToSend = userProfileToSend user incognitoProfile Nothing False
pqSup <- chatReadVar pqExperimentalEnabled
lift (withAgent' $ \a -> connRequestPQSupport a pqSup cReq) >>= \case
lift (withAgent' $ \a -> connRequestPQSupport a PQSupportOn cReq) >>= \case
Nothing -> throwChatError CEInvalidConnReq
-- TODO PQ the error above should be CEIncompatibleConnReqVersion, also the same API should be called in Plan
Just (agentV, pqSup') -> do
@@ -1541,8 +1523,7 @@ processChatCommand' vr = \case
processChatCommand $ APIListContacts userId
APICreateMyAddress userId -> withUserId userId $ \user -> procCmd $ do
subMode <- chatReadVar subscriptionMode
-- TODO v5.7 pass IPPQOn
(connId, cReq) <- withAgent $ \a -> createConnection a (aUserId user) True SCMContact Nothing IKPQOff subMode
(connId, cReq) <- withAgent $ \a -> createConnection a (aUserId user) True SCMContact Nothing IKPQOn subMode
withStore $ \db -> createUserContactLink db user connId cReq subMode
pure $ CRUserContactLinkCreated user cReq
CreateMyAddress -> withUser $ \User {userId} ->
@@ -1671,8 +1652,8 @@ processChatCommand' vr = \case
addContactConn ct ctConns = case contactSendConn_ ct of
Right conn | directOrUsed ct -> (ct, conn) : ctConns
_ -> ctConns
ctSndEvent :: (Contact, Connection) -> (ConnOrGroupId, PQSupport, ChatMsgEvent 'Json)
ctSndEvent (_, Connection {connId, pqSupport}) = (ConnectionId connId, pqSupport, XMsgNew $ MCSimple (extMsgContent mc Nothing))
ctSndEvent :: (Contact, Connection) -> (ConnOrGroupId, ChatMsgEvent 'Json)
ctSndEvent (_, Connection {connId}) = (ConnectionId connId, XMsgNew $ MCSimple (extMsgContent mc Nothing))
ctMsgReq :: (Contact, Connection) -> SndMessage -> MsgReq
ctMsgReq (_, conn) SndMessage {msgId, msgBody} = (conn, MsgFlags {notification = hasNotification XMsgNew_}, msgBody, msgId)
zipWith3' :: (a -> b -> c -> d) -> NonEmpty a -> NonEmpty b -> NonEmpty c -> NonEmpty d
@@ -1762,7 +1743,7 @@ processChatCommand' vr = \case
subMode <- chatReadVar subscriptionMode
dm <- encodeConnInfo $ XGrpAcpt membershipMemId
agentConnId <- withAgent $ \a -> joinConnection a (aUserId user) True connRequest dm PQSupportOff subMode
let chatV = vr PQSupportOff `peerConnChatVersion` peerChatVRange
let chatV = vr `peerConnChatVersion` peerChatVRange
withStore' $ \db -> do
createMemberConnection db userId fromMember agentConnId chatV peerChatVRange subMode
updateGroupMemberStatus db userId fromMember GSMemAccepted
@@ -1925,6 +1906,7 @@ processChatCommand' vr = \case
unless (maxVersion peerChatVRange >= groupDirectInvVersion) $ throwChatError CEPeerChatVRangeIncompatible
when (isJust $ memberContactId m) $ throwChatError $ CECommandError "member contact already exists"
subMode <- chatReadVar subscriptionMode
-- TODO PQ should negotitate contact connection with PQSupportOn?
(connId, cReq) <- withAgent $ \a -> createConnection a (aUserId user) True SCMInvitation Nothing IKPQOff subMode
-- [incognito] reuse membership incognito profile
ct <- withStore' $ \db -> createMemberContact db user connId cReq g m mConn subMode
@@ -2289,7 +2271,7 @@ processChatCommand' vr = \case
connect' (Just gLinkId) cReqHash xContactId True
where
connect' groupLinkId cReqHash xContactId inGroup = do
pqSup <- if inGroup then pure PQSupportOff else chatReadVar pqExperimentalEnabled
let pqSup = if inGroup then PQSupportOff else PQSupportOn
(connId, incognitoProfile, subMode, chatV) <- requestContact user incognito cReq xContactId inGroup pqSup
conn <- withStore' $ \db -> createConnReqConnection db userId connId cReqHash xContactId incognitoProfile groupLinkId subMode chatV pqSup
pure $ CRSentInvitation user conn incognitoProfile
@@ -2297,7 +2279,7 @@ processChatCommand' vr = \case
connectContactViaAddress user incognito ct cReq =
withInvitationLock "connectContactViaAddress" (strEncode cReq) $ do
newXContactId <- XContactId <$> drgRandomBytes 16
pqSup <- chatReadVar pqExperimentalEnabled
let pqSup = PQSupportOn
(connId, incognitoProfile, subMode, chatV) <- requestContact user incognito cReq newXContactId False pqSup
let cReqHash = ConnReqUriHash . C.sha256Hash $ strEncode cReq
ct' <- withStore $ \db -> createAddressContactConnection db vr user ct connId cReqHash newXContactId incognitoProfile subMode chatV pqSup
@@ -2370,8 +2352,8 @@ processChatCommand' vr = \case
mergedProfile = userProfileToSend user Nothing (Just ct) False
ct' = updateMergedPreferences user' ct
mergedProfile' = userProfileToSend user' Nothing (Just ct') False
ctSndEvent :: ChangedProfileContact -> (ConnOrGroupId, PQSupport, ChatMsgEvent 'Json)
ctSndEvent ChangedProfileContact {mergedProfile', conn = Connection {connId, pqSupport}} = (ConnectionId connId, pqSupport, XInfo mergedProfile')
ctSndEvent :: ChangedProfileContact -> (ConnOrGroupId, ChatMsgEvent 'Json)
ctSndEvent ChangedProfileContact {mergedProfile', conn = Connection {connId}} = (ConnectionId connId, XInfo mergedProfile')
ctMsgReq :: ChangedProfileContact -> Either ChatError SndMessage -> Either ChatError MsgReq
ctMsgReq ChangedProfileContact {conn} =
fmap $ \SndMessage {msgId, msgBody} ->
@@ -3116,10 +3098,10 @@ getRcvFilePath fileId fPath_ fn keepHandle = case fPath_ of
acceptContactRequest :: User -> UserContactRequest -> Maybe IncognitoProfile -> Bool -> CM Contact
acceptContactRequest user UserContactRequest {agentInvitationId = AgentInvId invId, cReqChatVRange, localDisplayName = cName, profileId, profile = cp, userContactLinkId, xContactId, pqSupport} incognitoProfile contactUsed = do
subMode <- chatReadVar subscriptionMode
pqSup <- chatReadVar pqExperimentalEnabled
let pqSup = PQSupportOn
vr <- chatVersionRange
let profileToSend = profileToSendOnAccept user incognitoProfile False
chatV = vr pqSup `peerConnChatVersion` cReqChatVRange
chatV = vr `peerConnChatVersion` cReqChatVRange
pqSup' = pqSup `CR.pqSupportAnd` pqSupport
dm <- encodeConnInfoPQ pqSup' chatV $ XInfo profileToSend
acId <- withAgent $ \a -> acceptContact a True invId dm pqSup' subMode
@@ -3130,7 +3112,7 @@ acceptContactRequestAsync user UserContactRequest {agentInvitationId = AgentInvI
subMode <- chatReadVar subscriptionMode
let profileToSend = profileToSendOnAccept user incognitoProfile False
vr <- chatVersionRange
chatV <- (\pq -> vr pq `peerConnChatVersion` cReqChatVRange) <$> chatReadVar pqExperimentalEnabled
let chatV = vr `peerConnChatVersion` cReqChatVRange
(cmdId, acId) <- agentAcceptContactAsync user True invId (XInfo profileToSend) subMode pqSup chatV
withStore' $ \db -> do
ct@Contact {activeConn} <- createAcceptedContact db user acId chatV cReqChatVRange cName profileId p userContactLinkId xContactId incognitoProfile subMode pqSup contactUsed
@@ -3160,7 +3142,7 @@ acceptGroupJoinRequestAsync
}
subMode <- chatReadVar subscriptionMode
vr <- chatVersionRange
chatV <- (\pq -> vr pq `peerConnChatVersion` cReqChatVRange) <$> chatReadVar pqExperimentalEnabled
let chatV = vr `peerConnChatVersion` cReqChatVRange
connIds <- agentAcceptContactAsync user True invId msg subMode PQSupportOff chatV
withStore $ \db -> do
liftIO $ createAcceptedMemberConnection db user connIds chatV ucr groupMemberId subMode
@@ -3206,7 +3188,7 @@ agentSubscriber = do
type AgentBatchSubscribe = AgentClient -> [ConnId] -> ExceptT AgentErrorType IO (Map ConnId (Either AgentErrorType ()))
subscribeUserConnections :: (PQSupport -> VersionRangeChat) -> Bool -> AgentBatchSubscribe -> User -> CM ()
subscribeUserConnections :: VersionRangeChat -> Bool -> AgentBatchSubscribe -> User -> CM ()
subscribeUserConnections vr onlyNeeded agentBatchSubscribe user = do
-- get user connections
ce <- asks $ subscriptionEvents . config
@@ -3500,7 +3482,7 @@ expireChatItems user@User {userId} ttl sync = do
cancelFilesInProgress user filesInfo
deleteFilesLocally filesInfo
withStore' $ \db -> deleteContactExpiredCIs db user ct expirationDate
processGroup :: (PQSupport -> VersionRangeChat) -> UTCTime -> UTCTime -> GroupInfo -> CM ()
processGroup :: VersionRangeChat -> UTCTime -> UTCTime -> GroupInfo -> CM ()
processGroup vr expirationDate createdAtCutoff gInfo = do
lift waitChatStartedAndActivated
filesInfo <- withStore' $ \db -> getGroupExpiredFileInfo db user gInfo expirationDate createdAtCutoff
@@ -3658,7 +3640,7 @@ processAgentMsgSndFile _corrId aFileId msg = do
case L.nonEmpty fds of
Just fds' -> loopSend fds'
Nothing -> pure msgDeliveryId
sendFileError :: Text -> (PQSupport -> VersionRangeChat) -> FileTransferMeta -> CM ()
sendFileError :: Text -> VersionRangeChat -> FileTransferMeta -> CM ()
sendFileError err vr ft = do
logError $ "Sent file error: " <> err
ci <- withStore $ \db -> do
@@ -3724,7 +3706,7 @@ processAgentMsgRcvFile _corrId aFileId msg = do
agentXFTPDeleteRcvFile aFileId fileId
toView $ CRRcvFileError user ci e ft
processAgentMessageConn :: (PQSupport -> VersionRangeChat) -> User -> ACorrId -> ConnId -> ACommand 'Agent 'AEConn -> CM ()
processAgentMessageConn :: VersionRangeChat -> User -> ACorrId -> ConnId -> ACommand 'Agent 'AEConn -> CM ()
processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = do
-- Missing connection/entity errors here will be sent to the view but not shown as CRITICAL alert,
-- as in this case no need to ACK message - we can't process messages for this connection anyway.
@@ -4105,7 +4087,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
profileToSend = profileToSendOnAccept user profileMode True
void $ sendDirectMemberMessage conn (XGrpLinkMem profileToSend) groupId
sendIntroductions members = do
intros <- withStore' $ \db -> createIntroductions db (maxVersion $ vr PQSupportOff) members m
intros <- withStore' $ \db -> createIntroductions db (maxVersion vr) members m
shuffledIntros <- liftIO $ shuffleIntros intros
if m `supportsVersion` batchSendVersion
then do
@@ -4557,9 +4539,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
Nothing -> do
-- [incognito] generate profile to send, create connection with incognito profile
incognitoProfile <- if acceptIncognito then Just . NewIncognito <$> liftIO generateRandomProfile else pure Nothing
pqSup <- chatReadVar pqExperimentalEnabled
let pqSup' = pqSup `CR.pqSupportAnd` reqPQSup
ct <- acceptContactRequestAsync user cReq incognitoProfile True pqSup'
ct <- acceptContactRequestAsync user cReq incognitoProfile True reqPQSup
toView $ CRAcceptingContactRequest user ct
Just groupId -> do
gInfo <- withStore $ \db -> getGroupInfo db vr user groupId
@@ -5644,8 +5624,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
| maxVersion mcvr >= groupDirectInvVersion -> pure Nothing
| otherwise -> Just <$> createConn subMode
let customUserProfileId = localProfileId <$> incognitoMembershipProfile gInfo
vr' = vr PQSupportOff
chatV = maybe (minVersion vr') (\peerVR -> vr' `peerConnChatVersion` fromChatVRange peerVR) memChatVRange
chatV = maybe (minVersion vr) (\peerVR -> vr `peerConnChatVersion` fromChatVRange peerVR) memChatVRange
void $ withStore $ \db -> createIntroReMember db user gInfo m chatV memInfo memRestrictions groupConnIds directConnIds customUserProfileId subMode
_ -> messageError "x.grp.mem.intro can be only sent by host member"
where
@@ -5693,7 +5672,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
directConnIds <- forM directConnReq $ \dcr -> joinAgentConnectionAsync user True dcr dm subMode
let customUserProfileId = localProfileId <$> incognitoMembershipProfile gInfo
mcvr = maybe chatInitialVRange fromChatVRange memChatVRange
chatV = vr PQSupportOff `peerConnChatVersion` mcvr
chatV = vr `peerConnChatVersion` mcvr
withStore' $ \db -> createIntroToMemberContact db user m toMember chatV mcvr groupConnIds directConnIds customUserProfileId subMode
xGrpMemRole :: GroupInfo -> GroupMember -> MemberId -> GroupMemberRole -> RcvMessage -> UTCTime -> CM ()
@@ -5892,6 +5871,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
joinConn subMode = do
-- [incognito] send membership incognito profile
let p = userProfileToSend user (fromLocalProfile <$> incognitoMembershipProfile g) Nothing False
-- TODO PQ should negotitate contact connection with PQSupportOn? (use encodeConnInfoPQ)
dm <- encodeConnInfo $ XInfo p
joinAgentConnectionAsync user True connReq dm subMode
createItems mCt' m' = do
@@ -6048,19 +6028,24 @@ metaBrokerTs MsgMeta {broker = (_, brokerTs)} = brokerTs
sameMemberId :: MemberId -> GroupMember -> Bool
sameMemberId memId GroupMember {memberId} = memId == memberId
-- TODO v5.7 for contacts only version upgrade should trigger enabling PQ support/encryption
updatePeerChatVRange :: Connection -> VersionRangeChat -> CM Connection
updatePeerChatVRange conn@Connection {connId, connChatVersion = v, peerChatVRange, pqSupport} msgVRange = do
v' <- lift $ upgradedConnVersion pqSupport v msgVRange
if msgVRange /= peerChatVRange || v' /= v
updatePeerChatVRange conn@Connection {connId, connChatVersion = v, peerChatVRange, connType, pqSupport, pqEncryption} msgVRange = do
v' <- lift $ upgradedConnVersion v msgVRange
conn' <- if msgVRange /= peerChatVRange || v' /= v
then do
withStore' $ \db -> setPeerChatVRange db connId v' msgVRange
pure conn {connChatVersion = v', peerChatVRange = msgVRange}
else pure conn
-- TODO v6.0 remove/review: for contacts only version upgrade should trigger enabling PQ support/encryption
if connType == ConnContact && v' >= pqEncryptionCompressionVersion && (pqSupport /= PQSupportOn || pqEncryption /= PQEncOn)
then do
withStore' $ \db -> updateConnSupportPQ db connId PQSupportOn PQEncOn
pure conn' {pqSupport = PQSupportOn, pqEncryption = PQEncOn}
else pure conn'
updateMemberChatVRange :: GroupMember -> Connection -> VersionRangeChat -> CM (GroupMember, Connection)
updateMemberChatVRange mem@GroupMember {groupMemberId} conn@Connection {connId, connChatVersion = v, peerChatVRange} msgVRange = do
v' <- lift $ upgradedConnVersion PQSupportOff v msgVRange
v' <- lift $ upgradedConnVersion v msgVRange
if msgVRange /= peerChatVRange || v' /= v
then do
withStore' $ \db -> do
@@ -6070,11 +6055,11 @@ updateMemberChatVRange mem@GroupMember {groupMemberId} conn@Connection {connId,
pure (mem {memberChatVRange = msgVRange, activeConn = Just conn'}, conn')
else pure (mem, conn)
upgradedConnVersion :: PQSupport -> VersionChat -> VersionRangeChat -> CM' VersionChat
upgradedConnVersion pqSup v peerVR = do
upgradedConnVersion :: VersionChat -> VersionRangeChat -> CM' VersionChat
upgradedConnVersion v peerVR = do
vr <- chatVersionRange'
-- don't allow reducing agreed connection version
pure $ maybe v (\(Compatible v') -> max v v') $ vr pqSup `compatibleVersion` peerVR
pure $ maybe v (\(Compatible v') -> max v v') $ vr `compatibleVersion` peerVR
parseFileDescription :: FilePartyI p => Text -> CM (ValidFileDescription p)
parseFileDescription =
@@ -6241,7 +6226,7 @@ cancelSndFileTransfer user@User {userId} ft@SndFileTransfer {fileId, connId, age
Just _ -> do
vr <- chatVersionRange
(sharedMsgId, conn) <- withStore $ \db -> (,) <$> getSharedMsgIdByFileId db userId fileId <*> getConnectionById db vr user connId
void $ sendDirectMessage_ conn PQSupportOff (BFileChunk sharedMsgId FileChunkCancel) (ConnectionId connId)
void $ sendDirectMessage_ conn (BFileChunk sharedMsgId FileChunkCancel) (ConnectionId connId)
_ -> withAgent $ \a -> void . sendMessage a acId PQEncOff SMP.noMsgFlags $ smpEncode FileChunkCancel
pure fileConnId
fileConnId = if isNothing fileInline then Just acId else Nothing
@@ -6281,8 +6266,8 @@ deleteOrUpdateMemberRecord user@User {userId} member =
sendDirectContactMessage :: MsgEncodingI e => User -> Contact -> ChatMsgEvent e -> CM (SndMessage, Int64)
sendDirectContactMessage user ct chatMsgEvent = do
conn@Connection {connId, pqSupport} <- liftEither $ contactSendConn_ ct
r <- sendDirectMessage_ conn pqSupport chatMsgEvent (ConnectionId connId)
conn@Connection {connId} <- liftEither $ contactSendConn_ ct
r <- sendDirectMessage_ conn chatMsgEvent (ConnectionId connId)
let (sndMessage, msgDeliveryId, pqEnc') = r
void $ createContactPQSndItem user ct conn pqEnc'
pure (sndMessage, msgDeliveryId)
@@ -6301,37 +6286,37 @@ contactSendConn_ ct@Contact {activeConn} = case activeConn of
-- unlike sendGroupMemberMessage, this function will not store message as pending
-- TODO v5.8 we could remove pending messages once all clients support forwarding
sendDirectMemberMessage :: MsgEncodingI e => Connection -> ChatMsgEvent e -> GroupId -> CM (SndMessage, Int64, PQEncryption)
sendDirectMemberMessage conn chatMsgEvent groupId = sendDirectMessage_ conn PQSupportOff chatMsgEvent (GroupId groupId)
sendDirectMemberMessage conn chatMsgEvent groupId = sendDirectMessage_ conn chatMsgEvent (GroupId groupId)
sendDirectMessage_ :: MsgEncodingI e => Connection -> PQSupport -> ChatMsgEvent e -> ConnOrGroupId -> CM (SndMessage, Int64, PQEncryption)
sendDirectMessage_ conn pqSup chatMsgEvent connOrGroupId = do
sendDirectMessage_ :: MsgEncodingI e => Connection -> ChatMsgEvent e -> ConnOrGroupId -> CM (SndMessage, Int64, PQEncryption)
sendDirectMessage_ conn chatMsgEvent connOrGroupId = do
when (connDisabled conn) $ throwChatError (CEConnectionDisabled conn)
msg@SndMessage {msgId, msgBody} <- createSndMessage chatMsgEvent connOrGroupId pqSup
msg@SndMessage {msgId, msgBody} <- createSndMessage chatMsgEvent connOrGroupId
-- TODO move compressed body to SndMessage and compress in createSndMessage
(msgDeliveryId, pqEnc') <- deliverMessage conn (toCMEventTag chatMsgEvent) msgBody msgId
pure (msg, msgDeliveryId, pqEnc')
createSndMessage :: MsgEncodingI e => ChatMsgEvent e -> ConnOrGroupId -> PQSupport -> CM SndMessage
createSndMessage chatMsgEvent connOrGroupId pqSup =
liftEither . runIdentity =<< lift (createSndMessages $ Identity (connOrGroupId, pqSup, chatMsgEvent))
createSndMessage :: MsgEncodingI e => ChatMsgEvent e -> ConnOrGroupId -> CM SndMessage
createSndMessage chatMsgEvent connOrGroupId =
liftEither . runIdentity =<< lift (createSndMessages $ Identity (connOrGroupId, chatMsgEvent))
createSndMessages :: forall e t. (MsgEncodingI e, Traversable t) => t (ConnOrGroupId, PQSupport, ChatMsgEvent e) -> CM' (t (Either ChatError SndMessage))
createSndMessages :: forall e t. (MsgEncodingI e, Traversable t) => t (ConnOrGroupId, ChatMsgEvent e) -> CM' (t (Either ChatError SndMessage))
createSndMessages idsEvents = do
g <- asks random
vr <- chatVersionRange'
withStoreBatch $ \db -> fmap (createMsg db g vr) idsEvents
where
createMsg :: DB.Connection -> TVar ChaChaDRG -> (PQSupport -> VersionRangeChat) -> (ConnOrGroupId, PQSupport, ChatMsgEvent e) -> IO (Either ChatError SndMessage)
createMsg db g vr (connOrGroupId, pqSup, evnt) = runExceptT $ do
createMsg :: DB.Connection -> TVar ChaChaDRG -> VersionRangeChat -> (ConnOrGroupId, ChatMsgEvent e) -> IO (Either ChatError SndMessage)
createMsg db g vr (connOrGroupId, evnt) = runExceptT $ do
withExceptT ChatErrorStore $ createNewSndMessage db g connOrGroupId evnt encodeMessage
where
encodeMessage sharedMsgId =
encodeChatMessage maxEncodedMsgLength ChatMessage {chatVRange = vr pqSup, msgId = Just sharedMsgId, chatMsgEvent = evnt}
encodeChatMessage maxEncodedMsgLength ChatMessage {chatVRange = vr, msgId = Just sharedMsgId, chatMsgEvent = evnt}
sendGroupMemberMessages :: forall e. MsgEncodingI e => User -> Connection -> NonEmpty (ChatMsgEvent e) -> GroupId -> CM ()
sendGroupMemberMessages user conn events groupId = do
when (connDisabled conn) $ throwChatError (CEConnectionDisabled conn)
let idsEvts = L.map (GroupId groupId,PQSupportOff,) events
let idsEvts = L.map (GroupId groupId,) events
(errs, msgs) <- lift $ partitionEithers . L.toList <$> createSndMessages idsEvts
unless (null errs) $ toView $ CRChatErrors (Just user) errs
forM_ (L.nonEmpty msgs) $ \msgs' -> do
@@ -6367,12 +6352,12 @@ batchSndMessagesJSON = batchMessages maxEncodedMsgLength . L.toList
encodeConnInfo :: MsgEncodingI e => ChatMsgEvent e -> CM ByteString
encodeConnInfo chatMsgEvent = do
vr <- chatVersionRange
encodeConnInfoPQ PQSupportOff (maxVersion $ vr PQSupportOff) chatMsgEvent
encodeConnInfoPQ PQSupportOff (maxVersion vr) chatMsgEvent
encodeConnInfoPQ :: MsgEncodingI e => PQSupport -> VersionChat -> ChatMsgEvent e -> CM ByteString
encodeConnInfoPQ pqSup v chatMsgEvent = do
vr <- chatVersionRange
let info = ChatMessage {chatVRange = vr pqSup, msgId = Nothing, chatMsgEvent}
let info = ChatMessage {chatVRange = vr, msgId = Nothing, chatMsgEvent}
case encodeChatMessage maxEncodedInfoLength info of
ECMEncoded connInfo -> case pqSup of
PQSupportOn | v >= pqEncryptionCompressionVersion && B.length connInfo > maxCompressedInfoLength -> do
@@ -6459,7 +6444,7 @@ sendGroupMessage user gInfo members chatMsgEvent = do
sendGroupMessage' :: MsgEncodingI e => User -> GroupInfo -> [GroupMember] -> ChatMsgEvent e -> CM (SndMessage, [GroupMember])
sendGroupMessage' user GroupInfo {groupId} members chatMsgEvent = do
msg@SndMessage {msgId, msgBody} <- createSndMessage chatMsgEvent (GroupId groupId) PQSupportOff
msg@SndMessage {msgId, msgBody} <- createSndMessage chatMsgEvent (GroupId groupId)
recipientMembers <- liftIO $ shuffleMembers (filter memberCurrent members)
let msgFlags = MsgFlags {notification = hasNotification $ toCMEventTag chatMsgEvent}
(toSend, pending) = foldr addMember ([], []) recipientMembers
@@ -6514,7 +6499,7 @@ memberSendAction chatMsgEvent members m@GroupMember {invitedByGroupMemberId} = c
sendGroupMemberMessage :: MsgEncodingI e => User -> GroupMember -> ChatMsgEvent e -> Int64 -> Maybe Int64 -> CM () -> CM ()
sendGroupMemberMessage user m@GroupMember {groupMemberId} chatMsgEvent groupId introId_ postDeliver = do
msg <- createSndMessage chatMsgEvent (GroupId groupId) PQSupportOff
msg <- createSndMessage chatMsgEvent (GroupId groupId)
messageMember msg `catchChatError` (\e -> toView (CRChatError (Just user) e))
where
messageMember :: SndMessage -> CM ()
@@ -6931,11 +6916,11 @@ waitChatStartedAndActivated = do
activated <- readTVar chatActivated
unless (isJust started && activated) retry
chatVersionRange :: CM (PQSupport -> VersionRangeChat)
chatVersionRange :: CM VersionRangeChat
chatVersionRange = lift chatVersionRange'
{-# INLINE chatVersionRange #-}
chatVersionRange' :: CM' (PQSupport -> VersionRangeChat)
chatVersionRange' :: CM' VersionRangeChat
chatVersionRange' = do
ChatConfig {chatVRange} <- asks config
pure chatVRange
@@ -6983,9 +6968,6 @@ chatCommandP =
"/remote_hosts_folder " *> (SetRemoteHostsFolder <$> filePath),
"/_files_encrypt " *> (APISetEncryptLocalFiles <$> onOffP),
"/contact_merge " *> (SetContactMergeEnabled <$> onOffP),
"/_pq @" *> (APISetContactPQ <$> A.decimal <* A.space <*> (PQEncryption <$> onOffP)),
"/pq @" *> (SetContactPQ <$> displayName <* A.space <*> (PQEncryption <$> onOffP)),
"/pq " *> (APISetPQEncryption . PQSupport <$> onOffP),
"/_db export " *> (APIExportArchive <$> jsonP),
"/db export" $> ExportArchive,
"/_db import " *> (APIImportArchive <$> jsonP),
+3 -8
View File
@@ -76,7 +76,7 @@ import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Crypto.File (CryptoFile (..))
import qualified Simplex.Messaging.Crypto.File as CF
import Simplex.Messaging.Crypto.Ratchet (PQEncryption, PQSupport (..))
import Simplex.Messaging.Crypto.Ratchet (PQEncryption)
import Simplex.Messaging.Encoding.String
import Simplex.Messaging.Notifications.Protocol (DeviceToken (..), NtfTknStatus)
import Simplex.Messaging.Parsers (defaultJSON, dropPrefix, enumJSON, parseAll, parseString, sumTypeJSON)
@@ -126,7 +126,7 @@ coreVersionInfo simplexmqCommit =
data ChatConfig = ChatConfig
{ agentConfig :: AgentConfig,
chatVRange :: PQSupport -> VersionRangeChat,
chatVRange :: VersionRangeChat,
confirmMigrations :: MigrationConfirmation,
defaultServers :: DefaultAgentServers,
tbqSize :: Natural,
@@ -230,8 +230,7 @@ data ChatController = ChatController
encryptLocalFiles :: TVar Bool,
tempDirectory :: TVar (Maybe FilePath),
logFilePath :: Maybe FilePath,
contactMergeEnabled :: TVar Bool,
pqExperimentalEnabled :: TVar PQSupport -- TODO v5.7 remove
contactMergeEnabled :: TVar Bool
}
data HelpSection = HSMain | HSFiles | HSGroups | HSContacts | HSMyAddress | HSIncognito | HSMarkdown | HSMessages | HSRemote | HSSettings | HSDatabase
@@ -268,9 +267,6 @@ data ChatCommand
| SetRemoteHostsFolder FilePath
| APISetEncryptLocalFiles Bool
| SetContactMergeEnabled Bool
| APISetPQEncryption PQSupport
| APISetContactPQ ContactId PQEncryption
| SetContactPQ ContactName PQEncryption
| APIExportArchive ArchiveConfig
| ExportArchive
| APIImportArchive ArchiveConfig
@@ -736,7 +732,6 @@ data ChatResponse
| CRRemoteCtrlSessionCode {remoteCtrl_ :: Maybe RemoteCtrlInfo, sessionCode :: Text}
| CRRemoteCtrlConnected {remoteCtrl :: RemoteCtrlInfo}
| CRRemoteCtrlStopped {rcsState :: RemoteCtrlSessionState, rcStopReason :: RemoteCtrlStopReason}
| CRContactPQAllowed {user :: User, contact :: Contact, pqEncryption :: PQEncryption}
| CRContactPQEnabled {user :: User, contact :: Contact, pqEnabled :: PQEncryption}
| CRSQLResult {rows :: [Text]}
| CRSlowSQLQueries {chatQueries :: [SlowSQLQuery], agentQueries :: [SlowSQLQuery]}
+3 -7
View File
@@ -49,7 +49,6 @@ import Simplex.Chat.Types.Shared
import Simplex.Chat.Types.Util
import Simplex.Messaging.Agent.Protocol (VersionSMPA, pqdrSMPAgentVersion)
import Simplex.Messaging.Compression (compress1, decompressBatch)
import Simplex.Messaging.Crypto.Ratchet (PQSupport (..), pattern PQSupportOff, pattern PQSupportOn)
import Simplex.Messaging.Encoding
import Simplex.Messaging.Encoding.String
import Simplex.Messaging.Parsers (defaultJSON, dropPrefix, fromTextField_, fstToLower, parseAll, sumTypeJSON, taggedObjectJSON)
@@ -70,14 +69,11 @@ import Simplex.Messaging.Version hiding (version)
-- This indirection is needed for backward/forward compatibility testing.
-- Testing with real app versions is still needed, as tests use the current code with different version ranges, not the old code.
currentChatVersion :: VersionChat
currentChatVersion = VersionChat 7
currentChatVersion = VersionChat 8
-- This should not be used directly in code, instead use `chatVRange` from ChatConfig (see comment above)
-- TODO remove parameterization in 5.7
supportedChatVRange :: PQSupport -> VersionRangeChat
supportedChatVRange pq = mkVersionRange initialChatVersion $ case pq of
PQSupportOn -> pqEncryptionCompressionVersion
PQSupportOff -> currentChatVersion
supportedChatVRange :: VersionRangeChat
supportedChatVRange = mkVersionRange initialChatVersion currentChatVersion
{-# INLINE supportedChatVRange #-}
-- version range that supports skipping establishing direct connections in a group and establishing direct connection via x.grp.direct.inv
+4 -5
View File
@@ -36,7 +36,6 @@ import Simplex.Chat.Types.Preferences
import Simplex.Messaging.Agent.Protocol (ConnId)
import Simplex.Messaging.Agent.Store.SQLite (firstRow, firstRow', maybeFirstRow)
import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
import Simplex.Messaging.Crypto.Ratchet (PQSupport)
import Simplex.Messaging.Util (eitherToMaybe)
getChatLockEntity :: DB.Connection -> AgentConnId -> ExceptT StoreError IO ChatLockEntity
@@ -64,7 +63,7 @@ getChatLockEntity db agentConnId = do
ExceptT . firstRow fromOnly (SEInternalError "group member connection group_id not found") $
DB.query db "SELECT group_id FROM group_members WHERE group_member_id = ?" (Only groupMemberId)
getConnectionEntity :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> AgentConnId -> ExceptT StoreError IO ConnectionEntity
getConnectionEntity :: DB.Connection -> VersionRangeChat -> User -> AgentConnId -> ExceptT StoreError IO ConnectionEntity
getConnectionEntity db vr user@User {userId, userContactId} agentConnId = do
c@Connection {connType, entityId} <- getConnection_
case entityId of
@@ -185,7 +184,7 @@ getConnectionEntity db vr user@User {userId, userContactId} agentConnId = do
userContact_ [(cReq, groupId)] = Right UserContact {userContactLinkId, connReqContact = cReq, groupId}
userContact_ _ = Left SEUserContactLinkNotFound
getConnectionEntityByConnReq :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> (ConnReqInvitation, ConnReqInvitation) -> IO (Maybe ConnectionEntity)
getConnectionEntityByConnReq :: DB.Connection -> VersionRangeChat -> User -> (ConnReqInvitation, ConnReqInvitation) -> IO (Maybe ConnectionEntity)
getConnectionEntityByConnReq db vr user@User {userId} (cReqSchema1, cReqSchema2) = do
connId_ <-
maybeFirstRow fromOnly $
@@ -196,7 +195,7 @@ getConnectionEntityByConnReq db vr user@User {userId} (cReqSchema1, cReqSchema2)
-- multiple connections can have same via_contact_uri_hash if request was repeated;
-- this function searches for latest connection with contact so that "known contact" plan would be chosen;
-- deleted connections are filtered out to allow re-connecting via same contact address
getContactConnEntityByConnReqHash :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> (ConnReqUriHash, ConnReqUriHash) -> IO (Maybe ConnectionEntity)
getContactConnEntityByConnReqHash :: DB.Connection -> VersionRangeChat -> User -> (ConnReqUriHash, ConnReqUriHash) -> IO (Maybe ConnectionEntity)
getContactConnEntityByConnReqHash db vr user@User {userId} (cReqHash1, cReqHash2) = do
connId_ <-
maybeFirstRow fromOnly $
@@ -216,7 +215,7 @@ getContactConnEntityByConnReqHash db vr user@User {userId} (cReqHash1, cReqHash2
(userId, cReqHash1, cReqHash2, ConnDeleted)
maybe (pure Nothing) (fmap eitherToMaybe . runExceptT . getConnectionEntity db vr user) connId_
getConnectionsToSubscribe :: DB.Connection -> (PQSupport -> VersionRangeChat) -> IO ([ConnId], [ConnectionEntity])
getConnectionsToSubscribe :: DB.Connection -> VersionRangeChat -> IO ([ConnId], [ConnectionEntity])
getConnectionsToSubscribe db vr = do
aConnIds <- map fromOnly <$> DB.query_ db "SELECT agent_conn_id FROM connections where to_subscribe = 1"
entities <- forM aConnIds $ \acId -> do
+12 -12
View File
@@ -126,7 +126,7 @@ deletePendingContactConnection db userId connId =
|]
(userId, connId, ConnContact)
createAddressContactConnection :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Contact -> ConnId -> ConnReqUriHash -> XContactId -> Maybe Profile -> SubscriptionMode -> VersionChat -> PQSupport -> ExceptT StoreError IO Contact
createAddressContactConnection :: DB.Connection -> VersionRangeChat -> User -> Contact -> ConnId -> ConnReqUriHash -> XContactId -> Maybe Profile -> SubscriptionMode -> VersionChat -> PQSupport -> ExceptT StoreError IO Contact
createAddressContactConnection db vr user@User {userId} Contact {contactId} acId cReqHash xContactId incognitoProfile subMode chatV pqSup = do
PendingContactConnection {pccConnId} <- liftIO $ createConnReqConnection db userId acId cReqHash xContactId incognitoProfile Nothing subMode chatV pqSup
liftIO $ DB.execute db "UPDATE connections SET contact_id = ? WHERE connection_id = ?" (contactId, pccConnId)
@@ -153,7 +153,7 @@ createConnReqConnection db userId acId cReqHash xContactId incognitoProfile grou
pccConnId <- insertedRowId db
pure PendingContactConnection {pccConnId, pccAgentConnId = AgentConnId acId, pccConnStatus, viaContactUri = True, viaUserContactLink = Nothing, groupLinkId, customUserProfileId, connReqInv = Nothing, localAlias = "", createdAt, updatedAt = createdAt}
getConnReqContactXContactId :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ConnReqUriHash -> IO (Maybe Contact, Maybe XContactId)
getConnReqContactXContactId :: DB.Connection -> VersionRangeChat -> User -> ConnReqUriHash -> IO (Maybe Contact, Maybe XContactId)
getConnReqContactXContactId db vr user@User {userId} cReqHash = do
getContactByConnReqHash db vr user cReqHash >>= \case
c@(Just _) -> pure (c, Nothing)
@@ -167,7 +167,7 @@ getConnReqContactXContactId db vr user@User {userId} cReqHash = do
"SELECT xcontact_id FROM connections WHERE user_id = ? AND via_contact_uri_hash = ? LIMIT 1"
(userId, cReqHash)
getContactByConnReqHash :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ConnReqUriHash -> IO (Maybe Contact)
getContactByConnReqHash :: DB.Connection -> VersionRangeChat -> User -> ConnReqUriHash -> IO (Maybe Contact)
getContactByConnReqHash db vr user@User {userId} cReqHash =
maybeFirstRow (toContact vr user) $
DB.query
@@ -279,12 +279,12 @@ setContactDeleted db user@User {userId} ct@Contact {contactId} = do
currentTs <- getCurrentTime
DB.execute db "UPDATE contacts SET deleted = 1, updated_at = ? WHERE user_id = ? AND contact_id = ?" (currentTs, userId, contactId)
getDeletedContacts :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> IO [Contact]
getDeletedContacts :: DB.Connection -> VersionRangeChat -> User -> IO [Contact]
getDeletedContacts db vr user@User {userId} = do
contactIds <- map fromOnly <$> DB.query db "SELECT contact_id FROM contacts WHERE user_id = ? AND deleted = 1" (Only userId)
rights <$> mapM (runExceptT . getDeletedContact db vr user) contactIds
getDeletedContact :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ExceptT StoreError IO Contact
getDeletedContact :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ExceptT StoreError IO Contact
getDeletedContact db vr user contactId = getContact_ db vr user contactId True
deleteContactProfile_ :: DB.Connection -> UserId -> ContactId -> IO ()
@@ -521,18 +521,18 @@ updateContactLDN_ db user@User {userId} contactId displayName newName updatedAt
(newName, updatedAt, userId, contactId)
safeDeleteLDN db user displayName
getContactByName :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ContactName -> ExceptT StoreError IO Contact
getContactByName :: DB.Connection -> VersionRangeChat -> User -> ContactName -> ExceptT StoreError IO Contact
getContactByName db vr user localDisplayName = do
cId <- getContactIdByName db user localDisplayName
getContact db vr user cId
getUserContacts :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> IO [Contact]
getUserContacts :: DB.Connection -> VersionRangeChat -> User -> IO [Contact]
getUserContacts db vr user@User {userId} = do
contactIds <- map fromOnly <$> DB.query db "SELECT contact_id FROM contacts WHERE user_id = ? AND deleted = 0" (Only userId)
contacts <- rights <$> mapM (runExceptT . getContact db vr user) contactIds
pure $ filter (\Contact {activeConn} -> isJust activeConn) contacts
createOrUpdateContactRequest :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> InvitationId -> VersionRangeChat -> Profile -> Maybe XContactId -> PQSupport -> ExceptT StoreError IO ContactOrRequest
createOrUpdateContactRequest :: DB.Connection -> VersionRangeChat -> User -> Int64 -> InvitationId -> VersionRangeChat -> Profile -> Maybe XContactId -> PQSupport -> ExceptT StoreError IO ContactOrRequest
createOrUpdateContactRequest db vr user@User {userId} userContactLinkId invId (VersionRange minV maxV) Profile {displayName, fullName, image, contactLink, preferences} xContactId_ pqSup =
liftIO (maybeM getContact' xContactId_) >>= \case
Just contact -> pure $ CORContact contact
@@ -732,10 +732,10 @@ getContactIdByName db User {userId} cName =
ExceptT . firstRow fromOnly (SEContactNotFoundByName cName) $
DB.query db "SELECT contact_id FROM contacts WHERE user_id = ? AND local_display_name = ? AND deleted = 0" (userId, cName)
getContact :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ExceptT StoreError IO Contact
getContact :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ExceptT StoreError IO Contact
getContact db vr user contactId = getContact_ db vr user contactId False
getContact_ :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> Bool -> ExceptT StoreError IO Contact
getContact_ :: DB.Connection -> VersionRangeChat -> User -> Int64 -> Bool -> ExceptT StoreError IO Contact
getContact_ db vr user@User {userId} contactId deleted =
ExceptT . firstRow (toContact vr user) (SEContactNotFound contactId) $
DB.query
@@ -791,7 +791,7 @@ getPendingContactConnections db User {userId} = do
|]
[":user_id" := userId, ":conn_type" := ConnContact]
getContactConnections :: DB.Connection -> (PQSupport -> VersionRangeChat) -> UserId -> Contact -> IO [Connection]
getContactConnections :: DB.Connection -> VersionRangeChat -> UserId -> Contact -> IO [Connection]
getContactConnections db vr userId Contact {contactId} =
connections =<< liftIO getConnections_
where
@@ -811,7 +811,7 @@ getContactConnections db vr userId Contact {contactId} =
connections [] = pure []
connections rows = pure $ map (toConnection vr) rows
getConnectionById :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ExceptT StoreError IO Connection
getConnectionById :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ExceptT StoreError IO Connection
getConnectionById db vr User {userId} connId = ExceptT $ do
firstRow (toConnection vr) (SEConnectionNotFoundById connId) $
DB.query
+9 -9
View File
@@ -174,7 +174,7 @@ getPendingSndChunks db fileId connId =
|]
(fileId, connId)
createSndDirectFTConnection :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> (CommandId, ConnId) -> SubscriptionMode -> IO ()
createSndDirectFTConnection :: DB.Connection -> VersionRangeChat -> User -> Int64 -> (CommandId, ConnId) -> SubscriptionMode -> IO ()
createSndDirectFTConnection db vr user@User {userId} fileId (cmdId, acId) subMode = do
currentTs <- getCurrentTime
Connection {connId} <- createSndFileConnection_ db vr userId fileId acId subMode
@@ -194,7 +194,7 @@ createSndGroupFileTransfer db userId GroupInfo {groupId} filePath FileInvitation
fileId <- insertedRowId db
pure FileTransferMeta {fileId, xftpSndFile = Nothing, xftpRedirectFor = Nothing, fileName, filePath, fileSize, fileInline, chunkSize, cancelled = False}
createSndGroupFileTransferConnection :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> (CommandId, ConnId) -> GroupMember -> SubscriptionMode -> IO ()
createSndGroupFileTransferConnection :: DB.Connection -> VersionRangeChat -> User -> Int64 -> (CommandId, ConnId) -> GroupMember -> SubscriptionMode -> IO ()
createSndGroupFileTransferConnection db vr user@User {userId} fileId (cmdId, acId) GroupMember {groupMemberId} subMode = do
currentTs <- getCurrentTime
Connection {connId} <- createSndFileConnection_ db vr userId fileId acId subMode
@@ -430,10 +430,10 @@ lookupChatRefByFileId db User {userId} fileId =
(userId, fileId)
-- TODO v6.0 remove
createSndFileConnection_ :: DB.Connection -> (PQSupport -> VersionRangeChat) -> UserId -> Int64 -> ConnId -> SubscriptionMode -> IO Connection
createSndFileConnection_ :: DB.Connection -> VersionRangeChat -> UserId -> Int64 -> ConnId -> SubscriptionMode -> IO Connection
createSndFileConnection_ db vr userId fileId agentConnId subMode = do
currentTs <- getCurrentTime
createConnection_ db userId ConnSndFile (Just fileId) agentConnId (minVersion $ vr PQSupportOff) chatInitialVRange Nothing Nothing Nothing 0 currentTs subMode CR.PQSupportOff
createConnection_ db userId ConnSndFile (Just fileId) agentConnId (minVersion vr) chatInitialVRange Nothing Nothing Nothing 0 currentTs subMode CR.PQSupportOff
updateSndFileStatus :: DB.Connection -> SndFileTransfer -> FileStatus -> IO ()
updateSndFileStatus db SndFileTransfer {fileId, connId} status = do
@@ -695,7 +695,7 @@ getRcvFileTransfer_ db userId fileId = do
_ -> pure Nothing
cancelled = fromMaybe False cancelled_
acceptRcvFileTransfer :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> (CommandId, ConnId) -> ConnStatus -> FilePath -> SubscriptionMode -> ExceptT StoreError IO AChatItem
acceptRcvFileTransfer :: DB.Connection -> VersionRangeChat -> User -> Int64 -> (CommandId, ConnId) -> ConnStatus -> FilePath -> SubscriptionMode -> ExceptT StoreError IO AChatItem
acceptRcvFileTransfer db vr user@User {userId} fileId (cmdId, acId) connStatus filePath subMode = ExceptT $ do
currentTs <- getCurrentTime
acceptRcvFT_ db user fileId filePath Nothing currentTs
@@ -707,7 +707,7 @@ acceptRcvFileTransfer db vr user@User {userId} fileId (cmdId, acId) connStatus f
setCommandConnId db user cmdId connId
runExceptT $ getChatItemByFileId db vr user fileId
getContactByFileId :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> FileTransferId -> ExceptT StoreError IO Contact
getContactByFileId :: DB.Connection -> VersionRangeChat -> User -> FileTransferId -> ExceptT StoreError IO Contact
getContactByFileId db vr user@User {userId} fileId = do
cId <- getContactIdByFileId
getContact db vr user cId
@@ -716,7 +716,7 @@ getContactByFileId db vr user@User {userId} fileId = do
ExceptT . firstRow fromOnly (SEContactNotFoundByFileId fileId) $
DB.query db "SELECT contact_id FROM files WHERE user_id = ? AND file_id = ?" (userId, fileId)
acceptRcvInlineFT :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> FileTransferId -> FilePath -> ExceptT StoreError IO AChatItem
acceptRcvInlineFT :: DB.Connection -> VersionRangeChat -> User -> FileTransferId -> FilePath -> ExceptT StoreError IO AChatItem
acceptRcvInlineFT db vr user fileId filePath = do
liftIO $ acceptRcvFT_ db user fileId filePath (Just IFMOffer) =<< getCurrentTime
getChatItemByFileId db vr user fileId
@@ -725,7 +725,7 @@ startRcvInlineFT :: DB.Connection -> User -> RcvFileTransfer -> FilePath -> Mayb
startRcvInlineFT db user RcvFileTransfer {fileId} filePath rcvFileInline =
acceptRcvFT_ db user fileId filePath rcvFileInline =<< getCurrentTime
xftpAcceptRcvFT :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> FileTransferId -> FilePath -> ExceptT StoreError IO AChatItem
xftpAcceptRcvFT :: DB.Connection -> VersionRangeChat -> User -> FileTransferId -> FilePath -> ExceptT StoreError IO AChatItem
xftpAcceptRcvFT db vr user fileId filePath = do
liftIO $ acceptRcvFT_ db user fileId filePath Nothing =<< getCurrentTime
getChatItemByFileId db vr user fileId
@@ -1000,7 +1000,7 @@ getLocalCryptoFile db userId fileId sent =
pure $ CryptoFile filePath fileCryptoArgs
_ -> throwError $ SEFileNotFound fileId
updateDirectCIFileStatus :: forall d. MsgDirectionI d => DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> CIFileStatus d -> ExceptT StoreError IO AChatItem
updateDirectCIFileStatus :: forall d. MsgDirectionI d => DB.Connection -> VersionRangeChat -> User -> Int64 -> CIFileStatus d -> ExceptT StoreError IO AChatItem
updateDirectCIFileStatus db vr user fileId fileStatus = do
aci@(AChatItem cType d cInfo ci) <- getChatItemByFileId db vr user fileId
case (cType, testEquality d $ msgDirection @d) of
+48 -48
View File
@@ -145,7 +145,7 @@ import Simplex.Messaging.Agent.Protocol (ConnId, UserId)
import Simplex.Messaging.Agent.Store.SQLite (firstRow, maybeFirstRow)
import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Crypto.Ratchet (PQSupport, pattern PQEncOff, pattern PQSupportOff)
import Simplex.Messaging.Crypto.Ratchet (pattern PQEncOff, pattern PQSupportOff)
import Simplex.Messaging.Protocol (SubscriptionMode (..))
import Simplex.Messaging.Util (eitherToMaybe, ($>>=), (<$$>))
import Simplex.Messaging.Version
@@ -157,9 +157,9 @@ type GroupMemberRow = ((Int64, Int64, MemberId, VersionChat, VersionChat, GroupM
type MaybeGroupMemberRow = ((Maybe Int64, Maybe Int64, Maybe MemberId, Maybe VersionChat, Maybe VersionChat, Maybe GroupMemberRole, Maybe GroupMemberCategory, Maybe GroupMemberStatus, Maybe Bool, Maybe MemberRestrictionStatus) :. (Maybe Int64, Maybe GroupMemberId, Maybe ContactName, Maybe ContactId, Maybe ProfileId, Maybe ProfileId, Maybe ContactName, Maybe Text, Maybe ImageData, Maybe ConnReqContact, Maybe LocalAlias, Maybe Preferences))
toGroupInfo :: (PQSupport -> VersionRangeChat) -> Int64 -> GroupInfoRow -> GroupInfo
toGroupInfo :: VersionRangeChat -> Int64 -> GroupInfoRow -> GroupInfo
toGroupInfo vr userContactId ((groupId, localDisplayName, displayName, fullName, description, image, hostConnCustomUserProfileId, enableNtfs_, sendRcpts, favorite, groupPreferences) :. (createdAt, updatedAt, chatTs, userMemberProfileSentAt, customData) :. userMemberRow) =
let membership = (toGroupMember userContactId userMemberRow) {memberChatVRange = vr PQSupportOff}
let membership = (toGroupMember userContactId userMemberRow) {memberChatVRange = vr}
chatSettings = ChatSettings {enableNtfs = fromMaybe MFAll enableNtfs_, sendRcpts, favorite}
fullGroupPreferences = mergeGroupPreferences groupPreferences
groupProfile = GroupProfile {displayName, fullName, description, image, groupPreferences}
@@ -191,7 +191,7 @@ createGroupLink db User {userId} groupInfo@GroupInfo {groupId, localDisplayName}
userContactLinkId <- insertedRowId db
void $ createConnection_ db userId ConnUserContact (Just userContactLinkId) agentConnId initialChatVersion chatInitialVRange Nothing Nothing Nothing 0 currentTs subMode PQSupportOff
getGroupLinkConnection :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupInfo -> ExceptT StoreError IO Connection
getGroupLinkConnection :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> ExceptT StoreError IO Connection
getGroupLinkConnection db vr User {userId} groupInfo@GroupInfo {groupId} =
ExceptT . firstRow (toConnection vr) (SEGroupLinkNotFound groupInfo) $
DB.query
@@ -264,7 +264,7 @@ setGroupLinkMemberRole :: DB.Connection -> User -> Int64 -> GroupMemberRole -> I
setGroupLinkMemberRole db User {userId} userContactLinkId memberRole =
DB.execute db "UPDATE user_contact_links SET group_link_member_role = ? WHERE user_id = ? AND user_contact_link_id = ?" (memberRole, userId, userContactLinkId)
getGroupAndMember :: DB.Connection -> User -> Int64 -> (PQSupport -> VersionRangeChat) -> ExceptT StoreError IO (GroupInfo, GroupMember)
getGroupAndMember :: DB.Connection -> User -> Int64 -> VersionRangeChat -> ExceptT StoreError IO (GroupInfo, GroupMember)
getGroupAndMember db User {userId, userContactId} groupMemberId vr =
ExceptT . firstRow toGroupAndMember (SEInternalError "referenced group member not found") $
DB.query
@@ -309,7 +309,7 @@ getGroupAndMember db User {userId, userContactId} groupMemberId vr =
in (groupInfo, (member :: GroupMember) {activeConn = toMaybeConnection vr connRow})
-- | creates completely new group with a single member - the current user
createNewGroup :: DB.Connection -> (PQSupport -> VersionRangeChat) -> TVar ChaChaDRG -> User -> GroupProfile -> Maybe Profile -> ExceptT StoreError IO GroupInfo
createNewGroup :: DB.Connection -> VersionRangeChat -> TVar ChaChaDRG -> User -> GroupProfile -> Maybe Profile -> ExceptT StoreError IO GroupInfo
createNewGroup db vr gVar user@User {userId} groupProfile incognitoProfile = ExceptT $ do
let GroupProfile {displayName, fullName, description, image, groupPreferences} = groupProfile
fullGroupPreferences = mergeGroupPreferences groupPreferences
@@ -352,7 +352,7 @@ createNewGroup db vr gVar user@User {userId} groupProfile incognitoProfile = Exc
}
-- | creates a new group record for the group the current user was invited to, or returns an existing one
createGroupInvitation :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Contact -> GroupInvitation -> Maybe ProfileId -> ExceptT StoreError IO (GroupInfo, GroupMemberId)
createGroupInvitation :: DB.Connection -> VersionRangeChat -> User -> Contact -> GroupInvitation -> Maybe ProfileId -> ExceptT StoreError IO (GroupInfo, GroupMemberId)
createGroupInvitation _ _ _ Contact {localDisplayName, activeConn = Nothing} _ _ = throwError $ SEContactNotReady localDisplayName
createGroupInvitation db vr user@User {userId} contact@Contact {contactId, activeConn = Just Connection {customUserProfileId, peerChatVRange}} GroupInvitation {fromMember, invitedMember, connRequest, groupProfile} incognitoProfileId = do
liftIO getInvitationGroupId_ >>= \case
@@ -397,7 +397,7 @@ createGroupInvitation db vr user@User {userId} contact@Contact {contactId, activ
|]
(profileId, localDisplayName, connRequest, customUserProfileId, userId, True, currentTs, currentTs, currentTs, currentTs)
insertedRowId db
let hostVRange = const $ adjustedMemberVRange vr peerChatVRange
let hostVRange = adjustedMemberVRange vr peerChatVRange
GroupMember {groupMemberId} <- createContactMemberInv_ db user groupId Nothing contact fromMember GCHostMember GSMemInvited IBUnknown Nothing currentTs hostVRange
membership <- createContactMemberInv_ db user groupId (Just groupMemberId) user invitedMember GCUserMember GSMemInvited (IBContact contactId) incognitoProfileId currentTs vr
let chatSettings = ChatSettings {enableNtfs = MFAll, sendRcpts = Nothing, favorite = False}
@@ -419,9 +419,9 @@ createGroupInvitation db vr user@User {userId} contact@Contact {contactId, activ
groupMemberId
)
adjustedMemberVRange :: (PQSupport -> VersionRangeChat) -> VersionRangeChat -> VersionRangeChat
adjustedMemberVRange getVR vr@(VersionRange minV maxV) =
let maxV' = min maxV (maxVersion $ getVR PQSupportOff)
adjustedMemberVRange :: VersionRangeChat -> VersionRangeChat -> VersionRangeChat
adjustedMemberVRange chatVR vr@(VersionRange minV maxV) =
let maxV' = min maxV (maxVersion chatVR)
in fromMaybe vr $ safeVersionRange minV (max minV maxV')
getHostMemberId_ :: DB.Connection -> User -> GroupId -> ExceptT StoreError IO GroupMemberId
@@ -429,7 +429,7 @@ getHostMemberId_ db User {userId} groupId =
ExceptT . firstRow fromOnly (SEHostMemberIdNotFound groupId) $
DB.query db "SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND member_category = ?" (userId, groupId, GCHostMember)
createContactMemberInv_ :: IsContact a => DB.Connection -> User -> GroupId -> Maybe GroupMemberId -> a -> MemberIdRole -> GroupMemberCategory -> GroupMemberStatus -> InvitedBy -> Maybe ProfileId -> UTCTime -> (PQSupport -> VersionRangeChat) -> ExceptT StoreError IO GroupMember
createContactMemberInv_ :: IsContact a => DB.Connection -> User -> GroupId -> Maybe GroupMemberId -> a -> MemberIdRole -> GroupMemberCategory -> GroupMemberStatus -> InvitedBy -> Maybe ProfileId -> UTCTime -> VersionRangeChat -> ExceptT StoreError IO GroupMember
createContactMemberInv_ db User {userId, userContactId} groupId invitedByGroupMemberId userOrContact MemberIdRole {memberId, memberRole} memberCategory memberStatus invitedBy incognitoProfileId createdAt vr = do
incognitoProfile <- forM incognitoProfileId $ \profileId -> getProfileById db userId profileId
(localDisplayName, memberProfile) <- case (incognitoProfile, incognitoProfileId) of
@@ -457,7 +457,7 @@ createContactMemberInv_ db User {userId, userContactId} groupId invitedByGroupMe
memberChatVRange
}
where
memberChatVRange@(VersionRange minV maxV) = vr PQSupportOff
memberChatVRange@(VersionRange minV maxV) = vr
insertMember_ :: IO ContactName
insertMember_ = do
let localDisplayName = localDisplayName' userOrContact
@@ -493,7 +493,7 @@ createContactMemberInv_ db User {userId, userContactId} groupId invitedByGroupMe
)
pure $ Right incognitoLdn
createGroupInvitedViaLink :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Connection -> GroupLinkInvitation -> ExceptT StoreError IO (GroupInfo, GroupMember)
createGroupInvitedViaLink :: DB.Connection -> VersionRangeChat -> User -> Connection -> GroupLinkInvitation -> ExceptT StoreError IO (GroupInfo, GroupMember)
createGroupInvitedViaLink
db
vr
@@ -564,7 +564,7 @@ setGroupInvitationChatItemId db User {userId} groupId chatItemId = do
-- TODO return the last connection that is ready, not any last connection
-- requires updating connection status
getGroup :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupId -> ExceptT StoreError IO Group
getGroup :: DB.Connection -> VersionRangeChat -> User -> GroupId -> ExceptT StoreError IO Group
getGroup db vr user groupId = do
gInfo <- getGroupInfo db vr user groupId
members <- liftIO $ getGroupMembers db vr user gInfo
@@ -619,12 +619,12 @@ deleteGroupProfile_ db userId groupId =
|]
(userId, groupId)
getUserGroups :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> IO [Group]
getUserGroups :: DB.Connection -> VersionRangeChat -> User -> IO [Group]
getUserGroups db vr user@User {userId} = do
groupIds <- map fromOnly <$> DB.query db "SELECT group_id FROM groups WHERE user_id = ?" (Only userId)
rights <$> mapM (runExceptT . getGroup db vr user) groupIds
getUserGroupDetails :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Maybe ContactId -> Maybe String -> IO [GroupInfo]
getUserGroupDetails :: DB.Connection -> VersionRangeChat -> User -> Maybe ContactId -> Maybe String -> IO [GroupInfo]
getUserGroupDetails db vr User {userId, userContactId} _contactId_ search_ =
map (toGroupInfo vr userContactId)
<$> DB.query
@@ -647,7 +647,7 @@ getUserGroupDetails db vr User {userId, userContactId} _contactId_ search_ =
where
search = fromMaybe "" search_
getUserGroupsWithSummary :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Maybe ContactId -> Maybe String -> IO [(GroupInfo, GroupSummary)]
getUserGroupsWithSummary :: DB.Connection -> VersionRangeChat -> User -> Maybe ContactId -> Maybe String -> IO [(GroupInfo, GroupSummary)]
getUserGroupsWithSummary db vr user _contactId_ search_ =
getUserGroupDetails db vr user _contactId_ search_
>>= mapM (\g@GroupInfo {groupId} -> (g,) <$> getGroupSummary db user groupId)
@@ -688,7 +688,7 @@ checkContactHasGroups :: DB.Connection -> User -> Contact -> IO (Maybe GroupId)
checkContactHasGroups db User {userId} Contact {contactId} =
maybeFirstRow fromOnly $ DB.query db "SELECT group_id FROM group_members WHERE user_id = ? AND contact_id = ? LIMIT 1" (userId, contactId)
getGroupInfoByName :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupName -> ExceptT StoreError IO GroupInfo
getGroupInfoByName :: DB.Connection -> VersionRangeChat -> User -> GroupName -> ExceptT StoreError IO GroupInfo
getGroupInfoByName db vr user gName = do
gId <- getGroupIdByName db user gName
getGroupInfo db vr user gId
@@ -712,7 +712,7 @@ groupMemberQuery =
)
|]
getGroupMember :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupId -> GroupMemberId -> ExceptT StoreError IO GroupMember
getGroupMember :: DB.Connection -> VersionRangeChat -> User -> GroupId -> GroupMemberId -> ExceptT StoreError IO GroupMember
getGroupMember db vr user@User {userId} groupId groupMemberId =
ExceptT . firstRow (toContactMember vr user) (SEGroupMemberNotFound groupMemberId) $
DB.query
@@ -720,7 +720,7 @@ getGroupMember db vr user@User {userId} groupId groupMemberId =
(groupMemberQuery <> " WHERE m.group_id = ? AND m.group_member_id = ? AND m.user_id = ?")
(userId, groupId, groupMemberId, userId)
getGroupMemberById :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMemberId -> ExceptT StoreError IO GroupMember
getGroupMemberById :: DB.Connection -> VersionRangeChat -> User -> GroupMemberId -> ExceptT StoreError IO GroupMember
getGroupMemberById db vr user@User {userId} groupMemberId =
ExceptT . firstRow (toContactMember vr user) (SEGroupMemberNotFound groupMemberId) $
DB.query
@@ -728,7 +728,7 @@ getGroupMemberById db vr user@User {userId} groupMemberId =
(groupMemberQuery <> " WHERE m.group_member_id = ? AND m.user_id = ?")
(userId, groupMemberId, userId)
getGroupMemberByMemberId :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupInfo -> MemberId -> ExceptT StoreError IO GroupMember
getGroupMemberByMemberId :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> MemberId -> ExceptT StoreError IO GroupMember
getGroupMemberByMemberId db vr user@User {userId} GroupInfo {groupId} memberId =
ExceptT . firstRow (toContactMember vr user) (SEGroupMemberNotFoundByMemberId memberId) $
DB.query
@@ -736,7 +736,7 @@ getGroupMemberByMemberId db vr user@User {userId} GroupInfo {groupId} memberId =
(groupMemberQuery <> " WHERE m.group_id = ? AND m.member_id = ?")
(userId, groupId, memberId)
getGroupMembers :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupInfo -> IO [GroupMember]
getGroupMembers :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> IO [GroupMember]
getGroupMembers db vr user@User {userId, userContactId} GroupInfo {groupId} = do
map (toContactMember vr user)
<$> DB.query
@@ -744,7 +744,7 @@ getGroupMembers db vr user@User {userId, userContactId} GroupInfo {groupId} = do
(groupMemberQuery <> " WHERE m.group_id = ? AND m.user_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?)")
(userId, groupId, userId, userContactId)
getGroupMembersForExpiration :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupInfo -> IO [GroupMember]
getGroupMembersForExpiration :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> IO [GroupMember]
getGroupMembersForExpiration db vr user@User {userId, userContactId} GroupInfo {groupId} = do
map (toContactMember vr user)
<$> DB.query
@@ -760,7 +760,7 @@ getGroupMembersForExpiration db vr user@User {userId, userContactId} GroupInfo {
)
(userId, groupId, userId, userContactId, GSMemRemoved, GSMemLeft, GSMemGroupDeleted, GSMemUnknown)
toContactMember :: (PQSupport -> VersionRangeChat) -> User -> (GroupMemberRow :. MaybeConnectionRow) -> GroupMember
toContactMember :: VersionRangeChat -> User -> (GroupMemberRow :. MaybeConnectionRow) -> GroupMember
toContactMember vr User {userContactId} (memberRow :. connRow) =
(toGroupMember userContactId memberRow) {activeConn = toMaybeConnection vr connRow}
@@ -778,7 +778,7 @@ getGroupCurrentMembersCount db User {userId} GroupInfo {groupId} = do
(groupId, userId)
pure $ length $ filter memberCurrent' statuses
getGroupInvitation :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupId -> ExceptT StoreError IO ReceivedGroupInvitation
getGroupInvitation :: DB.Connection -> VersionRangeChat -> User -> GroupId -> ExceptT StoreError IO ReceivedGroupInvitation
getGroupInvitation db vr user groupId =
getConnRec_ user >>= \case
Just connRequest -> do
@@ -913,7 +913,7 @@ createAcceptedMemberConnection
Connection {connId} <- createConnection_ db userId ConnMember (Just groupMemberId) agentConnId chatV cReqChatVRange Nothing (Just userContactLinkId) Nothing 0 createdAt subMode PQSupportOff
setCommandConnId db user cmdId connId
getContactViaMember :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMember -> ExceptT StoreError IO Contact
getContactViaMember :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> ExceptT StoreError IO Contact
getContactViaMember db vr user@User {userId} GroupMember {groupMemberId} = do
contactId <-
ExceptT $
@@ -1174,7 +1174,7 @@ getIntroduction db reMember toMember = ExceptT $ do
in Right GroupMemberIntro {introId, reMember, toMember, introStatus, introInvitation}
toIntro _ = Left SEIntroNotFound
getForwardIntroducedMembers :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMember -> Bool -> IO [GroupMember]
getForwardIntroducedMembers :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> Bool -> IO [GroupMember]
getForwardIntroducedMembers db vr user invitee highlyAvailable = do
memberIds <- map fromOnly <$> query
filter memberCurrent . rights <$> mapM (runExceptT . getGroupMemberById db vr user) memberIds
@@ -1194,7 +1194,7 @@ getForwardIntroducedMembers db vr user invitee highlyAvailable = do
WHERE to_group_member_id = ? AND intro_status NOT IN (?,?,?)
|]
getForwardInvitedMembers :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMember -> Bool -> IO [GroupMember]
getForwardInvitedMembers :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> Bool -> IO [GroupMember]
getForwardInvitedMembers db vr user forwardMember highlyAvailable = do
memberIds <- map fromOnly <$> query
filter memberCurrent . rights <$> mapM (runExceptT . getGroupMemberById db vr user) memberIds
@@ -1288,7 +1288,7 @@ createMemberConnection_ :: DB.Connection -> UserId -> Int64 -> ConnId -> Version
createMemberConnection_ db userId groupMemberId agentConnId chatV peerChatVRange viaContact connLevel currentTs subMode =
createConnection_ db userId ConnMember (Just groupMemberId) agentConnId chatV peerChatVRange viaContact Nothing Nothing connLevel currentTs subMode PQSupportOff
getViaGroupMember :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Contact -> IO (Maybe (GroupInfo, GroupMember))
getViaGroupMember :: DB.Connection -> VersionRangeChat -> User -> Contact -> IO (Maybe (GroupInfo, GroupMember))
getViaGroupMember db vr User {userId, userContactId} Contact {contactId} =
maybeFirstRow toGroupAndMember $
DB.query
@@ -1333,7 +1333,7 @@ getViaGroupMember db vr User {userId, userContactId} Contact {contactId} =
member = toGroupMember userContactId memberRow
in (groupInfo, (member :: GroupMember) {activeConn = toMaybeConnection vr connRow})
getViaGroupContact :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMember -> IO (Maybe Contact)
getViaGroupContact :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> IO (Maybe Contact)
getViaGroupContact db vr user@User {userId} GroupMember {groupMemberId} = do
contactId_ <-
maybeFirstRow fromOnly $
@@ -1384,7 +1384,7 @@ updateGroupProfile db user@User {userId} g@GroupInfo {groupId, localDisplayName,
(ldn, currentTs, userId, groupId)
safeDeleteLDN db user localDisplayName
getGroupInfo :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ExceptT StoreError IO GroupInfo
getGroupInfo :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ExceptT StoreError IO GroupInfo
getGroupInfo db vr User {userId, userContactId} groupId =
ExceptT . firstRow (toGroupInfo vr userContactId) (SEGroupNotFound groupId) $
DB.query
@@ -1407,7 +1407,7 @@ getGroupInfo db vr User {userId, userContactId} groupId =
|]
(groupId, userId, userContactId)
getGroupInfoByUserContactLinkConnReq :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> (ConnReqContact, ConnReqContact) -> IO (Maybe GroupInfo)
getGroupInfoByUserContactLinkConnReq :: DB.Connection -> VersionRangeChat -> User -> (ConnReqContact, ConnReqContact) -> IO (Maybe GroupInfo)
getGroupInfoByUserContactLinkConnReq db vr user@User {userId} (cReqSchema1, cReqSchema2) = do
groupId_ <-
maybeFirstRow fromOnly $
@@ -1421,7 +1421,7 @@ getGroupInfoByUserContactLinkConnReq db vr user@User {userId} (cReqSchema1, cReq
(userId, cReqSchema1, cReqSchema2)
maybe (pure Nothing) (fmap eitherToMaybe . runExceptT . getGroupInfo db vr user) groupId_
getGroupInfoByGroupLinkHash :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> (ConnReqUriHash, ConnReqUriHash) -> IO (Maybe GroupInfo)
getGroupInfoByGroupLinkHash :: DB.Connection -> VersionRangeChat -> User -> (ConnReqUriHash, ConnReqUriHash) -> IO (Maybe GroupInfo)
getGroupInfoByGroupLinkHash db vr user@User {userId, userContactId} (groupLinkHash1, groupLinkHash2) = do
groupId_ <-
maybeFirstRow fromOnly $
@@ -1448,7 +1448,7 @@ getGroupMemberIdByName db User {userId} groupId groupMemberName =
ExceptT . firstRow fromOnly (SEGroupMemberNameNotFound groupId groupMemberName) $
DB.query db "SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND local_display_name = ?" (userId, groupId, groupMemberName)
getActiveMembersByName :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ContactName -> ExceptT StoreError IO [(GroupInfo, GroupMember)]
getActiveMembersByName :: DB.Connection -> VersionRangeChat -> User -> ContactName -> ExceptT StoreError IO [(GroupInfo, GroupMember)]
getActiveMembersByName db vr user@User {userId} groupMemberName = do
groupMemberIds :: [(GroupId, GroupMemberId)] <-
liftIO $
@@ -1469,7 +1469,7 @@ getActiveMembersByName db vr user@User {userId} groupMemberName = do
where
ts GroupInfo {chatTs, updatedAt} = fromMaybe updatedAt chatTs
getMatchingContacts :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Contact -> IO [Contact]
getMatchingContacts :: DB.Connection -> VersionRangeChat -> User -> Contact -> IO [Contact]
getMatchingContacts db vr user@User {userId} Contact {contactId, profile = LocalProfile {displayName, fullName, image}} = do
contactIds <-
map fromOnly <$> case image of
@@ -1489,7 +1489,7 @@ getMatchingContacts db vr user@User {userId} Contact {contactId, profile = Local
AND p.display_name = ? AND p.full_name = ?
|]
getMatchingMembers :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Contact -> IO [GroupMember]
getMatchingMembers :: DB.Connection -> VersionRangeChat -> User -> Contact -> IO [GroupMember]
getMatchingMembers db vr user@User {userId} Contact {profile = LocalProfile {displayName, fullName, image}} = do
memberIds <-
map fromOnly <$> case image of
@@ -1508,7 +1508,7 @@ getMatchingMembers db vr user@User {userId} Contact {profile = LocalProfile {dis
AND p.display_name = ? AND p.full_name = ?
|]
getMatchingMemberContacts :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMember -> IO [Contact]
getMatchingMemberContacts :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> IO [Contact]
getMatchingMemberContacts _ _ _ GroupMember {memberContactId = Just _} = pure []
getMatchingMemberContacts db vr user@User {userId} GroupMember {memberProfile = LocalProfile {displayName, fullName, image}} = do
contactIds <-
@@ -1547,7 +1547,7 @@ createSentProbeHash db userId probeId to = do
"INSERT INTO sent_probe_hashes (sent_probe_id, contact_id, group_member_id, user_id, created_at, updated_at) VALUES (?,?,?,?,?,?)"
(probeId, ctId, gmId, userId, currentTs, currentTs)
matchReceivedProbe :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ContactOrMember -> Probe -> IO [ContactOrMember]
matchReceivedProbe :: DB.Connection -> VersionRangeChat -> User -> ContactOrMember -> Probe -> IO [ContactOrMember]
matchReceivedProbe db vr user@User {userId} from (Probe probe) = do
let probeHash = C.sha256Hash probe
cgmIds <-
@@ -1579,7 +1579,7 @@ matchReceivedProbe db vr user@User {userId} from (Probe probe) = do
(x : _) -> [x]
ctIds' <> memIds
matchReceivedProbeHash :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ContactOrMember -> ProbeHash -> IO (Maybe (ContactOrMember, Probe))
matchReceivedProbeHash :: DB.Connection -> VersionRangeChat -> User -> ContactOrMember -> ProbeHash -> IO (Maybe (ContactOrMember, Probe))
matchReceivedProbeHash db vr user@User {userId} from (ProbeHash probeHash) = do
probeIds <-
maybeFirstRow id $
@@ -1602,7 +1602,7 @@ matchReceivedProbeHash db vr user@User {userId} from (ProbeHash probeHash) = do
(ctId, gmId, probeHash, userId, currentTs, currentTs)
pure probeIds $>>= \(Only probe :. cgmIds) -> (,Probe probe) <$$> getContactOrMember_ db vr user cgmIds
matchSentProbe :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ContactOrMember -> Probe -> IO (Maybe ContactOrMember)
matchSentProbe :: DB.Connection -> VersionRangeChat -> User -> ContactOrMember -> Probe -> IO (Maybe ContactOrMember)
matchSentProbe db vr user@User {userId} _from (Probe probe) = do
cgmIds $>>= getContactOrMember_ db vr user
where
@@ -1623,7 +1623,7 @@ matchSentProbe db vr user@User {userId} _from (Probe probe) = do
|]
(userId, probe, ctId, gmId)
getContactOrMember_ :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> (Maybe ContactId, Maybe GroupId, Maybe GroupMemberId) -> IO (Maybe ContactOrMember)
getContactOrMember_ :: DB.Connection -> VersionRangeChat -> User -> (Maybe ContactId, Maybe GroupId, Maybe GroupMemberId) -> IO (Maybe ContactOrMember)
getContactOrMember_ db vr user ids =
fmap eitherToMaybe . runExceptT $ case ids of
(Just ctId, _, _) -> COMContact <$> getContact db vr user ctId
@@ -1631,7 +1631,7 @@ getContactOrMember_ db vr user ids =
_ -> throwError $ SEInternalError ""
-- if requested merge direction is overruled (toFromContacts), keepLDN is kept
mergeContactRecords :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Contact -> Contact -> ExceptT StoreError IO Contact
mergeContactRecords :: DB.Connection -> VersionRangeChat -> User -> Contact -> Contact -> ExceptT StoreError IO Contact
mergeContactRecords db vr user@User {userId} to@Contact {localDisplayName = keepLDN} from = do
let (toCt, fromCt) = toFromContacts to from
Contact {contactId = toContactId, localDisplayName = toLDN} = toCt
@@ -1721,7 +1721,7 @@ associateMemberWithContactRecord
when (memProfileId /= profileId) $ deleteUnusedProfile_ db userId memProfileId
when (memLDN /= localDisplayName) $ deleteUnusedDisplayName_ db userId memLDN
associateContactWithMemberRecord :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMember -> Contact -> ExceptT StoreError IO Contact
associateContactWithMemberRecord :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> Contact -> ExceptT StoreError IO Contact
associateContactWithMemberRecord
db
vr
@@ -1958,7 +1958,7 @@ createMemberContact
mergedPreferences = contactUserPreferences user userPreferences preferences $ connIncognito ctConn
pure Contact {contactId, localDisplayName, profile = memberProfile, activeConn = Just ctConn, viaGroup = Nothing, contactUsed = True, contactStatus = CSActive, chatSettings = defaultChatSettings, userPreferences, mergedPreferences, createdAt = currentTs, updatedAt = currentTs, chatTs = Just currentTs, contactGroupMemberId = Just groupMemberId, contactGrpInvSent = False, customData = Nothing}
getMemberContact :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ContactId -> ExceptT StoreError IO (GroupInfo, GroupMember, Contact, ConnReqInvitation)
getMemberContact :: DB.Connection -> VersionRangeChat -> User -> ContactId -> ExceptT StoreError IO (GroupInfo, GroupMember, Contact, ConnReqInvitation)
getMemberContact db vr user contactId = do
ct <- getContact db vr user contactId
let Contact {contactGroupMemberId, activeConn} = ct
@@ -2138,7 +2138,7 @@ setXGrpLinkMemReceived db mId xGrpLinkMemReceived = do
"UPDATE group_members SET xgrplinkmem_received = ?, updated_at = ? WHERE group_member_id = ?"
(xGrpLinkMemReceived, currentTs, mId)
createNewUnknownGroupMember :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupInfo -> MemberId -> Text -> ExceptT StoreError IO GroupMember
createNewUnknownGroupMember :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> MemberId -> Text -> ExceptT StoreError IO GroupMember
createNewUnknownGroupMember db vr user@User {userId, userContactId} GroupInfo {groupId} memberId memberName = do
currentTs <- liftIO getCurrentTime
let memberProfile = profileFromName memberName
@@ -2160,9 +2160,9 @@ createNewUnknownGroupMember db vr user@User {userId, userContactId} GroupInfo {g
insertedRowId db
getGroupMemberById db vr user groupMemberId
where
VersionRange minV maxV = vr PQSupportOff
VersionRange minV maxV = vr
updateUnknownMemberAnnounced :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupMember -> GroupMember -> MemberInfo -> ExceptT StoreError IO GroupMember
updateUnknownMemberAnnounced :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> GroupMember -> MemberInfo -> ExceptT StoreError IO GroupMember
updateUnknownMemberAnnounced db vr user@User {userId} invitingMember unknownMember@GroupMember {groupMemberId, memberChatVRange} MemberInfo {memberRole, v, profile} = do
_ <- updateMemberProfile db user unknownMember profile
currentTs <- liftIO getCurrentTime
+11 -11
View File
@@ -484,7 +484,7 @@ getChatItemQuote_ db User {userId, userContactId} chatDirection QuotedMsg {msgRe
ciQuoteGroup [] = ciQuote Nothing $ CIQGroupRcv Nothing
ciQuoteGroup ((Only itemId :. memberRow) : _) = ciQuote itemId . CIQGroupRcv . Just $ toGroupMember userContactId memberRow
getChatPreviews :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Bool -> PaginationByTime -> ChatListQuery -> IO [Either StoreError AChat]
getChatPreviews :: DB.Connection -> VersionRangeChat -> User -> Bool -> PaginationByTime -> ChatListQuery -> IO [Either StoreError AChat]
getChatPreviews db vr user withPCC pagination query = do
directChats <- findDirectChatPreviews_ db user pagination query
groupChats <- findGroupChatPreviews_ db user pagination query
@@ -621,7 +621,7 @@ findDirectChatPreviews_ db User {userId} pagination clq =
)
([":user_id" := userId, ":rcv_new" := CISRcvNew, ":search" := search] <> pagParams)
getDirectChatPreview_ :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ChatPreviewData 'CTDirect -> ExceptT StoreError IO AChat
getDirectChatPreview_ :: DB.Connection -> VersionRangeChat -> User -> ChatPreviewData 'CTDirect -> ExceptT StoreError IO AChat
getDirectChatPreview_ db vr user (DirectChatPD _ contactId lastItemId_ stats) = do
contact <- getContact db vr user contactId
lastItem <- case lastItemId_ of
@@ -717,7 +717,7 @@ findGroupChatPreviews_ db User {userId} pagination clq =
)
([":user_id" := userId, ":rcv_new" := CISRcvNew, ":search" := search] <> pagParams)
getGroupChatPreview_ :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ChatPreviewData 'CTGroup -> ExceptT StoreError IO AChat
getGroupChatPreview_ :: DB.Connection -> VersionRangeChat -> User -> ChatPreviewData 'CTGroup -> ExceptT StoreError IO AChat
getGroupChatPreview_ db vr user (GroupChatPD _ groupId lastItemId_ stats) = do
groupInfo <- getGroupInfo db vr user groupId
lastItem <- case lastItemId_ of
@@ -923,7 +923,7 @@ getContactConnectionChatPreviews_ db User {userId} pagination clq = case clq of
aChat = AChat SCTContactConnection $ Chat (ContactConnection conn) [] stats
in ACPD SCTContactConnection $ ContactConnectionPD updatedAt aChat
getDirectChat :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ChatPagination -> Maybe String -> ExceptT StoreError IO (Chat 'CTDirect)
getDirectChat :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ChatPagination -> Maybe String -> ExceptT StoreError IO (Chat 'CTDirect)
getDirectChat db vr user contactId pagination search_ = do
let search = fromMaybe "" search_
ct <- getContact db vr user contactId
@@ -1043,7 +1043,7 @@ getDirectChatBefore_ db user@User {userId} ct@Contact {contactId} beforeChatItem
|]
(userId, contactId, search, beforeChatItemId, count)
getGroupChat :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ChatPagination -> Maybe String -> ExceptT StoreError IO (Chat 'CTGroup)
getGroupChat :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ChatPagination -> Maybe String -> ExceptT StoreError IO (Chat 'CTGroup)
getGroupChat db vr user groupId pagination search_ = do
let search = fromMaybe "" search_
g <- getGroupInfo db vr user groupId
@@ -1526,7 +1526,7 @@ toGroupChatItem currentTs userContactId (((itemId, itemTs, AMsgDirection msgDir,
ciTimed :: Maybe CITimed
ciTimed = timedTTL >>= \ttl -> Just CITimed {ttl, deleteAt = timedDeleteAt}
getAllChatItems :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ChatPagination -> Maybe String -> ExceptT StoreError IO [AChatItem]
getAllChatItems :: DB.Connection -> VersionRangeChat -> User -> ChatPagination -> Maybe String -> ExceptT StoreError IO [AChatItem]
getAllChatItems db vr user@User {userId} pagination search_ = do
itemRefs <-
rights . map toChatItemRef <$> case pagination of
@@ -2179,7 +2179,7 @@ deleteLocalChatItem db User {userId} NoteFolder {noteFolderId} ci = do
|]
(userId, noteFolderId, itemId)
getChatItemByFileId :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ExceptT StoreError IO AChatItem
getChatItemByFileId :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ExceptT StoreError IO AChatItem
getChatItemByFileId db vr user@User {userId} fileId = do
(chatRef, itemId) <-
ExceptT . firstRow' toChatItemRef (SEChatItemNotFoundByFileId fileId) $
@@ -2195,13 +2195,13 @@ getChatItemByFileId db vr user@User {userId} fileId = do
(userId, fileId)
getAChatItem db vr user chatRef itemId
lookupChatItemByFileId :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> Int64 -> ExceptT StoreError IO (Maybe AChatItem)
lookupChatItemByFileId :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ExceptT StoreError IO (Maybe AChatItem)
lookupChatItemByFileId db vr user fileId = do
fmap Just (getChatItemByFileId db vr user fileId) `catchError` \case
SEChatItemNotFoundByFileId {} -> pure Nothing
e -> throwError e
getChatItemByGroupId :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupId -> ExceptT StoreError IO AChatItem
getChatItemByGroupId :: DB.Connection -> VersionRangeChat -> User -> GroupId -> ExceptT StoreError IO AChatItem
getChatItemByGroupId db vr user@User {userId} groupId = do
(chatRef, itemId) <-
ExceptT . firstRow' toChatItemRef (SEChatItemNotFoundByGroupId groupId) $
@@ -2227,7 +2227,7 @@ getChatRefViaItemId db User {userId} itemId = do
(Nothing, Just groupId) -> Right $ ChatRef CTGroup groupId
(_, _) -> Left $ SEBadChatItem itemId Nothing
getAChatItem :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ChatRef -> ChatItemId -> ExceptT StoreError IO AChatItem
getAChatItem :: DB.Connection -> VersionRangeChat -> User -> ChatRef -> ChatItemId -> ExceptT StoreError IO AChatItem
getAChatItem db vr user chatRef itemId = case chatRef of
ChatRef CTDirect contactId -> do
ct <- getContact db vr user contactId
@@ -2476,7 +2476,7 @@ createCIModeration db GroupInfo {groupId} moderatorMember itemMemberId itemShare
|]
(groupId, groupMemberId' moderatorMember, itemMemberId, itemSharedMId, msgId, moderatedAtTs)
getCIModeration :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> GroupInfo -> MemberId -> Maybe SharedMsgId -> IO (Maybe CIModeration)
getCIModeration :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> MemberId -> Maybe SharedMsgId -> IO (Maybe CIModeration)
getCIModeration _ _ _ _ _ Nothing = pure Nothing
getCIModeration db vr user GroupInfo {groupId} itemMemberId (Just sharedMsgId) = do
r_ <-
+3 -3
View File
@@ -328,7 +328,7 @@ createUserContactLink db User {userId} agentConnId cReq subMode =
userContactLinkId <- insertedRowId db
void $ createConnection_ db userId ConnUserContact (Just userContactLinkId) agentConnId initialChatVersion chatInitialVRange Nothing Nothing Nothing 0 currentTs subMode CR.PQSupportOff
getUserAddressConnections :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> ExceptT StoreError IO [Connection]
getUserAddressConnections :: DB.Connection -> VersionRangeChat -> User -> ExceptT StoreError IO [Connection]
getUserAddressConnections db vr User {userId} = do
cs <- liftIO getUserAddressConnections_
if null cs then throwError SEUserContactLinkNotFound else pure cs
@@ -349,7 +349,7 @@ getUserAddressConnections db vr User {userId} = do
|]
(userId, userId)
getUserContactLinks :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> IO [(Connection, UserContact)]
getUserContactLinks :: DB.Connection -> VersionRangeChat -> User -> IO [(Connection, UserContact)]
getUserContactLinks db vr User {userId} =
map toUserContactConnection
<$> DB.query
@@ -475,7 +475,7 @@ getUserContactLinkByConnReq db User {userId} (cReqSchema1, cReqSchema2) =
|]
(userId, cReqSchema1, cReqSchema2)
getContactWithoutConnViaAddress :: DB.Connection -> (PQSupport -> VersionRangeChat) -> User -> (ConnReqContact, ConnReqContact) -> IO (Maybe Contact)
getContactWithoutConnViaAddress :: DB.Connection -> VersionRangeChat -> User -> (ConnReqContact, ConnReqContact) -> IO (Maybe Contact)
getContactWithoutConnViaAddress db vr user@User {userId} (cReqSchema1, cReqSchema2) = do
ctId_ <-
maybeFirstRow fromOnly $
+4 -4
View File
@@ -166,12 +166,12 @@ type ConnectionRow = (Int64, ConnId, Int, Maybe Int64, Maybe Int64, Bool, Maybe
type MaybeConnectionRow = (Maybe Int64, Maybe ConnId, Maybe Int, Maybe Int64, Maybe Int64, Maybe Bool, Maybe GroupLinkId, Maybe Int64, Maybe ConnStatus, Maybe ConnType, Maybe Bool, Maybe LocalAlias) :. EntityIdsRow :. (Maybe UTCTime, Maybe Text, Maybe UTCTime, Maybe PQSupport, Maybe PQEncryption, Maybe PQEncryption, Maybe PQEncryption, Maybe Int, Maybe VersionChat, Maybe VersionChat, Maybe VersionChat)
toConnection :: (PQSupport -> VersionRangeChat) -> ConnectionRow -> Connection
toConnection :: VersionRangeChat -> ConnectionRow -> Connection
toConnection vr ((connId, acId, connLevel, viaContact, viaUserContactLink, viaGroupLink, groupLinkId, customUserProfileId, connStatus, connType, contactConnInitiated, localAlias) :. (contactId, groupMemberId, sndFileId, rcvFileId, userContactLinkId) :. (createdAt, code_, verifiedAt_, pqSupport, pqEncryption, pqSndEnabled, pqRcvEnabled, authErrCounter, chatV, minVer, maxVer)) =
Connection
{ connId,
agentConnId = AgentConnId acId,
connChatVersion = fromMaybe (vr pqSupport `peerConnChatVersion` peerChatVRange) chatV,
connChatVersion = fromMaybe (vr `peerConnChatVersion` peerChatVRange) chatV,
peerChatVRange = peerChatVRange,
connLevel,
viaContact,
@@ -201,7 +201,7 @@ toConnection vr ((connId, acId, connLevel, viaContact, viaUserContactLink, viaGr
entityId_ ConnSndFile = sndFileId
entityId_ ConnUserContact = userContactLinkId
toMaybeConnection :: (PQSupport -> VersionRangeChat) -> MaybeConnectionRow -> Maybe Connection
toMaybeConnection :: VersionRangeChat -> MaybeConnectionRow -> Maybe Connection
toMaybeConnection vr ((Just connId, Just agentConnId, Just connLevel, viaContact, viaUserContactLink, Just viaGroupLink, groupLinkId, customUserProfileId, Just connStatus, Just connType, Just contactConnInitiated, Just localAlias) :. (contactId, groupMemberId, sndFileId, rcvFileId, userContactLinkId) :. (Just createdAt, code_, verifiedAt_, Just pqSupport, Just pqEncryption, pqSndEnabled_, pqRcvEnabled_, Just authErrCounter, connChatVersion, Just minVer, Just maxVer)) =
Just $ toConnection vr ((connId, agentConnId, connLevel, viaContact, viaUserContactLink, viaGroupLink, groupLinkId, customUserProfileId, connStatus, connType, contactConnInitiated, localAlias) :. (contactId, groupMemberId, sndFileId, rcvFileId, userContactLinkId) :. (createdAt, code_, verifiedAt_, pqSupport, pqEncryption, pqSndEnabled_, pqRcvEnabled_, authErrCounter, connChatVersion, minVer, maxVer))
toMaybeConnection _ _ = Nothing
@@ -382,7 +382,7 @@ deleteUnusedIncognitoProfileById_ db User {userId} profileId =
type ContactRow = (ContactId, ProfileId, ContactName, Maybe Int64, ContactName, Text, Maybe ImageData, Maybe ConnReqContact, LocalAlias, Bool, ContactStatus) :. (Maybe MsgFilter, Maybe Bool, Bool, Maybe Preferences, Preferences, UTCTime, UTCTime, Maybe UTCTime, Maybe GroupMemberId, Bool, Maybe CustomData)
toContact :: (PQSupport -> VersionRangeChat) -> User -> ContactRow :. MaybeConnectionRow -> Contact
toContact :: VersionRangeChat -> User -> ContactRow :. MaybeConnectionRow -> Contact
toContact vr user (((contactId, profileId, localDisplayName, viaGroup, displayName, fullName, image, contactLink, localAlias, contactUsed, contactStatus) :. (enableNtfs_, sendRcpts, favorite, preferences, userPreferences, createdAt, updatedAt, chatTs, contactGroupMemberId, contactGrpInvSent, customData)) :. connRow) =
let profile = LocalProfile {profileId, displayName, fullName, image, contactLink, preferences, localAlias}
activeConn = toMaybeConnection vr connRow
-1
View File
@@ -342,7 +342,6 @@ responseToView hu@(currentRH, user_) ChatConfig {logLevel, showReactions, showRe
CRRemoteCtrlConnected RemoteCtrlInfo {remoteCtrlId = rcId, ctrlDeviceName} ->
["remote controller " <> sShow rcId <> " session started with " <> plain ctrlDeviceName]
CRRemoteCtrlStopped {} -> ["remote controller stopped"]
CRContactPQAllowed u c (CR.PQEncryption pqOn) -> ttyUser u [ttyContact' c <> ": enable " <> (if pqOn then "quantum resistant" else "standard") <> " end-to-end encryption"]
CRContactPQEnabled u c (CR.PQEncryption pqOn) -> ttyUser u [ttyContact' c <> ": " <> (if pqOn then "quantum resistant" else "standard") <> " end-to-end encryption enabled"]
CRSQLResult rows -> map plain rows
CRSlowSQLQueries {chatQueries, agentQueries} ->
+7 -1
View File
@@ -809,7 +809,9 @@ testRestoreDirectory tmp = do
groupFoundN 3 bob "privacy"
groupFound bob "security"
groupFoundN 3 cath "privacy"
groupFound cath "security"
cath #> "@SimpleX-Directory security"
cath <## "SimpleX-Directory: quantum resistant end-to-end encryption enabled"
groupFoundN' 2 cath "security"
listGroups :: HasCallStack => TestCC -> TestCC -> TestCC -> IO ()
listGroups superUser bob cath = do
@@ -1055,6 +1057,10 @@ groupFound = groupFoundN 2
groupFoundN :: Int -> TestCC -> String -> IO ()
groupFoundN count u name = do
u #> ("@SimpleX-Directory " <> name)
groupFoundN' count u name
groupFoundN' :: Int -> TestCC -> String -> IO ()
groupFoundN' count u name = do
u <# ("SimpleX-Directory> > " <> name)
u <## " Found 1 group(s)."
u <#. ("SimpleX-Directory> " <> name)
+12 -12
View File
@@ -44,7 +44,7 @@ import Simplex.Messaging.Agent.RetryInterval
import Simplex.Messaging.Agent.Store.SQLite (MigrationConfirmation (..), closeSQLiteStore)
import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
import Simplex.Messaging.Client (ProtocolClientConfig (..), defaultNetworkConfig)
import Simplex.Messaging.Crypto.Ratchet (supportedE2EEncryptVRange, pattern PQSupportOff)
import Simplex.Messaging.Crypto.Ratchet (supportedE2EEncryptVRange)
import qualified Simplex.Messaging.Crypto.Ratchet as CR
import Simplex.Messaging.Server (runSMPServerBlocking)
import Simplex.Messaging.Server.Env.STM
@@ -146,8 +146,8 @@ testAgentCfgVPrev :: AgentConfig
testAgentCfgVPrev =
testAgentCfg
{ smpClientVRange = prevRange $ smpClientVRange testAgentCfg,
smpAgentVRange = \_ -> prevRange $ supportedSMPAgentVRange PQSupportOff,
e2eEncryptVRange = \_ -> prevRange $ supportedE2EEncryptVRange PQSupportOff,
smpAgentVRange = prevRange supportedSMPAgentVRange,
e2eEncryptVRange = prevRange supportedE2EEncryptVRange,
smpCfg = (smpCfg testAgentCfg) {serverVRange = prevRange $ serverVRange $ smpCfg testAgentCfg}
}
@@ -155,8 +155,8 @@ testAgentCfgVNext :: AgentConfig
testAgentCfgVNext =
testAgentCfg
{ smpClientVRange = nextRange $ smpClientVRange testAgentCfg,
smpAgentVRange = \_ -> mkVersionRange duplexHandshakeSMPAgentVersion $ max pqdrSMPAgentVersion currentSMPAgentVersion,
e2eEncryptVRange = \_ -> mkVersionRange CR.kdfX3DHE2EEncryptVersion $ max CR.pqRatchetE2EEncryptVersion CR.currentE2EEncryptVersion,
smpAgentVRange = mkVersionRange duplexHandshakeSMPAgentVersion $ max pqdrSMPAgentVersion currentSMPAgentVersion,
e2eEncryptVRange = mkVersionRange CR.kdfX3DHE2EEncryptVersion $ max CR.pqRatchetE2EEncryptVersion CR.currentE2EEncryptVersion,
smpCfg = (smpCfg testAgentCfg) {serverVRange = nextRange $ serverVRange $ smpCfg testAgentCfg}
}
@@ -164,29 +164,29 @@ testAgentCfgV1 :: AgentConfig
testAgentCfgV1 =
testAgentCfg
{ smpClientVRange = v1Range,
smpAgentVRange = \_ -> versionToRange duplexHandshakeSMPAgentVersion,
e2eEncryptVRange = \_ -> versionToRange CR.kdfX3DHE2EEncryptVersion,
smpAgentVRange = versionToRange duplexHandshakeSMPAgentVersion,
e2eEncryptVRange = versionToRange CR.kdfX3DHE2EEncryptVersion,
smpCfg = (smpCfg testAgentCfg) {serverVRange = versionToRange batchCmdsSMPVersion}
}
testCfgVPrev :: ChatConfig
testCfgVPrev =
testCfg
{ chatVRange = \_ -> prevRange $ chatVRange testCfg PQSupportOff,
{ chatVRange = prevRange $ chatVRange testCfg,
agentConfig = testAgentCfgVPrev
}
testCfgVNext :: ChatConfig
testCfgVNext =
testCfg
{ chatVRange = \_ -> mkVersionRange initialChatVersion $ max pqEncryptionCompressionVersion currentChatVersion,
{ chatVRange = mkVersionRange initialChatVersion $ max pqEncryptionCompressionVersion currentChatVersion,
agentConfig = testAgentCfgVNext
}
testCfgV1 :: ChatConfig
testCfgV1 =
testCfg
{ chatVRange = const v1Range,
{ chatVRange = v1Range,
agentConfig = testAgentCfgV1
}
@@ -210,7 +210,7 @@ testCfgCreateGroupDirect =
mkCfgCreateGroupDirect testCfg
mkCfgCreateGroupDirect :: ChatConfig -> ChatConfig
mkCfgCreateGroupDirect cfg = cfg {chatVRange = const groupCreateDirectVRange}
mkCfgCreateGroupDirect cfg = cfg {chatVRange = groupCreateDirectVRange}
groupCreateDirectVRange :: VersionRangeChat
groupCreateDirectVRange = mkVersionRange (VersionChat 1) (VersionChat 1)
@@ -220,7 +220,7 @@ testCfgGroupLinkViaContact =
mkCfgGroupLinkViaContact testCfg
mkCfgGroupLinkViaContact :: ChatConfig -> ChatConfig
mkCfgGroupLinkViaContact cfg = cfg {chatVRange = const groupLinkViaContactVRange}
mkCfgGroupLinkViaContact cfg = cfg {chatVRange = groupLinkViaContactVRange}
groupLinkViaContactVRange :: VersionRangeChat
groupLinkViaContactVRange = mkVersionRange (VersionChat 1) (VersionChat 2)
+81 -322
View File
@@ -10,7 +10,7 @@ import ChatClient
import ChatTests.Utils
import Control.Concurrent (threadDelay)
import Control.Concurrent.Async (concurrently_)
import Control.Monad (forM_, when)
import Control.Monad (forM_)
import Data.Aeson (ToJSON)
import qualified Data.Aeson as J
import qualified Data.ByteString.Char8 as B
@@ -21,11 +21,10 @@ import qualified Simplex.Chat.AppSettings as AS
import Simplex.Chat.Call
import Simplex.Chat.Controller (ChatConfig (..))
import Simplex.Chat.Options (ChatOpts (..))
import Simplex.Chat.Protocol (currentChatVersion, pqEncryptionCompressionVersion, supportedChatVRange)
import Simplex.Chat.Protocol (supportedChatVRange)
import Simplex.Chat.Store (agentStoreFile, chatStoreFile)
import Simplex.Chat.Types (VersionRangeChat, authErrDisableCount, sameVerificationCode, verificationCode, VersionChat, pattern VersionChat)
import Simplex.Chat.Types (VersionRangeChat, authErrDisableCount, sameVerificationCode, verificationCode, pattern VersionChat)
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Crypto.Ratchet (PQEncryption (..), pattern PQEncOff, pattern PQEncOn, pattern PQSupportOff, pattern PQSupportOn)
import Simplex.Messaging.Util (safeDecodeUtf8)
import Simplex.Messaging.Version
import System.Directory (copyFile, doesDirectoryExist, doesFileExist)
@@ -47,6 +46,7 @@ chatDirectTests = do
it "direct timed message" testDirectTimedMessage
it "repeat AUTH errors disable contact" testRepeatAuthErrorsDisableContact
it "should send multiline message" testMultilineMessage
it "send large message" testLargeMessage
describe "duplicate contacts" $ do
it "duplicate contacts are separate (contacts don't merge)" testDuplicateContactsSeparate
it "new contact is separate with multiple duplicate contacts (contacts don't merge)" testDuplicateContactsMultipleSeparate
@@ -116,25 +116,18 @@ chatDirectTests = do
it "should send delivery receipts depending on configuration" testConfigureDeliveryReceipts
describe "negotiate connection peer chat protocol version range" $ do
describe "peer version range correctly set for new connection via invitation" $ do
testInvVRange (supportedChatVRange PQSupportOff) (supportedChatVRange PQSupportOff)
testInvVRange (supportedChatVRange PQSupportOff) vr11
testInvVRange vr11 (supportedChatVRange PQSupportOff)
testInvVRange supportedChatVRange supportedChatVRange
testInvVRange supportedChatVRange vr11
testInvVRange vr11 supportedChatVRange
testInvVRange vr11 vr11
describe "peer version range correctly set for new connection via contact request" $ do
testReqVRange (supportedChatVRange PQSupportOff) (supportedChatVRange PQSupportOff)
testReqVRange (supportedChatVRange PQSupportOff) vr11
testReqVRange vr11 (supportedChatVRange PQSupportOff)
testReqVRange supportedChatVRange supportedChatVRange
testReqVRange supportedChatVRange vr11
testReqVRange vr11 supportedChatVRange
testReqVRange vr11 vr11
it "update peer version range on received messages" testUpdatePeerChatVRange
describe "network statuses" $ do
it "should get network statuses" testGetNetworkStatuses
describe "PQ tests" $ do
describe "enable PQ before connection, connect via invitation link" $ pqMatrix2 runTestPQConnectViaLink
describe "enable PQ before connection, connect via contact address" $ pqMatrix2 runTestPQConnectViaAddress
describe "connect via invitation link with PQ encryption enabled" $ pqVersionTestMatrix2 runTestPQVersionsViaLink
describe "connect via contact address with PQ encryption enabled" $ pqVersionTestMatrix2 runTestPQVersionsViaAddress
it "should enable PQ after several messages in connection without PQ" testPQEnableContact
it "should enable PQ, reduce envelope size and enable compression" testPQEnableContactCompression
where
testInvVRange vr1 vr2 = it (vRangeStr vr1 <> " - " <> vRangeStr vr2) $ testConnInvChatVRange vr1 vr2
testReqVRange vr1 vr2 = it (vRangeStr vr1 <> " - " <> vRangeStr vr2) $ testConnReqChatVRange vr1 vr2
@@ -142,7 +135,7 @@ chatDirectTests = do
testAddContact :: HasCallStack => SpecWith FilePath
testAddContact = versionTestMatrix2 runTestAddContact
where
runTestAddContact alice bob = do
runTestAddContact pqExpected alice bob = do
alice ##> "/_connect 1"
inv <- getInvitation alice
bob ##> ("/_connect 1 " <> inv)
@@ -151,46 +144,50 @@ testAddContact = versionTestMatrix2 runTestAddContact
(bob <## "alice (Alice): contact is connected")
(alice <## "bob (Bob): contact is connected")
threadDelay 100000
chatsEmpty alice bob
chatsEmpty
alice #> "@bob hello there 🙂"
bob <# "alice> hello there 🙂"
alice ##> "/_unread chat @2 on"
alice <## "ok"
alice ##> "/_unread chat @2 off"
alice <## "ok"
chatsOneMessage alice bob
chatsOneMessage
bob #> "@alice hello there"
alice <# "bob> hello there"
bob #> "@alice how are you?"
alice <# "bob> how are you?"
chatsManyMessages alice bob
chatsEmpty alice bob = do
alice @@@ [("@bob", lastChatFeature)]
alice #$> ("/_get chat @2 count=100", chat, chatFeatures)
bob @@@ [("@alice", lastChatFeature)]
bob #$> ("/_get chat @2 count=100", chat, chatFeatures)
chatsOneMessage alice bob = do
alice @@@ [("@bob", "hello there 🙂")]
alice #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(1, "hello there 🙂")])
bob @@@ [("@alice", "hello there 🙂")]
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "hello there 🙂")])
chatsManyMessages alice bob = do
alice @@@ [("@bob", "how are you?")]
alice #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(1, "hello there 🙂"), (0, "hello there"), (0, "how are you?")])
bob @@@ [("@alice", "how are you?")]
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "hello there 🙂"), (1, "hello there"), (1, "how are you?")])
-- pagination
alice #$> ("/_get chat @2 after=" <> itemId 1 <> " count=100", chat, [(0, "hello there"), (0, "how are you?")])
alice #$> ("/_get chat @2 before=" <> itemId 2 <> " count=100", chat, chatFeatures <> [(1, "hello there 🙂")])
-- search
alice #$> ("/_get chat @2 count=100 search=ello ther", chat, [(1, "hello there 🙂"), (0, "hello there")])
-- read messages
alice #$> ("/_read chat @2 from=1 to=100", id, "ok")
bob #$> ("/_read chat @2 from=1 to=100", id, "ok")
alice #$> ("/_read chat @2", id, "ok")
bob #$> ("/_read chat @2", id, "ok")
alice #$> ("/read user", id, "ok")
alice #$> ("/_read user 1", id, "ok")
chatsManyMessages
where
chatsEmpty = do
alice @@@ [("@bob", lastChatFeature)]
alice #$> ("/_get chat @2 count=100", chat, features)
bob @@@ [("@alice", lastChatFeature)]
bob #$> ("/_get chat @2 count=100", chat, features)
chatsOneMessage = do
alice @@@ [("@bob", "hello there 🙂")]
alice #$> ("/_get chat @2 count=100", chat, features <> [(1, "hello there 🙂")])
bob @@@ [("@alice", "hello there 🙂")]
bob #$> ("/_get chat @2 count=100", chat, features <> [(0, "hello there 🙂")])
chatsManyMessages = do
alice @@@ [("@bob", "how are you?")]
alice #$> ("/_get chat @2 count=100", chat, features <> [(1, "hello there 🙂"), (0, "hello there"), (0, "how are you?")])
bob @@@ [("@alice", "how are you?")]
bob #$> ("/_get chat @2 count=100", chat, features <> [(0, "hello there 🙂"), (1, "hello there"), (1, "how are you?")])
-- pagination
alice #$> ("/_get chat @2 after=" <> itemId 1 <> " count=100", chat, [(0, "hello there"), (0, "how are you?")])
alice #$> ("/_get chat @2 before=" <> itemId 2 <> " count=100", chat, features <> [(1, "hello there 🙂")])
-- search
alice #$> ("/_get chat @2 count=100 search=ello ther", chat, [(1, "hello there 🙂"), (0, "hello there")])
-- read messages
alice #$> ("/_read chat @2 from=1 to=100", id, "ok")
bob #$> ("/_read chat @2 from=1 to=100", id, "ok")
alice #$> ("/_read chat @2", id, "ok")
bob #$> ("/_read chat @2", id, "ok")
alice #$> ("/read user", id, "ok")
alice #$> ("/_read user 1", id, "ok")
features = if pqExpected
then chatFeatures
else (0, e2eeInfoNoPQStr) : tail chatFeatures
testDuplicateContactsSeparate :: HasCallStack => FilePath -> IO ()
testDuplicateContactsSeparate =
@@ -728,6 +725,20 @@ testMultilineMessage = testChat3 aliceProfile bobProfile cathProfile $ \alice bo
cath <# "alice> hello"
cath <## "there"
testLargeMessage :: HasCallStack => FilePath -> IO ()
testLargeMessage =
testChat2 aliceProfile bobProfile $
\alice bob -> do
connectUsers alice bob
img <- genProfileImg
let profileImage = "data:image/png;base64," <> B.unpack img
alice `send` ("/_profile 1 {\"displayName\": \"alice2\", \"fullName\": \"\", \"image\": \"" <> profileImage <> "\"}")
_trimmedCmd1 <- getTermLine alice
alice <## "user profile is changed to alice2 (your 1 contacts are notified)"
bob <## "contact alice changed to alice2"
bob <## "use @alice2 <message> to send messages"
testGetSetSMPServers :: HasCallStack => FilePath -> IO ()
testGetSetSMPServers =
testChat2 aliceProfile bobProfile $
@@ -1649,17 +1660,17 @@ testUsersDifferentCIExpirationTTL tmp = do
-- set ttl for first user
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_ttl 1 1", id, "ok")
alice #$> ("/_ttl 1 2", id, "ok")
-- set ttl for second user
alice ##> "/user alisa"
showActiveUser alice "alisa"
alice #$> ("/_ttl 2 3", id, "ok")
alice #$> ("/_ttl 2 4", id, "ok")
-- first user messages
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/ttl", id, "old messages are set to be deleted after: 1 second(s)")
alice #$> ("/ttl", id, "old messages are set to be deleted after: 2 second(s)")
alice #> "@bob alice 3"
bob <# "alice> alice 3"
@@ -1671,7 +1682,7 @@ testUsersDifferentCIExpirationTTL tmp = do
-- second user messages
alice ##> "/user alisa"
showActiveUser alice "alisa"
alice #$> ("/ttl", id, "old messages are set to be deleted after: 3 second(s)")
alice #$> ("/ttl", id, "old messages are set to be deleted after: 4 second(s)")
alice #> "@bob alisa 3"
bob <# "alisa> alisa 3"
@@ -1680,7 +1691,7 @@ testUsersDifferentCIExpirationTTL tmp = do
alice #$> ("/_get chat @4 count=100", chat, chatFeatures <> [(1, "alisa 1"), (0, "alisa 2"), (1, "alisa 3"), (0, "alisa 4")])
threadDelay 2000000
threadDelay 3000000
-- messages both before and after setting chat item ttl are deleted
-- first user messages
@@ -1916,13 +1927,13 @@ testUsersTimedMessages tmp = do
withNewTestChat tmp "bob" bobProfile $ \bob -> do
withNewTestChat tmp "alice" aliceProfile $ \alice -> do
connectUsers alice bob
configureTimedMessages alice bob "2" "1"
configureTimedMessages alice bob "2" "2"
-- create second user and configure timed messages for contact
alice ##> "/create user alisa"
showActiveUser alice "alisa"
connectUsers alice bob
configureTimedMessages alice bob "4" "2"
configureTimedMessages alice bob "4" "3"
-- first user messages
alice ##> "/user alice"
@@ -1943,7 +1954,7 @@ testUsersTimedMessages tmp = do
alice <# "bob> alisa 2"
-- messages are deleted after ttl
threadDelay 500000
threadDelay 1500000
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
@@ -2094,7 +2105,7 @@ testUserPrivacy =
alice <##? chatHistory
alice ##> "/_get items before=13 count=10"
alice
<##? [ ConsoleString ("bob> " <> e2eeInfoNoPQStr),
<##? [ ConsoleString ("bob> " <> e2eeInfoPQStr),
"bob> Disappearing messages: allowed",
"bob> Full deletion: off",
"bob> Message reactions: enabled",
@@ -2165,7 +2176,7 @@ testUserPrivacy =
alice <## "messages are shown"
alice <## "profile is visible"
chatHistory =
[ ConsoleString ("bob> " <> e2eeInfoNoPQStr),
[ ConsoleString ("bob> " <> e2eeInfoPQStr),
"bob> Disappearing messages: allowed",
"bob> Full deletion: off",
"bob> Message reactions: enabled",
@@ -2347,6 +2358,7 @@ testMarkContactVerified =
alice <## "sending messages via: localhost"
alice <## "you've shared main profile with this contact"
alice <## connVerified
alice <## "quantum resistant end-to-end encryption"
alice <## currentChatVRangeInfo
where
connVerified
@@ -2517,6 +2529,7 @@ testSyncRatchetCodeReset tmp =
bob <## "sending messages via: localhost"
bob <## "you've shared main profile with this contact"
bob <## connVerified
bob <## "quantum resistant end-to-end encryption"
bob <## currentChatVRangeInfo
where
connVerified
@@ -2667,8 +2680,8 @@ testConfigureDeliveryReceipts tmp =
testConnInvChatVRange :: HasCallStack => VersionRangeChat -> VersionRangeChat -> FilePath -> IO ()
testConnInvChatVRange ct1VRange ct2VRange tmp =
withNewTestChatCfg tmp testCfg {chatVRange = const ct1VRange} "alice" aliceProfile $ \alice -> do
withNewTestChatCfg tmp testCfg {chatVRange = const ct2VRange} "bob" bobProfile $ \bob -> do
withNewTestChatCfg tmp testCfg {chatVRange = ct1VRange} "alice" aliceProfile $ \alice -> do
withNewTestChatCfg tmp testCfg {chatVRange = ct2VRange} "bob" bobProfile $ \bob -> do
connectUsers alice bob
alice ##> "/i bob"
@@ -2679,8 +2692,8 @@ testConnInvChatVRange ct1VRange ct2VRange tmp =
testConnReqChatVRange :: HasCallStack => VersionRangeChat -> VersionRangeChat -> FilePath -> IO ()
testConnReqChatVRange ct1VRange ct2VRange tmp =
withNewTestChatCfg tmp testCfg {chatVRange = const ct1VRange} "alice" aliceProfile $ \alice -> do
withNewTestChatCfg tmp testCfg {chatVRange = const ct2VRange} "bob" bobProfile $ \bob -> do
withNewTestChatCfg tmp testCfg {chatVRange = ct1VRange} "alice" aliceProfile $ \alice -> do
withNewTestChatCfg tmp testCfg {chatVRange = ct2VRange} "bob" bobProfile $ \bob -> do
alice ##> "/ad"
cLink <- getContactLink alice True
bob ##> ("/c " <> cLink)
@@ -2707,7 +2720,7 @@ testUpdatePeerChatVRange tmp =
contactInfoChatVRange alice vr11
bob ##> "/i alice"
contactInfoChatVRange bob (supportedChatVRange PQSupportOff)
contactInfoChatVRange bob supportedChatVRange
withTestChat tmp "bob" $ \bob -> do
bob <## "1 contacts connected (use /cs for the list)"
@@ -2716,10 +2729,10 @@ testUpdatePeerChatVRange tmp =
alice <# "bob> hello 1"
alice ##> "/i bob"
contactInfoChatVRange alice (supportedChatVRange PQSupportOff)
contactInfoChatVRange alice supportedChatVRange
bob ##> "/i alice"
contactInfoChatVRange bob (supportedChatVRange PQSupportOff)
contactInfoChatVRange bob supportedChatVRange
withTestChatCfg tmp cfg11 "bob" $ \bob -> do
bob <## "1 contacts connected (use /cs for the list)"
@@ -2731,9 +2744,9 @@ testUpdatePeerChatVRange tmp =
contactInfoChatVRange alice vr11
bob ##> "/i alice"
contactInfoChatVRange bob (supportedChatVRange PQSupportOff)
contactInfoChatVRange bob supportedChatVRange
where
cfg11 = testCfg {chatVRange = const vr11} :: ChatConfig
cfg11 = testCfg {chatVRange = vr11} :: ChatConfig
testGetNetworkStatuses :: HasCallStack => FilePath -> IO ()
testGetNetworkStatuses tmp = do
@@ -2759,259 +2772,5 @@ contactInfoChatVRange cc (VersionRange minVer maxVer) = do
cc <## "sending messages via: localhost"
cc <## "you've shared main profile with this contact"
cc <## "connection not verified, use /code command to see security code"
cc <## "quantum resistant end-to-end encryption"
cc <## ("peer chat protocol version range: (" <> show minVer <> ", " <> show maxVer <> ")")
runTestPQConnectViaLink :: HasCallStack => (TestCC, PQEnabled) -> (TestCC, PQEnabled) -> IO ()
runTestPQConnectViaLink (alice, aPQ) (bob, bPQ) = do
when aPQ $ pqOn alice
when bPQ $ pqOn bob
connectUsers alice bob
(alice, "hi") `pqSend` bob
(bob, "hey") `pqSend` alice
alice ##> "/_get chat @2 count=100"
ra <- chat <$> getTermLine alice
ra `shouldContain` [(0, e2eeInfo)]
alice `pqForContact` 2 `shouldReturn` PQEncryption pqEnabled
bob ##> "/_get chat @2 count=100"
rb <- chat <$> getTermLine bob
rb `shouldContain` [(0, e2eeInfo)]
bob `pqForContact` 2 `shouldReturn` PQEncryption pqEnabled
where
pqEnabled = aPQ && bPQ
pqSend = if pqEnabled then (+#>) else (\#>)
e2eeInfo = if pqEnabled then e2eeInfoPQStr else e2eeInfoNoPQStr
pqOn :: TestCC -> IO ()
pqOn cc = do
cc ##> "/pq on"
cc <## "ok"
runTestPQConnectViaAddress :: HasCallStack => (TestCC, PQEnabled) -> (TestCC, PQEnabled) -> IO ()
runTestPQConnectViaAddress (alice, aPQ) (bob, bPQ) = do
when aPQ $ pqOn alice
when bPQ $ pqOn bob
alice ##> "/ad"
cLink <- getContactLink alice True
bob ##> ("/c " <> cLink)
alice <#? bob
alice @@@ [("<@bob", "")]
alice ##> "/ac bob"
alice <## "bob (Bob): accepting contact request..."
concurrently_
(bob <## "alice (Alice): contact is connected")
(alice <## "bob (Bob): contact is connected")
(alice, "hi") `pqSend` bob
(bob, "hey") `pqSend` alice
alice ##> "/_get chat @2 count=100"
ra <- chat <$> getTermLine alice
ra `shouldContain` [(0, e2eeInfo)]
alice `pqForContact` 2 `shouldReturn` PQEncryption pqEnabled
bob ##> "/_get chat @2 count=100"
rb <- chat <$> getTermLine bob
rb `shouldContain` [(0, e2eeInfo)]
bob `pqForContact` 2 `shouldReturn` PQEncryption pqEnabled
where
pqEnabled = aPQ && bPQ
pqSend = if pqEnabled then (+#>) else (\#>)
e2eeInfo = if pqEnabled then e2eeInfoPQStr else e2eeInfoNoPQStr
runTestPQVersionsViaLink :: HasCallStack => TestCC -> TestCC -> Bool -> VersionChat -> IO ()
runTestPQVersionsViaLink alice bob pqExpected vExpected = do
img <- genProfileImg
let profileImage = "data:image/png;base64," <> B.unpack img
alice `send` ("/set profile image " <> profileImage)
_trimmedCmd1 <- getTermLine alice
alice <## "profile image updated"
bob `send` ("/set profile image " <> profileImage)
_trimmedCmd2 <- getTermLine bob
bob <## "profile image updated"
pqOn alice
pqOn bob
connectUsers alice bob
(alice, "hi", vExpected) `pqSend` (bob, vExpected)
(bob, "hey", vExpected) `pqSend` (alice, vExpected)
alice ##> "/_get chat @2 count=100"
ra <- chat <$> getTermLine alice
ra `shouldContain` [(0, e2eeInfo)]
alice `pqForContact` 2 `shouldReturn` PQEncryption pqExpected
bob ##> "/_get chat @2 count=100"
rb <- chat <$> getTermLine bob
rb `shouldContain` [(0, e2eeInfo)]
bob `pqForContact` 2 `shouldReturn` PQEncryption pqExpected
where
pqSend = if pqExpected then (+:#>) else (\:#>)
e2eeInfo = if pqExpected then e2eeInfoPQStr else e2eeInfoNoPQStr
runTestPQVersionsViaAddress :: HasCallStack => TestCC -> TestCC -> Bool -> VersionChat -> IO ()
runTestPQVersionsViaAddress alice bob pqExpected vExpected = do
img <- genProfileImg
let profileImage = "data:image/png;base64," <> B.unpack img
alice `send` ("/set profile image " <> profileImage)
_trimmedCmd1 <- getTermLine alice
alice <## "profile image updated"
bob `send` ("/set profile image " <> profileImage)
_trimmedCmd2 <- getTermLine bob
bob <## "profile image updated"
pqOn alice
pqOn bob
alice ##> "/ad"
cLink <- getContactLink alice True
bob ##> ("/c " <> cLink)
alice <#? bob
alice @@@ [("<@bob", "")]
alice ##> "/ac bob"
alice <## "bob (Bob): accepting contact request..."
concurrently_
(bob <## "alice (Alice): contact is connected")
(alice <## "bob (Bob): contact is connected")
(alice, "hi", vExpected) `pqSend` (bob, vExpected)
(bob, "hey", vExpected) `pqSend` (alice, vExpected)
alice ##> "/_get chat @2 count=100"
ra <- chat <$> getTermLine alice
ra `shouldContain` [(0, e2eeInfo)]
alice `pqForContact` 2 `shouldReturn` PQEncryption pqExpected
bob ##> "/_get chat @2 count=100"
rb <- chat <$> getTermLine bob
rb `shouldContain` [(0, e2eeInfo)]
bob `pqForContact` 2 `shouldReturn` PQEncryption pqExpected
where
pqSend = if pqExpected then (+:#>) else (\:#>)
e2eeInfo = if pqExpected then e2eeInfoPQStr else e2eeInfoNoPQStr
testPQEnableContact :: HasCallStack => FilePath -> IO ()
testPQEnableContact =
testChat2 aliceProfile bobProfile $ \alice bob -> do
connectUsers alice bob
(alice, "hi") \#> bob
(bob, "hey") \#> alice
alice ##> "/_get chat @2 count=100"
ra <- chat <$> getTermLine alice
ra `shouldContain` [(0, e2eeInfoNoPQStr)]
PQEncOff <- alice `pqForContact` 2
bob ##> "/_get chat @2 count=100"
rb <- chat <$> getTermLine bob
rb `shouldContain` [(0, e2eeInfoNoPQStr)]
PQEncOff <- bob `pqForContact` 2
sendMany PQEncOff alice bob
PQEncOff <- alice `pqForContact` 2
PQEncOff <- bob `pqForContact` 2
-- enabling experimental flags doesn't enable PQ in previously created connection
pqOn alice
sendMany PQEncOff alice bob
PQEncOff <- alice `pqForContact` 2
PQEncOff <- bob `pqForContact` 2
pqOn bob
sendMany PQEncOff alice bob
PQEncOff <- alice `pqForContact` 2
PQEncOff <- bob `pqForContact` 2
-- if only one contact allows PQ, it's not enabled
alice ##> "/pq @bob on"
alice <## "bob: enable quantum resistant end-to-end encryption"
sendMany PQEncOff alice bob
PQEncOff <- alice `pqForContact` 2
PQEncOff <- bob `pqForContact` 2
-- both contacts have to allow PQ to enable it
bob ##> "/pq @alice on"
bob <## "alice: enable quantum resistant end-to-end encryption"
(alice, "1") \#> bob
(bob, "2") \#> alice
(alice, "3") \#> bob
(bob, "4") \#> alice
(alice, "5") +#> bob
PQEncOff <- alice `pqForContact` 2
PQEncOff <- bob `pqForContact` 2
(bob, "6") ++#> alice
-- equivalent to:
-- bob `send` "@alice 6"
-- bob <## "alice: quantum resistant end-to-end encryption enabled"
-- bob <# "@alice 6"
-- alice <## "bob: quantum resistant end-to-end encryption enabled"
-- alice <# "bob> 6"
PQEncOn <- alice `pqForContact` 2
alice #$> ("/_get chat @2 count=2", chat, [(0, e2eeInfoPQStr), (0, "6")])
PQEncOn <- bob `pqForContact` 2
bob #$> ("/_get chat @2 count=2", chat, [(1, e2eeInfoPQStr), (1, "6")])
(alice, "6") +#> bob
(bob, "7") +#> alice
sendMany PQEncOn alice bob
PQEncOn <- alice `pqForContact` 2
PQEncOn <- bob `pqForContact` 2
pure ()
sendMany :: PQEncryption -> TestCC -> TestCC -> IO ()
sendMany pqEnc alice bob =
forM_ [(1 :: Int) .. 10] $ \i -> do
sndRcv pqEnc False (alice, show i) bob
sndRcv pqEnc False (bob, show i) alice
testPQEnableContactCompression :: HasCallStack => FilePath -> IO ()
testPQEnableContactCompression =
testChat2 aliceProfile bobProfile $ \alice bob -> do
connectUsers alice bob
(alice, "hi") \#> bob
(bob, "hey") \#> alice
PQEncOff <- alice `pqForContact` 2
PQEncOff <- bob `pqForContact` 2
(alice, "lrg 1", v) \:#> (bob, v)
(bob, "lrg 2", v) \:#> (alice, v)
PQSupportOff <- alice `pqSupportForCt` 2
alice ##> "/pq @bob on"
alice <## "bob: enable quantum resistant end-to-end encryption"
PQSupportOn <- alice `pqSupportForCt` 2
(alice, "lrg 3", v) \:#> (bob, v)
(bob, "lrg 4", v) \:#> (alice, v)
PQSupportOff <- bob `pqSupportForCt` 2
bob ##> "/pq @alice on"
bob <## "alice: enable quantum resistant end-to-end encryption"
PQSupportOn <- bob `pqSupportForCt` 2
threadDelay 300000
(alice, "lrg 1", v) \:#> (bob, v')
threadDelay 300000
(bob, "lrg 2", v') \:#> (alice, v')
threadDelay 300000
(alice, "lrg 3", v') \:#> (bob, v')
threadDelay 300000
(bob, "lrg 4", v') \:#> (alice, v')
threadDelay 300000
(alice, "lrg 5", v') +:#> (bob, v')
PQEncOff <- alice `pqForContact` 2
PQEncOff <- bob `pqForContact` 2
(bob, "lrg 6", v') ++:#> (alice, v')
(alice, "lrg 7", v') +:#> (bob, v')
(bob, "lrg 8", v') +:#> (alice, v')
where
v = currentChatVersion
v' = pqEncryptionCompressionVersion
+36 -8
View File
@@ -9,7 +9,7 @@ import ChatTests.Utils
import Control.Concurrent (threadDelay)
import Control.Concurrent.Async (concurrently_)
import Control.Monad (void, when)
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as B
import Data.List (isInfixOf)
import qualified Data.Text as T
import Simplex.Chat.Controller (ChatConfig (..))
@@ -18,7 +18,6 @@ import Simplex.Chat.Store (agentStoreFile, chatStoreFile)
import Simplex.Chat.Types (VersionRangeChat)
import Simplex.Chat.Types.Shared (GroupMemberRole (..))
import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
import Simplex.Messaging.Crypto.Ratchet (pattern PQSupportOff)
import System.Directory (copyFile)
import System.FilePath ((</>))
import Test.Hspec hiding (it)
@@ -29,6 +28,7 @@ chatGroupTests = do
describe "add contacts, create group and send/receive messages" testGroupMatrix
it "v1: add contacts, create group and send/receive messages" testGroup
it "v1: add contacts, create group and send/receive messages, check messages" testGroupCheckMessages
it "send large message" testGroupLargeMessage
it "create group with incognito membership" testNewGroupIncognito
it "create and join group with 4 members" testGroup2
it "create and delete group" testGroupDelete
@@ -150,19 +150,19 @@ chatGroupTests = do
it "member was blocked before joining group" testBlockForAllBeforeJoining
it "can't repeat block, unblock" testBlockForAllCantRepeat
where
_0 = supportedChatVRange PQSupportOff -- don't create direct connections
_0 = supportedChatVRange -- don't create direct connections
_1 = groupCreateDirectVRange
-- having host configured with older version doesn't have effect in tests
-- because host uses current code and sends version in MemberInfo
testNoDirect vrMem2 vrMem3 noConns =
it
( "host "
<> vRangeStr (supportedChatVRange PQSupportOff)
<> vRangeStr supportedChatVRange
<> (", 2nd mem " <> vRangeStr vrMem2)
<> (", 3rd mem " <> vRangeStr vrMem3)
<> (if noConns then " : 2 <!!> 3" else " : 2 <##> 3")
)
$ testNoGroupDirectConns (supportedChatVRange PQSupportOff) vrMem2 vrMem3 noConns
$ testNoGroupDirectConns supportedChatVRange vrMem2 vrMem3 noConns
testGroup :: HasCallStack => FilePath -> IO ()
testGroup =
@@ -357,6 +357,20 @@ testGroupShared alice bob cath checkMessages directConnections = do
alice #$> ("/_unread chat #1 on", id, "ok")
alice #$> ("/_unread chat #1 off", id, "ok")
testGroupLargeMessage :: HasCallStack => FilePath -> IO ()
testGroupLargeMessage =
testChat2 aliceProfile bobProfile $
\alice bob -> do
createGroup2 "team" alice bob
img <- genProfileImg
let profileImage = "data:image/png;base64," <> B.unpack img
alice `send` ("/_group_profile #1 {\"displayName\": \"team\", \"fullName\": \"\", \"image\": \"" <> profileImage <> "\", \"groupPreferences\": {\"directMessages\": {\"enable\": \"on\"}, \"history\": {\"enable\": \"on\"}}}")
_trimmedCmd1 <- getTermLine alice
alice <## "profile image updated"
bob <## "alice updated group #team:"
bob <## "profile image updated"
testNewGroupIncognito :: HasCallStack => FilePath -> IO ()
testNewGroupIncognito =
testChatCfg2 testCfgGroupLinkViaContact aliceProfile bobProfile $
@@ -3594,9 +3608,9 @@ testConfigureGroupDeliveryReceipts tmp =
testNoGroupDirectConns :: HasCallStack => VersionRangeChat -> VersionRangeChat -> VersionRangeChat -> Bool -> FilePath -> IO ()
testNoGroupDirectConns hostVRange mem2VRange mem3VRange noDirectConns tmp =
withNewTestChatCfg tmp testCfg {chatVRange = const hostVRange} "alice" aliceProfile $ \alice -> do
withNewTestChatCfg tmp testCfg {chatVRange = const mem2VRange} "bob" bobProfile $ \bob -> do
withNewTestChatCfg tmp testCfg {chatVRange = const mem3VRange} "cath" cathProfile $ \cath -> do
withNewTestChatCfg tmp testCfg {chatVRange = hostVRange} "alice" aliceProfile $ \alice -> do
withNewTestChatCfg tmp testCfg {chatVRange = mem2VRange} "bob" bobProfile $ \bob -> do
withNewTestChatCfg tmp testCfg {chatVRange = mem3VRange} "cath" cathProfile $ \cath -> do
createGroup3 "team" alice bob cath
if noDirectConns
then contactsDontExist bob cath
@@ -3885,6 +3899,20 @@ testMemberContactMessage =
(bob <## "alice (Alice): contact is connected")
bob #$> ("/_get chat #1 count=1", chat, [(0, "started direct connection with you")])
-- exchanging messages will enable PQ (see Chat "TODO PQ" - perhaps connection should be negotiated with PQ on)
alice <##> bob
alice <##> bob
alice `send` "@bob hi"
alice <## "bob: quantum resistant end-to-end encryption enabled"
alice <# "@bob hi"
bob <## "alice: quantum resistant end-to-end encryption enabled"
bob <# "alice> hi"
bob #> "@alice hey"
alice <# "bob> hey"
alice <##> bob
-- bob and cath connect
+3 -1
View File
@@ -307,6 +307,7 @@ testProfileLink =
cc <## ("contact address: " <> cLink)
cc <## "you've shared main profile with this contact"
cc <## "connection not verified, use /code command to see security code"
cc <## "quantum resistant end-to-end encryption"
cc <## currentChatVRangeInfo
checkAliceNoProfileLink cc = do
cc ##> "/info alice"
@@ -315,6 +316,7 @@ testProfileLink =
cc <##. "sending messages via"
cc <## "you've shared main profile with this contact"
cc <## "connection not verified, use /code command to see security code"
cc <## "quantum resistant end-to-end encryption"
cc <## currentChatVRangeInfo
testUserContactLinkAutoAccept :: HasCallStack => FilePath -> IO ()
@@ -1516,7 +1518,7 @@ testSetContactPrefs = testChat2 aliceProfile bobProfile $
alice ##> "/_set prefs @2 {}"
alice <## "your preferences for bob did not change"
(bob </)
let startFeatures = [(0, e2eeInfoNoPQStr), (0, "Disappearing messages: allowed"), (0, "Full deletion: off"), (0, "Message reactions: enabled"), (0, "Voice messages: off"), (0, "Audio/video calls: enabled")]
let startFeatures = [(0, e2eeInfoPQStr), (0, "Disappearing messages: allowed"), (0, "Full deletion: off"), (0, "Message reactions: enabled"), (0, "Voice messages: off"), (0, "Audio/video calls: enabled")]
alice #$> ("/_get chat @2 count=100", chat, startFeatures)
bob #$> ("/_get chat @2 count=100", chat, startFeatures)
let sendVoice = "/_send @2 json {\"filePath\": \"test.txt\", \"msgContent\": {\"type\": \"voice\", \"text\": \"\", \"duration\": 10}}"
+11 -38
View File
@@ -87,15 +87,16 @@ ifCI xrun run d t = do
skip :: String -> SpecWith a -> SpecWith a
skip = before_ . pendingWith
versionTestMatrix2 :: (HasCallStack => TestCC -> TestCC -> IO ()) -> SpecWith FilePath
-- Bool is pqExpected - see testAddContact
versionTestMatrix2 :: (HasCallStack => Bool -> TestCC -> TestCC -> IO ()) -> SpecWith FilePath
versionTestMatrix2 runTest = do
it "current" $ testChat2 aliceProfile bobProfile runTest
it "prev" $ testChatCfg2 testCfgVPrev aliceProfile bobProfile runTest
it "prev to curr" $ runTestCfg2 testCfg testCfgVPrev runTest
it "curr to prev" $ runTestCfg2 testCfgVPrev testCfg runTest
it "old (1st supported)" $ testChatCfg2 testCfgV1 aliceProfile bobProfile runTest
it "old to curr" $ runTestCfg2 testCfg testCfgV1 runTest
it "curr to old" $ runTestCfg2 testCfgV1 testCfg runTest
it "current" $ testChat2 aliceProfile bobProfile (runTest True)
it "prev" $ testChatCfg2 testCfgVPrev aliceProfile bobProfile (runTest False)
it "prev to curr" $ runTestCfg2 testCfg testCfgVPrev (runTest False)
it "curr to prev" $ runTestCfg2 testCfgVPrev testCfg (runTest False)
it "old (1st supported)" $ testChatCfg2 testCfgV1 aliceProfile bobProfile (runTest False)
it "old to curr" $ runTestCfg2 testCfg testCfgV1 (runTest False)
it "curr to old" $ runTestCfg2 testCfgV1 testCfg (runTest False)
versionTestMatrix3 :: (HasCallStack => TestCC -> TestCC -> TestCC -> IO ()) -> SpecWith FilePath
versionTestMatrix3 runTest = do
@@ -119,34 +120,6 @@ runTestCfg3 aliceCfg bobCfg cathCfg runTest tmp =
withNewTestChatCfg tmp cathCfg "cath" cathProfile $ \cath ->
runTest alice bob cath
type PQEnabled = Bool
pqMatrix2 :: (HasCallStack => (TestCC, PQEnabled) -> (TestCC, PQEnabled) -> IO ()) -> SpecWith FilePath
pqMatrix2 runTest = do
it "PQ: off, off" $ test False False
it "PQ: on, off" $ test False True
it "PQ: off, on" $ test True False
it "PQ: on, on" $ test True True
where
test aPQ bPQ = testChat2 aliceProfile bobProfile $ \a b -> runTest (a, aPQ) (b, bPQ)
pqVersionTestMatrix2 :: (HasCallStack => TestCC -> TestCC -> Bool -> VersionChat -> IO ()) -> SpecWith FilePath
pqVersionTestMatrix2 runTest = do
it "current" $ testChat2 aliceProfile bobProfile (runTest' True pqEncryptionCompressionVersion)
it "prev" $ testChatCfg2 testCfgVPrev aliceProfile bobProfile (runTest' False (VersionChat 6))
it "prev to curr" $ runTestCfg2 testCfg testCfgVPrev (runTest' False (VersionChat 6))
it "curr to prev" $ runTestCfg2 testCfgVPrev testCfg (runTest' False (VersionChat 6))
it "old (1st supported)" $ testChatCfg2 testCfgV1 aliceProfile bobProfile (runTest' False (VersionChat 1))
it "old to curr" $ runTestCfg2 testCfg testCfgV1 (runTest' False (VersionChat 1))
it "curr to old" $ runTestCfg2 testCfgV1 testCfg (runTest' False (VersionChat 1))
it "next" $ testChatCfg2 testCfgVNext aliceProfile bobProfile (runTest' True pqEncryptionCompressionVersion)
it "next to curr" $ runTestCfg2 testCfg testCfgVNext (runTest' True pqEncryptionCompressionVersion)
it "curr to next" $ runTestCfg2 testCfgVNext testCfg (runTest' True pqEncryptionCompressionVersion)
it "next to prev" $ runTestCfg2 testCfgVPrev testCfgVNext (runTest' False (VersionChat 6))
it "prev to next" $ runTestCfg2 testCfgVNext testCfgVPrev (runTest' False (VersionChat 6))
where
runTest' pqExpected v a b = runTest a b pqExpected v
withTestChatGroup3Connected :: HasCallStack => FilePath -> String -> (HasCallStack => TestCC -> IO a) -> IO a
withTestChatGroup3Connected tmp dbPrefix action = do
withTestChat tmp dbPrefix $ \cc -> do
@@ -287,7 +260,7 @@ chatFeaturesF = map (\(a, _, c) -> (a, c)) chatFeatures''
chatFeatures'' :: [((Int, String), Maybe (Int, String), Maybe String)]
chatFeatures'' =
[ ((0, e2eeInfoNoPQStr), Nothing, Nothing),
[ ((0, e2eeInfoPQStr), Nothing, Nothing),
((0, "Disappearing messages: allowed"), Nothing, Nothing),
((0, "Full deletion: off"), Nothing, Nothing),
((0, "Message reactions: enabled"), Nothing, Nothing),
@@ -708,7 +681,7 @@ checkActionDeletesFile file action = do
currentChatVRangeInfo :: String
currentChatVRangeInfo =
"peer chat protocol version range: " <> vRangeStr (supportedChatVRange PQSupportOff)
"peer chat protocol version range: " <> vRangeStr supportedChatVRange
vRangeStr :: VersionRange v -> String
vRangeStr (VersionRange minVer maxVer) = "(" <> show minVer <> ", " <> show maxVer <> ")"
+9 -9
View File
@@ -50,7 +50,7 @@ testDhPubKey :: C.PublicKeyX448
testDhPubKey = "MEIwBQYDK2VvAzkAmKuSYeQ/m0SixPDS8Wq8VBaTS1cW+Lp0n0h4Diu+kUpR+qXx4SDJ32YGEFoGFGSbGPry5Ychr6U="
testE2ERatchetParams :: RcvE2ERatchetParamsUri 'C.X448
testE2ERatchetParams = E2ERatchetParamsUri (supportedE2EEncryptVRange PQSupportOn) testDhPubKey testDhPubKey Nothing
testE2ERatchetParams = E2ERatchetParamsUri supportedE2EEncryptVRange testDhPubKey testDhPubKey Nothing
testConnReq :: ConnectionRequestUri 'CMInvitation
testConnReq = CRInvitationUri connReqData testE2ERatchetParams
@@ -132,8 +132,8 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do
"{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}"
##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (MCSimple (extMsgContent (MCText "hello") Nothing)))
it "x.msg.new chat message with chat version range" $
"{\"v\":\"1-7\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}"
##==## ChatMessage (supportedChatVRange PQSupportOff) (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (MCSimple (extMsgContent (MCText "hello") Nothing)))
"{\"v\":\"1-8\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}"
##==## ChatMessage supportedChatVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (MCSimple (extMsgContent (MCText "hello") Nothing)))
it "x.msg.new quote" $
"{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello to you too\",\"type\":\"text\"},\"quote\":{\"content\":{\"text\":\"hello there!\",\"type\":\"text\"},\"msgRef\":{\"msgId\":\"BQYHCA==\",\"sent\":true,\"sentAt\":\"1970-01-01T00:00:01.000000001Z\"}}}}"
##==## ChatMessage
@@ -242,14 +242,14 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do
"{\"v\":\"1\",\"event\":\"x.grp.mem.new\",\"params\":{\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemNew MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Nothing, profile = testProfile}
it "x.grp.mem.new with member chat version range" $
"{\"v\":\"1\",\"event\":\"x.grp.mem.new\",\"params\":{\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"v\":\"1-7\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemNew MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Just $ ChatVersionRange $ supportedChatVRange PQSupportOff, profile = testProfile}
"{\"v\":\"1\",\"event\":\"x.grp.mem.new\",\"params\":{\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"v\":\"1-8\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemNew MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Just $ ChatVersionRange supportedChatVRange, profile = testProfile}
it "x.grp.mem.intro" $
"{\"v\":\"1\",\"event\":\"x.grp.mem.intro\",\"params\":{\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemIntro MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Nothing, profile = testProfile} Nothing
it "x.grp.mem.intro with member chat version range" $
"{\"v\":\"1\",\"event\":\"x.grp.mem.intro\",\"params\":{\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"v\":\"1-7\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemIntro MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Just $ ChatVersionRange $ supportedChatVRange PQSupportOff, profile = testProfile} Nothing
"{\"v\":\"1\",\"event\":\"x.grp.mem.intro\",\"params\":{\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"v\":\"1-8\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemIntro MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Just $ ChatVersionRange supportedChatVRange, profile = testProfile} Nothing
it "x.grp.mem.intro with member restrictions" $
"{\"v\":\"1\",\"event\":\"x.grp.mem.intro\",\"params\":{\"memberRestrictions\":{\"restriction\":\"blocked\"},\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemIntro MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Nothing, profile = testProfile} (Just MemberRestrictions {restriction = MRSBlocked})
@@ -263,8 +263,8 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do
"{\"v\":\"1\",\"event\":\"x.grp.mem.fwd\",\"params\":{\"memberIntro\":{\"directConnReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\",\"groupConnReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\"},\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemFwd MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Nothing, profile = testProfile} IntroInvitation {groupConnReq = testConnReq, directConnReq = Just testConnReq}
it "x.grp.mem.fwd with member chat version range and w/t directConnReq" $
"{\"v\":\"1\",\"event\":\"x.grp.mem.fwd\",\"params\":{\"memberIntro\":{\"groupConnReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\"},\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"v\":\"1-7\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemFwd MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Just $ ChatVersionRange $ supportedChatVRange PQSupportOff, profile = testProfile} IntroInvitation {groupConnReq = testConnReq, directConnReq = Nothing}
"{\"v\":\"1\",\"event\":\"x.grp.mem.fwd\",\"params\":{\"memberIntro\":{\"groupConnReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\"},\"memberInfo\":{\"memberRole\":\"admin\",\"memberId\":\"AQIDBA==\",\"v\":\"1-8\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}}"
#==# XGrpMemFwd MemberInfo {memberId = MemberId "\1\2\3\4", memberRole = GRAdmin, v = Just $ ChatVersionRange supportedChatVRange, profile = testProfile} IntroInvitation {groupConnReq = testConnReq, directConnReq = Nothing}
it "x.grp.mem.info" $
"{\"v\":\"1\",\"event\":\"x.grp.mem.info\",\"params\":{\"memberId\":\"AQIDBA==\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}"
#==# XGrpMemInfo (MemberId "\1\2\3\4") testProfile
+2 -1
View File
@@ -252,5 +252,6 @@
"hero-overlay-card-3-p-1": "<a href=\"https://www.trailofbits.com/about/\">Trail of Bits</a> هي شركة رائدة في مجال الاستشارات الأمنية والتكنولوجية، ومن بين عملائها شركات التكنولوجيا الكبرى والوكالات الحكومية ومشاريع blockchain الكبرى.",
"docs-dropdown-9": "التنزيلات",
"please-enable-javascript": "الرجاء تفعيل جافا سكريبت (JavaScript) لرؤية رمز QR.",
"please-use-link-in-mobile-app": "يُرجى استخدام الرابط في تطبيق الجوال"
"please-use-link-in-mobile-app": "يُرجى استخدام الرابط في تطبيق الجوال",
"docs-dropdown-10": "الشفافية"
}
+32 -1
View File
@@ -2,5 +2,36 @@
"developers": "Разработчици",
"glossary": "Речник",
"yes": "Да",
"no": "Не"
"no": "Не",
"home": "Дом",
"reference": "Справка",
"blog": "Блог",
"features": "Характеристика",
"why-simplex": "Защо SimpleX",
"simplex-privacy": "Поверителност на SimpleX",
"simplex-network": "SimpleX мрежа",
"simplex-explained-tab-1-text": "1. Какъв опит като потребител",
"simplex-explained-tab-2-text": "2. Как работи",
"simplex-explained-tab-3-text": "3. Какво виждат сървърите",
"simplex-explained-tab-1-p-1": "Можете да създавате контакти и групи и да провеждате двупосочни разговори, както във всеки друго чат приложение.",
"simplex-explained-tab-2-p-1": "За всяка връзка използвате две отделни опашки за съобщения, за да изпращате и получавате съобщения през различни сървъри.",
"simplex-explained": "Обяснението на SimpleX",
"simplex-explained-tab-2-p-2": "Сървърите предават съобщения само еднопосочно, без да имат картина от разговора или връзките на потребителя.",
"chat-bot-example": "Пример за чат бот",
"smp-protocol": "СМП Протокол",
"chat-protocol": "Чат протокол",
"donate": "Дарете",
"copyright-label": "© 2020-2023 SimpleX | Проект с отворен код",
"simplex-chat-protocol": "SimpleX Чат протокол",
"terminal-cli": "Системна конзола",
"terms-and-privacy-policy": "Условия и политика за поверителност",
"hero-header": "Предефинирана поверителност",
"hero-overlay-1-textlink": "Защо потребителските идентификатори са лоши за поверителността?",
"hero-overlay-2-textlink": "Как работи SimpleX?",
"hero-2-header": "Осъществяване на частна връзка",
"simplex-explained-tab-1-p-2": "Как може да работи с еднопосочни опашки и без идентификатори на потребителски профили?",
"simplex-explained-tab-3-p-2": "Потребителите могат допълнително да подобрят поверителността на метаданните, като използват Tor за достъп до сървъри, предотвратявайки корелация по IP адрес.",
"hero-2-header-desc": "Видеото показва как се свързвате с приятеля си чрез неговия еднократен QR-код лично или чрез видео връзка. Можете също да се свържете, като споделите покана за връзка.",
"hero-overlay-3-textlink": "Оценка на сигурността",
"hero-overlay-1-title": "Как работи SimpleX?"
}
+2 -1
View File
@@ -252,5 +252,6 @@
"hero-overlay-card-3-p-1": "<a href=\"https://www.trailofbits.com/about/\">Trail of Bits</a> ist eine führende Security- und Technologie-Unternehmensberatung, deren Kunden aus den Bereichen Big-Tech, Regierungsbehörden und großen Blockchain-Projekten stammen.",
"docs-dropdown-9": "Downloads",
"please-enable-javascript": "Bitte aktivieren Sie JavaScript, um den QR-Code zu sehen.",
"please-use-link-in-mobile-app": "Bitte nutzen Sie den Link in der Mobiltelefon-App"
"please-use-link-in-mobile-app": "Bitte nutzen Sie den Link in der Mobiltelefon-App",
"docs-dropdown-10": "Transparent"
}
+2 -1
View File
@@ -252,5 +252,6 @@
"hero-overlay-card-3-p-1": "<a href=\"https://www.trailofbits.com/about/\">Trail of Bits</a> es una consultora de seguridad y tecnología líder cuyos clientes incluyen grandes tecnológicas, agencias gubernamentales e importantes proyectos de blockchain.",
"docs-dropdown-9": "Descargas",
"please-enable-javascript": "Habilita JavaScript para ver el código QR.",
"please-use-link-in-mobile-app": "Usa el enlace en la apliación móvil,"
"please-use-link-in-mobile-app": "Usa el enlace en la apliación móvil,",
"docs-dropdown-10": "Transparencia"
}
+2 -1
View File
@@ -253,5 +253,6 @@
"hero-overlay-card-3-p-1": "<a href=\"https://www.trailofbits.com/about/\">Trail of Bits</a> est un cabinet leader dans le secteur de la sécurité et des technologies qui compte parmi ses clients des grandes entreprises de la tech, des agences gouvernementales et d'importants projets de blockchain.",
"docs-dropdown-9": "Téléchargements",
"please-enable-javascript": "Veuillez activer JavaScript pour voir le code QR.",
"please-use-link-in-mobile-app": "Veuillez utiliser le lien dans l'application mobile"
"please-use-link-in-mobile-app": "Veuillez utiliser le lien dans l'application mobile",
"docs-dropdown-10": "Transparence"
}
+2 -1
View File
@@ -252,5 +252,6 @@
"hero-overlay-card-3-p-1": "<a href=\"https://www.trailofbits.com/about/\">Trail of Bits</a> è leader nella consulenza di sicurezza e tecnologia, i cui clienti includono grandi aziende, agenzie governative e importanti progetti di blockchain.",
"docs-dropdown-9": "Download",
"please-enable-javascript": "Attiva JavaScript per vedere il codice QR.",
"please-use-link-in-mobile-app": "Usa il link nell'app mobile"
"please-use-link-in-mobile-app": "Usa il link nell'app mobile",
"docs-dropdown-10": "Trasparenza"
}
+2 -1
View File
@@ -252,5 +252,6 @@
"hero-overlay-card-3-p-2": "Trail of Bitsは2022年11月にSimpleXプラットフォームの暗号とネットワークのコンポーネントを検証しました。",
"docs-dropdown-9": "ダウンロード",
"please-enable-javascript": "QRコードを表示するためにJavaScriptを有効にしてください。",
"please-use-link-in-mobile-app": "このリンクをモバイルアプリで使用してください"
"please-use-link-in-mobile-app": "このリンクをモバイルアプリで使用してください",
"docs-dropdown-10": "透明性"
}
+2 -1
View File
@@ -252,5 +252,6 @@
"hero-overlay-card-3-p-1": "<a href=\"https://www.trailofbits.com/about/\">Trail of Bits</a> is een toonaangevend beveiligings- en technologieadviesbureau met klanten onder meer grote technologiebedrijven, overheidsinstanties en grote blockchain-projecten.",
"docs-dropdown-9": "Downloads",
"please-enable-javascript": "Schakel JavaScript in om de QR-code te zien.",
"please-use-link-in-mobile-app": "Gebruik de link in de mobiele app"
"please-use-link-in-mobile-app": "Gebruik de link in de mobiele app",
"docs-dropdown-10": "Transparantie"
}
+2 -1
View File
@@ -252,5 +252,6 @@
"f-droid-page-f-droid-org-repo-section-text": "Приложение SimpleX Chat от разработчиков и от репозитория F-Droid.org имеют разные ключи подписи. Если вы хотите сменить одно на другое, вам сначала нужно будет <a href='/docs/guide/chat-profiles.html#move-your-chat-profiles-to-another-device'>экспортировать</a> базу данных и только потом скачать другое приложение.",
"simplex-private-5-title": "Многоуровневое<br>Заполнения содержимого",
"please-use-link-in-mobile-app": "Пожалуйста, воспользуйтесь ссылкой в мобильном приложении",
"please-enable-javascript": "Пожалуйста, включите JavaScript, чтобы увидеть QR-код."
"please-enable-javascript": "Пожалуйста, включите JavaScript, чтобы увидеть QR-код.",
"docs-dropdown-10": "Прозрачность"
}
+2 -1
View File
@@ -252,5 +252,6 @@
"hero-overlay-card-3-p-1": "<a href=\"https://www.trailofbits.com/about/\">Trail of Bits</a> 是一家领先的安全和技术咨询企业,其客户包括大型科技公司、政府机构和重要的区块链项目。",
"docs-dropdown-9": "下载",
"please-use-link-in-mobile-app": "请使用移动应用程序中的链接",
"please-enable-javascript": "请启用 JavaScript 以查看二维码。"
"please-enable-javascript": "请启用 JavaScript 以查看二维码。",
"docs-dropdown-10": "透明度"
}