Compare commits

..

313 Commits

Author SHA1 Message Date
Evgeny Poberezkin 05cc300231 Merge tag 'v6.0.5' into stable-android 2024-10-09 08:28:29 +01:00
Evgeny Poberezkin 2f730d54e9 6.0.5: ios 239, android 241, desktop 68 2024-09-24 21:48:30 +01:00
Evgeny Poberezkin fe0013c4a9 ios: update core library 2024-09-24 17:51:34 +01:00
Stanislav Dmitrenko 5261886b31 android, desktop: proxy configuration includes credentials (#4892)
* android, desktop: proxy configuration includes credentials

* migration

* changes for disabled socks

* migration

* port

* new logic

* migration

* check validity of fields

* validity of host

* import changes proxy just in case

* send port always

* non-nullable

* Revert "send port always"

This reverts commit 14dd066d80.

* string

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-09-24 17:07:39 +01:00
Evgeny 93ab3076d4 ios: SOCKS proxy UI (#4893)
* ios: SOCKS proxy UI

* update network config

* proxy

* adapt

* move, dont default to localhost:9050

* move socks proxy to defaults

* sock proxy preference

* rename

* rename

* fix

* fix

---------

Co-authored-by: Avently <7953703+avently@users.noreply.github.com>
2024-09-24 17:06:00 +01:00
Stanislav Dmitrenko 3b88ddbd4f desktop: fix vlc dependency (2) (#4869) 2024-09-24 17:04:08 +01:00
Evgeny Poberezkin cd65e4dbb9 Merge branch 'stable' into stable-android 2024-09-24 12:42:55 +01:00
Evgeny Poberezkin d6dc35738e core: 6.0.5.0 (simplexmq 6.0.5.0) 2024-09-24 12:42:22 +01:00
Evgeny 5b3aba9db2 ci: dont build when files in core do not change (#4797) 2024-09-24 12:40:58 +01:00
Stanislav Dmitrenko 981cbb8bf9 android: target API level 34 (Android 14) (#4697) 2024-09-23 09:05:14 +01:00
Stanislav Dmitrenko 25fb099c44 android, desktop: fix always connecting state in call (#4911) 2024-09-19 18:00:08 +01:00
Evgeny 40e93cc61e core: reduce max message sizes (#4882)
* core: reduce max message sizes

* reduce

* comment
2024-09-16 18:05:09 +01:00
Evgeny c22d23750f core: support different SOCKS proxy authentication modes (#4886)
* core: support different SOCKS proxy authentication modes

* use defaultSocksProxyWithAuth

* hostMode CLI option

* simplexmq
2024-09-16 07:33:48 +01:00
Stanislav Dmitrenko 2539255957 android: remove Worker provider's interface implementation (#4874) 2024-09-13 12:35:12 +01:00
spaced4ndy 3ea8279451 multiplatform: fix delete messages alert (#4862) 2024-09-11 13:04:59 +01:00
Evgeny 0cb568d206 fix incorrect error of migration to device (#4852)
* fix incorrect error of migration to device

* alert to finish migration, ios fix

* simplexmq

* catching exception and stopping chat

* text

---------

Co-authored-by: Avently <7953703+avently@users.noreply.github.com>
2024-09-09 15:01:18 +01:00
Evgeny 351cfcbcbc core: allow deleting user when user record in agent database was deleted (#4851) 2024-09-08 23:01:31 +01:00
Henrique Albuquerque 691cd489ea blog: fix grammar error (#4846) 2024-09-08 12:56:15 +01:00
Stanislav Dmitrenko bccbb9900f android: fix initializing WorkManager (#4833) 2024-09-06 12:39:23 +01:00
Diogo e002f33c53 multiplatform: fix deleted contacts with conversations being identified as contact cards (#4828)
* multiplatform: fix deleted contacts with conversations being identified as contact cards

* fix in ios

* Revert "fix in ios"

This reverts commit 9b8c6bc125.

* fix for ios

* same check as ios for android and desktop
2024-09-04 18:12:41 +01:00
Stanislav Dmitrenko 6407d5de63 android, desktop: making list items unique (#4812) 2024-09-03 14:38:42 +01:00
Stanislav Dmitrenko 9cba96082d android, desktop: fix crash when window is small in chat view (#4819) 2024-09-03 14:37:04 +01:00
Stanislav Dmitrenko 2089fd8539 android, desktop: remove slash from strings (#4818) 2024-09-03 14:36:41 +01:00
Stanislav Dmitrenko 31c4ff2705 android, desktop: group info remembers scroll position and search (#4817) 2024-09-03 14:36:01 +01:00
sh fe20a43232 flatpak: update metainfo (#4811) 2024-09-02 15:15:16 +01:00
Stanislav Dmitrenko 087519c39d desktop: fix vlc dependency (#4809) 2024-09-02 13:08:09 +01:00
Evgeny fff29f8548 faq: private message routing (#4807)
* faq: private message routing

* readme

* corrections
2024-08-31 11:41:21 +01:00
Evgeny 8cc03b6c21 docs: FAQ on deletion of sent messages and read receipts (#4470)
* docs: FAQ on deletion of sent messages and read receipts

* update
2024-08-31 11:41:06 +01:00
Evgeny Poberezkin f5d5bd62ed Merge branch 'stable' into stable-android 2024-08-30 20:00:44 +01:00
Evgeny Poberezkin 6adf8f29b0 6.0.4: ios 236, android 237, desktop 65 2024-08-30 19:59:40 +01:00
Stanislav Dmitrenko 4ca1b57e1b android, desktop: small enhancements to new chat sheet (#4803)
* android, desktop: small enhancements to new chat sheet

* padding

* normal view matching stable

* fix one hand layout

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Diogo <diogofncunha@gmail.com>
2024-08-30 18:34:53 +01:00
Evgeny Poberezkin 9432a5e5cd ios: update core library 2024-08-30 17:09:49 +01:00
Evgeny Poberezkin d2f9888195 Merge branch 'stable' into stable-android 2024-08-30 13:40:03 +01:00
Evgeny Poberezkin a9ec1f9ec1 core: 6.0.4.0 (simplexmq 6.0.3.0) 2024-08-30 13:39:35 +01:00
Stanislav Dmitrenko 122387d180 android, desktop: fix loading chat items when search was not empty (#4802) 2024-08-30 11:11:26 +01:00
Stanislav Dmitrenko 6edea46dad android, desktop: improvement to a lock UI (#4769)
* android, desktop: improvement to a lock UI

* oneTime passcode screen which allows to pass verification while in call

* change

* unused line

* don't ask to set up auth if already has

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-29 13:15:11 +01:00
Diogo 2fe3acf4df fix android simulator build (#4795) 2024-08-29 12:01:29 +01:00
Stanislav Dmitrenko dfe16991d0 ios: make CallKit calls fire in time after cold start (#4787)
* ios: make CallKit calls fire in time after cold start

* longer wait period

* uncomment

* change

* change

* removed commented code

* ios: update core library

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-28 15:49:11 +01:00
Stanislav Dmitrenko acb372a4ce core: call uuid (#4777)
* core: call uuid

* fix

* text

* android, desktop

* ios

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-28 15:31:02 +01:00
sh 121eaf6073 flatpak: update metainfo (#4784)
* flatpak: update metainfo

* flatpak: change release link and ol to ul
2024-08-28 10:39:28 +01:00
Stanislav Dmitrenko 76cb9013f5 desktop: show only AppImage download option for those who running AppImage (#4774) 2024-08-27 11:21:00 +01:00
Stanislav Dmitrenko f1e8c65aa1 android, desktop: using SemVer when checking for updates (#4768)
* android, desktop: using SemVer when checking for updates

* simplify

* simplify

* no comment

* simplify

* change

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-26 21:06:21 +01:00
Stanislav Dmitrenko 0118e64ab4 android, desktop: items padding and min height (#4767) 2024-08-26 16:59:57 +01:00
Evgeny 4552860345 ios: remove unnecessary protocols (#4763) 2024-08-25 14:33:06 +01:00
Evgeny 4d18174b11 ui: fix Debug delivery (#4757) 2024-08-24 19:10:30 +01:00
Evgeny Poberezkin 5ec5826642 Merge branch 'stable' into stable-android 2024-08-24 16:49:03 +01:00
Evgeny Poberezkin defd095a4f 6.0.3: ios 235, android 235, desktop 64 2024-08-24 16:32:32 +01:00
Evgeny Poberezkin ed60f28e56 ios: update core library 2024-08-24 15:44:08 +01:00
Evgeny Poberezkin 29155ab73a Merge branch 'stable' into stable-android 2024-08-24 15:10:05 +01:00
Evgeny Poberezkin f0b889ffcf core: 6.0.3.0 (simplexmq 6.0.2.0) 2024-08-24 15:07:32 +01:00
Evgeny Poberezkin a95415fa1a 6.0.2: ios 234, android 234, desktop 63 2024-08-22 12:22:28 +01:00
Evgeny 8d48c4b14c ui: translations (#4740)
* Translated using Weblate (Italian)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 64.6% (1314 of 2032 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 62.8% (1121 of 1785 strings)

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

* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 33.5% (682 of 2032 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 81.6% (1659 of 2032 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 81.6% (1659 of 2032 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 62.8% (1121 of 1785 strings)

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

* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 49.6% (887 of 1785 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (2031 of 2032 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% (1785 of 1785 strings)

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

* Translated using Weblate (Indonesian)

Currently translated at 5.3% (108 of 2032 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 34.2% (696 of 2032 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 85.4% (1736 of 2032 strings)

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

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Chinese (Traditional))

Currently translated at 86.8% (1764 of 2032 strings)

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

* Translated using Weblate (Czech)

Currently translated at 88.6% (1801 of 2032 strings)

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

* Translated using Weblate (Indonesian)

Currently translated at 5.8% (118 of 2032 strings)

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

* 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 (Vietnamese)

Currently translated at 34.4% (701 of 2032 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 34.9% (710 of 2032 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% (2032 of 2032 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% (1785 of 1785 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 35.6% (725 of 2032 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% (2032 of 2032 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% (1785 of 1785 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% (2032 of 2032 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% (1785 of 1785 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% (2032 of 2032 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% (1785 of 1785 strings)

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

* process localizations

* ru

* ru export

* hu

---------

Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: kumo <cloud_029@icloud.com>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: tuananh-ng <158744840+tuananh-ng@users.noreply.github.com>
Co-authored-by: Jiaa <jorden2895@gmail.com>
Co-authored-by: axmfs <axmfs@proton.me>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: billy appetie <billy_appetie@users.noreply.hosted.weblate.org>
Co-authored-by: Max <Prototypem95@users.noreply.hosted.weblate.org>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
2024-08-22 11:40:54 +01:00
Stanislav Dmitrenko 9f44242e4c ios: fix applying theme when no global theme edited yet (#4738)
* ios: fix applying theme when no global theme editer yet

* base color

* added check for base

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-22 08:34:17 +01:00
Evgeny Poberezkin 7e7d93c596 ios: update library 2024-08-21 22:43:24 +01:00
Stanislav Dmitrenko 073818db55 android, desktop: fix applying theme when no global theme edited yet (#4735) 2024-08-21 22:05:50 +01:00
Stanislav Dmitrenko 519dd9e219 android, desktop: fix onboarding layout (#4734) 2024-08-21 22:03:49 +01:00
Evgeny Poberezkin 94218a1a7e core: 6.0.2.0 (simplexmq 6.0.1.0) 2024-08-21 19:20:20 +01:00
Arturs Krumins 996c6efddd ios: prevent hangs when opening app from background with async api calls (#4730)
* ios: async api calls on entering foreground

* rename

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-21 19:16:57 +01:00
Arturs Krumins fd9c080103 ios: fix last message being hidden on load (#4733) 2024-08-21 17:04:12 +01:00
Stanislav Dmitrenko 5cb8badb22 android, desktop: layout changes for settings items (#4732)
* android, desktop: layout changes for settings items

* section paddings

* toggle

* padding and border

* padding

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-21 16:46:42 +01:00
Arturs Krumins 0438f35539 ios: fix notifying the recipient when hanging up a call in ios15 (#4731)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-21 15:05:59 +01:00
Diogo d5eb7b7811 core: api to change user of pending connections (#4681)
* core: add api that enables change of owner user id for pending connections

* old user sends request, incognito handling and coverage

* call agent inside set connection api

* only set user id if servers match

* simplify

* reduce test noise

* return invitation when a newone is created

* add test for profile on different server

* refactor namings

* update simplexmq

* refactor

* test improvements and simplify

* remove fdescribes

* simplify and reduce vars scope

* put if back

* refactor, change error

* refactor view

* refactor

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2024-08-21 13:27:58 +04:00
Evgeny Poberezkin e04f74738e Revert "ios: asynchronous api calls when entering foreground (#4710)"
This reverts commit b52dfee078.
2024-08-20 18:24:53 +01:00
Stanislav Dmitrenko 5f0ccb9f17 ios: fix interface color without callKit (#4727)
* ios: fix interface color without callKit

* call area

* better hiding sheet when making a call without CallKit

* invert condition
2024-08-20 17:04:00 +01:00
Arturs Krumins b2d18f6960 ios: fix visual artifacts when opening a chat on iOS15 (#4726)
* ios: fix visual artifacts when opening a chat on iOS15

* fix separators

* cleanup
2024-08-20 13:54:52 +01:00
Arturs Krumins b52dfee078 ios: asynchronous api calls when entering foreground (#4710)
* ios: get call invitations asynchronously

* async update chats

* async user list on appear

* move model changes to main thread

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-20 11:28:06 +01:00
Evgeny 70991debfd ios: optimize performance of updating chats (#4723)
* ios: optimize performance of updating chats

* even simpler

* always use updateChats

* make chats readonly from outside of model
2024-08-20 09:29:52 +01:00
Stanislav Dmitrenko 885aa9cfa5 android, desktop: scrolling moves title to app bar (#4703)
* android, desktop: scrolling moves title to app bar

* one place should be without padding

* scroll related changes for both platforms

* adapt code to universal ColumnWithScrollBar

* show in center

* small adjustments

* new chat sheet fix

* divider + mix background color for desktop

* coerce

* different transition

* desktop title starts from left

* host starts from left too

* different coefficient

* settings title
2024-08-19 19:43:54 +01:00
Evgeny 75a468434c core: only start message delivery workers when there are pending messages (#4713)
* core: use threads instead of async (reduce memory)

* simplexmq

* core: only start message delivery workers when there are pending messages (#4714)

* core: only start message delivery workers when there are pending messages

* update tls

* simplexmq

* update ios, simplexmq

* simplexmq
2024-08-18 23:00:34 +01:00
Arturs Krumins 3b98032371 ios: filter agent subscriptions from chat console (#4708) 2024-08-17 15:52:35 +01:00
Arturs Krumins 3a0921c093 ios: asychronous subscription updates (#4707)
* ios: asychronous subscription updates

* cleanup
2024-08-17 13:26:56 +01:00
Evgeny 3740805125 core: batch connection subscription transactions (#4701)
* core: batch connection subscription transactions

* simplexmq
2024-08-16 11:55:22 +01:00
Arturs Krumins b0e0b0beb8 remove text slection context menu from chat item (#4699) 2024-08-15 20:08:51 +01:00
Arturs Krumins c823a4fa6c extend chat view material behind keyboard (#4698)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-15 18:43:30 +01:00
Arturs Krumins 3c694e2841 upgrade code scanner (#4650)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-15 18:21:22 +01:00
Arturs Krumins c159c2ede3 ios: fix pending connection sheet styling when opened via icon; fix tappable area of pending connections and contact requests (#4694)
* fix new contact sheet styling

* fix contact request tappable area

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2024-08-15 14:15:24 +04:00
spaced4ndy 1d0d7bbd01 core: batch send file descriptions (#4684)
* core: batch send file descriptions

* fix useMember

* fix result interpretation

* remove comment

* refactor

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-15 13:43:57 +04:00
Evgeny Poberezkin 82c4d77c73 6.0.1: ios 233, android 232, desktop 62 2024-08-14 23:10:06 +01:00
Evgeny 25938af62f ui: translations (#4654)
* Translated using Weblate (Dutch)

Currently translated at 100.0% (2030 of 2030 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 28.5% (580 of 2030 strings)

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

* Translated using Weblate (Indonesian)

Currently translated at 5.2% (106 of 2030 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (2030 of 2030 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 28.5% (580 of 2030 strings)

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

* Translated using Weblate (Indonesian)

Currently translated at 5.2% (106 of 2030 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2030 of 2030 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% (1785 of 1785 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 29.3% (595 of 2030 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% (2030 of 2030 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% (1785 of 1785 strings)

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

* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Vietnamese)

Currently translated at 29.9% (607 of 2030 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 30.5% (621 of 2030 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% (2032 of 2032 strings)

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

* Translated using Weblate (French)

Currently translated at 97.4% (1981 of 2032 strings)

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

* Translated using Weblate (French)

Currently translated at 97.8% (1989 of 2032 strings)

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

* Translated using Weblate (French)

Currently translated at 98.7% (2007 of 2032 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2032 of 2032 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 31.3% (638 of 2032 strings)

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

* Translated using Weblate (Indonesian)

Currently translated at 5.2% (107 of 2032 strings)

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

* process localizations

* update ru

---------

Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: tuananh-ng <158744840+tuananh-ng@users.noreply.github.com>
Co-authored-by: billy appetie <billy_appetie@users.noreply.hosted.weblate.org>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
2024-08-14 21:12:50 +01:00
Evgeny edfcced1fa website: translation (#4692)
* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (257 of 257 strings)

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

* space

---------

Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
2024-08-14 21:01:28 +01:00
Evgeny Poberezkin 5bff5a855e core: 6.0.1.0 2024-08-14 20:30:11 +01:00
Arturs Krumins 46a60d979b ios: fix messages reseting position, when app is brought from background to foreground (#4686)
* ios: fix messages reseting position, when app is brought back to foreground

* minor
2024-08-14 20:14:40 +01:00
Arturs Krumins f6ef57534f ios: add text to share extension link preview (#4683)
* ios: add text to share extension link preview

* remove maxHeight contraint
2024-08-14 19:29:13 +01:00
Stanislav Dmitrenko 1e4479f736 android, desktop: fix loading more items when fast switching chats (#4685)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-14 19:08:08 +01:00
Stanislav Dmitrenko 789c762c81 android: hide keyboard when not needed (#4689)
* android: hide keyboard when not needed

* revert some parts

* more places

* unused

* delay

* comment
2024-08-14 18:59:53 +01:00
Evgeny e9baeba31f blog: v6 announcement (#4598)
* blog: v6 announcement

* update
2024-08-14 14:10:14 +01:00
Arturs Krumins 2d5bbcdd61 ios: fix merged item order (#4682) 2024-08-14 07:59:58 +01:00
Arturs Krumins c3f67aff69 ios: speed up network status handling (#4678)
* move network status into a separate model

* reduce network model observation scope (#4679)

* dont pass chat

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-13 21:08:04 +01:00
Arturs Krumins 7cb3a499b2 ios: optimise chat switching (#4663)
* ios: shooth chat switching

* debug button

* navigation timeout

* fix scroll crash

* fix merge

* whitespace

* wip

* add spinner; extract load and nav logic

* cleanup

* direct chat button

* cleanup

* showLoadingProgress

* reverse rename

* rename

* spinner layout

* move all programmatic navigation to `openLoadChat`

* remove access restriction

* fix scroll on item added regression

* print

* fix page load regression

* fix member sheet disappearing

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-13 19:37:48 +01:00
Stanislav Dmitrenko 32e7fd72d3 android, desktop: searching in different screens using the same data (#4673)
* android, desktop: searching in different screens using the same data

* don't filter if not needed
2024-08-13 19:15:54 +01:00
Stanislav Dmitrenko 915bbed400 android, desktop: fix chatView state propagation (#4676) 2024-08-13 19:11:04 +01:00
Stanislav Dmitrenko 2ae5a8bffd android, desktop: padding for RTL layout and remembering prefered layout (#4675)
* android, desktop: padding for RTL layout and remembering prefered layout

* refactor

* changes
2024-08-13 19:07:03 +01:00
Stanislav Dmitrenko cd1550a14d android, desktop: fix crash on marking chat read (#4671) 2024-08-13 18:56:47 +01:00
Stanislav Dmitrenko c72c461306 android: replacing a crash with an alert when opening broken Uri (#4674)
* android: replacing a crash with an alert when opening broken Uri

* strings

---------

Co-authored-by: Evgeny <evgeny@poberezkin.com>
2024-08-13 18:42:33 +01:00
spaced4ndy 38fa4c231f ui: improve remote controller stop reason (#4670) 2024-08-13 15:05:13 +04:00
spaced4ndy cb683d0706 ui: disable subs indicator when chat is stopped (#4672) 2024-08-13 13:14:27 +04:00
Diogo 84ae39b012 android: fix group creation chat redirection showing attachments view (#4669) 2024-08-13 12:18:06 +04:00
Stanislav Dmitrenko 6a12f2dec8 ios: fix updating chat wallpaper while app is in background (#4661) 2024-08-12 21:57:04 +01:00
Diogo d1f704d160 multiplatform: mark chat non deleted only on send/receive (keep chatDeleted flag on open) (#4664) 2024-08-12 19:50:36 +04:00
Diogo 9871ebb3b1 ios: mark chat non deleted only on send/receive (keep chatDeleted flag on open) (#4659)
* ios: navigation to delete chat working for group members

* modify

* Revert "modify"

This reverts commit fc811bbb84.

* don't mark non deleted on open, mark on send

* simplify

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2024-08-12 18:49:34 +04:00
Evgeny 02c404593c cli: do not log events for hidden user profiles (#4658)
* cli: do not log events for hidden user profiles

* fix
2024-08-12 08:45:11 +01:00
sh 1d9c5b7a0b flatpak: update metainfo (#4660) 2024-08-12 11:42:48 +04:00
Evgeny Poberezkin e20a4e54c3 6.0: ios 232, android 230, desktop 61 2024-08-11 14:31:00 +01:00
Stanislav Dmitrenko 1f8c69ec23 ios: fix applying chat theme (#4656) 2024-08-11 13:11:11 +01:00
Arturs Krumins 35c37263b8 ios: fix group replaced in the list of chats with direct chat (#4655)
* add viewbuilder

* fix

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-11 12:06:25 +01:00
Arturs Krumins 9b70599cc5 ios: scroll chat list to bottom, when items are added (#4651)
* scroll chat list to bottom

* simpler

* is really near bottom

* reduce thresholds

* comment

* itemAdded

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-11 10:07:45 +01:00
Evgeny a4a11f99d2 ios: fix switching to another chat prevents marking items as unread (#4652) 2024-08-11 07:18:01 +01:00
Evgeny Poberezkin 7c8955fcdb ios: core library 6.0.0.7 2024-08-10 22:49:47 +01:00
Arturs Krumins f922064f5c iOS: fix chat list temporarily navigating to an empty view (#4647)
* add two way binding for chatList navigation

* style

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-10 22:23:56 +01:00
Evgeny 110839627f ios: new message sheet detents (#4639)
* ios: new message sheet detents

* animation

* use isActive

* fix sheet rendering

* minor

* increase onTap area

* cleanup

* cleanup

* refactor, dont allow reducing sheet once opened

---------

Co-authored-by: Levitating Pineapple <noreply@levitatingpineapple.com>
2024-08-10 22:18:49 +01:00
Evgeny Poberezkin c90b71120f core: 6.0.0.7 2024-08-10 21:53:21 +01:00
Evgeny 3ec029e489 core: fix auto-reply to the previous version clients (#4649)
* core: fix auto-reply to the previous version clients

* add condition, refactor
2024-08-10 21:52:21 +01:00
Evgeny f4c799aced ui: translations (#4648)
* Translated using Weblate (German)

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

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (2030 of 2030 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (2030 of 2030 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2030 of 2030 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% (1785 of 1785 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 28.0% (569 of 2030 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% (2030 of 2030 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% (1785 of 1785 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1785 of 1785 strings)

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

* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Chinese (Simplified))

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

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2030 of 2030 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (2030 of 2030 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (1785 of 1785 strings)

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

* process localizations, update RU

* remove quotes

---------

Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: tuananh-ng <158744840+tuananh-ng@users.noreply.github.com>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
2024-08-10 15:51:29 +01:00
Evgeny d970470702 ui: fix throttled chat ordering (#4645)
* ios: fix throttled chat ordering

* optimize

* account for added chats

* revert kotlin change

* dont pop chat that is already on top, unify with addChat

* android, desktop: fix chat ordering

* update

* clear

* fix ios

* refactor sorting
2024-08-10 14:04:37 +01:00
Evgeny Poberezkin 9ee74bd36e core: 6.0.0.6 (simplexmq 6.0.0.8) 2024-08-09 23:16:39 +01:00
Evgeny 0a4ff2e35f core: reduce usage of STM transactions for better performance and memory usage (#4636)
* core: reduce usage of STM transactions for better performance and memory usage

* simplexmq

* fix test crash

* enable all tests

* simplexmq
2024-08-09 22:30:30 +01:00
Stanislav Dmitrenko a3550df893 android, desktop: small layout changes (#4643)
* android, desktop: small layout changes

* padding

* blue theme handling

* themedBackground on onboarding

* status bar in call

* disabled elevation on attachments sheet to prevent seeing shadow from the bottom

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-08-09 21:51:40 +01:00
Evgeny Poberezkin 3778698a6e ios: set default toolbar opacity to regular, show dropdown 2024-08-09 17:26:57 +01:00
Arturs Krumins cf7a16e857 ios: translucent bars in chat view (#4641)
* extend reverse list; disable clipping

* wallpaper - ignore safe area

* minor

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2024-08-09 17:23:57 +01:00
Evgeny bef1597fa1 ui: fix when moderation for multiple items is enabled (#4642)
* ios: fix when moderation for multiple items is enabled

* same on Android

* same

---------

Co-authored-by: Avently <7953703+avently@users.noreply.github.com>
2024-08-09 19:56:19 +04:00
spaced4ndy f06118835d android: don't show local authentication notice on first start (#4640) 2024-08-09 18:29:14 +04:00
Evgeny Poberezkin fa9e50a904 desktop: correct ru translation 2024-08-09 13:28:39 +01:00
Evgeny Poberezkin 932a65630c desktop, android: remove duplicate localization string 2024-08-09 13:17:14 +01:00
Evgeny b649b64999 ui: translations (#4638)
* Translated using Weblate (German)

Currently translated at 97.8% (1986 of 2029 strings)

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

* Translated using Weblate (Russian)

Currently translated at 99.2% (2014 of 2029 strings)

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

* Translated using Weblate (French)

Currently translated at 97.4% (1978 of 2029 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 99.1% (2012 of 2029 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 99.1% (2012 of 2029 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 59.0% (1198 of 2029 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 99.0% (2010 of 2029 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 99.1% (2012 of 2029 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 88.6% (1799 of 2029 strings)

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

* Translated using Weblate (Czech)

Currently translated at 88.7% (1801 of 2029 strings)

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

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 79.7% (1618 of 2029 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 99.0% (2009 of 2029 strings)

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

* Translated using Weblate (Ukrainian)

Currently translated at 89.1% (1809 of 2029 strings)

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

* Translated using Weblate (Lithuanian)

Currently translated at 86.0% (1745 of 2029 strings)

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

* Translated using Weblate (Finnish)

Currently translated at 72.6% (1474 of 2029 strings)

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

* Translated using Weblate (Korean)

Currently translated at 45.7% (929 of 2029 strings)

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

* Translated using Weblate (Polish)

Currently translated at 95.7% (1943 of 2029 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 45.5% (925 of 2029 strings)

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

* Translated using Weblate (Hebrew)

Currently translated at 92.8% (1883 of 2029 strings)

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

* Translated using Weblate (Thai)

Currently translated at 63.7% (1293 of 2029 strings)

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

* Translated using Weblate (Bulgarian)

Currently translated at 85.0% (1726 of 2029 strings)

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

* Translated using Weblate (Turkish)

Currently translated at 89.1% (1809 of 2029 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 99.1% (2012 of 2029 strings)

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

* Translated using Weblate (Persian)

Currently translated at 89.7% (1821 of 2029 strings)

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

* Translated using Weblate (Romanian)

Currently translated at 33.0% (670 of 2029 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 27.4% (556 of 2029 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 99.2% (2013 of 2029 strings)

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

* Translated using Weblate (Hungarian)

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

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1786 of 1786 strings)

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

* Translated using Weblate (Chinese (Simplified))

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

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (2029 of 2029 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 99.7% (1781 of 1786 strings)

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

* Translated using Weblate (Hungarian)

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

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

* process localizations

* ru: translate New message

---------

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
2024-08-09 13:07:19 +01:00
Evgeny e94ead3a4f ui: rename sheet to "New message" (#4637)
* ui: rename sheet to "New message"

* export localizations
2024-08-09 12:40:39 +01:00
spaced4ndy 42d7c20a47 ios: fix appSheet screen protection for ios 16 (#4635)
* ios: fix app sheet screen protection for ios 16

* comment
2024-08-09 11:43:42 +01:00
Evgeny Poberezkin 31782600cb Merge branch 'stable' into stable-android 2024-06-01 09:28:13 +01:00
Evgeny Poberezkin db392037ea Merge branch 'stable' into stable-android 2024-05-31 23:35:46 +01:00
Evgeny Poberezkin 6ad7189c53 Merge branch 'stable' into stable-android 2024-05-25 17:17:18 +01:00
Evgeny Poberezkin 15d8444c74 Merge branch 'stable' into stable-android 2024-05-25 11:19:14 +01:00
Evgeny Poberezkin 2d31b853ac Merge branch 'stable' into stable-android 2024-05-22 20:30:46 +01:00
Evgeny Poberezkin 3af0108b0d Merge branch 'stable' into stable-android 2024-04-13 11:59:14 +01:00
Evgeny Poberezkin 746dd33728 Merge branch 'stable' into stable-android 2024-03-22 21:21:10 +00:00
Evgeny Poberezkin 2fceecab37 Merge branch 'stable' into stable-android 2024-03-04 21:38:09 +00:00
Evgeny Poberezkin e094ec5cf5 Merge branch 'stable' into stable-android 2024-02-27 07:19:21 +00:00
Evgeny Poberezkin fbd6012611 Merge branch 'stable' into stable-android 2024-02-21 19:06:13 +00:00
Evgeny Poberezkin 913ce4ebfd Merge branch 'stable' into stable-android 2024-02-21 14:30:35 +00:00
Evgeny Poberezkin 1e01a961fe Merge branch 'stable' into stable-android 2024-02-21 08:43:40 +00:00
Evgeny Poberezkin 27f4a71146 Merge branch 'stable' into stable-android 2024-02-10 23:35:40 +00:00
Evgeny Poberezkin 282bca4d81 Merge branch 'stable' into stable-android 2024-02-03 18:45:28 +00:00
Evgeny Poberezkin e5011ad150 Merge branch 'stable' into stable-android 2024-01-31 09:47:35 +00:00
Evgeny Poberezkin 0d4d08e52b core: unify dependencies for GHC 8.10.7 and 9.6.3 (#3774) 2024-01-30 23:18:37 +00:00
Evgeny Poberezkin 7f8c7b2d99 fix merge 2024-01-24 22:46:56 +00:00
Evgeny Poberezkin f5b666ae6d Merge branch 'stable' into stable-android 2024-01-24 22:42:04 +00:00
Evgeny Poberezkin 1cfe51af45 Merge branch 'stable' into stable-android 2024-01-18 20:58:52 +00:00
Evgeny Poberezkin 68af58bda1 Merge branch 'stable' into stable-android 2024-01-10 12:17:06 +00:00
Evgeny Poberezkin f51796b81c Merge branch 'stable' into stable-android 2024-01-09 20:20:37 +00:00
Evgeny Poberezkin 995618cf1c Merge branch 'stable' into stable-android 2024-01-09 10:40:34 +00:00
Evgeny Poberezkin 68baa18af8 Merge branch 'stable' into stable-android 2024-01-06 11:48:49 +00:00
Evgeny Poberezkin a4f1c9c915 Merge branch 'stable' into stable-android 2023-12-30 10:21:07 +00:00
Evgeny Poberezkin b8141c3555 Merge branch 'master-android' into stable-android 2023-12-28 09:18:12 +00:00
Evgeny Poberezkin 47214e33ea Merge branch 'master-ghc8107' into master-android 2023-12-27 21:02:49 +00:00
Evgeny Poberezkin ff239d81e5 Merge branch 'master' into master-ghc8107 2023-12-27 21:02:11 +00:00
Evgeny Poberezkin 0a6e47dd61 Merge branch 'master' into master-ghc8107 2023-12-27 20:57:25 +00:00
Evgeny Poberezkin ee75219ed3 core: 5.4.2.1 (simplexmq 5.5.0.2) 2023-12-27 20:57:05 +00:00
Evgeny Poberezkin 2e337a753f Merge branch 'master-ghc8107' into master-android 2023-12-27 14:09:42 +00:00
Evgeny Poberezkin 9918d91def Merge branch 'master' into master-ghc8107 2023-12-27 14:09:23 +00:00
Evgeny Poberezkin 82dd5751c1 Merge branch 'master-ghc8107' into master-android 2023-12-26 21:27:06 +00:00
Evgeny Poberezkin de637fab50 Merge branch 'master' into master-ghc8107 2023-12-26 21:12:36 +00:00
Evgeny Poberezkin cb49f6f01d Merge branch 'master-ghc8107' into master-android 2023-12-23 19:57:27 +00:00
Evgeny Poberezkin 6d0a83aa58 Merge branch 'master' into master-ghc8107 2023-12-23 19:57:08 +00:00
Evgeny Poberezkin 05f57e98ad Merge branch 'master-ghc8107' into master-android 2023-12-23 17:25:14 +00:00
Evgeny Poberezkin 6a66525927 Merge branch 'master' into master-ghc8107 2023-12-23 17:24:47 +00:00
Evgeny Poberezkin 9530a6055a Merge branch 'master-ghc8107' into master-android 2023-12-23 15:12:49 +00:00
Evgeny Poberezkin f5ed8debcc Merge branch 'master' into master-ghc8107 2023-12-23 15:11:38 +00:00
Evgeny Poberezkin 355d2449c5 fix for GHC 8.10.7 2023-12-23 15:05:36 +00:00
Evgeny Poberezkin f7382cdd6f Merge branch 'master' into master-ghc8107 2023-12-23 13:52:44 +00:00
Evgeny Poberezkin dc8d10d068 core: limit process package version to 1.6.17 2023-12-21 10:54:54 +00:00
Evgeny Poberezkin 951245d33f Merge branch 'master-ghc8107' into master-android 2023-12-21 10:00:28 +00:00
Evgeny Poberezkin 521b901cc9 Merge branch 'master' into master-ghc8107 (without changes for iPhone7) 2023-12-21 09:59:25 +00:00
Evgeny Poberezkin 6311ba451b Merge branch 'master-ghc8107' into master-android 2023-12-21 00:45:32 +00:00
Evgeny Poberezkin 754c76d6fd Merge branch 'master' into master-ghc8107 2023-12-21 00:45:10 +00:00
Evgeny Poberezkin 545f110fb8 nix: fix direct-sqlcipher content hash 2023-12-13 20:29:36 +00:00
Evgeny Poberezkin 4c6387c854 nix: fix script 2023-12-13 20:28:32 +00:00
Evgeny Poberezkin aea7ff1c89 nix: fix script 2023-12-13 20:27:58 +00:00
Evgeny Poberezkin 77ac972e09 Merge branch 'master-ghc8107' into master-android 2023-12-13 12:36:06 +00:00
Evgeny Poberezkin 256f85024f Merge branch 'master' into master-ghc8107 2023-12-13 12:35:37 +00:00
Evgeny Poberezkin 870f9e42dd Merge branch 'master' into master-ghc8107 2023-12-12 20:09:39 +00:00
Evgeny Poberezkin b3544cfbc3 Merge branch 'stable' into stable-android 2023-12-12 10:12:42 +00:00
Evgeny Poberezkin 0a4a3a24e1 Merge branch 'master-ghc8107' into master-android 2023-12-11 17:36:51 +00:00
Evgeny Poberezkin 8a66390a78 fix for GHC 8.10.7 2023-12-11 16:14:56 +00:00
Evgeny Poberezkin 3d48eded3d Merge branch 'master-ghc8107' into master-android 2023-12-11 14:56:47 +00:00
Evgeny Poberezkin 6546426ec0 Merge branch 'master' into master-ghc8107 2023-12-11 14:56:25 +00:00
spaced4ndy 4a7ceb00fb Merge branch 'master-ghc8107' into master-android 2023-12-11 17:53:08 +04:00
spaced4ndy 53560378bb Merge branch 'master' into master-ghc8107 2023-12-11 17:52:48 +04:00
Evgeny Poberezkin bfa8717ed4 Merge branch 'master-android' into stable-android 2023-12-09 20:43:21 +00:00
Evgeny Poberezkin cdb3b6aafd Merge branch 'master-ghc8107' into master-android 2023-12-07 15:12:49 +00:00
Evgeny Poberezkin 9f3d3e8ba4 Merge branch 'master' into master-ghc8107 2023-12-07 15:00:23 +00:00
Evgeny Poberezkin 047aad592e Merge branch 'master-ghc8107' into master-android 2023-12-04 12:32:05 +00:00
Evgeny Poberezkin 087acd9180 changes to support GHC 8.10.7 (#3512)
* Revert "raise lower bound on mtl to a real version (#3499)"

This reverts commit f94c0311c1.

* Revert "core: expand ranges to fit ghc 8.10 & 9.6 (#3496)"

This reverts commit 9a1c7f41f7.

* update simplexmq

* remove netword-transport fork

* compatibility with GHC 8.10.7

* simplexmq

* fix test

* simplexmq, deps

* update sqlcipher deps in sha256nix

* fix index-state in cabal.project

* index-state

* remove import

* add cabal.project.freeze

* simplexmq

* remove freeze

* simplexmq

* bytestring,simplexmq

* template-haskell, simplexmq

* simplexmq

* simplexmq

* simplexmq

* mtl

* simplexmq

* remove duplicate index-state
2023-12-04 12:29:49 +00:00
Evgeny Poberezkin 0b822e4a5c Merge branch 'master' into master-ghc8107 2023-12-04 10:07:16 +00:00
Evgeny Poberezkin f8a469488e Merge branch 'master' into master-ghc8107 2023-12-02 12:30:36 +00:00
Evgeny Poberezkin 3b5e806418 Merge branch 'master' into master-ghc8107 2023-12-01 17:46:12 +00:00
spaced4ndy 79e208193a Merge branch 'master-ghc8107' into master-android 2023-11-30 21:11:25 +04:00
spaced4ndy ef5c13b1c1 Merge branch 'master' into master-ghc8107 2023-11-30 21:10:51 +04:00
spaced4ndy 38533213d2 Merge branch 'master' into master-ghc8107 2023-11-30 20:56:51 +04:00
spaced4ndy 5f1aa6fa9d Merge branch 'master-ghc8107' into master-android 2023-11-27 19:18:22 +04:00
spaced4ndy b0002fe07d Merge branch 'master' into master-ghc8107 2023-11-27 19:17:39 +04:00
Evgeny Poberezkin ef21fd1d26 Merge branch 'master-ghc8107' into master-android 2023-11-26 19:59:46 +00:00
Evgeny Poberezkin 4a311b9578 fix for ghc 8.10.7 2023-11-26 19:34:39 +00:00
Evgeny Poberezkin b8da5e225b Merge branch 'master' into master-ghc8107 2023-11-26 18:53:40 +00:00
Evgeny Poberezkin 8b3300e197 Merge branch 'master-android' into stable-android 2023-11-26 13:14:27 +00:00
Evgeny Poberezkin f27de052cf Merge branch 'master' into master-android 2023-11-26 11:51:16 +00:00
Evgeny Poberezkin 5cc537f14c Merge branch 'master' into master-ghc8107 2023-11-26 11:50:50 +00:00
Evgeny Poberezkin dc8ca4cf89 Merge tag 'v5.4.0' into master-android 2023-11-25 11:23:23 +00:00
Evgeny Poberezkin b62dd801f1 Merge branch 'master-ghc8107' into master-android 2023-11-24 20:02:05 +00:00
Evgeny Poberezkin 0c096e2c89 Merge branch 'master' into master-ghc8107 2023-11-24 19:00:30 +00:00
Evgeny Poberezkin cc127e56fe Merge branch 'master' into master-android 2023-11-23 16:23:02 +00:00
Evgeny Poberezkin 1781495ee3 Merge branch 'master' into master-ghc8107 2023-11-23 16:22:46 +00:00
Evgeny Poberezkin 831231d8e6 Merge branch 'master-ghc8107' into master-android 2023-11-21 21:16:04 +00:00
Evgeny Poberezkin 45102442f4 Merge branch 'master' into master-ghc8107 2023-11-21 21:15:10 +00:00
spaced4ndy f323c8e112 Merge branch 'master-ghc8107' into master-android 2023-11-21 19:42:28 +04:00
spaced4ndy 3bdc6b5e28 Merge branch 'master' into master-ghc8107 2023-11-21 19:41:06 +04:00
Evgeny Poberezkin d8373262bc Merge branch 'master-ghc8107' into master-android 2023-11-21 00:01:20 +00:00
Evgeny Poberezkin 3597d34716 Merge branch 'master' into master-ghc8107 2023-11-21 00:00:59 +00:00
Evgeny Poberezkin bd4259e89e update hpack 2023-11-20 14:43:20 +00:00
Evgeny Poberezkin 55ead740cc update hpack 2023-11-20 14:43:05 +00:00
Evgeny Poberezkin 5ef0eda2d7 Merge branch 'master-ghc8107' into master-android 2023-11-20 14:30:27 +00:00
Evgeny Poberezkin 49a9b0e7d6 update hpack version 2023-11-20 14:30:10 +00:00
Evgeny Poberezkin 45ada450a2 Merge branch 'master-ghc8107' into master-android 2023-11-20 13:24:07 +00:00
Evgeny Poberezkin 307a1b3c5e fix for ghc 8.10.7 2023-11-20 13:23:45 +00:00
Evgeny Poberezkin ed6b3bbead Merge branch 'master' into master-ghc8107 2023-11-20 13:01:22 +00:00
spaced4ndy 901610eec5 Merge branch 'master-ghc8107' into master-android 2023-11-20 14:08:10 +04:00
spaced4ndy 7d4127c51d Merge branch 'master' into master-ghc8107 2023-11-20 14:07:08 +04:00
Evgeny Poberezkin 13215d91d7 Merge branch 'master-ghc8107' into master-android 2023-11-20 00:07:12 +00:00
Evgeny Poberezkin e1a8099474 fix for GHC 8.10.7 2023-11-20 00:06:45 +00:00
Evgeny Poberezkin daa8d9bb21 Merge branch 'master' into master-ghc8107 2023-11-19 23:42:13 +00:00
Evgeny Poberezkin 5fcbade1bc Merge branch 'master-ghc8107' into master-android 2023-11-17 11:49:35 +00:00
Evgeny Poberezkin 3937ffa9a6 Merge branch 'master' into master-ghc8107 2023-11-17 11:47:52 +00:00
Evgeny Poberezkin 80ddb50e1c Merge branch 'master-ghc8107' into master-android 2023-11-16 18:55:17 +00:00
Evgeny Poberezkin f6e66f1c53 Merge branch 'master' into master-ghc8107 2023-11-16 18:13:02 +00:00
Evgeny Poberezkin 0c23ff9ae3 Merge branch 'master-ghc8107' into master-android 2023-11-11 13:57:32 +00:00
Evgeny Poberezkin 1570bc2b99 Merge branch 'master' into master-ghc8107 2023-11-11 13:56:53 +00:00
Evgeny Poberezkin 1e2104cabf Merge branch 'master-ghc8107' into master-android 2023-11-11 09:52:07 +00:00
Evgeny Poberezkin f3014f258d Merge branch 'master' into master-ghc8107 2023-11-11 09:51:42 +00:00
Evgeny Poberezkin f0991cc0ba Merge branch 'master-ghc8107' into master-android 2023-11-10 21:22:19 +00:00
Evgeny Poberezkin 74b78a8d7b Merge branch 'master' into master-ghc8107 2023-11-10 21:11:08 +00:00
Evgeny Poberezkin 82cd70a75c Merge branch 'master-ghc8107' into master-android 2023-11-10 21:08:11 +00:00
Evgeny Poberezkin fe4eb7b5af Merge branch 'master' into master-ghc8107 without changes, to skip update for ghc 9.6.3 2023-11-10 21:04:20 +00:00
Evgeny Poberezkin c459e71d02 Merge branch 'master-ghc8107' into master-android 2023-11-06 11:26:40 +00:00
Evgeny Poberezkin 2516d5a393 Merge branch 'master' into master-ghc8107 2023-11-06 11:26:22 +00:00
spaced4ndy 477d98d75a Merge branch 'master-ghc8107' into master-android 2023-11-06 11:42:39 +04:00
spaced4ndy 4253cd7fb9 Merge branch 'master' into master-ghc8107 2023-11-06 11:41:55 +04:00
Evgeny Poberezkin ca78958667 Merge branch 'master-ghc8107' into master-android 2023-11-04 13:39:35 +00:00
Evgeny Poberezkin 1f5b80d560 fix for ghc8107 2023-11-04 13:37:25 +00:00
Evgeny Poberezkin 2de111e76c Merge branch 'master' into master-ghc8107 2023-11-04 13:02:08 +00:00
spaced4ndy 8343285d93 Merge branch 'master-ghc8107' into master-android 2023-10-30 21:01:16 +04:00
spaced4ndy 5dbe2b2745 Merge branch 'master' into master-ghc8107 2023-10-30 21:00:11 +04:00
Evgeny Poberezkin fb9485190d Merge branch 'master-ghc8107' into master-android 2023-10-29 18:27:00 +00:00
Evgeny Poberezkin 6881600e06 Merge branch 'master' into master-ghc8107 2023-10-29 18:24:13 +00:00
spaced4ndy 9ed723bafa Merge branch 'master-ghc8107' into master-android 2023-10-25 10:48:37 +04:00
spaced4ndy 9ded1c9821 Merge branch 'master' into master-ghc8107 2023-10-25 10:47:35 +04:00
spaced4ndy bb374c68b1 Merge branch 'master-ghc8107' into master-android 2023-10-24 18:14:22 +04:00
spaced4ndy c3e82a6a4e Merge branch 'master' into master-ghc8107 2023-10-24 18:13:56 +04:00
spaced4ndy 7c12e82042 Merge branch 'master-ghc8107' into master-android 2023-10-24 17:41:19 +04:00
spaced4ndy e7e66ff873 Merge branch 'master' into master-ghc8107 2023-10-24 17:40:55 +04:00
Evgeny Poberezkin c4d7e5307c Merge branch 'master-ghc8107' into master-android 2023-10-22 15:35:55 +01:00
Evgeny Poberezkin d6b9a45a39 Merge branch 'master' into master-ghc8107 2023-10-22 15:10:33 +01:00
Evgeny Poberezkin 7fd3b4d6ba Merge branch 'master-ghc8107' into master-android 2023-10-18 22:45:11 +01:00
Evgeny Poberezkin 4004aafbc5 Merge branch 'master' into master-ghc8107 2023-10-18 22:44:27 +01:00
spaced4ndy 95008eeeaf Merge branch 'master-ghc8107' into master-android 2023-10-16 20:05:49 +04:00
spaced4ndy c7a8992043 core: fix compilation for ghc 8.10.7 2023-10-16 20:05:13 +04:00
spaced4ndy ea2b5f2ccf Merge branch 'master-ghc8107' into master-android 2023-10-16 19:28:48 +04:00
spaced4ndy ed9f277421 Merge branch 'master' into master-ghc8107 2023-10-16 19:28:06 +04:00
Evgeny Poberezkin 5c14c3b349 Merge branch 'master-ghc8107' into master-android 2023-10-15 18:54:16 +01:00
Evgeny Poberezkin d8fb31f167 Merge branch 'master' into master-ghc8107 2023-10-15 18:53:23 +01:00
Evgeny Poberezkin 02db38ffd3 Merge branch 'master-ghc8107' into master-android 2023-10-11 21:58:16 +01:00
Evgeny Poberezkin 7692195bfa core: fix for ghc 8.10.7 2023-10-11 21:57:53 +01:00
Evgeny Poberezkin c435cbdc7b Merge branch 'master-ghc8107' into master-android 2023-10-11 21:28:43 +01:00
Evgeny Poberezkin effc281271 Merge branch 'master' into master-ghc8107 2023-10-11 21:27:21 +01:00
spaced4ndy 41eb2e5689 Merge branch 'master-ghc8107' into master-android 2023-10-11 13:22:30 +04:00
spaced4ndy 67d74a0a27 Merge branch 'master' into master-ghc8107 2023-10-11 13:21:46 +04:00
Evgeny Poberezkin c60af078d7 Merge branch 'stable' into stable-android 2023-10-09 19:55:51 +01:00
Evgeny Poberezkin f66405e79b Merge branch 'master-ghc8107' into master-android 2023-10-09 17:31:56 +01:00
Evgeny Poberezkin 74d186af16 Merge branch 'master' into master-ghc8107 2023-10-09 17:31:27 +01:00
Evgeny Poberezkin e4fbe66d95 Merge branch 'stable' into stable-android 2023-10-09 14:36:03 +01:00
Evgeny Poberezkin 187fef0c5a Merge branch 'master-ghc8107' into master-android 2023-10-09 14:05:21 +01:00
Evgeny Poberezkin 4782cab507 Merge branch 'master' into master-ghc8107 2023-10-09 14:05:04 +01:00
Evgeny Poberezkin cb52d75ff0 Merge branch 'stable' into stable-android 2023-10-08 17:31:23 +01:00
Evgeny Poberezkin bcbee67709 Merge branch 'master-ghc8107' into master-android 2023-10-08 08:38:40 +01:00
Evgeny Poberezkin 2501cbe55d Merge branch 'master' into master-ghc8107 2023-10-08 08:38:02 +01:00
Evgeny Poberezkin 2bd049db87 Merge branch 'master-ghc8107' into master-android 2023-10-07 21:10:22 +01:00
Evgeny Poberezkin 6b8b9ab4fd Merge branch 'master' into master-ghc8107 2023-10-07 19:06:38 +01:00
Evgeny Poberezkin 30db24265e Merge branch 'master-ghc8107' into master-android 2023-10-02 23:04:44 +01:00
Evgeny Poberezkin 316d605899 Merge branch 'master' into master-ghc8107 2023-10-02 23:04:13 +01:00
Evgeny Poberezkin b4257f7767 Merge branch 'master-ghc8107' into master-android 2023-10-01 13:21:50 +01:00
Evgeny Poberezkin a3f2d5c919 Merge branch 'master' into master-ghc8107 2023-10-01 13:20:06 +01:00
Evgeny Poberezkin cf46469cd5 Merge branch 'master-ghc8107' into master-android 2023-10-01 11:19:50 +01:00
Evgeny Poberezkin 0312fde818 Merge branch 'master' into master-ghc8107 2023-10-01 11:19:27 +01:00
Evgeny Poberezkin 9defa44f0c Merge branch 'master-ghc8107' into master-android 2023-09-29 13:15:23 +01:00
Evgeny Poberezkin 915b53054c Merge branch 'master' into master-ghc8107 2023-09-29 13:14:57 +01:00
Evgeny Poberezkin f81557b4fd Merge branch 'master-ghc8107' into master-android 2023-09-27 22:10:06 +01:00
Evgeny Poberezkin e273bd1239 Merge branch 'master' into master-ghc8107 2023-09-27 22:04:00 +01:00
spaced4ndy a63caf4640 Merge branch 'master-ghc8107' into master-android 2023-09-27 20:38:36 +04:00
spaced4ndy e7f0234134 Merge branch 'master' into master-ghc8107 2023-09-27 20:11:39 +04:00
Evgeny Poberezkin 340552321e Merge branch 'master-ghc8107' into master-android 2023-09-27 16:07:24 +01:00
Evgeny Poberezkin 98a3fc214d Merge branch 'master' into master-ghc8107 2023-09-27 16:04:25 +01:00
Evgeny Poberezkin 6a578cfe3c Merge branch 'master-ghc8107' into master-android 2023-09-25 16:53:04 +01:00
Evgeny Poberezkin dacc075fe8 Merge branch 'master' into master-ghc8107 2023-09-25 16:52:33 +01:00
spaced4ndy 55418e2bc0 Merge branch 'master-ghc8107' into master-android 2023-09-25 17:43:59 +04:00
spaced4ndy f2b5c0f3a8 Merge branch 'master' into master-ghc8107 2023-09-25 17:43:37 +04:00
spaced4ndy 5ebdf5dba9 Merge branch 'master-ghc8107' into master-android 2023-09-25 17:07:14 +04:00
spaced4ndy 8e045764df Merge branch 'master' into master-ghc8107 2023-09-25 16:40:08 +04:00
Evgeny Poberezkin 503d3d77e6 Merge branch 'master' into master-ghc8107 2023-09-23 08:47:28 +01:00
Evgeny Poberezkin 81bd7d97c5 Merge branch 'master' into master-ghc8107 2023-09-22 17:21:54 +01:00
Evgeny Poberezkin 8f57925067 compatibility with GHC 8.10.7 2023-09-22 14:01:25 +01:00
Evgeny Poberezkin 9bf99db82e Merge branch 'master' into master-ghc8107 2023-09-22 13:46:50 +01:00
Evgeny Poberezkin 5615cdbf1a Merge branch 'master' into master-android 2023-09-21 17:04:47 +01:00
Evgeny Poberezkin d802ae0058 Merge branch 'master' into master-android 2023-09-21 12:06:10 +01:00
Evgeny Poberezkin 8f2278198c Merge branch 'master' into master-android 2023-09-20 14:55:25 +01:00
spaced4ndy 10937a5a4e Merge branch 'master' into master-android 2023-09-20 17:36:53 +04:00
Evgeny Poberezkin 6aff6e9804 Merge branch 'master-ghc9' into master-ghc8107 2023-09-18 21:56:35 +01:00
Evgeny Poberezkin 95477cae7e core: use commit from simplexmq branch master-ghc8107 2023-09-18 21:45:50 +01:00
491 changed files with 9405 additions and 3853 deletions
+16 -4
View File
@@ -5,12 +5,22 @@ on:
branches:
- master
- stable
- users
tags:
- "v*"
- "!*-fdroid"
- "!*-armv7a"
pull_request:
paths-ignore:
- "apps/ios"
- "apps/multiplatform"
- "blog"
- "docs"
- "fastlane"
- "images"
- "packages"
- "website"
- "README.md"
- "PRIVACY.md"
jobs:
prepare-release:
@@ -92,7 +102,7 @@ jobs:
uses: actions/checkout@v3
- name: Setup Haskell
uses: haskell-actions/setup@v2
uses: haskell/actions/setup@v2
with:
ghc-version: ${{ matrix.ghc }}
cabal-version: "3.10.1.0"
@@ -220,7 +230,7 @@ jobs:
APPLE_SIMPLEX_NOTARIZATION_APPLE_ID: ${{ secrets.APPLE_SIMPLEX_NOTARIZATION_APPLE_ID }}
APPLE_SIMPLEX_NOTARIZATION_PASSWORD: ${{ secrets.APPLE_SIMPLEX_NOTARIZATION_PASSWORD }}
run: |
scripts/ci/build-desktop-mac.sh
scripts/build-desktop-mac.sh
path=$(echo $PWD/apps/multiplatform/release/main/dmg/SimpleX-*.dmg)
echo "package_path=$path" >> $GITHUB_OUTPUT
echo "package_hash=$(echo SHA2-512\(${{ matrix.desktop_asset_name }}\)= $(openssl sha512 $path | cut -d' ' -f 2))" >> $GITHUB_OUTPUT
@@ -300,7 +310,9 @@ jobs:
# Unix /
# / Windows
# rm -rf dist-newstyle/src/direct-sq* is here because of the bug in cabal's dependency which prevents second build from finishing
# * In powershell multiline commands do not fail if individual commands fail - https://github.community/t/multiline-commands-on-windows-do-not-fail-if-individual-commands-fail/16753
# * And GitHub Actions does not support parameterizing shell in a matrix job - https://github.community/t/using-matrix-to-specify-shell-is-it-possible/17065
- name: 'Setup MSYS2'
if: matrix.os == 'windows-latest'
+22 -18
View File
@@ -18,7 +18,7 @@
2. ↔️ [Connect to the team](#connect-to-the-team), [join user groups](#join-user-groups) and [follow our updates](#follow-our-updates).
3. 🤝 [Make a private connection](#make-a-private-connection) with a friend.
4. 🔤 [Help translating SimpleX Chat](#help-translating-simplex-chat).
5. ⚡️ [Contribute](#contribute) and [help us with donations](#help-us-with-donations).
5. ⚡️ [Contribute](#contribute) and [support us with donations](#please-support-us-with-your-donations).
[Learn more about SimpleX Chat](#contents).
@@ -150,7 +150,7 @@ We would love to have you join the development! You can help us with:
- contributing to SimpleX Chat knowledge-base.
- developing features - please connect to us via chat so we can help you get started.
## Help us with donations
## Please support us with your donations
Huge thank you to everybody who donated to SimpleX Chat!
@@ -233,6 +233,8 @@ You can use SimpleX with your own servers and still communicate with people usin
Recent and important updates:
[Aug 14, 2024. SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing](./blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.md)
[Jun 4, 2024. SimpleX network: private message routing, v5.8 released with IP address protection and chat themes](./blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.md)
[Apr 26, 2024. SimpleX network: legally binding transparency, v5.7 released with better calls and messages.](./blog/20240426-simplex-legally-binding-transparency-v5-7-better-user-experience.md)
@@ -298,25 +300,27 @@ What is already implemented:
1. Instead of user profile identifiers used by all other platforms, even the most private ones, SimpleX uses [pairwise per-queue identifiers](./docs/GLOSSARY.md#pairwise-pseudonymous-identifier) (2 addresses for each unidirectional message queue, with an optional 3rd address for push notifications on iOS, 2 queues in each connection between the users). It makes observing the network graph on the application level more difficult, as for `n` users there can be up to `n * (n-1)` message queues.
2. [End-to-end encryption](./docs/GLOSSARY.md#end-to-end-encryption) in each message queue using [NaCl cryptobox](https://nacl.cr.yp.to/box.html). This is added to allow redundancy in the future (passing each message via several servers), to avoid having the same ciphertext in different queues (that would only be visible to the attacker if TLS is compromised). The encryption keys used for this encryption are not rotated, instead we are planning to rotate the queues. Curve25519 keys are used for key negotiation.
3. [Double ratchet](./docs/GLOSSARY.md#double-ratchet-algorithm) end-to-end encryption in each conversation between two users (or group members). This is the same algorithm that is used in Signal and many other messaging apps; it provides OTR messaging with [forward secrecy](./docs/GLOSSARY.md#forward-secrecy) (each message is encrypted by its own ephemeral key) and [break-in recovery](./docs/GLOSSARY.md#post-compromise-security) (the keys are frequently re-negotiated as part of the message exchange). Two pairs of Curve448 keys are used for the initial [key agreement](./docs/GLOSSARY.md#key-agreement-protocol), initiating party passes these keys via the connection link, accepting side - in the header of the confirmation message.
4. Additional layer of encryption using NaCL cryptobox for the messages delivered from the server to the recipient. This layer avoids having any ciphertext in common between sent and received traffic of the server inside TLS (and there are no identifiers in common as well).
5. Several levels of [content padding](./docs/GLOSSARY.md#message-padding) to frustrate message size attacks.
6. All message metadata, including the time when the message was received by the server (rounded to a second) is sent to the recipients inside an encrypted envelope, so even if TLS is compromised it cannot be observed.
7. Only TLS 1.2/1.3 are allowed for client-server connections, limited to cryptographic algorithms: CHACHA20POLY1305_SHA256, Ed25519/Ed448, Curve25519/Curve448.
8. To protect against replay attacks SimpleX servers require [tlsunique channel binding](https://www.rfc-editor.org/rfc/rfc5929.html) as session ID in each client command signed with per-queue ephemeral key.
9. To protect your IP address all SimpleX Chat clients support accessing messaging servers via Tor - see [v3.1 release announcement](./blog/20220808-simplex-chat-v3.1-chat-groups.md) for more details.
10. Local database encryption with passphrase - your contacts, groups and all sent and received messages are stored encrypted. If you used SimpleX Chat before v4.0 you need to enable the encryption via the app settings.
11. Transport isolation - different TCP connections and Tor circuits are used for traffic of different user profiles, optionally - for different contacts and group member connections.
12. Manual messaging queue rotations to move conversation to another SMP relay.
13. Sending end-to-end encrypted files using [XFTP protocol](https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html).
14. Local files encryption.
4. [Post-quantum resistant key exchange](./docs/GLOSSARY.md#post-quantum-cryptography) in double ratchet protocol *on every ratchet step*. Read more in [this post](./blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md) and also see this [publication by Apple]( https://security.apple.com/blog/imessage-pq3/) explaining the need for post-quantum key rotation.
5. Additional layer of encryption using NaCL cryptobox for the messages delivered from the server to the recipient. This layer avoids having any ciphertext in common between sent and received traffic of the server inside TLS (and there are no identifiers in common as well).
6. Several levels of [content padding](./docs/GLOSSARY.md#message-padding) to frustrate message size attacks.
7. All message metadata, including the time when the message was received by the server (rounded to a second) is sent to the recipients inside an encrypted envelope, so even if TLS is compromised it cannot be observed.
8. Only TLS 1.2/1.3 are allowed for client-server connections, limited to cryptographic algorithms: CHACHA20POLY1305_SHA256, Ed25519/Ed448, Curve25519/Curve448.
9. To protect against replay attacks SimpleX servers require [tlsunique channel binding](https://www.rfc-editor.org/rfc/rfc5929.html) as session ID in each client command signed with per-queue ephemeral key.
10. To protect your IP address from unknown messaging relays, and for per-message transport anonymity (compared with Tor/VPN per-connection anonymity), from v6.0 all SimpleX Chat clients use private message routing by default. Read more in [this post](./blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.md#private-message-routing).
11. To protect your IP address from unknown file relays, when SOCKS proxy is not enabled SimpleX Chat clients ask for a confirmation before downloading the files from unknown servers.
12. To protect your IP address from known servers all SimpleX Chat clients support accessing messaging servers via Tor - see [v3.1 release announcement](./blog/20220808-simplex-chat-v3.1-chat-groups.md) for more details.
13. Local database encryption with passphrase - your contacts, groups and all sent and received messages are stored encrypted. If you used SimpleX Chat before v4.0 you need to enable the encryption via the app settings.
14. Transport isolation - different TCP connections and Tor circuits are used for traffic of different user profiles, optionally - for different contacts and group member connections.
15. Manual messaging queue rotations to move conversation to another SMP relay.
16. Sending end-to-end encrypted files using [XFTP protocol](https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html).
17. Local files encryption.
We plan to add:
1. Senders' SMP relays and recipients' XFTP relays to reduce traffic and conceal IP addresses from the relays chosen, and potentially controlled, by another party.
2. Post-quantum resistant key exchange in double ratchet protocol.
3. Automatic message queue rotation and redundancy. Currently the queues created between two users are used until the queue is manually changed by the user or contact is deleted. We are planning to add automatic queue rotation to make these identifiers temporary and rotate based on some schedule TBC (e.g., every X messages, or every X hours/days).
4. Message "mixing" - adding latency to message delivery, to protect against traffic correlation by message time.
5. Reproducible builds this is the limitation of the development stack, but we will be investing into solving this problem. Users can still build all applications and services from the source code.
1. Automatic message queue rotation and redundancy. Currently the queues created between two users are used until the queue is manually changed by the user or contact is deleted. We are planning to add automatic queue rotation to make these identifiers temporary and rotate based on some schedule TBC (e.g., every X messages, or every X hours/days).
2. Message "mixing" - adding latency to message delivery, to protect against traffic correlation by message time.
3. Reproducible builds this is the limitation of the development stack, but we will be investing into solving this problem. Users can still build all applications and services from the source code.
4. Recipients' XFTP relays to reduce traffic and conceal IP addresses from the relays chosen, and potentially controlled, by another party.
## For developers
-24
View File
@@ -15,35 +15,11 @@ class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
logger.debug("AppDelegate: didFinishLaunchingWithOptions")
application.registerForRemoteNotifications()
if #available(iOS 17.0, *) { trackKeyboard() }
NotificationCenter.default.addObserver(self, selector: #selector(pasteboardChanged), name: UIPasteboard.changedNotification, object: nil)
removePasscodesIfReinstalled()
prepareForLaunch()
return true
}
@available(iOS 17.0, *)
private func trackKeyboard() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@available(iOS 17.0, *)
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
ChatModel.shared.keyboardHeight = keyboardFrame.cgRectValue.height
}
}
@available(iOS 17.0, *)
@objc func keyboardWillHide(_ notification: Notification) {
ChatModel.shared.keyboardHeight = 0
}
@objc func pasteboardChanged() {
ChatModel.shared.pasteboardHasStrings = UIPasteboard.general.hasStrings
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02hhx", $0) }.joined()
logger.debug("AppDelegate: didRegisterForRemoteNotificationsWithDeviceToken \(token)")
+4 -4
View File
@@ -36,7 +36,7 @@ struct ContentView: View {
@State private var waitingForOrPassedAuth = true
@State private var chatListActionSheet: ChatListActionSheet? = nil
private let callTopPadding: CGFloat = 50
private let callTopPadding: CGFloat = 40
private enum ChatListActionSheet: Identifiable {
case planAndConnectSheet(sheet: PlanAndConnectActionSheet)
@@ -151,12 +151,12 @@ struct ContentView: View {
}
}
.onAppear {
reactOnDarkThemeChanges()
reactOnDarkThemeChanges(systemInDarkThemeCurrently)
}
.onChange(of: colorScheme) { scheme in
// It's needed to update UI colors when iOS wants to make screenshot after going to background,
// so when a user changes his global theme from dark to light or back, the app will adapt to it
reactOnDarkThemeChanges()
reactOnDarkThemeChanges(scheme == .dark)
}
.onChange(of: theme.name) { _ in
ThemeManager.adjustWindowStyle()
@@ -207,7 +207,7 @@ struct ContentView: View {
CallDuration(call: call)
}
.padding(.horizontal)
.frame(height: callTopPadding - 10)
.frame(height: callTopPadding)
.background(Color(uiColor: UIColor(red: 47/255, green: 208/255, blue: 88/255, alpha: 1)))
.onTapGesture {
chatModel.activeCallViewIsCollapsed = false
+143 -58
View File
@@ -50,12 +50,77 @@ class ItemsModel: ObservableObject {
var reversedChatItems: [ChatItem] = [] {
willSet { publisher.send() }
}
var itemAdded = false {
willSet { publisher.send() }
}
// Publishes directly to `objectWillChange` publisher,
// this will cause reversedChatItems to be rendered without throttling
@Published var isLoading = false
@Published var showLoadingProgress = false
init() {
publisher
.throttle(for: 0.25, scheduler: DispatchQueue.main, latest: true)
.sink { self.objectWillChange.send() }
.store(in: &bag)
}
func loadOpenChat(_ chatId: ChatId, willNavigate: @escaping () -> Void = {}) {
let navigationTimeout = Task {
do {
try await Task.sleep(nanoseconds: 250_000000)
await MainActor.run {
willNavigate()
ChatModel.shared.chatId = chatId
}
} catch {}
}
let progressTimeout = Task {
do {
try await Task.sleep(nanoseconds: 1500_000000)
await MainActor.run { showLoadingProgress = true }
} catch {}
}
Task {
if let chat = ChatModel.shared.getChat(chatId) {
await MainActor.run { self.isLoading = true }
// try? await Task.sleep(nanoseconds: 5000_000000)
await loadChat(chat: chat)
navigationTimeout.cancel()
progressTimeout.cancel()
await MainActor.run {
self.isLoading = false
self.showLoadingProgress = false
willNavigate()
ChatModel.shared.chatId = chatId
}
}
}
}
}
class NetworkModel: ObservableObject {
// map of connections network statuses, key is agent connection id
@Published var networkStatuses: Dictionary<String, NetworkStatus> = [:]
static let shared = NetworkModel()
private init() { }
func setContactNetworkStatus(_ contact: Contact, _ status: NetworkStatus) {
if let conn = contact.activeConn {
networkStatuses[conn.agentConnId] = status
}
}
func contactNetworkStatus(_ contact: Contact) -> NetworkStatus {
if let conn = contact.activeConn {
networkStatuses[conn.agentConnId] ?? .unknown
} else {
.unknown
}
}
}
final class ChatModel: ObservableObject {
@@ -78,10 +143,8 @@ final class ChatModel: ObservableObject {
@Published var contentViewAccessAuthenticated: Bool = false
@Published var laRequest: LocalAuthRequest?
// list of chat "previews"
@Published var chats: [Chat] = []
@Published private(set) var chats: [Chat] = []
@Published var deletedChats: Set<String> = []
// map of connections network statuses, key is agent connection id
@Published var networkStatuses: Dictionary<String, NetworkStatus> = [:]
// current chat
@Published var chatId: String?
var chatItemStatuses: Dictionary<Int64, CIStatus> = [:]
@@ -120,9 +183,6 @@ final class ChatModel: ObservableObject {
@Published var stopPreviousRecPlay: URL? = nil // coordinates currently playing source
@Published var draft: ComposeState?
@Published var draftChatId: String?
// tracks keyboard height via subscription in AppDelegate
@Published var keyboardHeight: CGFloat = 0
@Published var pasteboardHasStrings: Bool = UIPasteboard.general.hasStrings
@Published var networkInfo = UserNetworkInfo(networkType: .other, online: true)
var messageDelivery: Dictionary<Int64, () -> Void> = [:]
@@ -228,10 +288,17 @@ final class ChatModel: ObservableObject {
chats.firstIndex(where: { $0.id == id })
}
func addChat(_ chat: Chat, at position: Int = 0) {
withAnimation {
chats.insert(chat, at: position)
func addChat(_ chat: Chat) {
if chatId == nil {
withAnimation { addChat_(chat, at: 0) }
} else {
addChat_(chat, at: 0)
}
popChatCollector.throttlePopChat(chat.chatInfo.id, currentPosition: 0)
}
func addChat_(_ chat: Chat, at position: Int = 0) {
chats.insert(chat, at: position)
}
func updateChatInfo(_ cInfo: ChatInfo) {
@@ -289,26 +356,10 @@ final class ChatModel: ObservableObject {
}
}
func updateChats(with newChats: [ChatData]) {
for i in 0..<newChats.count {
let c = newChats[i]
if let j = getChatIndex(c.id) {
let chat = chats[j]
chat.chatInfo = c.chatInfo
chat.chatItems = c.chatItems
chat.chatStats = c.chatStats
if i != j {
if chatId != c.chatInfo.id {
popChat_(j, to: i)
} else if i == 0 {
chatToTop = c.chatInfo.id
}
}
} else {
addChat(Chat(c), at: i)
}
}
func updateChats(_ newChats: [ChatData]) {
chats = newChats.map { Chat($0) }
NtfManager.shared.setNtfBadgeCount(totalUnreadCountForAllUsers())
popChatCollector.clear()
}
// func addGroup(_ group: SimpleXChat.Group) {
@@ -316,6 +367,12 @@ final class ChatModel: ObservableObject {
// }
func addChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) {
// mark chat non deleted
if case let .direct(contact) = cInfo, contact.chatDeleted {
var updatedContact = contact
updatedContact.chatDeleted = false
updateContact(updatedContact)
}
// update previews
if let i = getChatIndex(cInfo.id) {
chats[i].chatItems = switch cInfo {
@@ -335,7 +392,7 @@ final class ChatModel: ObservableObject {
if case .rcvNew = cItem.meta.itemStatus {
unreadCollector.changeUnreadCounter(cInfo.id, by: 1)
}
popChatCollector.addChat(cInfo.id)
popChatCollector.throttlePopChat(cInfo.id, currentPosition: i)
} else {
addChat(Chat(chatInfo: cInfo, chatItems: [cItem]))
}
@@ -381,6 +438,7 @@ final class ChatModel: ObservableObject {
ci.meta.itemStatus = status
}
im.reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0)
im.itemAdded = true
}
return true
}
@@ -475,6 +533,7 @@ final class ChatModel: ObservableObject {
let cItem = ChatItem.liveDummy(chatInfo.chatType)
withAnimation {
im.reversedChatItems.insert(cItem, at: 0)
im.itemAdded = true
}
return cItem
}
@@ -610,29 +669,61 @@ final class ChatModel: ObservableObject {
class PopChatCollector {
private let subject = PassthroughSubject<Void, Never>()
private var bag = Set<AnyCancellable>()
private var chatsToPop: [ChatId: Date] = [:]
private let popTsComparator = KeyPathComparator<Chat>(\.popTs, order: .reverse)
init() {
subject
.throttle(for: 2, scheduler: DispatchQueue.main, latest: true)
.sink {
let m = ChatModel.shared
if m.chatId == nil {
withAnimation {
m.chats = m.chats.sorted(using: KeyPathComparator(\.popTs, order: .reverse))
}
} else {
m.chats = m.chats.sorted(using: KeyPathComparator(\.popTs, order: .reverse))
}
}
.sink { self.popCollectedChats() }
.store(in: &bag)
}
func addChat(_ chatId: ChatId) {
if let index = ChatModel.shared.getChatIndex(chatId) {
ChatModel.shared.chats[index].popTs = CFAbsoluteTimeGetCurrent()
func throttlePopChat(_ chatId: ChatId, currentPosition: Int) {
let m = ChatModel.shared
if currentPosition > 0 && m.chatId == chatId {
m.chatToTop = chatId
}
if currentPosition > 0 || !chatsToPop.isEmpty {
chatsToPop[chatId] = Date.now
subject.send()
}
}
func clear() {
chatsToPop = [:]
}
func popCollectedChats() {
let m = ChatModel.shared
var ixs: IndexSet = []
var chs: [Chat] = []
// collect chats that received updates
for (chatId, popTs) in self.chatsToPop {
// Currently opened chat is excluded, removing it from the list would navigate out of it
// It will be popped to top later when user exits from the list.
if m.chatId != chatId, let i = m.getChatIndex(chatId) {
ixs.insert(i)
let ch = m.chats[i]
ch.popTs = popTs
chs.append(ch)
}
}
let removeInsert = {
m.chats.remove(atOffsets: ixs)
// sort chats by pop timestamp in descending order
m.chats.insert(contentsOf: chs.sorted(using: self.popTsComparator), at: 0)
}
if m.chatId == nil {
withAnimation { removeInsert() }
} else {
removeInsert()
}
self.chatsToPop = [:]
}
}
private func markChatItemRead_(_ i: Int) {
@@ -729,6 +820,7 @@ final class ChatModel: ObservableObject {
func popChat(_ id: String) {
if let i = getChatIndex(id) {
// no animation here, for it not to look like it just moved when leaving the chat
popChat_(i)
}
}
@@ -801,7 +893,13 @@ final class ChatModel: ObservableObject {
}
i += 1
}
return UnreadChatItemCounts(isNearBottom: totalBelow < 16, unreadBelow: unreadBelow)
return UnreadChatItemCounts(
// TODO these thresholds account for the fact that items are still "visible" while
// covered by compose area, they should be replaced with the actual height in pixels below the screen.
isNearBottom: totalBelow < 15,
isReallyNearBottom: totalBelow < 2,
unreadBelow: unreadBelow
)
}
func topItemInView(itemsInView: Set<String>) -> ChatItem? {
@@ -812,20 +910,6 @@ final class ChatModel: ObservableObject {
while i < maxIx && inView(i) { i += 1 }
return im.reversedChatItems[min(i - 1, maxIx)]
}
func setContactNetworkStatus(_ contact: Contact, _ status: NetworkStatus) {
if let conn = contact.activeConn {
networkStatuses[conn.agentConnId] = status
}
}
func contactNetworkStatus(_ contact: Contact) -> NetworkStatus {
if let conn = contact.activeConn {
networkStatuses[conn.agentConnId] ?? .unknown
} else {
.unknown
}
}
}
struct ShowingInvitation {
@@ -840,6 +924,7 @@ struct NTFContactRequest {
struct UnreadChatItemCounts: Equatable {
var isNearBottom: Bool
var isReallyNearBottom: Bool
var unreadBelow: Int
}
@@ -848,7 +933,7 @@ final class Chat: ObservableObject, Identifiable, ChatLike {
@Published var chatItems: [ChatItem]
@Published var chatStats: ChatStats
var created = Date.now
var popTs: CFAbsoluteTime?
fileprivate var popTs: Date?
init(_ cData: ChatData) {
self.chatInfo = cData.chatInfo
+3 -1
View File
@@ -57,7 +57,9 @@ class NtfManager: NSObject, UNUserNotificationCenterDelegate, ObservableObject {
chatModel.ntfCallInvitationAction = (chatId, ntfAction)
}
} else {
chatModel.chatId = content.targetContentIdentifier
if let chatId = content.targetContentIdentifier {
ItemsModel.shared.loadOpenChat(chatId)
}
}
handler()
}
+67 -54
View File
@@ -112,9 +112,9 @@ func chatSendCmdSync(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? =
return resp
}
func chatSendCmd(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? = nil, _ ctrl: chat_ctrl? = nil) async -> ChatResponse {
func chatSendCmd(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? = nil, _ ctrl: chat_ctrl? = nil, log: Bool = true) async -> ChatResponse {
await withCheckedContinuation { cont in
cont.resume(returning: chatSendCmdSync(cmd, bgTask: bgTask, bgDelay: bgDelay, ctrl))
cont.resume(returning: chatSendCmdSync(cmd, bgTask: bgTask, bgDelay: bgDelay, ctrl, log: log))
}
}
@@ -320,8 +320,8 @@ private func apiChatsResponse(_ r: ChatResponse) throws -> [ChatData] {
let loadItemsPerPage = 50
func apiGetChat(type: ChatType, id: Int64, search: String = "") throws -> Chat {
let r = chatSendCmdSync(.apiGetChat(type: type, id: id, pagination: .last(count: loadItemsPerPage), search: search))
func apiGetChat(type: ChatType, id: Int64, search: String = "") async throws -> Chat {
let r = await chatSendCmd(.apiGetChat(type: type, id: id, pagination: .last(count: loadItemsPerPage), search: search))
if case let .apiChat(_, chat) = r { return Chat.init(chat) }
throw r
}
@@ -332,22 +332,20 @@ func apiGetChatItems(type: ChatType, id: Int64, pagination: ChatPagination, sear
throw r
}
func loadChat(chat: Chat, search: String = "") {
func loadChat(chat: Chat, search: String = "", clearItems: Bool = true) async {
do {
let cInfo = chat.chatInfo
let m = ChatModel.shared
let im = ItemsModel.shared
m.chatItemStatuses = [:]
im.reversedChatItems = []
let chat = try apiGetChat(type: cInfo.chatType, id: cInfo.apiId, search: search)
if case let .direct(contact) = chat.chatInfo, !cInfo.chatDeleted, chat.chatInfo.chatDeleted {
var updatedContact = contact
updatedContact.chatDeleted = false
m.updateContact(updatedContact)
} else {
if clearItems {
await MainActor.run { im.reversedChatItems = [] }
}
let chat = try await apiGetChat(type: cInfo.chatType, id: cInfo.apiId, search: search)
await MainActor.run {
im.reversedChatItems = chat.chatItems.reversed()
m.updateChatInfo(chat.chatInfo)
}
im.reversedChatItems = chat.chatItems.reversed()
} catch let error {
logger.error("loadChat error: \(responseError(error))")
}
@@ -584,13 +582,13 @@ func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) throws -> (Gro
throw r
}
func apiContactQueueInfo(_ contactId: Int64) async throws -> (RcvMsgInfo?, QueueInfo) {
func apiContactQueueInfo(_ contactId: Int64) async throws -> (RcvMsgInfo?, ServerQueueInfo) {
let r = await chatSendCmd(.apiContactQueueInfo(contactId: contactId))
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
throw r
}
func apiGroupMemberQueueInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (RcvMsgInfo?, QueueInfo) {
func apiGroupMemberQueueInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (RcvMsgInfo?, ServerQueueInfo) {
let r = await chatSendCmd(.apiGroupMemberQueueInfo(groupId: groupId, groupMemberId: groupMemberId))
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
throw r
@@ -707,7 +705,7 @@ func apiConnect_(incognito: Bool, connReq: String) async -> ((ConnReqType, Pendi
return ((.contact, connection), nil)
case let .contactAlreadyExists(_, contact):
if let c = m.getContactChat(contact.contactId) {
await MainActor.run { m.chatId = c.id }
ItemsModel.shared.loadOpenChat(c.id)
}
let alert = contactAlreadyExistsAlert(contact)
return (nil, alert)
@@ -1171,12 +1169,12 @@ func acceptContactRequest(incognito: Bool, contactRequest: UserContactRequest) a
let chat = Chat(chatInfo: ChatInfo.direct(contact: contact), chatItems: [])
await MainActor.run {
ChatModel.shared.replaceChat(contactRequest.id, chat)
ChatModel.shared.setContactNetworkStatus(contact, .connected)
NetworkModel.shared.setContactNetworkStatus(contact, .connected)
}
if contact.sndReady {
DispatchQueue.main.async {
dismissAllSheets(animated: true) {
ChatModel.shared.chatId = chat.id
ItemsModel.shared.loadOpenChat(chat.id)
}
}
}
@@ -1220,12 +1218,18 @@ func apiEndCall(_ contact: Contact) async throws {
try await sendCommandOkResp(.apiEndCall(contact: contact))
}
func apiGetCallInvitations() throws -> [RcvCallInvitation] {
func apiGetCallInvitationsSync() throws -> [RcvCallInvitation] {
let r = chatSendCmdSync(.apiGetCallInvitations)
if case let .callInvitations(invs) = r { return invs }
throw r
}
func apiGetCallInvitations() async throws -> [RcvCallInvitation] {
let r = await chatSendCmd(.apiGetCallInvitations)
if case let .callInvitations(invs) = r { return invs }
throw r
}
func apiCallStatus(_ contact: Contact, _ status: String) async throws {
if let callStatus = WebRTCCallStatus.init(rawValue: status) {
try await sendCommandOkResp(.apiCallStatus(contact: contact, callStatus: callStatus))
@@ -1422,9 +1426,9 @@ func apiGetVersion() throws -> CoreVersionInfo {
throw r
}
func getAgentSubsTotal() throws -> (SMPServerSubs, Bool) {
func getAgentSubsTotal() async throws -> (SMPServerSubs, Bool) {
let userId = try currentUserId("getAgentSubsTotal")
let r = chatSendCmdSync(.getAgentSubsTotal(userId: userId), log: false)
let r = await chatSendCmd(.getAgentSubsTotal(userId: userId), log: false)
if case let .agentSubsTotal(_, subsTotal, hasSession) = r { return (subsTotal, hasSession) }
logger.error("getAgentSubsTotal error: \(String(describing: r))")
throw r
@@ -1519,7 +1523,7 @@ func startChat(refreshInvitations: Bool = true) throws {
try getUserChatData()
NtfManager.shared.setNtfBadgeCount(m.totalUnreadCountForAllUsers())
if (refreshInvitations) {
try refreshCallInvitations()
Task { try await refreshCallInvitations() }
}
(m.savedToken, m.tokenStatus, m.notificationMode, m.notificationServer) = apiGetNtfToken()
_ = try apiStartChat()
@@ -1593,7 +1597,7 @@ func getUserChatData() throws {
m.userAddress = try apiGetUserAddress()
m.chatItemTTL = try getChatItemTTL()
let chats = try apiGetChats()
m.chats = chats.map { Chat.init($0) }
m.updateChats(chats)
}
private func getUserChatDataAsync() async throws {
@@ -1605,12 +1609,12 @@ private func getUserChatDataAsync() async throws {
await MainActor.run {
m.userAddress = userAddress
m.chatItemTTL = chatItemTTL
m.chats = chats.map { Chat.init($0) }
m.updateChats(chats)
}
} else {
await MainActor.run {
m.userAddress = nil
m.chats = []
m.updateChats([])
}
}
}
@@ -1660,6 +1664,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
await TerminalItems.shared.add(.resp(.now, res))
}
let m = ChatModel.shared
let n = NetworkModel.shared
logger.debug("processReceivedMsg: \(res.responseType)")
switch res {
case let .contactDeletedByContact(user, contact):
@@ -1682,7 +1687,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
NtfManager.shared.notifyContactConnected(user, contact)
}
await MainActor.run {
m.setContactNetworkStatus(contact, .connected)
n.setContactNetworkStatus(contact, .connected)
}
case let .contactConnecting(user, contact):
if active(user) && contact.directOrUsed {
@@ -1705,7 +1710,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
}
await MainActor.run {
m.setContactNetworkStatus(contact, .connected)
n.setContactNetworkStatus(contact, .connected)
}
case let .receivedContactRequest(user, contactRequest):
if active(user) {
@@ -1739,7 +1744,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
if active(user) && m.hasChat(mergedContact.id) {
await MainActor.run {
if m.chatId == mergedContact.id {
m.chatId = intoContact.id
ItemsModel.shared.loadOpenChat(mergedContact.id)
}
m.removeChat(mergedContact.id)
}
@@ -1747,27 +1752,27 @@ func processReceivedMsg(_ res: ChatResponse) async {
case let .networkStatus(status, connections):
// dispatch queue to synchronize access
networkStatusesLock.sync {
var ns = m.networkStatuses
var ns = n.networkStatuses
// slow loop is on the background thread
for cId in connections {
ns[cId] = status
}
// fast model update is on the main thread
DispatchQueue.main.sync {
m.networkStatuses = ns
n.networkStatuses = ns
}
}
case let .networkStatuses(_, statuses): ()
// dispatch queue to synchronize access
networkStatusesLock.sync {
var ns = m.networkStatuses
var ns = n.networkStatuses
// slow loop is on the background thread
for s in statuses {
ns[s.agentConnId] = s.networkStatus
}
// fast model update is on the main thread
DispatchQueue.main.sync {
m.networkStatuses = ns
n.networkStatuses = ns
}
}
case let .newChatItem(user, aChatItem):
@@ -1775,11 +1780,6 @@ func processReceivedMsg(_ res: ChatResponse) async {
let cItem = aChatItem.chatItem
await MainActor.run {
if active(user) {
if case let .direct(contact) = cInfo, contact.chatDeleted {
var updatedContact = contact
updatedContact.chatDeleted = false
m.updateContact(updatedContact)
}
m.addChatItem(cInfo, cItem)
} else if cItem.isRcvNew && cInfo.ntfsEnabled {
m.increaseUnreadCounter(user: user)
@@ -1913,7 +1913,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
if let contact = memberContact {
await MainActor.run {
m.setContactNetworkStatus(contact, .connected)
n.setContactNetworkStatus(contact, .connected)
}
}
case let .groupUpdated(user, toGroup):
@@ -2094,6 +2094,8 @@ func processReceivedMsg(_ res: ChatResponse) async {
m.remoteCtrlSession = nil
dismissAllSheets() {
switch rcStopReason {
case .disconnected:
()
case .connectionFailed(.errorAgent(.RCP(.identity))):
AlertManager.shared.showAlertMsg(
title: "Connection with desktop stopped",
@@ -2136,12 +2138,13 @@ func processReceivedMsg(_ res: ChatResponse) async {
func switchToLocalSession() {
let m = ChatModel.shared
let n = NetworkModel.shared
m.remoteCtrlSession = nil
do {
m.users = try listUsers()
try getUserChatData()
let statuses = (try apiGetNetworkStatuses()).map { s in (s.agentConnId, s.networkStatus) }
m.networkStatuses = Dictionary(uniqueKeysWithValues: statuses)
n.networkStatuses = Dictionary(uniqueKeysWithValues: statuses)
} catch let error {
logger.debug("error updating chat data: \(responseError(error))")
}
@@ -2164,32 +2167,42 @@ func chatItemSimpleUpdate(_ user: any UserLike, _ aChatItem: AChatItem) async {
}
}
func refreshCallInvitations() throws {
func refreshCallInvitations() async throws {
let m = ChatModel.shared
let callInvitations = try justRefreshCallInvitations()
if let (chatId, ntfAction) = m.ntfCallInvitationAction,
let invitation = m.callInvitations.removeValue(forKey: chatId) {
m.ntfCallInvitationAction = nil
CallController.shared.callAction(invitation: invitation, action: ntfAction)
} else if let invitation = callInvitations.last(where: { $0.user.showNotifications }) {
activateCall(invitation)
let callInvitations = try await apiGetCallInvitations()
await MainActor.run {
m.callInvitations = callsByChat(callInvitations)
if let (chatId, ntfAction) = m.ntfCallInvitationAction,
let invitation = m.callInvitations.removeValue(forKey: chatId) {
m.ntfCallInvitationAction = nil
CallController.shared.callAction(invitation: invitation, action: ntfAction)
} else if let invitation = callInvitations.last(where: { $0.user.showNotifications }) {
activateCall(invitation)
}
}
}
func justRefreshCallInvitations() throws -> [RcvCallInvitation] {
let m = ChatModel.shared
let callInvitations = try apiGetCallInvitations()
m.callInvitations = callInvitations.reduce(into: [ChatId: RcvCallInvitation]()) { result, inv in result[inv.contact.id] = inv }
return callInvitations
func justRefreshCallInvitations() async throws {
let callInvitations = try apiGetCallInvitationsSync()
await MainActor.run {
ChatModel.shared.callInvitations = callsByChat(callInvitations)
}
}
private func callsByChat(_ callInvitations: [RcvCallInvitation]) -> [ChatId: RcvCallInvitation] {
callInvitations.reduce(into: [ChatId: RcvCallInvitation]()) {
result, inv in result[inv.contact.id] = inv
}
}
func activateCall(_ callInvitation: RcvCallInvitation) {
if !callInvitation.user.showNotifications { return }
let m = ChatModel.shared
logger.debug("reportNewIncomingCall activeCallUUID \(String(describing: m.activeCall?.callUUID)) invitationUUID \(String(describing: callInvitation.callUUID))")
if !callInvitation.user.showNotifications || m.activeCall?.callUUID == callInvitation.callUUID { return }
CallController.shared.reportNewIncomingCall(invitation: callInvitation) { error in
if let error = error {
DispatchQueue.main.async {
m.callInvitations[callInvitation.contact.id]?.callkitUUID = nil
m.callInvitations[callInvitation.contact.id]?.callUUID = nil
}
logger.error("reportNewIncomingCall error: \(error.localizedDescription)")
} else {
+13 -10
View File
@@ -58,6 +58,7 @@ struct SimpleXApp: App {
}
.onChange(of: scenePhase) { phase in
logger.debug("scenePhase was \(String(describing: scenePhase)), now \(String(describing: phase))")
AppSheetState.shared.scenePhaseActive = phase == .active
switch (phase) {
case .background:
// --- authentication
@@ -82,9 +83,11 @@ struct SimpleXApp: App {
if appState != .stopped {
startChatAndActivate {
if appState.inactive && chatModel.chatRunning == true {
updateChats()
if !chatModel.showCallView && !CallController.shared.hasActiveCalls() {
updateCallInvitations()
Task {
await updateChats()
if !chatModel.showCallView && !CallController.shared.hasActiveCalls() {
await updateCallInvitations()
}
}
}
}
@@ -129,16 +132,16 @@ struct SimpleXApp: App {
}
}
private func updateChats() {
private func updateChats() async {
do {
let chats = try apiGetChats()
chatModel.updateChats(with: chats)
let chats = try await apiGetChatsAsync()
await MainActor.run { chatModel.updateChats(chats) }
if let id = chatModel.chatId,
let chat = chatModel.getChat(id) {
loadChat(chat: chat)
Task { await loadChat(chat: chat, clearItems: false) }
}
if let ncr = chatModel.ntfContactRequest {
chatModel.ntfContactRequest = nil
await MainActor.run { chatModel.ntfContactRequest = nil }
if case let .contactRequest(contactRequest) = chatModel.getChat(ncr.chatId)?.chatInfo {
Task { await acceptContactRequest(incognito: ncr.incognito, contactRequest: contactRequest) }
}
@@ -148,9 +151,9 @@ struct SimpleXApp: App {
}
}
private func updateCallInvitations() {
private func updateCallInvitations() async {
do {
try refreshCallInvitations()
try await refreshCallInvitations()
} catch let error {
logger.error("apiGetCallInvitations: cannot update call invitations \(responseError(error))")
}
+2 -2
View File
@@ -91,8 +91,8 @@ var systemInDarkThemeCurrently: Bool {
return UITraitCollection.current.userInterfaceStyle == .dark
}
func reactOnDarkThemeChanges() {
if currentThemeDefault.get() == DefaultTheme.SYSTEM_THEME_NAME && CurrentColors.colors.isLight == systemInDarkThemeCurrently {
func reactOnDarkThemeChanges(_ inDarkNow: Bool) {
if currentThemeDefault.get() == DefaultTheme.SYSTEM_THEME_NAME && CurrentColors.colors.isLight == inDarkNow {
// Change active colors from light to dark and back based on system theme
ThemeManager.applyTheme(DefaultTheme.SYSTEM_THEME_NAME)
}
+1 -1
View File
@@ -53,7 +53,7 @@ class ThemeManager {
return perUserTheme
}
let defaultTheme = defaultActiveTheme(appSettingsTheme)
return ThemeModeOverride(mode: CurrentColors.base.mode, colors: defaultTheme?.colors ?? ThemeColors(), wallpaper: defaultTheme?.wallpaper)
return ThemeModeOverride(mode: CurrentColors.base.mode, colors: defaultTheme?.colors ?? ThemeColors(), wallpaper: defaultTheme?.wallpaper ?? ThemeWallpaper.from(PresetWallpaper.school.toType(CurrentColors.base), nil, nil))
}
static func currentColors(_ themeOverridesForType: WallpaperType?, _ perChatTheme: ThemeModeOverride?, _ perUserTheme: ThemeModeOverrides?, _ appSettingsTheme: [ThemeOverrides]) -> ActiveTheme {
@@ -185,7 +185,7 @@ struct ActiveCallView: View {
case .ended:
closeCallView(client)
call.callState = .ended
if let uuid = call.callkitUUID {
if let uuid = call.callUUID {
CallController.shared.endCall(callUUID: uuid)
}
case .ok:
@@ -382,7 +382,7 @@ struct ActiveCallOverlay: View {
private func endCallButton() -> some View {
let cc = CallController.shared
return callButton("phone.down.fill", width: 60, height: 60) {
if let uuid = call.callkitUUID {
if let uuid = call.callUUID {
cc.endCall(callUUID: uuid)
} else {
cc.endCall(call: call) {}
@@ -462,9 +462,9 @@ struct ActiveCallOverlay: View {
struct ActiveCallOverlay_Previews: PreviewProvider {
static var previews: some View {
Group{
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callkitUUID: UUID(), callState: .offerSent, localMedia: .video), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, localMedia: .video), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
.background(.black)
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callkitUUID: UUID(), callState: .offerSent, localMedia: .audio), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, localMedia: .audio), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
.background(.black)
}
}
+96 -44
View File
@@ -51,7 +51,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
logger.debug("CallController.provider CXStartCallAction")
if callManager.startOutgoingCall(callUUID: action.callUUID) {
if callManager.startOutgoingCall(callUUID: action.callUUID.uuidString.lowercased()) {
action.fulfill()
provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil)
} else {
@@ -61,12 +61,30 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
logger.debug("CallController.provider CXAnswerCallAction")
if callManager.answerIncomingCall(callUUID: action.callUUID) {
// WebRTC call should be in connected state to fulfill.
// Otherwise no audio and mic working on lockscreen
fulfillOnConnect = action
} else {
action.fail()
Task {
let chatIsReady = await waitUntilChatStarted(timeoutMs: 30_000, stepMs: 500)
logger.debug("CallController chat started \(chatIsReady) \(ChatModel.shared.chatInitialized) \(ChatModel.shared.chatRunning == true) \(String(describing: AppChatState.shared.value))")
if !chatIsReady {
action.fail()
return
}
if !ChatModel.shared.callInvitations.values.contains(where: { inv in inv.callUUID == action.callUUID.uuidString.lowercased() }) {
try? await justRefreshCallInvitations()
logger.debug("CallController: updated call invitations chat")
}
await MainActor.run {
logger.debug("CallController.provider will answer on call")
if callManager.answerIncomingCall(callUUID: action.callUUID.uuidString.lowercased()) {
logger.debug("CallController.provider answered on call")
// WebRTC call should be in connected state to fulfill.
// Otherwise no audio and mic working on lockscreen
fulfillOnConnect = action
} else {
logger.debug("CallController.provider will fail the call")
action.fail()
}
}
}
}
@@ -75,7 +93,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
// Should be nil here if connection was in connected state
fulfillOnConnect?.fail()
fulfillOnConnect = nil
callManager.endCall(callUUID: action.callUUID) { ok in
callManager.endCall(callUUID: action.callUUID.uuidString.lowercased()) { ok in
if ok {
action.fulfill()
} else {
@@ -86,7 +104,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
}
func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) {
if callManager.enableMedia(media: .audio, enable: !action.isMuted, callUUID: action.callUUID) {
if callManager.enableMedia(media: .audio, enable: !action.isMuted, callUUID: action.callUUID.uuidString.lowercased()) {
action.fulfill()
} else {
action.fail()
@@ -156,6 +174,19 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
}
}
private func waitUntilChatStarted(timeoutMs: UInt64, stepMs: UInt64) async -> Bool {
logger.debug("CallController waiting until chat started")
var t: UInt64 = 0
repeat {
if ChatModel.shared.chatInitialized, ChatModel.shared.chatRunning == true, case .active = AppChatState.shared.value {
return true
}
_ = try? await Task.sleep(nanoseconds: stepMs * 1000000)
t += stepMs
} while t < timeoutMs
return false
}
@objc(pushRegistry:didUpdatePushCredentials:forType:)
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
logger.debug("CallController: didUpdate push credentials for type \(type.rawValue)")
@@ -171,32 +202,19 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
self.reportExpiredCall(payload: payload, completion)
return
}
if (!ChatModel.shared.chatInitialized) {
logger.debug("CallController: initializing chat")
do {
try initializeChat(start: true, refreshInvitations: false)
} catch let error {
logger.error("CallController: initializing chat error: \(error)")
self.reportExpiredCall(payload: payload, completion)
return
}
}
logger.debug("CallController: initialized chat")
startChatForCall()
logger.debug("CallController: started chat")
self.shouldSuspendChat = true
// There are no invitations in the model, as it was processed by NSE
_ = try? justRefreshCallInvitations()
logger.debug("CallController: updated call invitations chat")
// logger.debug("CallController justRefreshCallInvitations: \(String(describing: m.callInvitations))")
// Extract the call information from the push notification payload
let m = ChatModel.shared
if let contactId = payload.dictionaryPayload["contactId"] as? String,
let invitation = m.callInvitations[contactId] {
let update = self.cxCallUpdate(invitation: invitation)
if let uuid = invitation.callkitUUID {
let displayName = payload.dictionaryPayload["displayName"] as? String,
let callUUID = payload.dictionaryPayload["callUUID"] as? String,
let uuid = UUID(uuidString: callUUID),
let callTsInterval = payload.dictionaryPayload["callTs"] as? TimeInterval,
let mediaStr = payload.dictionaryPayload["media"] as? String,
let media = CallMediaType(rawValue: mediaStr) {
let update = self.cxCallUpdate(contactId, displayName, media)
let callTs = Date(timeIntervalSince1970: callTsInterval)
if callTs.timeIntervalSinceNow >= -180 {
logger.debug("CallController: report pushkit call via CallKit")
let update = self.cxCallUpdate(invitation: invitation)
self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
if error != nil {
m.callInvitations.removeValue(forKey: contactId)
@@ -205,11 +223,31 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
completion()
}
} else {
logger.debug("CallController will expire call 1")
self.reportExpiredCall(update: update, completion)
}
} else {
logger.debug("CallController will expire call 2")
self.reportExpiredCall(payload: payload, completion)
}
//DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
if (!ChatModel.shared.chatInitialized) {
logger.debug("CallController: initializing chat")
do {
try initializeChat(start: true, refreshInvitations: false)
} catch let error {
logger.error("CallController: initializing chat error: \(error)")
if let call = ChatModel.shared.activeCall {
self.endCall(call: call, completed: completion)
}
return
}
}
logger.debug("CallController: initialized chat")
startChatForCall()
logger.debug("CallController: started chat")
self.shouldSuspendChat = true
}
// This function fulfils the requirement to always report a call when PushKit notification is received,
@@ -239,8 +277,8 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
}
func reportNewIncomingCall(invitation: RcvCallInvitation, completion: @escaping (Error?) -> Void) {
logger.debug("CallController.reportNewIncomingCall, UUID=\(String(describing: invitation.callkitUUID))")
if CallController.useCallKit(), let uuid = invitation.callkitUUID {
logger.debug("CallController.reportNewIncomingCall, UUID=\(String(describing: invitation.callUUID))")
if CallController.useCallKit(), let callUUID = invitation.callUUID, let uuid = UUID(uuidString: callUUID) {
if invitation.callTs.timeIntervalSinceNow >= -180 {
let update = cxCallUpdate(invitation: invitation)
provider.reportNewIncomingCall(with: uuid, update: update, completion: completion)
@@ -261,6 +299,14 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
return update
}
private func cxCallUpdate(_ contactId: String, _ displayName: String, _ media: CallMediaType) -> CXCallUpdate {
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: contactId)
update.hasVideo = media == .video
update.localizedCallerName = displayName
return update
}
func reportIncomingCall(call: Call, connectedAt dateConnected: Date?) {
logger.debug("CallController: reporting incoming call connected")
if CallController.useCallKit() {
@@ -272,14 +318,14 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
func reportOutgoingCall(call: Call, connectedAt dateConnected: Date?) {
logger.debug("CallController: reporting outgoing call connected")
if CallController.useCallKit(), let uuid = call.callkitUUID {
if CallController.useCallKit(), let callUUID = call.callUUID, let uuid = UUID(uuidString: callUUID) {
provider.reportOutgoingCall(with: uuid, connectedAt: dateConnected)
}
}
func reportCallRemoteEnded(invitation: RcvCallInvitation) {
logger.debug("CallController: reporting remote ended")
if CallController.useCallKit(), let uuid = invitation.callkitUUID {
if CallController.useCallKit(), let callUUID = invitation.callUUID, let uuid = UUID(uuidString: callUUID) {
provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded)
} else if invitation.contact.id == activeCallInvitation?.contact.id {
activeCallInvitation = nil
@@ -288,14 +334,17 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
func reportCallRemoteEnded(call: Call) {
logger.debug("CallController: reporting remote ended")
if CallController.useCallKit(), let uuid = call.callkitUUID {
if CallController.useCallKit(), let callUUID = call.callUUID, let uuid = UUID(uuidString: callUUID) {
provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded)
}
}
func startCall(_ contact: Contact, _ media: CallMediaType) {
logger.debug("CallController.startCall")
let uuid = callManager.newOutgoingCall(contact, media)
let callUUID = callManager.newOutgoingCall(contact, media)
guard let uuid = UUID(uuidString: callUUID) else {
return
}
if CallController.useCallKit() {
let handle = CXHandle(type: .generic, value: contact.id)
let action = CXStartCallAction(call: uuid, handle: handle)
@@ -307,8 +356,8 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
update.localizedCallerName = contact.displayName
self.provider.reportCall(with: uuid, updated: update)
}
} else if callManager.startOutgoingCall(callUUID: uuid) {
if callManager.startOutgoingCall(callUUID: uuid) {
} else if callManager.startOutgoingCall(callUUID: callUUID) {
if callManager.startOutgoingCall(callUUID: callUUID) {
logger.debug("CallController.startCall: call started")
} else {
logger.error("CallController.startCall: no active call")
@@ -318,8 +367,8 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
func answerCall(invitation: RcvCallInvitation) {
logger.debug("CallController: answering a call")
if CallController.useCallKit(), let callUUID = invitation.callkitUUID {
requestTransaction(with: CXAnswerCallAction(call: callUUID))
if CallController.useCallKit(), let callUUID = invitation.callUUID, let uuid = UUID(uuidString: callUUID) {
requestTransaction(with: CXAnswerCallAction(call: uuid))
} else {
callManager.answerIncomingCall(invitation: invitation)
}
@@ -328,10 +377,13 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
}
}
func endCall(callUUID: UUID) {
logger.debug("CallController: ending the call with UUID \(callUUID.uuidString)")
func endCall(callUUID: String) {
let uuid = UUID(uuidString: callUUID)
logger.debug("CallController: ending the call with UUID \(callUUID)")
if CallController.useCallKit() {
requestTransaction(with: CXEndCallAction(call: callUUID))
if let uuid {
requestTransaction(with: CXEndCallAction(call: uuid))
}
} else {
callManager.endCall(callUUID: callUUID) { ok in
if ok {
+13 -13
View File
@@ -10,17 +10,17 @@ import Foundation
import SimpleXChat
class CallManager {
func newOutgoingCall(_ contact: Contact, _ media: CallMediaType) -> UUID {
let uuid = UUID()
let call = Call(direction: .outgoing, contact: contact, callkitUUID: uuid, callState: .waitCapabilities, localMedia: media)
func newOutgoingCall(_ contact: Contact, _ media: CallMediaType) -> String {
let uuid = UUID().uuidString.lowercased()
let call = Call(direction: .outgoing, contact: contact, callUUID: uuid, callState: .waitCapabilities, localMedia: media)
call.speakerEnabled = media == .video
ChatModel.shared.activeCall = call
return uuid
}
func startOutgoingCall(callUUID: UUID) -> Bool {
func startOutgoingCall(callUUID: String) -> Bool {
let m = ChatModel.shared
if let call = m.activeCall, call.callkitUUID == callUUID {
if let call = m.activeCall, call.callUUID == callUUID {
m.showCallView = true
Task { await m.callCommand.processCommand(.capabilities(media: call.localMedia)) }
return true
@@ -28,7 +28,7 @@ class CallManager {
return false
}
func answerIncomingCall(callUUID: UUID) -> Bool {
func answerIncomingCall(callUUID: String) -> Bool {
if let invitation = getCallInvitation(callUUID) {
answerIncomingCall(invitation: invitation)
return true
@@ -42,7 +42,7 @@ class CallManager {
let call = Call(
direction: .incoming,
contact: invitation.contact,
callkitUUID: invitation.callkitUUID,
callUUID: invitation.callUUID,
callState: .invitationAccepted,
localMedia: invitation.callType.media,
sharedKey: invitation.sharedKey
@@ -68,8 +68,8 @@ class CallManager {
}
}
func enableMedia(media: CallMediaType, enable: Bool, callUUID: UUID) -> Bool {
if let call = ChatModel.shared.activeCall, call.callkitUUID == callUUID {
func enableMedia(media: CallMediaType, enable: Bool, callUUID: String) -> Bool {
if let call = ChatModel.shared.activeCall, call.callUUID == callUUID {
let m = ChatModel.shared
Task { await m.callCommand.processCommand(.media(media: media, enable: enable)) }
return true
@@ -77,8 +77,8 @@ class CallManager {
return false
}
func endCall(callUUID: UUID, completed: @escaping (Bool) -> Void) {
if let call = ChatModel.shared.activeCall, call.callkitUUID == callUUID {
func endCall(callUUID: String, completed: @escaping (Bool) -> Void) {
if let call = ChatModel.shared.activeCall, call.callUUID == callUUID {
endCall(call: call) { completed(true) }
} else if let invitation = getCallInvitation(callUUID) {
endCall(invitation: invitation) { completed(true) }
@@ -126,8 +126,8 @@ class CallManager {
}
}
private func getCallInvitation(_ callUUID: UUID) -> RcvCallInvitation? {
if let (_, invitation) = ChatModel.shared.callInvitations.first(where: { (_, inv) in inv.callkitUUID == callUUID }) {
private func getCallInvitation(_ callUUID: String) -> RcvCallInvitation? {
if let (_, invitation) = ChatModel.shared.callInvitations.first(where: { (_, inv) in inv.callUUID == callUUID }) {
return invitation
}
return nil
+3 -3
View File
@@ -18,7 +18,7 @@ class Call: ObservableObject, Equatable {
var direction: CallDirection
var contact: Contact
var callkitUUID: UUID?
var callUUID: String?
var localMedia: CallMediaType
@Published var callState: CallState
@Published var localCapabilities: CallCapabilities?
@@ -33,14 +33,14 @@ class Call: ObservableObject, Equatable {
init(
direction: CallDirection,
contact: Contact,
callkitUUID: UUID?,
callUUID: String?,
callState: CallState,
localMedia: CallMediaType,
sharedKey: String? = nil
) {
self.direction = direction
self.contact = contact
self.callkitUUID = callkitUUID
self.callUUID = callUUID
self.callState = callState
self.localMedia = localMedia
self.sharedKey = sharedKey
@@ -411,6 +411,15 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
}
func endCall() {
if #available(iOS 16.0, *) {
_endCall()
} else {
// Fixes `connection.close()` getting locked up in iOS15
DispatchQueue.global(qos: .utility).async { self._endCall() }
}
}
private func _endCall() {
guard let call = activeCall.wrappedValue else { return }
logger.debug("WebRTCClient: ending the call")
activeCall.wrappedValue = nil
+13 -5
View File
@@ -92,6 +92,7 @@ struct ChatInfoView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@Environment(\.dismiss) var dismiss: DismissAction
@ObservedObject var networkModel = NetworkModel.shared
@ObservedObject var chat: Chat
@State var contact: Contact
@State var localAlias: String
@@ -502,14 +503,14 @@ struct ChatInfoView: View {
.foregroundColor(theme.colors.primary)
.font(.system(size: 14))
Spacer()
Text(chatModel.contactNetworkStatus(contact).statusString)
Text(networkModel.contactNetworkStatus(contact).statusString)
.foregroundColor(theme.colors.secondary)
serverImage()
}
}
private func serverImage() -> some View {
let status = chatModel.contactNetworkStatus(contact)
let status = networkModel.contactNetworkStatus(contact)
return Image(systemName: status.imageName)
.foregroundColor(status == .connected ? .green : theme.colors.secondary)
.font(.system(size: 12))
@@ -557,7 +558,7 @@ struct ChatInfoView: View {
private func networkStatusAlert() -> Alert {
Alert(
title: Text("Network status"),
message: Text(chatModel.contactNetworkStatus(contact).statusExplanation)
message: Text(networkModel.contactNetworkStatus(contact).statusExplanation)
)
}
@@ -670,7 +671,14 @@ private struct CallButton: View {
InfoViewButton(image: image, title: title, disabledLook: !canCall, width: width) {
if canCall {
CallController.shared.startCall(contact, mediaType)
if CallController.useCallKit() {
CallController.shared.startCall(contact, mediaType)
} else {
// When CallKit is not used, colorscheme will be changed and it will be visible if not hiding sheets first
dismissAllSheets(animated: true) {
CallController.shared.startCall(contact, mediaType)
}
}
} else if contact.nextSendGrpInv {
showAlert(SomeAlert(
alert: mkAlert(
@@ -934,7 +942,7 @@ func syncConnectionForceAlert(_ syncConnectionForce: @escaping () -> Void) -> Al
)
}
func queueInfoText(_ info: (RcvMsgInfo?, QueueInfo)) -> String {
func queueInfoText(_ info: (RcvMsgInfo?, ServerQueueInfo)) -> String {
let (rcvMsgInfo, qInfo) = info
var msgInfo: String
if let rcvMsgInfo { msgInfo = encodeJSON(rcvMsgInfo) } else { msgInfo = "none" }
@@ -294,7 +294,6 @@ struct FramedItemView: View {
.padding(.horizontal, 12)
.overlay(DetermineWidth())
.frame(minWidth: 0, alignment: .leading)
.textSelection(.enabled)
if let mediaWidth = maxMediaWidth(), mediaWidth < maxWidth {
v.frame(maxWidth: mediaWidth, alignment: .leading)
@@ -97,7 +97,7 @@ struct ChatItemForwardingView: View {
)
} else {
composeState = ComposeState.init(forwardingItem: ci, fromChatInfo: fromChatInfo)
chatModel.chatId = chat.id
ItemsModel.shared.loadOpenChat(chat.id)
}
}
} label: {
@@ -351,7 +351,7 @@ struct ChatItemInfoView: View {
Button {
Task {
await MainActor.run {
chatModel.chatId = forwardedFromItem.chatInfo.id
ItemsModel.shared.loadOpenChat(forwardedFromItem.chatInfo.id)
dismiss()
}
}
+132 -118
View File
@@ -47,65 +47,69 @@ struct ChatView: View {
@State private var showDeleteSelectedMessages: Bool = false
@State private var allowToDeleteSelectedMessagesForAll: Bool = false
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
var body: some View {
if #available(iOS 16.0, *) {
let v = viewBody
.scrollDismissesKeyboard(.immediately)
.keyboardPadding()
if (searchMode) {
v.toolbarBackground(.thinMaterial, for: .navigationBar)
} else {
v.toolbarBackground(.visible, for: .navigationBar)
}
viewBody
.scrollDismissesKeyboard(.immediately)
.toolbarBackground(.hidden, for: .navigationBar)
} else {
viewBody
}
}
@ViewBuilder
private var viewBody: some View {
let cInfo = chat.chatInfo
return VStack(spacing: 0) {
if searchMode {
searchToolbar()
ZStack {
let wallpaperImage = theme.wallpaper.type.image
let wallpaperType = theme.wallpaper.type
let backgroundColor = theme.wallpaper.background ?? wallpaperType.defaultBackgroundColor(theme.base, theme.colors.background)
let tintColor = theme.wallpaper.tint ?? wallpaperType.defaultTintColor(theme.base)
Color.clear.ignoresSafeArea(.all)
.if(wallpaperImage != nil) { view in
view.modifier(
ChatViewBackground(image: wallpaperImage!, imageType: wallpaperType, background: backgroundColor, tint: tintColor)
)
}
VStack(spacing: 0) {
ZStack(alignment: .bottomTrailing) {
chatItemsList()
floatingButtons(counts: floatingButtonModel.unreadChatItemCounts)
}
connectingText()
if selectedChatItems == nil {
ComposeView(
chat: chat,
composeState: $composeState,
keyboardVisible: $keyboardVisible
)
.disabled(!cInfo.sendMsgEnabled)
} else {
SelectedItemsBottomToolbar(
chatItems: ItemsModel.shared.reversedChatItems,
selectedChatItems: $selectedChatItems,
chatInfo: chat.chatInfo,
deleteItems: { forAll in
allowToDeleteSelectedMessagesForAll = forAll
showDeleteSelectedMessages = true
},
moderateItems: {
if case let .group(groupInfo) = chat.chatInfo {
showModerateSelectedMessagesAlert(groupInfo)
}
}
)
}
}
}
.safeAreaInset(edge: .top) {
VStack(spacing: .zero) {
if searchMode { searchToolbar() }
Divider()
}
ZStack(alignment: .bottomTrailing) {
let wallpaperImage = theme.wallpaper.type.image
let wallpaperType = theme.wallpaper.type
let backgroundColor = theme.wallpaper.background ?? wallpaperType.defaultBackgroundColor(theme.base, theme.colors.background)
let tintColor = theme.wallpaper.tint ?? wallpaperType.defaultTintColor(theme.base)
chatItemsList()
.if(wallpaperImage != nil) { view in
view.modifier(
ChatViewBackground(image: wallpaperImage!, imageType: wallpaperType, background: backgroundColor, tint: tintColor)
)
}
floatingButtons(counts: floatingButtonModel.unreadChatItemCounts)
}
connectingText()
if selectedChatItems == nil {
ComposeView(
chat: chat,
composeState: $composeState,
keyboardVisible: $keyboardVisible
)
.disabled(!cInfo.sendMsgEnabled)
} else {
SelectedItemsBottomToolbar(
chatItems: ItemsModel.shared.reversedChatItems,
selectedChatItems: $selectedChatItems,
chatInfo: chat.chatInfo,
deleteItems: { forAll in
allowToDeleteSelectedMessagesForAll = forAll
showDeleteSelectedMessages = true
},
moderateItems: {
if case let .group(groupInfo) = chat.chatInfo {
showModerateSelectedMessagesAlert(groupInfo)
}
}
)
}
.background(ToolbarMaterial.material(toolbarMaterial))
}
.navigationTitle(cInfo.chatViewName)
.background(theme.colors.background)
@@ -125,16 +129,23 @@ struct ChatView: View {
}
}
}
.appSheet(item: $selectedMember) { member in
Group {
if case let .group(groupInfo) = chat.chatInfo {
GroupMemberInfoView(groupInfo: groupInfo, groupMember: member, navigation: true)
}
}
}
.onAppear {
loadChat(chat: chat)
initChatView()
selectedChatItems = nil
initChatView()
}
.onChange(of: chatModel.chatId) { cId in
showChatInfoSheet = false
selectedChatItems = nil
scrollModel.scrollToBottom()
stopAudioPlayer()
if let cId {
selectedChatItems = nil
if let c = chatModel.getChat(cId) {
chat = c
}
@@ -147,8 +158,10 @@ struct ChatView: View {
.onChange(of: revealedChatItem) { _ in
NotificationCenter.postReverseListNeedsLayout()
}
.onChange(of: im.reversedChatItems) { reversedChatItems in
if reversedChatItems.count <= loadItemsPerPage && filtered(reversedChatItems).count < 10 {
.onChange(of: im.isLoading) { isLoading in
if !isLoading,
im.reversedChatItems.count <= loadItemsPerPage,
filtered(im.reversedChatItems).count < 10 {
loadChatItems(chat.chatInfo)
}
}
@@ -157,7 +170,6 @@ struct ChatView: View {
VideoPlayerView.players.removeAll()
stopAudioPlayer()
if chatModel.chatId == cInfo.id && !presentationMode.wrappedValue.isPresented {
chatModel.chatId = nil
DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
if chatModel.chatId == nil {
chatModel.chatItemStatuses = [:]
@@ -184,7 +196,7 @@ struct ChatView: View {
} label: {
ChatInfoToolbar(chat: chat)
}
.appSheet(isPresented: $showChatInfoSheet) {
.appSheet(isPresented: $showChatInfoSheet, onDismiss: { theme = buildTheme() }) {
ChatInfoView(
chat: chat,
contact: contact,
@@ -217,6 +229,7 @@ struct ChatView: View {
}
}
ToolbarItem(placement: .navigationBarTrailing) {
let isLoading = im.isLoading && im.showLoadingProgress
if selectedChatItems != nil {
Button {
withAnimation {
@@ -239,19 +252,23 @@ struct ChatView: View {
}
}
Menu {
if callsPrefEnabled && chatModel.activeCall == nil {
Button {
CallController.shared.startCall(contact, .video)
} label: {
Label("Video call", systemImage: "video")
if !isLoading {
if callsPrefEnabled && chatModel.activeCall == nil {
Button {
CallController.shared.startCall(contact, .video)
} label: {
Label("Video call", systemImage: "video")
}
.disabled(!contact.ready || !contact.active)
}
.disabled(!contact.ready || !contact.active)
searchButton()
ToggleNtfsButton(chat: chat)
.disabled(!contact.ready || !contact.active)
}
searchButton()
ToggleNtfsButton(chat: chat)
.disabled(!contact.ready || !contact.active)
} label: {
Image(systemName: "ellipsis")
.tint(isLoading ? Color.clear : nil)
.overlay { if isLoading { ProgressView() } }
}
}
case let .group(groupInfo):
@@ -276,10 +293,14 @@ struct ChatView: View {
}
}
Menu {
searchButton()
ToggleNtfsButton(chat: chat)
if !isLoading {
searchButton()
ToggleNtfsButton(chat: chat)
}
} label: {
Image(systemName: "ellipsis")
.tint(isLoading ? Color.clear : nil)
.overlay { if isLoading { ProgressView() } }
}
}
case .local:
@@ -345,14 +366,11 @@ struct ChatView: View {
searchText = ""
searchMode = false
searchFocussed = false
DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
loadChat(chat: chat)
}
Task { await loadChat(chat: chat) }
}
}
.padding(.horizontal)
.padding(.vertical, 8)
.background(.thinMaterial)
}
private func voiceWithoutFrame(_ ci: ChatItem) -> Bool {
@@ -386,31 +404,42 @@ struct ChatView: View {
: voiceNoFrame
? (g.size.width - 32)
: (g.size.width - 32) * 0.84
return chatItemView(ci, maxWidth)
.onAppear {
floatingButtonModel.appeared(viewId: ci.viewId)
}
.onDisappear {
floatingButtonModel.disappeared(viewId: ci.viewId)
}
.id(ci.id) // Required to trigger `onAppear` on iOS15
return ChatItemWithMenu(
chat: $chat,
chatItem: ci,
maxWidth: maxWidth,
composeState: $composeState,
selectedMember: $selectedMember,
revealedChatItem: $revealedChatItem,
selectedChatItems: $selectedChatItems
)
.onAppear {
floatingButtonModel.appeared(viewId: ci.viewId)
}
.onDisappear {
floatingButtonModel.disappeared(viewId: ci.viewId)
}
.id(ci.id) // Required to trigger `onAppear` on iOS15
} loadPage: {
loadChatItems(cInfo)
}
.onTapGesture { hideKeyboard() }
.onChange(of: searchText) { _ in
loadChat(chat: chat, search: searchText)
}
.onChange(of: chatModel.chatId) { chatId in
if let chatId, let c = chatModel.getChat(chatId) {
chat = c
showChatInfoSheet = false
loadChat(chat: c)
.opacity(ItemsModel.shared.isLoading ? 0 : 1)
.padding(.vertical, -InvertedTableView.inset)
.onTapGesture { hideKeyboard() }
.onChange(of: searchText) { _ in
Task { await loadChat(chat: chat, search: searchText) }
}
.onChange(of: im.reversedChatItems) { _ in
floatingButtonModel.chatItemsChanged()
}
.onChange(of: im.itemAdded) { added in
if added {
im.itemAdded = false
if floatingButtonModel.unreadChatItemCounts.isReallyNearBottom {
scrollModel.scrollToBottom()
}
}
.onChange(of: im.reversedChatItems) { _ in
floatingButtonModel.chatItemsChanged()
}
}
}
}
@@ -443,19 +472,19 @@ struct ChatView: View {
init() {
unreadChatItemCounts = UnreadChatItemCounts(
isNearBottom: true,
isReallyNearBottom: true,
unreadBelow: 0
)
events
.receive(on: DispatchQueue.global(qos: .background))
.scan(Set<String>()) { itemsInView, event in
return switch event {
case let .appeared(viewId):
itemsInView.union([viewId])
case let .disappeared(viewId):
itemsInView.subtracting([viewId])
case .chatItemsChanged:
itemsInView
var updated = itemsInView
switch event {
case let .appeared(viewId): updated.insert(viewId)
case let .disappeared(viewId): updated.remove(viewId)
case .chatItemsChanged: ()
}
return updated
}
.map { ChatModel.shared.unreadChatItemCounts(itemsInView: $0) }
.removeDuplicates()
@@ -539,8 +568,8 @@ struct ChatView: View {
private func endCallButton(_ call: Call) -> some View {
Button {
if let uuid = call.callkitUUID {
CallController.shared.endCall(callUUID: uuid)
if CallController.useCallKit(), let callUUID = call.callUUID {
CallController.shared.endCall(callUUID: callUUID)
} else {
CallController.shared.endCall(call: call) {}
}
@@ -663,22 +692,10 @@ struct ChatView: View {
VoiceItemState.chatView = [:]
}
@ViewBuilder private func chatItemView(_ ci: ChatItem, _ maxWidth: CGFloat) -> some View {
ChatItemWithMenu(
chat: chat,
chatItem: ci,
maxWidth: maxWidth,
composeState: $composeState,
selectedMember: $selectedMember,
revealedChatItem: $revealedChatItem,
selectedChatItems: $selectedChatItems
)
}
private struct ChatItemWithMenu: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
@ObservedObject var chat: Chat
@Binding @ObservedObject var chat: Chat
let chatItem: ChatItem
let maxWidth: CGFloat
@Binding var composeState: ComposeState
@@ -708,7 +725,7 @@ struct ChatView: View {
Group {
if revealed, let range = range {
let items = Array(zip(Array(range), im.reversedChatItems[range]))
ForEach(items, id: \.1.viewId) { (i, ci) in
ForEach(items.reversed(), id: \.1.viewId) { (i, ci) in
let prev = i == prevHidden ? prevItem : im.reversedChatItems[i + 1]
chatItemView(ci, nil, prev)
.overlay {
@@ -806,8 +823,8 @@ struct ChatView: View {
HStack(alignment: .top, spacing: 8) {
MemberProfileImage(member, size: memberImageSize, backgroundColor: theme.colors.background)
.onTapGesture {
if m.membersLoaded {
selectedMember = m.getGroupMember(member.groupMemberId)
if let member = m.getGroupMember(member.groupMemberId) {
selectedMember = member
} else {
Task {
await m.loadGroupMembers(groupInfo) {
@@ -816,9 +833,6 @@ struct ChatView: View {
}
}
}
.appSheet(item: $selectedMember) { member in
GroupMemberInfoView(groupInfo: groupInfo, groupMember: member, navigation: true)
}
chatItemWithMenu(ci, range, maxWidth)
}
}
@@ -55,7 +55,7 @@ struct ComposeLinkView: View {
.foregroundColor(theme.colors.secondary)
}
.padding(.vertical, 5)
.frame(maxWidth: .infinity, minHeight: 60, maxHeight: 60)
.frame(maxWidth: .infinity, minHeight: 60)
}
}
}
@@ -281,6 +281,7 @@ struct ComposeView: View {
@State private var stopPlayback: Bool = false
@AppStorage(DEFAULT_PRIVACY_SAVE_LAST_DRAFT) private var saveLastDraft = true
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
var body: some View {
VStack(spacing: 0) {
@@ -381,7 +382,11 @@ struct ComposeView: View {
}
}
}
.background(.thinMaterial)
.background {
Color.clear
.overlay(ToolbarMaterial.material(toolbarMaterial))
.ignoresSafeArea(.all, edges: .bottom)
}
.onChange(of: composeState.message) { msg in
if composeState.linkPreviewAllowed {
if msg.count > 0 {
@@ -185,7 +185,6 @@ struct GroupChatInfoView: View {
logger.error("GroupChatInfoView apiGetGroupLink: \(responseError(error))")
}
}
.keyboardPadding()
}
private func groupInfoHeader() -> some View {
@@ -321,24 +321,24 @@ struct GroupMemberInfoView: View {
func knownDirectChatButton(_ chat: Chat, width: CGFloat) -> some View {
InfoViewButton(image: "message.fill", title: "message", width: width) {
dismissAllSheets(animated: true)
DispatchQueue.main.async {
chatModel.chatId = chat.id
ItemsModel.shared.loadOpenChat(chat.id) {
dismissAllSheets(animated: true)
}
}
}
func newDirectChatButton(_ contactId: Int64, width: CGFloat) -> some View {
InfoViewButton(image: "message.fill", title: "message", width: width) {
do {
let chat = try apiGetChat(type: .direct, id: contactId)
chatModel.addChat(chat)
dismissAllSheets(animated: true)
DispatchQueue.main.async {
chatModel.chatId = chat.id
Task {
do {
let chat = try await apiGetChat(type: .direct, id: contactId)
chatModel.addChat(chat)
ItemsModel.shared.loadOpenChat(chat.id) {
dismissAllSheets(animated: true)
}
} catch let error {
logger.error("openDirectChatButton apiGetChat error: \(responseError(error))")
}
} catch let error {
logger.error("openDirectChatButton apiGetChat error: \(responseError(error))")
}
}
}
@@ -352,9 +352,10 @@ struct GroupMemberInfoView: View {
await MainActor.run {
progressIndicator = false
chatModel.addChat(Chat(chatInfo: .direct(contact: memberContact)))
dismissAllSheets(animated: true)
chatModel.chatId = memberContact.id
chatModel.setContactNetworkStatus(memberContact, .connected)
ItemsModel.shared.loadOpenChat(memberContact.id) {
dismissAllSheets(animated: true)
}
NetworkModel.shared.setContactNetworkStatus(memberContact, .connected)
}
} catch let error {
logger.error("createMemberContactButton apiCreateMemberContact error: \(responseError(error))")
+49 -7
View File
@@ -11,7 +11,6 @@ import Combine
/// A List, which displays it's items in reverse order - from bottom to top
struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIViewControllerRepresentable {
let items: Array<Item>
@Binding var scrollState: ReverseListScrollModel<Item>.State
@@ -53,6 +52,7 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
super.init(style: .plain)
// 1. Style
tableView = InvertedTableView()
tableView.separatorStyle = .none
tableView.transform = .verticalFlip
tableView.backgroundColor = .clear
@@ -132,6 +132,11 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
NotificationCenter.default.post(name: .chatViewWillBeginScrolling, object: nil)
}
override func viewDidAppear(_ animated: Bool) {
tableView.clipsToBounds = false
parent?.viewIfLoaded?.clipsToBounds = false
}
/// Scrolls up
func scrollToNextPage() {
tableView.setContentOffset(
@@ -147,18 +152,23 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
/// Scrolls to Item at index path
/// - Parameter indexPath: Item to scroll to - will scroll to beginning of the list, if `nil`
func scroll(to index: Int?, position: UITableView.ScrollPosition) {
if let index {
var animated = false
if #available(iOS 16.0, *) {
animated = true
}
var animated = false
if #available(iOS 16.0, *) {
animated = true
}
if let index, tableView.numberOfRows(inSection: 0) != 0 {
tableView.scrollToRow(
at: IndexPath(row: index, section: 0),
at: position,
animated: animated
)
Task { representer.scrollState = .atDestination }
} else {
tableView.setContentOffset(
CGPoint(x: .zero, y: -InvertedTableView.inset),
animated: animated
)
}
Task { representer.scrollState = .atDestination }
}
func update(items: Array<Item>) {
@@ -170,6 +180,13 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
snapshot,
animatingDifferences: itemCount != 0 && abs(items.count - itemCount) == 1
)
// Sets content offset on initial load
if itemCount == 0 {
tableView.setContentOffset(
CGPoint(x: 0, y: -InvertedTableView.inset),
animated: false
)
}
itemCount = items.count
}
}
@@ -272,3 +289,28 @@ func withConditionalAnimation<Result>(
try body()
}
}
class InvertedTableView: UITableView {
static let inset = CGFloat(100)
static let insets = UIEdgeInsets(
top: inset,
left: .zero,
bottom: inset,
right: .zero
)
override var contentInsetAdjustmentBehavior: UIScrollView.ContentInsetAdjustmentBehavior {
get { .never }
set { }
}
override var contentInset: UIEdgeInsets {
get { Self.insets }
set { }
}
override var adjustedContentInset: UIEdgeInsets {
Self.insets
}
}
@@ -104,19 +104,22 @@ struct SelectedItemsBottomToolbar: View {
allButtonsDisabled = count == 0 || count > 20
canModerate = possibleToModerate(chatInfo)
if let selected = selectedItems {
(deleteEnabled, deleteForEveryoneEnabled, moderateEnabled, _, selectedChatItems) = chatItems.reduce((true, true, true, true, [])) { (r, ci) in
let me: Bool
let onlyOwnGroupItems: Bool
(deleteEnabled, deleteForEveryoneEnabled, me, onlyOwnGroupItems, selectedChatItems) = chatItems.reduce((true, true, true, true, [])) { (r, ci) in
if selected.contains(ci.id) {
var (de, dee, me, onlyOwnGroupItems, sel) = r
de = de && ci.canBeDeletedForSelf
dee = dee && ci.meta.deletable && !ci.localNote
onlyOwnGroupItems = onlyOwnGroupItems && ci.chatDir == .groupSnd
me = me && !onlyOwnGroupItems && ci.content.msgContent != nil && ci.memberToModerate(chatInfo) != nil
me = me && ci.content.msgContent != nil && ci.memberToModerate(chatInfo) != nil
sel.insert(ci.id) // we are collecting new selected items here to account for any changes in chat items list
return (de, dee, me, onlyOwnGroupItems, sel)
} else {
return r
}
}
moderateEnabled = me && !onlyOwnGroupItems
}
}
@@ -114,7 +114,7 @@ struct ChatListNavLink: View {
}
} else {
NavLinkPlain(
tag: chat.chatInfo.id,
chatId: chat.chatInfo.id,
selection: $chatModel.chatId,
label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) }
)
@@ -194,7 +194,7 @@ struct ChatListNavLink: View {
}
default:
NavLinkPlain(
tag: chat.chatInfo.id,
chatId: chat.chatInfo.id,
selection: $chatModel.chatId,
label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) },
disabled: !groupInfo.ready
@@ -221,7 +221,7 @@ struct ChatListNavLink: View {
@ViewBuilder private func noteFolderNavLink(_ noteFolder: NoteFolder) -> some View {
NavLinkPlain(
tag: chat.chatInfo.id,
chatId: chat.chatInfo.id,
selection: $chatModel.chatId,
label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) },
disabled: !noteFolder.ready
@@ -355,6 +355,7 @@ struct ChatListNavLink: View {
.tint(.red)
}
.frame(height: dynamicRowHeight)
.contentShape(Rectangle())
.onTapGesture { showContactRequestDialog = true }
.confirmationDialog("Accept connection request?", isPresented: $showContactRequestDialog, titleVisibility: .visible) {
Button("Accept") { Task { await acceptContactRequest(incognito: false, contactRequest: contactRequest) } }
@@ -392,6 +393,7 @@ struct ChatListNavLink: View {
}
}
}
.contentShape(Rectangle())
.onTapGesture {
showContactConnectionInfo = true
}
@@ -472,9 +474,7 @@ struct ChatListNavLink: View {
Task {
let ok = await connectContactViaAddress(contact.contactId, incognito, showAlert: { AlertManager.shared.showAlert($0) })
if ok {
await MainActor.run {
chatModel.chatId = contact.id
}
ItemsModel.shared.loadOpenChat(contact.id)
AlertManager.shared.showAlert(connReqSentAlert(.contact))
}
}
@@ -25,7 +25,7 @@ struct ChatListView: View {
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
@AppStorage(DEFAULT_ONE_HAND_UI_CARD_SHOWN) private var oneHandUICardShown = false
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.bar.rawValue
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
var body: some View {
if #available(iOS 16.0, *) {
@@ -40,7 +40,9 @@ struct ChatListView: View {
NavStackCompat(
isActive: Binding(
get: { chatModel.chatId != nil },
set: { _ in }
set: { active in
if !active { chatModel.chatId = nil }
}
),
destination: chatView
) { chatListView }
@@ -215,18 +217,35 @@ struct ChatListView: View {
.listRowSeparator(.hidden)
.listRowBackground(Color.clear)
}
ForEach(cs, id: \.viewId) { chat in
ChatListNavLink(chat: chat)
if #available(iOS 16.0, *) {
ForEach(cs, id: \.viewId) { chat in
ChatListNavLink(chat: chat)
.scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center)
.padding(.trailing, -16)
.disabled(chatModel.chatRunning != true || chatModel.deletedChats.contains(chat.chatInfo.id))
.listRowBackground(Color.clear)
}
.offset(x: -8)
} else {
ForEach(cs, id: \.viewId) { chat in
VStack(spacing: .zero) {
Divider()
.padding(.leading, 16)
ChatListNavLink(chat: chat)
.padding(.horizontal, 8)
.padding(.vertical, 6)
}
.scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center)
.padding(.trailing, -16)
.listRowSeparator(.hidden)
.listRowInsets(EdgeInsets())
.background { theme.colors.background } // Hides default list selection colour
.disabled(chatModel.chatRunning != true || chatModel.deletedChats.contains(chat.chatInfo.id))
.listRowBackground(Color.clear)
}
}
.offset(x: -8)
}
.listStyle(.plain)
.onChange(of: chatModel.chatId) { chId in
if chId == nil, let chatId = chatModel.chatToTop {
.onChange(of: chatModel.chatId) { currentChatId in
if let chatId = chatModel.chatToTop, currentChatId != chatId {
chatModel.chatToTop = nil
chatModel.popChat(chatId)
}
@@ -322,7 +341,7 @@ struct ChatListView: View {
struct SubsStatusIndicator: View {
@State private var subs: SMPServerSubs = SMPServerSubs.newSMPServerSubs
@State private var hasSess: Bool = false
@State private var timer: Timer? = nil
@State private var task: Task<Void, Never>?
@State private var showServersSummary = false
@AppStorage(DEFAULT_SHOW_SUBSCRIPTION_PERCENTAGE) private var showSubscriptionPercentage = false
@@ -339,11 +358,12 @@ struct SubsStatusIndicator: View {
}
}
}
.disabled(ChatModel.shared.chatRunning != true)
.onAppear {
startTimer()
startTask()
}
.onDisappear {
stopTimer()
stopTask()
}
.appSheet(isPresented: $showServersSummary) {
ServersSummaryView()
@@ -351,25 +371,28 @@ struct SubsStatusIndicator: View {
}
}
private func startTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
if AppChatState.shared.value == .active {
getSubsTotal()
private func startTask() {
task = Task {
while !Task.isCancelled {
if AppChatState.shared.value == .active {
do {
let (subs, hasSess) = try await getAgentSubsTotal()
await MainActor.run {
self.subs = subs
self.hasSess = hasSess
}
} catch let error {
logger.error("getSubsTotal error: \(responseError(error))")
}
}
try? await Task.sleep(nanoseconds: 1_000_000_000) // Sleep for 1 second
}
}
}
func stopTimer() {
timer?.invalidate()
timer = nil
}
private func getSubsTotal() {
do {
(subs, hasSess) = try getAgentSubsTotal()
} catch let error {
logger.error("getSubsTotal error: \(responseError(error))")
}
func stopTask() {
task?.cancel()
task = nil
}
}
@@ -495,21 +518,21 @@ func chatStoppedIcon() -> some View {
struct ChatListView_Previews: PreviewProvider {
static var previews: some View {
let chatModel = ChatModel()
chatModel.chats = [
Chat(
chatModel.updateChats([
ChatData(
chatInfo: ChatInfo.sampleData.direct,
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello")]
),
Chat(
ChatData(
chatInfo: ChatInfo.sampleData.group,
chatItems: [ChatItem.getSample(1, .directSnd, .now, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")]
),
Chat(
ChatData(
chatInfo: ChatInfo.sampleData.contactRequest,
chatItems: []
)
]
])
return Group {
ChatListView(showSettings: Binding.constant(false))
.environmentObject(chatModel)
@@ -376,17 +376,7 @@ struct ChatPreviewView: View {
switch chat.chatInfo {
case let .direct(contact):
if contact.active && contact.activeConn != nil {
switch (chatModel.contactNetworkStatus(contact)) {
case .connected: incognitoIcon(chat.chatInfo.incognito, theme.colors.secondary, size: size)
case .error:
Image(systemName: "exclamationmark.circle")
.resizable()
.scaledToFit()
.frame(width: dynamicChatInfoSize, height: dynamicChatInfoSize)
.foregroundColor(theme.colors.secondary)
default:
ProgressView()
}
NetworkStatusView(contact: contact, size: size)
} else {
incognitoIcon(chat.chatInfo.incognito, theme.colors.secondary, size: size)
}
@@ -400,6 +390,30 @@ struct ChatPreviewView: View {
incognitoIcon(chat.chatInfo.incognito, theme.colors.secondary, size: size)
}
}
struct NetworkStatusView: View {
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
@EnvironmentObject var theme: AppTheme
@ObservedObject var networkModel = NetworkModel.shared
let contact: Contact
let size: CGFloat
var body: some View {
let dynamicChatInfoSize = dynamicSize(userFont).chatInfoSize
switch (networkModel.contactNetworkStatus(contact)) {
case .connected: incognitoIcon(contact.contactConnIncognito, theme.colors.secondary, size: size)
case .error:
Image(systemName: "exclamationmark.circle")
.resizable()
.scaledToFit()
.frame(width: dynamicChatInfoSize, height: dynamicChatInfoSize)
.foregroundColor(theme.colors.secondary)
default:
ProgressView()
}
}
}
}
@ViewBuilder func incognitoIcon(_ incognito: Bool, _ secondaryColor: Color, size: CGFloat) -> some View {
@@ -16,7 +16,6 @@ struct ContactConnectionView: View {
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
@State private var localAlias = ""
@FocusState private var aliasTextFieldFocused: Bool
@State private var showContactConnectionInfo = false
var body: some View {
if case let .contactConnection(conn) = chat.chatInfo {
@@ -32,7 +31,6 @@ struct ContactConnectionView: View {
.scaledToFill()
.frame(width: 48, height: 48)
.foregroundColor(Color(uiColor: .tertiarySystemGroupedBackground).asAnotherColorFromSecondaryVariant(theme))
.onTapGesture { showContactConnectionInfo = true }
}
.frame(width: 63, height: 63)
.padding(.leading, 4)
@@ -72,9 +70,6 @@ struct ContactConnectionView: View {
Spacer()
}
.frame(maxHeight: .infinity)
.appSheet(isPresented: $showContactConnectionInfo) {
ContactConnectionInfo(contactConnection: contactConnection)
}
}
}
}
@@ -407,12 +407,18 @@ struct ServersSummaryView: View {
struct SubscriptionStatusIndicatorView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
var subs: SMPServerSubs
var hasSess: Bool
var body: some View {
let onionHosts = networkUseOnionHostsGroupDefault.get()
let (color, variableValue, opacity, _) = subscriptionStatusColorAndPercentage(m.networkInfo.online, onionHosts, subs, hasSess)
let (color, variableValue, opacity, _) = subscriptionStatusColorAndPercentage(
online: m.networkInfo.online,
usesProxy: networkUseOnionHostsGroupDefault.get() != .no || groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY) != nil,
subs: subs,
hasSess: hasSess,
primaryColor: theme.colors.primary
)
if #available(iOS 16.0, *) {
Image(systemName: "dot.radiowaves.up.forward", variableValue: variableValue)
.foregroundColor(color)
@@ -425,26 +431,32 @@ struct SubscriptionStatusIndicatorView: View {
struct SubscriptionStatusPercentageView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
var subs: SMPServerSubs
var hasSess: Bool
var body: some View {
let onionHosts = networkUseOnionHostsGroupDefault.get()
let (_, _, _, statusPercent) = subscriptionStatusColorAndPercentage(m.networkInfo.online, onionHosts, subs, hasSess)
let (_, _, _, statusPercent) = subscriptionStatusColorAndPercentage(
online: m.networkInfo.online,
usesProxy: networkUseOnionHostsGroupDefault.get() != .no || groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY) != nil,
subs: subs,
hasSess: hasSess,
primaryColor: theme.colors.primary
)
Text(verbatim: "\(Int(floor(statusPercent * 100)))%")
.foregroundColor(.secondary)
.font(.caption)
}
}
func subscriptionStatusColorAndPercentage(_ online: Bool, _ onionHosts: OnionHosts, _ subs: SMPServerSubs, _ hasSess: Bool) -> (Color, Double, Double, Double) {
func subscriptionStatusColorAndPercentage(online: Bool, usesProxy: Bool, subs: SMPServerSubs, hasSess: Bool, primaryColor: Color) -> (Color, Double, Double, Double) {
func roundedToQuarter(_ n: Double) -> Double {
n >= 1 ? 1
: n <= 0 ? 0
: (n * 4).rounded() / 4
}
let activeColor: Color = onionHosts == .require ? .indigo : .accentColor
let activeColor: Color = usesProxy ? .indigo : primaryColor
let noConnColorAndPercent: (Color, Double, Double, Double) = (Color(uiColor: .tertiaryLabel), 1, 1, 0)
let activeSubsRounded = roundedToQuarter(subs.shareOfActive)
@@ -85,15 +85,18 @@ struct UserPicker: View {
.padding(8)
.opacity(userPickerVisible ? 1.0 : 0.0)
.onAppear {
do {
// This check prevents the call of listUsers after the app is suspended, and the database is closed.
if case .active = scenePhase {
m.users = try listUsers()
}
} catch let error {
logger.error("Error loading users \(responseError(error))")
}
}
// This check prevents the call of listUsers after the app is suspended, and the database is closed.
if case .active = scenePhase {
Task {
do {
let users = try await listUsersAsync()
await MainActor.run { m.users = users }
} catch {
logger.error("Error loading users \(responseError(error))")
}
}
}
}
}
private func userView(_ u: UserInfo) -> some View {
@@ -56,7 +56,7 @@ struct ContactListNavLink: View {
func recentContactNavLink(_ contact: Contact) -> some View {
Button {
dismissAllSheets(animated: true) {
ChatModel.shared.chatId = contact.id
ItemsModel.shared.loadOpenChat(contact.id)
}
} label: {
contactPreview(contact, titleColor: theme.colors.onBackground)
@@ -82,11 +82,8 @@ struct ContactListNavLink: View {
Button {
Task {
await MainActor.run {
var updatedContact = contact
updatedContact.chatDeleted = false
ChatModel.shared.updateContact(updatedContact)
dismissAllSheets(animated: true) {
ChatModel.shared.chatId = contact.id
ItemsModel.shared.loadOpenChat(contact.id)
}
}
}
@@ -191,9 +188,7 @@ struct ContactListNavLink: View {
Task {
let ok = await connectContactViaAddress(contact.contactId, incognito, showAlert: { alert = SomeAlert(alert: $0, id: "ContactListNavLink connectContactViaAddress") })
if ok {
await MainActor.run {
ChatModel.shared.chatId = contact.id
}
ItemsModel.shared.loadOpenChat(contact.id)
DispatchQueue.main.async {
dismissAllSheets(animated: true) {
AlertManager.shared.showAlert(connReqSentAlert(.contact))
@@ -491,7 +491,7 @@ struct DatabaseView: View {
appFilesCountAndSize = directoryFileCountAndSize(getAppFilesDirectory())
do {
let chats = try apiGetChats()
m.updateChats(with: chats)
m.updateChats(chats)
} catch let error {
logger.error("apiGetChats: cannot update chats \(responseError(error))")
}
+8 -2
View File
@@ -8,15 +8,21 @@
import SwiftUI
class AppSheetState: ObservableObject {
static let shared = AppSheetState()
@Published var scenePhaseActive: Bool = false
}
private struct PrivacySensitive: ViewModifier {
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
@Environment(\.scenePhase) var scenePhase
// Screen protection doesn't work for appSheet on iOS 16 if @Environment(\.scenePhase) is used instead of global state
@ObservedObject var appSheetState: AppSheetState = AppSheetState.shared
func body(content: Content) -> some View {
if !protectScreen {
content
} else {
content.privacySensitive(scenePhase != .active).redacted(reason: .privacy)
content.privacySensitive(!appSheetState.scenePhaseActive).redacted(reason: .privacy)
}
}
}
@@ -11,13 +11,22 @@ import SwiftUI
import SimpleXChat
struct ChatViewBackground: ViewModifier {
@EnvironmentObject var theme: AppTheme
@Environment(\.colorScheme) var colorScheme
var image: Image
var imageType: WallpaperType
var background: Color
var tint: Color
func body(content: Content) -> some View {
// Workaround a problem (SwiftUI bug?) when wallpaper is not updated when user changes global theme in iOS settings from dark to light and vice versa
if colorScheme == .light {
back(content)
} else {
back(content)
}
}
func back(_ content: Content) -> some View {
content.background(
Canvas { context, size in
var image = context.resolve(image)
@@ -81,7 +90,7 @@ struct ChatViewBackground: ViewModifier {
case WallpaperType.empty: ()
}
}
)
).ignoresSafeArea(.all)
}
}
@@ -91,7 +100,7 @@ extension PresetWallpaper {
scale
} else if let type = ChatModel.shared.currentUser?.uiThemes?.preferredMode(base.mode == DefaultThemeMode.dark)?.wallpaper?.toAppWallpaper().type, type.sameType(WallpaperType.preset(filename, nil)) {
type.scale
} else if let scale = themeOverridesDefault.get().first(where: { $0.wallpaper != nil && $0.wallpaper!.preset == filename })?.wallpaper?.scale {
} else if let scale = themeOverridesDefault.get().first(where: { $0.wallpaper != nil && $0.wallpaper!.preset == filename && $0.base == base })?.wallpaper?.scale {
scale
} else {
Float(1.0)
@@ -1,21 +0,0 @@
//
// KeyboardPadding.swift
// SimpleX (iOS)
//
// Created by Evgeny on 10/07/2023.
// Copyright © 2023 SimpleX Chat. All rights reserved.
//
import SwiftUI
extension View {
@ViewBuilder func keyboardPadding() -> some View {
if #available(iOS 17.0, *) {
GeometryReader { g in
self.padding(.bottom, max(0, ChatModel.shared.keyboardHeight - g.safeAreaInsets.bottom))
}
} else {
self
}
}
}
@@ -7,16 +7,17 @@
//
import SwiftUI
import SimpleXChat
struct NavLinkPlain<V: Hashable, Label: View>: View {
@State var tag: V
@Binding var selection: V?
struct NavLinkPlain<Label: View>: View {
let chatId: ChatId
@Binding var selection: ChatId?
@ViewBuilder var label: () -> Label
var disabled = false
var body: some View {
ZStack {
Button("") { DispatchQueue.main.async { selection = tag } }
Button("") { ItemsModel.shared.loadOpenChat(chatId) }
.disabled(disabled)
label()
}
@@ -17,7 +17,9 @@ struct NavStackCompat <C: View, D: View>: View {
if #available(iOS 16, *) {
NavigationStack(path: Binding(
get: { isActive.wrappedValue ? [true] : [] },
set: { _ in }
set: { path in
if path.isEmpty { isActive.wrappedValue = false }
}
)) {
ZStack {
NavigationLink(value: true) { EmptyView() }
@@ -65,7 +65,7 @@ struct LocalAuthView: View {
// Clear sensitive data on screen just in case app fails to hide its views while new database is created
m.chatId = nil
ItemsModel.shared.reversedChatItems = []
m.chats = []
m.updateChats([])
m.users = []
_ = kcAppPassword.set(password)
_ = kcSelfDestructPassword.remove()
@@ -24,6 +24,7 @@ private enum MigrationFromState: Equatable {
}
private enum MigrateFromDeviceViewAlert: Identifiable {
case finishMigration(_ fileId: Int64, _ ctrl: chat_ctrl)
case deleteChat(_ title: LocalizedStringKey = "Delete chat profile?", _ text: LocalizedStringKey = "This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost.")
case startChat(_ title: LocalizedStringKey = "Start chat?", _ text: LocalizedStringKey = "Warning: starting chat on multiple devices is not supported and will cause message delivery failures")
@@ -38,6 +39,7 @@ private enum MigrateFromDeviceViewAlert: Identifiable {
var id: String {
switch self {
case .finishMigration: return "finishMigration"
case let .deleteChat(title, text): return "\(title) \(text)"
case let .startChat(title, text): return "\(title) \(text)"
@@ -138,6 +140,15 @@ struct MigrateFromDevice: View {
}
.alert(item: $alert) { alert in
switch alert {
case let .finishMigration(fileId, ctrl):
return Alert(
title: Text("Remove archive?"),
message: Text("The uploaded database archive will be permanently removed from the servers."),
primaryButton: .destructive(Text("Continue")) {
finishMigration(fileId, ctrl)
},
secondaryButton: .cancel()
)
case let .startChat(title, text):
return Alert(
title: Text(title),
@@ -318,7 +329,7 @@ struct MigrateFromDevice: View {
Text("Cancel migration").foregroundColor(.red)
}
}
Button(action: { finishMigration(fileId, ctrl) }) {
Button(action: { alert = .finishMigration(fileId, ctrl) }) {
settingsRow("checkmark", color: theme.colors.secondary) {
Text("Finalize migration").foregroundColor(theme.colors.primary)
}
@@ -523,9 +534,15 @@ struct MigrateFromDevice: View {
}
case let .sndStandaloneFileComplete(_, fileTransferMeta, rcvURIs):
let cfg = getNetCfg()
let proxy: NetworkProxy? = if cfg.socksProxy == nil {
nil
} else {
networkProxyDefault.get()
}
let data = MigrationFileLinkData.init(
networkConfig: MigrationFileLinkData.NetworkConfig(
socksProxy: cfg.socksProxy,
networkProxy: proxy,
hostMode: cfg.hostMode,
requiredHostMode: cfg.requiredHostMode
)
@@ -93,7 +93,6 @@ struct MigrateToDevice: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
@Environment(\.dismiss) var dismiss: DismissAction
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@Binding var migrationState: MigrationToState?
@State private var useKeychain = storeDBPassphraseGroupDefault.get()
@State private var alert: MigrateToDeviceViewAlert?
@@ -102,6 +101,7 @@ struct MigrateToDevice: View {
// Prevent from hiding the view until migration is finished or app deleted
@State private var backDisabled: Bool = false
@State private var showQRCodeScanner: Bool = true
@State private var pasteboardHasStrings = UIPasteboard.general.hasStrings
var body: some View {
VStack {
@@ -197,10 +197,8 @@ struct MigrateToDevice: View {
}
}
}
if developerTools {
Section(header: Text("Or paste archive link").foregroundColor(theme.colors.secondary)) {
pasteLinkView()
}
Section(header: Text("Or paste archive link").foregroundColor(theme.colors.secondary)) {
pasteLinkView()
}
}
}
@@ -218,7 +216,7 @@ struct MigrateToDevice: View {
} label: {
Text("Tap to paste link")
}
.disabled(!ChatModel.shared.pasteboardHasStrings)
.disabled(!pasteboardHasStrings)
.frame(maxWidth: .infinity, alignment: .center)
}
@@ -487,6 +485,9 @@ struct MigrateToDevice: View {
do {
if !hasChatCtrl() {
chatInitControllerRemovingDatabases()
} else if ChatModel.shared.chatRunning == true {
// cannot delete storage if chat is running
try await apiStopChat()
}
try await apiDeleteStorage()
try? FileManager.default.createDirectory(at: getWallpaperDirectory(), withIntermediateDirectories: true)
@@ -556,11 +557,22 @@ struct MigrateToDevice: View {
do {
try? FileManager.default.removeItem(at: getMigrationTempFilesDirectory())
MigrationToDeviceState.save(nil)
appSettings.importIntoApp()
try SimpleX.startChat(refreshInvitations: true)
AlertManager.shared.showAlertMsg(title: "Chat migrated!", message: "Finalize migration on another device.")
try ObjC.catchException {
appSettings.importIntoApp()
}
do {
try SimpleX.startChat(refreshInvitations: true)
AlertManager.shared.showAlertMsg(title: "Chat migrated!", message: "Finalize migration on another device.")
} catch let error {
AlertManager.shared.showAlert(Alert(title: Text("Error starting chat"), message: Text(responseError(error))))
}
} catch let error {
AlertManager.shared.showAlert(Alert(title: Text("Error starting chat"), message: Text(responseError(error))))
logger.error("Error importing settings: \(error.localizedDescription)")
AlertManager.shared.showAlert(
Alert(
title: Text("Error migrating settings"),
message: Text ("Not all settings were migrated. Repeat migration if you need them.") + Text("\n\n") + Text(responseError(error)))
)
}
hideView()
}
@@ -37,7 +37,7 @@ struct AddGroupView: View {
) { _ in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
dismissAllSheets(animated: true) {
m.chatId = groupInfo.id
ItemsModel.shared.loadOpenChat(groupInfo.id)
}
}
}
@@ -52,14 +52,14 @@ struct AddGroupView: View {
) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
dismissAllSheets(animated: true) {
m.chatId = groupInfo.id
ItemsModel.shared.loadOpenChat(groupInfo.id)
}
}
}
.navigationBarTitle("Group link")
}
} else {
createGroupView().keyboardPadding()
createGroupView()
}
}
@@ -61,18 +61,39 @@ struct NewChatSheet: View {
@State private var searchShowingSimplexLink = false
@State private var searchChatFilteredBySimplexLink: String? = nil
@Binding var alert: SomeAlert?
// Sheet height management
@State private var isAddContactActive = false
@State private var isScanPasteLinkActive = false
@State private var isLargeSheet = false
@State private var allowSmallSheet = true
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
var body: some View {
NavigationView {
viewBody()
.navigationTitle("New Chat")
let showArchive = !filterContactTypes(chats: chatModel.chats, contactTypes: [.chatDeleted]).isEmpty
let v = NavigationView {
viewBody(showArchive)
.navigationTitle("New message")
.navigationBarTitleDisplayMode(.large)
.navigationBarHidden(searchMode)
.modifier(ThemedBackground(grouped: true))
}
if #available(iOS 16.0, *), oneHandUI {
let sheetHeight: CGFloat = showArchive ? 575 : 500
v.presentationDetents(
allowSmallSheet ? [.height(sheetHeight), .large] : [.large],
selection: Binding(
get: { isLargeSheet || !allowSmallSheet ? .large : .height(sheetHeight) },
set: { isLargeSheet = $0 == .large }
)
)
} else {
v
}
}
@ViewBuilder private func viewBody() -> some View {
@ViewBuilder private func viewBody(_ showArchive: Bool) -> some View {
List {
HStack {
ContactsListSearchBar(
@@ -90,21 +111,25 @@ struct NewChatSheet: View {
if (searchText.isEmpty) {
Section {
NavigationLink {
NavigationLink(isActive: $isAddContactActive) {
NewChatView(selection: .invite, parentAlert: $alert)
.navigationTitle("New chat")
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
} label: {
Label("Add contact", systemImage: "link.badge.plus")
navigateOnTap(Label("Add contact", systemImage: "link.badge.plus")) {
isAddContactActive = true
}
}
NavigationLink {
NavigationLink(isActive: $isScanPasteLinkActive) {
NewChatView(selection: .connect, showQRCodeScanner: true, parentAlert: $alert)
.navigationTitle("New chat")
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
} label: {
Label("Scan / Paste link", systemImage: "qrcode")
navigateOnTap(Label("Scan / Paste link", systemImage: "qrcode")) {
isScanPasteLinkActive = true
}
}
NavigationLink {
AddGroupView()
@@ -116,7 +141,7 @@ struct NewChatSheet: View {
}
}
if (!filterContactTypes(chats: chatModel.chats, contactTypes: [.chatDeleted]).isEmpty) {
if (showArchive) {
Section {
NavigationLink {
DeletedChats()
@@ -140,6 +165,22 @@ struct NewChatSheet: View {
}
}
/// Extends label's tap area to match `.insetGrouped` list row insets
private func navigateOnTap<L: View>(_ label: L, setActive: @escaping () -> Void) -> some View {
label
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.leading, 16).padding(.vertical, 8).padding(.trailing, 32)
.contentShape(Rectangle())
.onTapGesture {
isLargeSheet = true
DispatchQueue.main.async {
allowSmallSheet = false
setActive()
}
}
.padding(.leading, -16).padding(.vertical, -8).padding(.trailing, -32)
}
func newChatActionButton<Content : View>(_ icon: String, color: Color/* = .secondary*/, content: @escaping () -> Content) -> some View {
ZStack(alignment: .leading) {
Image(systemName: icon)
@@ -158,7 +199,7 @@ func chatContactType(chat: Chat) -> ContactType {
case .contactRequest:
return .request
case let .direct(contact):
if contact.activeConn == nil && contact.profile.contactLink != nil {
if contact.activeConn == nil && contact.profile.contactLink != nil && contact.active {
return .card
} else if contact.chatDeleted {
return .chatDeleted
@@ -296,6 +296,7 @@ private struct ConnectView: View {
@Binding var pastedLink: String
@Binding var alert: NewChatViewAlert?
@State private var sheet: PlanAndConnectActionSheet?
@State private var pasteboardHasStrings = UIPasteboard.general.hasStrings
var body: some View {
List {
@@ -332,7 +333,7 @@ private struct ConnectView: View {
} label: {
Text("Tap to paste link")
}
.disabled(!ChatModel.shared.pasteboardHasStrings)
.disabled(!pasteboardHasStrings)
.frame(maxWidth: .infinity, alignment: .center)
} else {
linkTextView(pastedLink)
@@ -898,11 +899,11 @@ func openKnownContact(_ contact: Contact, dismiss: Bool, showAlreadyExistsAlert:
DispatchQueue.main.async {
if dismiss {
dismissAllSheets(animated: true) {
m.chatId = c.id
ItemsModel.shared.loadOpenChat(c.id)
showAlreadyExistsAlert?()
}
} else {
m.chatId = c.id
ItemsModel.shared.loadOpenChat(c.id)
showAlreadyExistsAlert?()
}
}
@@ -917,11 +918,11 @@ func openKnownGroup(_ groupInfo: GroupInfo, dismiss: Bool, showAlreadyExistsAler
DispatchQueue.main.async {
if dismiss {
dismissAllSheets(animated: true) {
m.chatId = g.id
ItemsModel.shared.loadOpenChat(g.id)
showAlreadyExistsAlert?()
}
} else {
m.chatId = g.id
ItemsModel.shared.loadOpenChat(g.id)
showAlreadyExistsAlert?()
}
}
@@ -77,7 +77,6 @@ struct CreateProfile: View {
focusDisplayName = true
}
}
.keyboardPadding()
}
}
@@ -128,7 +127,6 @@ struct CreateFirstProfile: View {
}
.padding()
.frame(maxWidth: .infinity, alignment: .leading)
.keyboardPadding()
}
func onboardingButtons() -> some View {
@@ -36,6 +36,10 @@ struct AdvancedNetworkSettings: View {
@State private var showSettingsAlert: NetworkSettingsAlert?
@State private var onionHosts: OnionHosts = .no
@State private var showSaveDialog = false
@State private var netProxy = networkProxyDefault.get()
@State private var currentNetProxy = networkProxyDefault.get()
@State private var useNetProxy = false
@State private var netProxyAuth = false
var body: some View {
VStack {
@@ -102,6 +106,76 @@ struct AdvancedNetworkSettings: View {
.foregroundColor(theme.colors.secondary)
}
Section {
Toggle("Use SOCKS proxy", isOn: $useNetProxy)
Group {
TextField("IP address", text: $netProxy.host)
TextField(
"Port",
text: Binding(
get: { netProxy.port > 0 ? "\(netProxy.port)" : "" },
set: { s in
netProxy.port = if let port = Int(s), port > 0 {
port
} else {
0
}
}
)
)
Toggle("Proxy requires password", isOn: $netProxyAuth)
if netProxyAuth {
TextField("Username", text: $netProxy.username)
PassphraseField(
key: $netProxy.password,
placeholder: "Password",
valid: NetworkProxy.validCredential(netProxy.password)
)
}
}
.if(!useNetProxy) { $0.foregroundColor(theme.colors.secondary) }
.disabled(!useNetProxy)
} header: {
HStack {
Text("SOCKS proxy").foregroundColor(theme.colors.secondary)
if useNetProxy && !netProxy.valid {
Spacer()
Image(systemName: "exclamationmark.circle.fill").foregroundColor(.red)
}
}
} footer: {
if netProxyAuth {
Text("Your credentials may be sent unencrypted.")
.foregroundColor(theme.colors.secondary)
} else {
Text("Do not use credentials with proxy.")
.foregroundColor(theme.colors.secondary)
}
}
.onChange(of: useNetProxy) { useNetProxy in
netCfg.socksProxy = useNetProxy && currentNetProxy.valid
? currentNetProxy.toProxyString()
: nil
netProxy = currentNetProxy
netProxyAuth = netProxy.username != "" || netProxy.password != ""
}
.onChange(of: netProxyAuth) { netProxyAuth in
if netProxyAuth {
netProxy.auth = currentNetProxy.auth
netProxy.username = currentNetProxy.username
netProxy.password = currentNetProxy.password
} else {
netProxy.auth = .username
netProxy.username = ""
netProxy.password = ""
}
}
.onChange(of: netProxy) { netProxy in
netCfg.socksProxy = useNetProxy && netProxy.valid
? netProxy.toProxyString()
: nil
}
Section {
Picker("Use .onion hosts", selection: $onionHosts) {
ForEach(OnionHosts.values, id: \.self) { Text($0.text) }
@@ -156,19 +230,19 @@ struct AdvancedNetworkSettings: View {
Section {
Button("Reset to defaults") {
updateNetCfgView(NetCfg.defaults)
updateNetCfgView(NetCfg.defaults, NetworkProxy.def)
}
.disabled(netCfg == NetCfg.defaults)
Button("Set timeouts for proxy/VPN") {
updateNetCfgView(netCfg.withProxyTimeouts)
updateNetCfgView(netCfg.withProxyTimeouts, netProxy)
}
.disabled(netCfg.hasProxyTimeouts)
Button("Save and reconnect") {
showSettingsAlert = .update
}
.disabled(netCfg == currentNetCfg)
.disabled(netCfg == currentNetCfg || (useNetProxy && !netProxy.valid))
}
}
}
@@ -182,7 +256,8 @@ struct AdvancedNetworkSettings: View {
if cfgLoaded { return }
cfgLoaded = true
currentNetCfg = getNetCfg()
updateNetCfgView(currentNetCfg)
currentNetProxy = networkProxyDefault.get()
updateNetCfgView(currentNetCfg, currentNetProxy)
}
.alert(item: $showSettingsAlert) { a in
switch a {
@@ -206,7 +281,7 @@ struct AdvancedNetworkSettings: View {
if netCfg == currentNetCfg {
dismiss()
cfgLoaded = false
} else {
} else if !useNetProxy || netProxy.valid {
showSaveDialog = true
}
})
@@ -221,18 +296,26 @@ struct AdvancedNetworkSettings: View {
}
}
private func updateNetCfgView(_ cfg: NetCfg) {
private func updateNetCfgView(_ cfg: NetCfg, _ proxy: NetworkProxy) {
netCfg = cfg
netProxy = proxy
onionHosts = OnionHosts(netCfg: netCfg)
enableKeepAlive = netCfg.enableKeepAlive
keepAliveOpts = netCfg.tcpKeepAlive ?? KeepAliveOpts.defaults
useNetProxy = netCfg.socksProxy != nil
netProxyAuth = switch netProxy.auth {
case .username: netProxy.username != "" || netProxy.password != ""
case .isolate: false
}
}
private func saveNetCfg() -> Bool {
do {
try setNetworkConfig(netCfg)
currentNetCfg = netCfg
setNetCfg(netCfg)
setNetCfg(netCfg, networkProxy: useNetProxy ? netProxy : nil)
currentNetProxy = netProxy
networkProxyDefault.set(netProxy)
return true
} catch let error {
let err = responseError(error)
@@ -19,9 +19,15 @@ extension AppSettings {
val.hostMode = .publicHost
val.requiredHostMode = true
}
val.socksProxy = nil
setNetCfg(val)
if val.socksProxy != nil {
val.socksProxy = networkProxy?.toProxyString()
setNetCfg(val, networkProxy: networkProxy)
} else {
val.socksProxy = nil
setNetCfg(val, networkProxy: nil)
}
}
if let val = networkProxy { networkProxyDefault.set(val) }
if let val = privacyEncryptLocalFiles { privacyEncryptLocalFilesGroupDefault.set(val) }
if let val = privacyAskToApproveRelays { privacyAskToApproveRelaysGroupDefault.set(val) }
if let val = privacyAcceptImages {
@@ -52,10 +58,10 @@ extension AppSettings {
profileImageCornerRadiusGroupDefault.set(val)
def.setValue(val, forKey: DEFAULT_PROFILE_IMAGE_CORNER_RADIUS)
}
if let val = uiColorScheme { def.setValue(val, forKey: DEFAULT_CURRENT_THEME) }
if let val = uiDarkColorScheme { def.setValue(val, forKey: DEFAULT_SYSTEM_DARK_THEME) }
if let val = uiCurrentThemeIds { def.setValue(val, forKey: DEFAULT_CURRENT_THEME_IDS) }
if let val = uiThemes { def.setValue(val.skipDuplicates(), forKey: DEFAULT_THEME_OVERRIDES) }
if let val = uiColorScheme { currentThemeDefault.set(val) }
if let val = uiDarkColorScheme { systemDarkThemeDefault.set(val) }
if let val = uiCurrentThemeIds { currentThemeIdsDefault.set(val) }
if let val = uiThemes { themeOverridesDefault.set(val.skipDuplicates()) }
if let val = oneHandUI { groupDefaults.setValue(val, forKey: GROUP_DEFAULT_ONE_HAND_UI) }
}
@@ -63,6 +69,7 @@ extension AppSettings {
let def = UserDefaults.standard
var c = AppSettings.defaults
c.networkConfig = getNetCfg()
c.networkProxy = networkProxyDefault.get()
c.privacyEncryptLocalFiles = privacyEncryptLocalFilesGroupDefault.get()
c.privacyAskToApproveRelays = privacyAskToApproveRelaysGroupDefault.get()
c.privacyAcceptImages = privacyAcceptImagesGroupDefault.get()
@@ -32,10 +32,9 @@ struct AppearanceSettings: View {
if currentThemeDefault.get() == DefaultTheme.SYSTEM_THEME_NAME { nil as DefaultThemeMode? } else { CurrentColors.base.mode }
}()
@State private var darkModeTheme: String = UserDefaults.standard.string(forKey: DEFAULT_SYSTEM_DARK_THEME) ?? DefaultTheme.DARK.themeName
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var profileImageCornerRadius = defaultProfileImageCorner
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.bar.rawValue
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
@State var themeUserDestination: (Int64, ThemeModeOverrides?)? = {
if let currentUser = ChatModel.shared.currentUser, let uiThemes = currentUser.uiThemes, uiThemes.preferredMode(!CurrentColors.colors.isLight) != nil {
@@ -67,14 +66,12 @@ struct AppearanceSettings: View {
Section("Chat list") {
Toggle("Reachable chat toolbar", isOn: $oneHandUI)
if developerTools {
Picker("Toolbar opacity", selection: $toolbarMaterial) {
ForEach(ToolbarMaterial.allCases, id: \.rawValue) { tm in
Text(tm.text).tag(tm.rawValue)
}
Picker("Toolbar opacity", selection: $toolbarMaterial) {
ForEach(ToolbarMaterial.allCases, id: \.rawValue) { tm in
Text(tm.text).tag(tm.rawValue)
}
.frame(height: 36)
}
.frame(height: 36)
}
Section {
@@ -318,6 +315,8 @@ enum ToolbarMaterial: String, CaseIterable {
ToolbarMaterial(rawValue: s)?.material ?? Material.bar
}
static let defaultMaterial: String = ToolbarMaterial.regular.rawValue
var material: Material {
switch self {
case .bar: .bar
@@ -73,6 +73,8 @@ let DEFAULT_SYSTEM_DARK_THEME = "systemDarkTheme"
let DEFAULT_CURRENT_THEME_IDS = "currentThemeIds"
let DEFAULT_THEME_OVERRIDES = "themeOverrides"
let DEFAULT_NETWORK_PROXY = "networkProxy"
let ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN = "androidCallOnLockScreen"
let appDefaults: [String: Any] = [
@@ -99,7 +101,7 @@ let appDefaults: [String: Any] = [
DEFAULT_ENCRYPTION_STARTED: false,
DEFAULT_PROFILE_IMAGE_CORNER_RADIUS: defaultProfileImageCorner,
DEFAULT_ONE_HAND_UI_CARD_SHOWN: false,
DEFAULT_TOOLBAR_MATERIAL: ToolbarMaterial.bar.rawValue,
DEFAULT_TOOLBAR_MATERIAL: ToolbarMaterial.defaultMaterial,
DEFAULT_CONNECT_VIA_LINK_TAB: ConnectViaLinkTab.scan.rawValue,
DEFAULT_LIVE_MESSAGE_ALERT_SHOWN: false,
DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE: true,
@@ -245,6 +247,7 @@ public class CodableDefault<T: Codable> {
}
}
let networkProxyDefault: CodableDefault<NetworkProxy> = CodableDefault(defaults: UserDefaults.standard, forKey: DEFAULT_NETWORK_PROXY, withDefault: NetworkProxy.def)
struct SettingsView: View {
@Environment(\.colorScheme) var colorScheme
@@ -4264,10 +4264,6 @@ This is your link for group %@!</source>
<target>Състояние на мрежата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Нов kод за достъп</target>
@@ -4108,10 +4108,6 @@ This is your link for group %@!</source>
<target>Stav sítě</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Nové heslo</target>
@@ -524,17 +524,17 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Abbrechen</target>
<target>Beenden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Wechsel der Empfängeradresse abbrechen</target>
<target>Wechsel der Empfängeradresse beenden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Wechsel der Empfängeradresse abbrechen?</target>
<target>Wechsel der Empfängeradresse beenden?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -657,7 +657,7 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Der Wechsel der Empfängeradresse wird abgebrochen. Die bisherige Adresse wird weiter verwendet.</target>
<target>Der Wechsel der Empfängeradresse wird beendet. Die bisherige Adresse wird weiter verwendet.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
@@ -752,6 +752,7 @@
</trans-unit>
<trans-unit id="Allow calls?" xml:space="preserve">
<source>Allow calls?</source>
<target>Anrufe erlauben?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
@@ -946,10 +947,12 @@
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Kontakte für spätere Chats archivieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
<source>Archived contacts</source>
<target>Archivierte Kontakte</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
@@ -1054,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Kontrollieren Sie Ihr Netzwerk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1098,6 +1102,7 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Für bessere Privatsphäre verpixeln.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
@@ -1152,6 +1157,7 @@
</trans-unit>
<trans-unit id="Calls prohibited!" xml:space="preserve">
<source>Calls prohibited!</source>
<target>Anrufe nicht zugelassen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Camera not available" xml:space="preserve">
@@ -1161,10 +1167,12 @@
</trans-unit>
<trans-unit id="Can't call contact" xml:space="preserve">
<source>Can't call contact</source>
<target>Kontakt kann nicht angerufen werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't call member" xml:space="preserve">
<source>Can't call member</source>
<target>Mitglied kann nicht angerufen werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contact!" xml:space="preserve">
@@ -1179,6 +1187,7 @@
</trans-unit>
<trans-unit id="Can't message member" xml:space="preserve">
<source>Can't message member</source>
<target>Mitglied kann nicht benachrichtigt werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel" xml:space="preserve">
@@ -1319,6 +1328,7 @@
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Chat-Liste</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1408,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Farbige Chats mit neuen Designs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1452,6 +1463,7 @@
</trans-unit>
<trans-unit id="Confirm contact deletion?" xml:space="preserve">
<source>Confirm contact deletion?</source>
<target>Löschen des Kontakts bestätigen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
@@ -1511,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Schneller mit Ihren Freunden verbinden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -1589,6 +1602,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Connecting to contact, please wait or check later!" xml:space="preserve">
<source>Connecting to contact, please wait or check later!</source>
<target>Verbinde mit Kontakt, bitte warten oder später erneut überprüfen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connecting to desktop" xml:space="preserve">
@@ -1603,6 +1617,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Connection and servers status." xml:space="preserve">
<source>Connection and servers status.</source>
<target>Verbindungs- und Server-Status.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection error" xml:space="preserve">
@@ -1657,6 +1672,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Contact deleted!" xml:space="preserve">
<source>Contact deleted!</source>
<target>Kontakt gelöscht!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact hidden:" xml:space="preserve">
@@ -1671,6 +1687,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Contact is deleted." xml:space="preserve">
<source>Contact is deleted.</source>
<target>Kontakt wurde gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact name" xml:space="preserve">
@@ -1685,6 +1702,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
<source>Contact will be deleted - this cannot be undone!</source>
<target>Kontakt wird gelöscht. Dies kann nicht rückgängig gemacht werden!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
@@ -1704,6 +1722,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Conversation deleted!" xml:space="preserve">
<source>Conversation deleted!</source>
<target>Unterhaltung gelöscht!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Copy" xml:space="preserve">
@@ -2047,6 +2066,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Delete contact?" xml:space="preserve">
<source>Delete contact?</source>
<target>Kontakt löschen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete database" xml:space="preserve">
@@ -2156,6 +2176,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Delete up to 20 messages at once." xml:space="preserve">
<source>Delete up to 20 messages at once.</source>
<target>Löschen Sie bis zu 20 Nachrichten auf einmal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete user profile?" xml:space="preserve">
@@ -2165,6 +2186,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Delete without notification" xml:space="preserve">
<source>Delete without notification</source>
<target>Ohne Benachrichtigung löschen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Deleted" xml:space="preserve">
@@ -2254,6 +2276,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Developer options" xml:space="preserve">
<source>Developer options</source>
<target>Optionen für Entwickler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Developer tools" xml:space="preserve">
@@ -2678,7 +2701,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Fehler beim Abbrechen des Adresswechsels</target>
<target>Fehler beim Beenden des Adresswechsels</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -3816,6 +3839,7 @@ Fehler: %2$@</target>
</trans-unit>
<trans-unit id="It protects your IP address and connections." xml:space="preserve">
<source>It protects your IP address and connections.</source>
<target>Ihre IP-Adresse und Verbindungen werden geschützt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -3882,6 +3906,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Keep conversation" xml:space="preserve">
<source>Keep conversation</source>
<target>Unterhaltung behalten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
@@ -4359,10 +4384,6 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Netzwerkstatus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Neuer Zugangscode</target>
@@ -4375,6 +4396,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Neue Chat-Erfahrung 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4409,6 +4431,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Neue Medien-Optionen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4581,6 +4604,7 @@ Dies erfordert die Aktivierung eines VPNs.</target>
</trans-unit>
<trans-unit id="Only delete conversation" xml:space="preserve">
<source>Only delete conversation</source>
<target>Nur die Unterhaltung löschen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can change group preferences." xml:space="preserve">
@@ -4820,10 +4844,12 @@ Dies erfordert die Aktivierung eines VPNs.</target>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Direkt aus der Chat-Liste abspielen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
<source>Please ask your contact to enable calls.</source>
<target>Bitten Sie Ihren Kontakt darum, Anrufe zu aktivieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
@@ -5129,6 +5155,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
</trans-unit>
<trans-unit id="Reachable chat toolbar" xml:space="preserve">
<source>Reachable chat toolbar</source>
<target>Erreichbare Chat-Symbolleiste</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React…" xml:space="preserve">
@@ -5404,6 +5431,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Alle Hinweise zurücksetzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
@@ -5773,6 +5801,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
</trans-unit>
<trans-unit id="Send message to enable calls." xml:space="preserve">
<source>Send message to enable calls.</source>
<target>Nachricht senden, um Anrufe zu aktivieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
@@ -6062,6 +6091,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Aus anderen Apps heraus teilen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6750,6 +6780,7 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Chat-Liste umschalten:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6759,6 +6790,7 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>Deckkraft der Symbolleiste</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -7055,6 +7087,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Use the app with one hand." xml:space="preserve">
<source>Use the app with one hand.</source>
<target>Die App mit einer Hand nutzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -7416,6 +7449,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>Kann von Ihnen in den Erscheinungsbild-Einstellungen geändert werden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -7455,6 +7489,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="You can send messages to %@ from Archived contacts." xml:space="preserve">
<source>You can send messages to %@ from Archived contacts.</source>
<target>Sie können aus den archivierten Kontakten heraus Nachrichten an %@ versenden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can set lock screen notification preview via settings." xml:space="preserve">
@@ -7484,6 +7519,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="You can still view conversation with %@ in the list of chats." xml:space="preserve">
<source>You can still view conversation with %@ in the list of chats.</source>
<target>Sie können in der Chatliste weiterhin die Unterhaltung mit %@ einsehen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
@@ -7565,6 +7601,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="You need to allow your contact to call to be able to call them." xml:space="preserve">
<source>You need to allow your contact to call to be able to call them.</source>
<target>Sie müssen Ihrem Kontakt Anrufe zu Ihnen erlauben, bevor Sie ihn selbst anrufen können.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You need to allow your contact to send voice messages to be able to send them." xml:space="preserve">
@@ -7876,6 +7913,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="call" xml:space="preserve">
<source>call</source>
<target>Anrufen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="call error" xml:space="preserve">
@@ -8250,6 +8288,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="invite" xml:space="preserve">
<source>invite</source>
<target>Einladen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="invited" xml:space="preserve">
@@ -8309,6 +8348,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>Nachricht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message received" xml:space="preserve">
@@ -8343,6 +8383,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="mute" xml:space="preserve">
<source>mute</source>
<target>Stummschalten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="never" xml:space="preserve">
@@ -8479,6 +8520,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="search" xml:space="preserve">
<source>search</source>
<target>Suchen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
@@ -8567,6 +8609,7 @@ Zuletzt empfangene Nachricht: %2$@</target>
</trans-unit>
<trans-unit id="unmute" xml:space="preserve">
<source>unmute</source>
<target>Stummschaltung aufheben</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
@@ -8616,6 +8659,7 @@ Zuletzt empfangene Nachricht: %2$@</target>
</trans-unit>
<trans-unit id="video" xml:space="preserve">
<source>video</source>
<target>Video</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="video call (not e2e encrypted)" xml:space="preserve">
@@ -8998,7 +9042,7 @@ Zuletzt empfangene Nachricht: %2$@</target>
</trans-unit>
<trans-unit id="You can allow sharing in Privacy &amp; Security / SimpleX Lock settings." xml:space="preserve">
<source>You can allow sharing in Privacy &amp; Security / SimpleX Lock settings.</source>
<target>Du kannst das Teilen in den Einstellungen zu Datenschutz &amp; Sicherheit bzw. SimpleX-Sperre erlauben.</target>
<target>Du kannst das Teilen in den Einstellungen zu Datenschutz &amp; Sicherheit - SimpleX-Sperre erlauben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
@@ -4384,11 +4384,6 @@ This is your link for group %@!</target>
<target>Network status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<target>New Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>New Passcode</target>
@@ -582,12 +582,12 @@
</trans-unit>
<trans-unit id="Acknowledged" xml:space="preserve">
<source>Acknowledged</source>
<target>Recibido</target>
<target>Confirmaciones</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Acknowledgement errors" xml:space="preserve">
<source>Acknowledgement errors</source>
<target>Errores de reconocimiento</target>
<target>Errores de confirmación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
@@ -697,7 +697,7 @@
</trans-unit>
<trans-unit id="All data is private to your device." xml:space="preserve">
<source>All data is private to your device.</source>
<target>Todos los datos son privados para tu dispositivo.</target>
<target>Todos los datos son privados y están en tu dispositivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All group members will remain connected." xml:space="preserve">
@@ -802,7 +802,7 @@
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<target>Permitir enviar enlaces SimpleX.</target>
<target>Se permite enviar enlaces SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
@@ -947,6 +947,7 @@
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Archiva contactos para charlar más tarde.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
@@ -1056,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Uso de red mejorado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1100,6 +1102,7 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Difumina para mayor privacidad.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
@@ -1290,7 +1293,7 @@
</trans-unit>
<trans-unit id="Chat database" xml:space="preserve">
<source>Chat database</source>
<target>Base de datos del chat</target>
<target>Base de datos de SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat database deleted" xml:space="preserve">
@@ -1310,21 +1313,22 @@
</trans-unit>
<trans-unit id="Chat is running" xml:space="preserve">
<source>Chat is running</source>
<target>Chat está en ejecución</target>
<target>SimpleX está en ejecución</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat is stopped" xml:space="preserve">
<source>Chat is stopped</source>
<target>Chat está parado</target>
<target>SimpleX 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 parado. Si has usado esta base de datos en otro dispositivo, debes transferirla de vuelta antes de iniciar Chat.</target>
<target>SimpleX está parado. Si has usado esta base de datos en otro dispositivo, debes transferirla de vuelta antes de iniciar SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Lista de chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1414,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Colorea los chats con los nuevos temas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1433,7 +1438,7 @@
</trans-unit>
<trans-unit id="Completed" xml:space="preserve">
<source>Completed</source>
<target>Completado</target>
<target>Completadas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configure ICE servers" xml:space="preserve">
@@ -1488,7 +1493,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>Confirma que recuerdas la frase de contraseña de la base de datos para migrarla.</target>
<target>Para migrar confirma que recuerdas la frase de contraseña de la base de datos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
@@ -1518,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Conecta más rápido con tus amigos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -1561,7 +1567,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
<target>Conectado</target>
<target>Conectadas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connected desktop" xml:space="preserve">
@@ -1611,7 +1617,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Connection and servers status." xml:space="preserve">
<source>Connection and servers status.</source>
<target>Estado de conexión y servidores.</target>
<target>Estado de tu conexión y servidores.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection error" xml:space="preserve">
@@ -1806,7 +1812,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Created" xml:space="preserve">
<source>Created</source>
<target>Creado</target>
<target>Creadas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Created at" xml:space="preserve">
@@ -2000,7 +2006,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Delete %lld messages?" xml:space="preserve">
<source>Delete %lld messages?</source>
<target>¿Elimina %lld mensajes?</target>
<target>¿Eliminar %lld mensajes?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete address" xml:space="preserve">
@@ -2185,7 +2191,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Deleted" xml:space="preserve">
<source>Deleted</source>
<target>Eliminado</target>
<target>Eliminadas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Deleted at" xml:space="preserve">
@@ -2200,7 +2206,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Deletion errors" xml:space="preserve">
<source>Deletion errors</source>
<target>Errores de borrado</target>
<target>Errores de eliminación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery" xml:space="preserve">
@@ -2400,7 +2406,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Do not send history to new members." xml:space="preserve">
<source>Do not send history to new members.</source>
<target>No enviar historial a miembros nuevos.</target>
<target>No se envía el historial a los miembros nuevos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't create address" xml:space="preserve">
@@ -2945,7 +2951,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Error stopping chat" xml:space="preserve">
<source>Error stopping chat</source>
<target>Error al parar Chat</target>
<target>Error al parar SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error switching profile!" xml:space="preserve">
@@ -3290,7 +3296,7 @@ Error: %2$@</target>
</trans-unit>
<trans-unit id="Fully decentralized visible only to members." xml:space="preserve">
<source>Fully decentralized visible only to members.</source>
<target>Completamente descentralizado: sólo visible a los miembros.</target>
<target>Completamente descentralizado y sólo visible para los miembros.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
@@ -3625,7 +3631,7 @@ Error: %2$@</target>
</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, Chat debe estar parado.</target>
<target>Para continuar, SimpleX debe estar parado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -4145,7 +4151,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<target>El mensaje puede ser entregado más tarde si el miembro vuelve a estar activo.</target>
<target>El mensaje podría ser entregado más tarde si el miembro vuelve a estar activo.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
@@ -4378,11 +4384,6 @@ This is your link for group %@!</source>
<target>Estado de la red</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<target>Nuevo Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Código Nuevo</target>
@@ -4395,6 +4396,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Nueva experiencia de chat 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4429,6 +4431,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Nuevas opciones multimedia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4478,7 +4481,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<target>Aún no hay conexión directa, el mensaje es reenviado por el administrador.</target>
<target>Aún no hay conexión directa con este miembro, el mensaje es reenviado por el administrador.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
@@ -4816,7 +4819,7 @@ Requiere activación de la VPN.</target>
</trans-unit>
<trans-unit id="Pending" xml:space="preserve">
<source>Pending</source>
<target>Pendiente</target>
<target>Pendientes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="People can connect to you only via the links you share." xml:space="preserve">
@@ -4841,6 +4844,7 @@ Requiere activación de la VPN.</target>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Reproduce desde la lista de chats.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
@@ -5064,7 +5068,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<target>No permitir el envío de enlaces SimpleX.</target>
<target>No se permite enviar enlaces SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
@@ -5121,7 +5125,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Proxied" xml:space="preserve">
<source>Proxied</source>
<target>Con proxy</target>
<target>Como proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Proxied servers" xml:space="preserve">
@@ -5236,7 +5240,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Received total" xml:space="preserve">
<source>Received total</source>
<target>Total recibido</target>
<target>Total recibidos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
@@ -5427,11 +5431,12 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Reiniciar todas las pistas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
<source>Reset all statistics</source>
<target>Restablecer estadísticas</target>
<target>Restablecer todas las estadísticas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics?" xml:space="preserve">
@@ -5521,7 +5526,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Run chat" xml:space="preserve">
<source>Run chat</source>
<target>Ejecutar chat</target>
<target>Ejecutar SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SMP server" xml:space="preserve">
@@ -5706,7 +5711,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Secured" xml:space="preserve">
<source>Secured</source>
<target>Seguro</target>
<target>Aseguradas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Security assessment" xml:space="preserve">
@@ -5836,7 +5841,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Send up to 100 last messages to new members." xml:space="preserve">
<source>Send up to 100 last messages to new members.</source>
<target>Enviar hasta 100 últimos mensajes a los miembros nuevos.</target>
<target>Se envían hasta 100 mensajes más recientes a los miembros nuevos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
@@ -5901,7 +5906,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Sent directly" xml:space="preserve">
<source>Sent directly</source>
<target>Enviado directamente</target>
<target>Directamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent file event" xml:space="preserve">
@@ -5931,12 +5936,12 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Total enviado</target>
<target>Total enviados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent via proxy" xml:space="preserve">
<source>Sent via proxy</source>
<target>Enviado mediante proxy</target>
<target>Mediante proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
@@ -6086,6 +6091,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Comparte desde otras aplicaciones.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6135,7 +6141,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Show percentage" xml:space="preserve">
<source>Show percentage</source>
<target>Mostrar porcentaje</target>
<target>Mostrar porcentajes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
@@ -6320,17 +6326,17 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Parar chat</target>
<target>Parar SimpleX</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>Para habilitar las acciones sobre la base de datos, debes parar Chat</target>
<target>Para habilitar las acciones sobre la base de datos, debes parar SimpleX</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 parar Chat. Mientras tanto no podrás recibir ni enviar mensajes.</target>
<target>Para poder exportar, importar o eliminar la base de datos primero debes parar SimpleX. 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">
@@ -6532,7 +6538,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>La aplicación pedirá que confirmes las descargas desde servidores de archivos desconocidos (excepto .onion).</target>
<target>La aplicación pedirá que confirmes las descargas desde servidores de archivos desconocidos (excepto si son .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
@@ -6637,7 +6643,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
</trans-unit>
<trans-unit id="They can be overridden in contact and group settings." xml:space="preserve">
<source>They can be overridden in contact and group settings.</source>
<target>Se pueden anular en la configuración de contactos.</target>
<target>Se puede modificar desde la configuración particular de cada grupo y contacto.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
@@ -6774,6 +6780,7 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Alternar lista de chats:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6783,6 +6790,7 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>Opacidad barra</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -7079,7 +7087,7 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
</trans-unit>
<trans-unit id="Use the app with one hand." xml:space="preserve">
<source>Use the app with one hand.</source>
<target>Usa la aplicación con una mano.</target>
<target>Usa la aplicación con una sola mano.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -7441,6 +7449,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>Puedes cambiar la posición de la barra desde el menú Apariencia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -7752,7 +7761,7 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
<source>Your profile **%@** will be shared.</source>
<target>Tu perfil **%@** será compartido.</target>
<target>El perfil **%@** será compartido.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
@@ -8199,7 +8208,7 @@ Los servidores SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="expired" xml:space="preserve">
<source>expired</source>
<target>expirado</target>
<target>expirados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
@@ -4098,10 +4098,6 @@ This is your link for group %@!</source>
<target>Verkon tila</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Uusi pääsykoodi</target>
@@ -524,7 +524,7 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Annuler</target>
<target>Abandonner</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
@@ -752,6 +752,7 @@
</trans-unit>
<trans-unit id="Allow calls?" xml:space="preserve">
<source>Allow calls?</source>
<target>Autoriser les appels?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
@@ -941,15 +942,17 @@
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archiver et transférer</target>
<target>Archiver et téléverser</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Archiver les contacts pour discuter plus tard.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
<source>Archived contacts</source>
<target>Contacts archivés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
@@ -1054,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Meilleure gestion de réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1098,6 +1102,7 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Rendez les images floues et protégez-les contre les regards indiscrets.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
@@ -1152,6 +1157,7 @@
</trans-unit>
<trans-unit id="Calls prohibited!" xml:space="preserve">
<source>Calls prohibited!</source>
<target>Les appels ne sont pas autorisés!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Camera not available" xml:space="preserve">
@@ -1161,10 +1167,12 @@
</trans-unit>
<trans-unit id="Can't call contact" xml:space="preserve">
<source>Can't call contact</source>
<target>Impossible d'appeler le contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't call member" xml:space="preserve">
<source>Can't call member</source>
<target>Impossible d'appeler le membre</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contact!" xml:space="preserve">
@@ -1179,6 +1187,7 @@
</trans-unit>
<trans-unit id="Can't message member" xml:space="preserve">
<source>Can't message member</source>
<target>Impossible d'envoyer un message à ce membre</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel" xml:space="preserve">
@@ -1294,6 +1303,7 @@
</trans-unit>
<trans-unit id="Chat database exported" xml:space="preserve">
<source>Chat database exported</source>
<target>Exportation de la base de données des discussions</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat database imported" xml:space="preserve">
@@ -1318,6 +1328,7 @@
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Liste de discussion</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1407,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Colorez vos discussions avec les nouveaux thèmes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1426,7 +1438,7 @@
</trans-unit>
<trans-unit id="Completed" xml:space="preserve">
<source>Completed</source>
<target>Complété</target>
<target>Complétées</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configure ICE servers" xml:space="preserve">
@@ -1451,6 +1463,7 @@
</trans-unit>
<trans-unit id="Confirm contact deletion?" xml:space="preserve">
<source>Confirm contact deletion?</source>
<target>Confirmer la suppression du contact?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
@@ -1510,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Connectez-vous à vos amis plus rapidement.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -1588,6 +1602,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Connecting to contact, please wait or check later!" xml:space="preserve">
<source>Connecting to contact, please wait or check later!</source>
<target>Connexion au contact, veuillez patienter ou vérifier plus tard!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connecting to desktop" xml:space="preserve">
@@ -1602,6 +1617,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Connection and servers status." xml:space="preserve">
<source>Connection and servers status.</source>
<target>État de la connexion et des serveurs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection error" xml:space="preserve">
@@ -1656,6 +1672,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Contact deleted!" xml:space="preserve">
<source>Contact deleted!</source>
<target>Contact supprimé !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact hidden:" xml:space="preserve">
@@ -1670,6 +1687,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Contact is deleted." xml:space="preserve">
<source>Contact is deleted.</source>
<target>Le contact est supprimé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact name" xml:space="preserve">
@@ -1684,6 +1702,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
<source>Contact will be deleted - this cannot be undone!</source>
<target>Le contact sera supprimé - il n'est pas possible de revenir en arrière!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
@@ -1703,6 +1722,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Conversation deleted!" xml:space="preserve">
<source>Conversation deleted!</source>
<target>Conversation supprimée!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Copy" xml:space="preserve">
@@ -1792,7 +1812,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Created" xml:space="preserve">
<source>Created</source>
<target>Créé</target>
<target>Créées</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Created at" xml:space="preserve">
@@ -2046,6 +2066,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Delete contact?" xml:space="preserve">
<source>Delete contact?</source>
<target>Supprimer le contact?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete database" xml:space="preserve">
@@ -2155,6 +2176,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Delete up to 20 messages at once." xml:space="preserve">
<source>Delete up to 20 messages at once.</source>
<target>Supprimez jusqu'à 20 messages à la fois.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete user profile?" xml:space="preserve">
@@ -2164,11 +2186,12 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Delete without notification" xml:space="preserve">
<source>Delete without notification</source>
<target>Supprimer sans notification</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Deleted" xml:space="preserve">
<source>Deleted</source>
<target>Supprimé</target>
<target>Supprimées</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Deleted at" xml:space="preserve">
@@ -2253,6 +2276,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Developer options" xml:space="preserve">
<source>Developer options</source>
<target>Options pour les développeurs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Developer tools" xml:space="preserve">
@@ -3815,6 +3839,7 @@ Erreur: %2$@</target>
</trans-unit>
<trans-unit id="It protects your IP address and connections." xml:space="preserve">
<source>It protects your IP address and connections.</source>
<target>Il protège votre adresse IP et vos connexions.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -3881,6 +3906,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Keep conversation" xml:space="preserve">
<source>Keep conversation</source>
<target>Garder la conversation</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
@@ -4060,6 +4086,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Media &amp; file servers" xml:space="preserve">
<source>Media &amp; file servers</source>
<target>Serveurs de fichiers et de médias</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Medium" xml:space="preserve">
@@ -4154,6 +4181,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Message servers" xml:space="preserve">
<source>Message servers</source>
<target>Serveurs de messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
@@ -4356,10 +4384,6 @@ Voici votre lien pour le groupe %@ !</target>
<target>État du réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Nouveau code d'accès</target>
@@ -4372,6 +4396,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Nouvelle expérience de discussion 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4406,6 +4431,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Nouvelles options de médias</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4578,6 +4604,7 @@ Nécessite l'activation d'un VPN.</target>
</trans-unit>
<trans-unit id="Only delete conversation" xml:space="preserve">
<source>Only delete conversation</source>
<target>Ne supprimer que la conversation</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can change group preferences." xml:space="preserve">
@@ -4817,10 +4844,12 @@ Nécessite l'activation d'un VPN.</target>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Aperçu depuis la liste de conversation.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
<source>Please ask your contact to enable calls.</source>
<target>Veuillez demander à votre contact d'autoriser les appels.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
@@ -5126,6 +5155,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Reachable chat toolbar" xml:space="preserve">
<source>Reachable chat toolbar</source>
<target>Barre d'outils accessible</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React…" xml:space="preserve">
@@ -5401,6 +5431,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Rétablir tous les conseils</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
@@ -5535,6 +5566,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Save and reconnect" xml:space="preserve">
<source>Save and reconnect</source>
<target>Sauvegarder et se reconnecter</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and update group profile" xml:space="preserve">
@@ -5679,7 +5711,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Secured" xml:space="preserve">
<source>Secured</source>
<target>Sécurisé</target>
<target>Sécurisées</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Security assessment" xml:space="preserve">
@@ -5759,7 +5791,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Send link previews" xml:space="preserve">
<source>Send link previews</source>
<target>Envoi d'aperçus de liens</target>
<target>Aperçu des liens</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send live message" xml:space="preserve">
@@ -5769,6 +5801,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Send message to enable calls." xml:space="preserve">
<source>Send message to enable calls.</source>
<target>Envoyer un message pour activer les appels.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
@@ -5933,7 +5966,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Server requires authorization to upload, check password" xml:space="preserve">
<source>Server requires authorization to upload, check password</source>
<target>Le serveur requiert une autorisation pour uploader, vérifiez le mot de passe</target>
<target>Le serveur requiert une autorisation pour téléverser, vérifiez le mot de passe</target>
<note>server test error</note>
</trans-unit>
<trans-unit id="Server test failed!" xml:space="preserve">
@@ -6058,6 +6091,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Partager depuis d'autres applications.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6097,7 +6131,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Show last messages" xml:space="preserve">
<source>Show last messages</source>
<target>Voir les derniers messages</target>
<target>Aperçu des derniers messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
@@ -6112,7 +6146,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Afficher l'aperçu</target>
<target>Aperçu affiché</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
@@ -6232,6 +6266,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Certains fichiers n'ont pas été exportés:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import - you may see Chat console for more details." xml:space="preserve">
@@ -6241,6 +6276,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import:" xml:space="preserve">
<source>Some non-fatal errors occurred during import:</source>
<target>L'importation a entraîné des erreurs non fatales:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Somebody" xml:space="preserve">
@@ -6350,7 +6386,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="Subscribed" xml:space="preserve">
<source>Subscribed</source>
<target>Inscrit</target>
<target>Inscriptions</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Subscription errors" xml:space="preserve">
@@ -6380,6 +6416,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
</trans-unit>
<trans-unit id="TCP connection" xml:space="preserve">
<source>TCP connection</source>
<target>Connexion TCP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP connection timeout" xml:space="preserve">
@@ -6743,6 +6780,7 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Afficher la liste des conversations:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6752,6 +6790,7 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>Opacité de la barre d'outils</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -6938,6 +6977,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Update settings?" xml:space="preserve">
<source>Update settings?</source>
<target>Mettre à jour les paramètres?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Updating settings will re-connect the client to all servers." xml:space="preserve">
@@ -6962,7 +7002,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
<source>Upload file</source>
<target>Transférer le fichier</target>
<target>Téléverser le fichier</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Uploaded" xml:space="preserve">
@@ -7047,6 +7087,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Use the app with one hand." xml:space="preserve">
<source>Use the app with one hand.</source>
<target>Utiliser l'application d'une main.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -7116,7 +7157,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</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>La vidéo ne sera reçue que lorsque votre contact aura fini de la transférer.</target>
<target>La vidéo ne sera reçue que lorsque votre contact aura fini la mettre en ligne.</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">
@@ -7408,6 +7449,7 @@ Répéter la demande d'adhésion ?</target>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>Vous pouvez choisir de le modifier dans les paramètres d'apparence.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -7447,6 +7489,7 @@ Répéter la demande d'adhésion ?</target>
</trans-unit>
<trans-unit id="You can send messages to %@ from Archived contacts." xml:space="preserve">
<source>You can send messages to %@ from Archived contacts.</source>
<target>Vous pouvez envoyer des messages à %@ à partir des contacts archivés.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can set lock screen notification preview via settings." xml:space="preserve">
@@ -7476,6 +7519,7 @@ Répéter la demande d'adhésion ?</target>
</trans-unit>
<trans-unit id="You can still view conversation with %@ in the list of chats." xml:space="preserve">
<source>You can still view conversation with %@ in the list of chats.</source>
<target>Vous pouvez toujours voir la conversation avec %@ dans la liste des discussions.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
@@ -7542,10 +7586,12 @@ Répéter la demande de connexion ?</target>
</trans-unit>
<trans-unit id="You may migrate the exported database." xml:space="preserve">
<source>You may migrate the exported database.</source>
<target>Vous pouvez migrer la base de données exportée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You may save the exported archive." xml:space="preserve">
<source>You may save the exported archive.</source>
<target>Vous pouvez enregistrer l'archive exportée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." xml:space="preserve">
@@ -7555,6 +7601,7 @@ Répéter la demande de connexion ?</target>
</trans-unit>
<trans-unit id="You need to allow your contact to call to be able to call them." xml:space="preserve">
<source>You need to allow your contact to call to be able to call them.</source>
<target>Vous devez autoriser votre contact à appeler pour pouvoir l'appeler.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You need to allow your contact to send voice messages to be able to send them." xml:space="preserve">
@@ -7866,6 +7913,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</trans-unit>
<trans-unit id="call" xml:space="preserve">
<source>call</source>
<target>appeler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="call error" xml:space="preserve">
@@ -8240,6 +8288,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</trans-unit>
<trans-unit id="invite" xml:space="preserve">
<source>invite</source>
<target>inviter</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="invited" xml:space="preserve">
@@ -8299,6 +8348,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message received" xml:space="preserve">
@@ -8333,6 +8383,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</trans-unit>
<trans-unit id="mute" xml:space="preserve">
<source>mute</source>
<target>muet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="never" xml:space="preserve">
@@ -8469,6 +8520,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</trans-unit>
<trans-unit id="search" xml:space="preserve">
<source>search</source>
<target>rechercher</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
@@ -8557,6 +8609,7 @@ dernier message reçu: %2$@</target>
</trans-unit>
<trans-unit id="unmute" xml:space="preserve">
<source>unmute</source>
<target>démuter</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
@@ -8606,6 +8659,7 @@ dernier message reçu: %2$@</target>
</trans-unit>
<trans-unit id="video" xml:space="preserve">
<source>video</source>
<target>vidéo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="video call (not e2e encrypted)" xml:space="preserve">
@@ -8948,10 +9002,12 @@ dernier message reçu: %2$@</target>
</trans-unit>
<trans-unit id="Sending a message takes longer than expected." xml:space="preserve">
<source>Sending a message takes longer than expected.</source>
<target>L'envoi d'un message prend plus de temps que prévu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending message…" xml:space="preserve">
<source>Sending message…</source>
<target>Envoi du message…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share" xml:space="preserve">
@@ -8961,6 +9017,7 @@ dernier message reçu: %2$@</target>
</trans-unit>
<trans-unit id="Slow network?" xml:space="preserve">
<source>Slow network?</source>
<target>Réseau lent?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown database error: %@" xml:space="preserve">
@@ -8975,6 +9032,7 @@ dernier message reçu: %2$@</target>
</trans-unit>
<trans-unit id="Wait" xml:space="preserve">
<source>Wait</source>
<target>Attendez</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
@@ -219,12 +219,12 @@
</trans-unit>
<trans-unit id="%lld messages blocked" xml:space="preserve">
<source>%lld messages blocked</source>
<target>%lld üzenet blokkolva</target>
<target>%lld üzenet letiltva</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 üzenet blokkolva az admin által</target>
<target>%lld üzenet letiltva az admin által</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
@@ -947,6 +947,7 @@
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Ismerősök archiválása a későbbi csevegéshez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
@@ -1041,7 +1042,7 @@
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Téves üzenet hash</target>
<target>Hibás az üzenet ellenőrzőösszege</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
@@ -1056,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Jobb hálózatkezelés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1065,7 +1067,7 @@
</trans-unit>
<trans-unit id="Block" xml:space="preserve">
<source>Block</source>
<target>Blokkolás</target>
<target>Letiltás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Block for all" xml:space="preserve">
@@ -1075,12 +1077,12 @@
</trans-unit>
<trans-unit id="Block group members" xml:space="preserve">
<source>Block group members</source>
<target>Csoporttagok blokkolása</target>
<target>Csoporttagok letiltása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Block member" xml:space="preserve">
<source>Block member</source>
<target>Tag blokkolása</target>
<target>Tag letiltása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Block member for all?" xml:space="preserve">
@@ -1090,7 +1092,7 @@
</trans-unit>
<trans-unit id="Block member?" xml:space="preserve">
<source>Block member?</source>
<target>Tag blokkolása?</target>
<target>Tag letiltása?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blocked by admin" xml:space="preserve">
@@ -1100,6 +1102,7 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Elhomályosítás a jobb adatvédelemért.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
@@ -1325,6 +1328,7 @@
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Csevegőlista</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1414,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Csevegések színezése új témákkal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1518,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Kapcsolódjon gyorsabban az ismerőseihez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -2125,7 +2131,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Delete member message?" xml:space="preserve">
<source>Delete member message?</source>
<target>Csoporttag üzenet törlése?</target>
<target>Csoporttag üzenetének törlése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete message?" xml:space="preserve">
@@ -2215,7 +2221,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Kézbesítési igazolások!</target>
<target>Üzenet kézbesítési jelentések!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
@@ -2675,12 +2681,12 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Enter welcome message…" xml:space="preserve">
<source>Enter welcome message…</source>
<target>Üdvözlő üzenetet megadása…</target>
<target>Üdvözlő üzenet megadása…</target>
<note>placeholder</note>
</trans-unit>
<trans-unit id="Enter welcome message… (optional)" xml:space="preserve">
<source>Enter welcome message… (optional)</source>
<target>Üdvözlő üzenetet megadása… (opcionális)</target>
<target>Üdvözlő üzenet megadása… (opcionális)</target>
<note>placeholder</note>
</trans-unit>
<trans-unit id="Enter your name…" xml:space="preserve">
@@ -2955,7 +2961,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Hiba a kapcsolat szinkronizálása során</target>
<target>Hiba a kapcsolat szinkronizálása közben</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
@@ -3535,7 +3541,7 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
<target>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.</target>
<target>Ha nem tud személyesen találkozni, mutassa meg a QR-kódot egy videohívás közben, vagy ossza meg a hivatkozást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="If you enter this passcode when opening the app, all app data will be irreversibly removed!" xml:space="preserve">
@@ -4125,7 +4131,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Üzenetkézbesítési bizonylatok!</target>
<target>Üzenet kézbesítési jelentések!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
@@ -4170,7 +4176,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<target>Üzenetjelentés</target>
<target>Üzenet kézbesítési jelentés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message servers" xml:space="preserve">
@@ -4378,11 +4384,6 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Hálózat állapota</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<target>Új csevegés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Új jelkód</target>
@@ -4395,6 +4396,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Új csevegési élmény 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4429,6 +4431,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Új médiabeállítások</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4841,6 +4844,7 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Lejátszás a csevegési listából.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
@@ -5101,7 +5105,7 @@ Hiba: %@</target>
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Védje IP-címét az ismerősei által kiválasztott üzenetküldő átjátszókkal szemben.
Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.</target>
Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
@@ -5427,6 +5431,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Tippek visszaállítása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
@@ -5966,7 +5971,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Server test failed!" xml:space="preserve">
<source>Server test failed!</source>
<target>Sikertelen kiszolgáló-teszt!</target>
<target>Sikertelen kiszolgáló teszt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server type" xml:space="preserve">
@@ -6086,6 +6091,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Megosztás más alkalmazásokból.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6265,12 +6271,12 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import - you may see Chat console for more details." xml:space="preserve">
<source>Some non-fatal errors occurred during import - you may see Chat console for more details.</source>
<target>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.</target>
<target>Néhány nem végzetes hiba történt az importálás közben további részletekért a csevegési konzolban olvashat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import:" xml:space="preserve">
<source>Some non-fatal errors occurred during import:</source>
<target>Néhány nem végzetes hiba történt az importálás során:</target>
<target>Néhány nem végzetes hiba történt az importálás közben:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Somebody" xml:space="preserve">
@@ -6557,7 +6563,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The created archive is available via app Settings / Database / Old database archive." xml:space="preserve">
<source>The created archive is available via app Settings / Database / Old database archive.</source>
<target>A létrehozott archívum a Beállítások / Adatbázis / Régi adatbázis-archívum menüpontban érhető el.</target>
<target>A létrehozott archívum a Beállítások / Adatbázis / Régi adatbázis-archívum menüben érhető el.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
@@ -6567,7 +6573,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>Az előző üzenet hash-e más.</target>
<target>Az előző üzenet ellenőrzőösszege különbözik.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
@@ -6597,7 +6603,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The old database was not removed during the migration, it can be deleted." xml:space="preserve">
<source>The old database was not removed during the migration, it can be deleted.</source>
<target>A régi adatbázis nem került eltávolításra az átköltöztetés során, így törölhető.</target>
<target>A régi adatbázis nem került eltávolításra az átköltöztetés közben, így törölhető.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The profile is only shared with your contacts." xml:space="preserve">
@@ -6774,6 +6780,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Csevegőlista átváltása:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6783,6 +6790,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>Eszköztár átlátszatlansága</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -7441,6 +7449,7 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>Ezt a „Megjelenés” menüben módosíthatja.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -7455,7 +7464,7 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You can enable them later via app Privacy &amp; Security settings." xml:space="preserve">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>Később engedélyezheti őket az alkalmazás Adatvédelem és biztonság menüpontban.</target>
<target>Később engedélyezheti őket az alkalmazás Adatvédelem és biztonság menüben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
@@ -7505,7 +7514,7 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You can start chat via app Settings / Database or by restarting the app" xml:space="preserve">
<source>You can start chat via app Settings / Database or by restarting the app</source>
<target>A csevegést az alkalmazás Beállítások / Adatbázis menü segítségével vagy az alkalmazás újraindításával indíthatja el</target>
<target>A csevegést az alkalmazás Beállítások / Adatbázis menüben vagy az alkalmazás újraindításával indíthatja el</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can still view conversation with %@ in the list of chats." xml:space="preserve">
@@ -7879,17 +7888,17 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="bad message hash" xml:space="preserve">
<source>bad message hash</source>
<target>téves üzenet hash</target>
<target>hibás az üzenet ellenőrzőösszege</target>
<note>integrity error chat item</note>
</trans-unit>
<trans-unit id="blocked" xml:space="preserve">
<source>blocked</source>
<target>blokkolva</target>
<target>letiltva</target>
<note>marked deleted chat item preview text</note>
</trans-unit>
<trans-unit id="blocked %@" xml:space="preserve">
<source>blocked %@</source>
<target>letiltotta őt: %@</target>
<target>letiltotta %@-t</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="blocked by admin" xml:space="preserve">
@@ -8481,7 +8490,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="removed %@" xml:space="preserve">
<source>removed %@</source>
<target>%@ eltávolítva</target>
<target>eltávolította őt: %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="removed contact address" xml:space="preserve">
@@ -8580,7 +8589,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="unblocked %@" xml:space="preserve">
<source>unblocked %@</source>
<target>%@ feloldva</target>
<target>feloldotta %@ letiltását</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="unknown" xml:space="preserve">
@@ -8705,7 +8714,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="you blocked %@" xml:space="preserve">
<source>you blocked %@</source>
<target>blokkolta őt: %@</target>
<target>ön letiltotta %@-t</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you changed address" xml:space="preserve">
@@ -8750,7 +8759,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="you unblocked %@" xml:space="preserve">
<source>you unblocked %@</source>
<target>feloldotta %@ blokkolását</target>
<target>ön feloldotta %@ letiltását</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you: " xml:space="preserve">
@@ -9033,7 +9042,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="You can allow sharing in Privacy &amp; Security / SimpleX Lock settings." xml:space="preserve">
<source>You can allow sharing in Privacy &amp; Security / SimpleX Lock settings.</source>
<target>A megosztást az Adatvédelem és biztonság / SimpleX zár menüpontban engedélyezheti.</target>
<target>A megosztást az Adatvédelem és biztonság / SimpleX zár menüben engedélyezheti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
@@ -947,6 +947,7 @@
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Archivia contatti per chattare più tardi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
@@ -1056,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Rete migliorata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1100,6 +1102,7 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Sfoca per una privacy maggiore.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
@@ -1325,6 +1328,7 @@
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Elenco delle chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1414,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Colora le chat con i nuovi temi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1518,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Connettiti più velocemente ai tuoi amici.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -1611,7 +1617,7 @@ Questo è il tuo link una tantum!</target>
</trans-unit>
<trans-unit id="Connection and servers status." xml:space="preserve">
<source>Connection and servers status.</source>
<target>Stato di connessione e server.</target>
<target>Stato della connessione e dei server.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection error" xml:space="preserve">
@@ -4378,11 +4384,6 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Stato della rete</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<target>Nuova chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Nuovo codice di accesso</target>
@@ -4395,6 +4396,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Una nuova esperienza di chat 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4429,6 +4431,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Nuove opzioni multimediali</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4841,6 +4844,7 @@ Richiede l'attivazione della VPN.</target>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Riproduci dall'elenco delle chat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
@@ -5427,6 +5431,7 @@ Attivalo nelle impostazioni *Rete e server*.</target>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Ripristina tutti i suggerimenti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
@@ -6086,6 +6091,7 @@ Attivalo nelle impostazioni *Rete e server*.</target>
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Condividi da altre app.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6774,6 +6780,7 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Cambia l'elenco delle chat:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6783,6 +6790,7 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>Opacità barra degli strumenti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -7441,6 +7449,7 @@ Ripetere la richiesta di ingresso?</target>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>Puoi cambiarlo nelle impostazioni dell'aspetto.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -4122,10 +4122,6 @@ This is your link for group %@!</source>
<target>ネットワーク状況</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>新しいパスコード</target>
@@ -947,6 +947,7 @@
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Archiveer contacten om later te chatten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
@@ -1056,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Beter netwerk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1100,6 +1102,7 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Vervagen voor betere privacy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
@@ -1325,6 +1328,7 @@
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Chatlijst</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1414,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Kleurchats met de nieuwe thema's.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1518,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Maak sneller verbinding met je vrienden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -3900,7 +3906,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Keep conversation" xml:space="preserve">
<source>Keep conversation</source>
<target>Blijf in gesprek</target>
<target>Behoud het gesprek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
@@ -4378,11 +4384,6 @@ Dit is jouw link voor groep %@!</target>
<target>Netwerk status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<target>Nieuw Gesprek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Nieuwe toegangscode</target>
@@ -4395,6 +4396,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Nieuwe chatervaring 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4429,6 +4431,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Nieuwe media-opties</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4841,6 +4844,7 @@ Vereist het inschakelen van VPN.</target>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Afspelen via de gesprekken lijst.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
@@ -5151,7 +5155,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
</trans-unit>
<trans-unit id="Reachable chat toolbar" xml:space="preserve">
<source>Reachable chat toolbar</source>
<target>Bereikbare chat werkbalk</target>
<target>Toegankelijke chatwerkbalk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React…" xml:space="preserve">
@@ -5427,6 +5431,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Alle hints resetten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
@@ -6086,6 +6091,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Delen vanuit andere apps.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6774,6 +6780,7 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Chatlijst wisselen:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6783,6 +6790,7 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>De transparantie van de werkbalk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -7441,6 +7449,7 @@ Deelnameverzoek herhalen?</target>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>U kunt dit wijzigen in de instellingen onder uiterlijk.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -752,6 +752,7 @@
</trans-unit>
<trans-unit id="Allow calls?" xml:space="preserve">
<source>Allow calls?</source>
<target>Zezwolić na połączenia?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
@@ -791,6 +792,7 @@
</trans-unit>
<trans-unit id="Allow sharing" xml:space="preserve">
<source>Allow sharing</source>
<target>Zezwól na udostępnianie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve">
@@ -945,10 +947,12 @@
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Archiwizuj kontakty aby porozmawiać później.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
<source>Archived contacts</source>
<target>Zarchiwizowane kontakty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
@@ -1053,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Lepsze sieciowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1097,10 +1102,12 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Rozmycie dla lepszej prywatności.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
<source>Blur media</source>
<target>Rozmycie mediów</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">
@@ -1150,6 +1157,7 @@
</trans-unit>
<trans-unit id="Calls prohibited!" xml:space="preserve">
<source>Calls prohibited!</source>
<target>Połączenia zakazane!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Camera not available" xml:space="preserve">
@@ -1159,10 +1167,12 @@
</trans-unit>
<trans-unit id="Can't call contact" xml:space="preserve">
<source>Can't call contact</source>
<target>Nie można zadzwonić do kontaktu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't call member" xml:space="preserve">
<source>Can't call member</source>
<target>Nie można zadzwonić do członka</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contact!" xml:space="preserve">
@@ -1177,6 +1187,7 @@
</trans-unit>
<trans-unit id="Can't message member" xml:space="preserve">
<source>Can't message member</source>
<target>Nie można wysłać wiadomości do członka</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel" xml:space="preserve">
@@ -1292,6 +1303,7 @@
</trans-unit>
<trans-unit id="Chat database exported" xml:space="preserve">
<source>Chat database exported</source>
<target>Wyeksportowano bazę danych czatu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat database imported" xml:space="preserve">
@@ -1316,6 +1328,7 @@
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Lista czatów</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1405,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Koloruj czaty z nowymi motywami.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1449,6 +1463,7 @@
</trans-unit>
<trans-unit id="Confirm contact deletion?" xml:space="preserve">
<source>Confirm contact deletion?</source>
<target>Potwierdzić usunięcie kontaktu?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm database upgrades" xml:space="preserve">
@@ -1508,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Szybciej łącz się ze znajomymi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -1586,6 +1602,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Connecting to contact, please wait or check later!" xml:space="preserve">
<source>Connecting to contact, please wait or check later!</source>
<target>Łączenie z kontaktem, poczekaj lub sprawdź później!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connecting to desktop" xml:space="preserve">
@@ -1600,6 +1617,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Connection and servers status." xml:space="preserve">
<source>Connection and servers status.</source>
<target>Stan połączenia i serwerów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection error" xml:space="preserve">
@@ -1614,6 +1632,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Connection notifications" xml:space="preserve">
<source>Connection notifications</source>
<target>Powiadomienia o połączeniu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection request sent!" xml:space="preserve">
@@ -1653,6 +1672,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Contact deleted!" xml:space="preserve">
<source>Contact deleted!</source>
<target>Kontakt usunięty!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact hidden:" xml:space="preserve">
@@ -1667,6 +1687,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Contact is deleted." xml:space="preserve">
<source>Contact is deleted.</source>
<target>Kontakt jest usunięty.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact name" xml:space="preserve">
@@ -1681,6 +1702,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
<source>Contact will be deleted - this cannot be undone!</source>
<target>Kontakt zostanie usunięty nie można tego cofnąć!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
@@ -1700,6 +1722,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Conversation deleted!" xml:space="preserve">
<source>Conversation deleted!</source>
<target>Rozmowa usunięta!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Copy" xml:space="preserve">
@@ -1978,6 +2001,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Delete %lld messages of members?" xml:space="preserve">
<source>Delete %lld messages of members?</source>
<target>Usunąć %lld wiadomości członków?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete %lld messages?" xml:space="preserve">
@@ -2042,6 +2066,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Delete contact?" xml:space="preserve">
<source>Delete contact?</source>
<target>Usunąć kontakt?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete database" xml:space="preserve">
@@ -2151,6 +2176,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Delete up to 20 messages at once." xml:space="preserve">
<source>Delete up to 20 messages at once.</source>
<target>Usuń do 20 wiadomości na raz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete user profile?" xml:space="preserve">
@@ -2160,6 +2186,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Delete without notification" xml:space="preserve">
<source>Delete without notification</source>
<target>Usuń bez powiadomienia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Deleted" xml:space="preserve">
@@ -2219,6 +2246,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Destination server address of %@ is incompatible with forwarding server %@ settings." xml:space="preserve">
<source>Destination server address of %@ is incompatible with forwarding server %@ settings.</source>
<target>Adres serwera docelowego %@ jest niekompatybilny z ustawieniami serwera przekazującego %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
@@ -2228,6 +2256,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Destination server version of %@ is incompatible with forwarding server %@." xml:space="preserve">
<source>Destination server version of %@ is incompatible with forwarding server %@.</source>
<target>Wersja serwera docelowego %@ jest niekompatybilna z serwerem przekierowującym %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Detailed statistics" xml:space="preserve">
@@ -2247,6 +2276,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Developer options" xml:space="preserve">
<source>Developer options</source>
<target>Opcje deweloperskie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Developer tools" xml:space="preserve">
@@ -2301,6 +2331,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Disabled" xml:space="preserve">
<source>Disabled</source>
<target>Wyłączony</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
@@ -2530,6 +2561,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Enabled" xml:space="preserve">
<source>Enabled</source>
<target>Włączony</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
@@ -2704,6 +2736,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
<source>Error connecting to forwarding server %@. Please try later.</source>
<target>Błąd połączenia z serwerem przekierowania %@. Spróbuj ponownie później.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error creating address" xml:space="preserve">
@@ -3209,14 +3242,17 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
<target>Serwer przekazujący %@ nie mógł połączyć się z serwerem docelowym %@. Spróbuj ponownie później.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server address is incompatible with network settings: %@." xml:space="preserve">
<source>Forwarding server address is incompatible with network settings: %@.</source>
<target>Adres serwera przekierowującego jest niekompatybilny z ustawieniami sieciowymi: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server version is incompatible with network settings: %@." xml:space="preserve">
<source>Forwarding server version is incompatible with network settings: %@.</source>
<target>Wersja serwera przekierowującego jest niekompatybilna z ustawieniami sieciowymi: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
@@ -3803,6 +3839,7 @@ Błąd: %2$@</target>
</trans-unit>
<trans-unit id="It protects your IP address and connections." xml:space="preserve">
<source>It protects your IP address and connections.</source>
<target>Chroni Twój adres IP i połączenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It seems like you are already connected via this link. If it is not the case, there was an error (%@)." xml:space="preserve">
@@ -3869,6 +3906,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Keep conversation" xml:space="preserve">
<source>Keep conversation</source>
<target>Zachowaj rozmowę</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
@@ -4048,10 +4086,12 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Media &amp; file servers" xml:space="preserve">
<source>Media &amp; file servers</source>
<target>Serwery mediów i plików</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Medium" xml:space="preserve">
<source>Medium</source>
<target>Średni</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Member" xml:space="preserve">
@@ -4141,6 +4181,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Message servers" xml:space="preserve">
<source>Message servers</source>
<target>Serwery wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
@@ -4343,10 +4384,6 @@ To jest twój link do grupy %@!</target>
<target>Status sieci</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Nowy Pin</target>
@@ -4359,6 +4396,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Nowe możliwości czatu 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4393,6 +4431,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Nowe opcje mediów</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4487,6 +4526,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Nothing selected" xml:space="preserve">
<source>Nothing selected</source>
<target>Nic nie jest zaznaczone</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Notifications" xml:space="preserve">
@@ -4564,6 +4604,7 @@ Wymaga włączenia VPN.</target>
</trans-unit>
<trans-unit id="Only delete conversation" xml:space="preserve">
<source>Only delete conversation</source>
<target>Usuń tylko rozmowę</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can change group preferences." xml:space="preserve">
@@ -4803,10 +4844,12 @@ Wymaga włączenia VPN.</target>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Odtwórz z listy czatów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
<source>Please ask your contact to enable calls.</source>
<target>Poproś kontakt o włącznie połączeń.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
@@ -5112,6 +5155,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Reachable chat toolbar" xml:space="preserve">
<source>Reachable chat toolbar</source>
<target>Osiągalny pasek narzędzi czatu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React…" xml:space="preserve">
@@ -5387,6 +5431,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Zresetuj wszystkie wskazówki</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
@@ -5521,6 +5566,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Save and reconnect" xml:space="preserve">
<source>Save and reconnect</source>
<target>Zapisz i połącz ponownie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and update group profile" xml:space="preserve">
@@ -5685,6 +5731,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Selected %lld" xml:space="preserve">
<source>Selected %lld</source>
<target>Zaznaczono %lld</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Selected chat preferences prohibit this message." xml:space="preserve">
@@ -5754,6 +5801,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Send message to enable calls." xml:space="preserve">
<source>Send message to enable calls.</source>
<target>Wyślij wiadomość aby włączyć połączenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
@@ -6043,6 +6091,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Udostępnij z innych aplikacji.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6057,6 +6106,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Share to SimpleX" xml:space="preserve">
<source>Share to SimpleX</source>
<target>Udostępnij do SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share with contacts" xml:space="preserve">
@@ -6211,10 +6261,12 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Soft" xml:space="preserve">
<source>Soft</source>
<target>Łagodny</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Niektóre plik(i) nie zostały wyeksportowane:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import - you may see Chat console for more details." xml:space="preserve">
@@ -6224,6 +6276,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import:" xml:space="preserve">
<source>Some non-fatal errors occurred during import:</source>
<target>Podczas importu wystąpiły niekrytyczne błędy:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Somebody" xml:space="preserve">
@@ -6323,6 +6376,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Strong" xml:space="preserve">
<source>Strong</source>
<target>Silne</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -6362,6 +6416,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="TCP connection" xml:space="preserve">
<source>TCP connection</source>
<target>Połączenie TCP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP connection timeout" xml:space="preserve">
@@ -6533,10 +6588,12 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
</trans-unit>
<trans-unit id="The messages will be deleted for all members." xml:space="preserve">
<source>The messages will be deleted for all members.</source>
<target>Wiadomości zostaną usunięte dla wszystkich członków.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The messages will be marked as moderated for all members." xml:space="preserve">
<source>The messages will be marked as moderated for all members.</source>
<target>Wiadomości zostaną oznaczone jako moderowane dla wszystkich członków.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The next generation of private messaging" xml:space="preserve">
@@ -6723,6 +6780,7 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Przełącz listę czatów:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6732,6 +6790,7 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>Nieprzezroczystość paska narzędzi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -6918,6 +6977,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Update settings?" xml:space="preserve">
<source>Update settings?</source>
<target>Zaktualizować ustawienia?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Updating settings will re-connect the client to all servers." xml:space="preserve">
@@ -7027,6 +7087,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Use the app with one hand." xml:space="preserve">
<source>Use the app with one hand.</source>
<target>Korzystaj z aplikacji jedną ręką.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -7388,6 +7449,7 @@ Powtórzyć prośbę dołączenia?</target>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>Możesz to zmienić w ustawieniach wyglądu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -7427,6 +7489,7 @@ Powtórzyć prośbę dołączenia?</target>
</trans-unit>
<trans-unit id="You can send messages to %@ from Archived contacts." xml:space="preserve">
<source>You can send messages to %@ from Archived contacts.</source>
<target>Możesz wysyłać wiadomości do %@ ze zarchiwizowanych kontaktów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can set lock screen notification preview via settings." xml:space="preserve">
@@ -7456,6 +7519,7 @@ Powtórzyć prośbę dołączenia?</target>
</trans-unit>
<trans-unit id="You can still view conversation with %@ in the list of chats." xml:space="preserve">
<source>You can still view conversation with %@ in the list of chats.</source>
<target>Nadal możesz przeglądać rozmowę z %@ na liście czatów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
@@ -7522,10 +7586,12 @@ Powtórzyć prośbę połączenia?</target>
</trans-unit>
<trans-unit id="You may migrate the exported database." xml:space="preserve">
<source>You may migrate the exported database.</source>
<target>Możesz zmigrować wyeksportowaną bazy danych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You may save the exported archive." xml:space="preserve">
<source>You may save the exported archive.</source>
<target>Możesz zapisać wyeksportowane archiwum.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." xml:space="preserve">
@@ -7535,6 +7601,7 @@ Powtórzyć prośbę połączenia?</target>
</trans-unit>
<trans-unit id="You need to allow your contact to call to be able to call them." xml:space="preserve">
<source>You need to allow your contact to call to be able to call them.</source>
<target>Aby móc dzwonić, musisz zezwolić kontaktowi na połączenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You need to allow your contact to send voice messages to be able to send them." xml:space="preserve">
@@ -7846,6 +7913,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</trans-unit>
<trans-unit id="call" xml:space="preserve">
<source>call</source>
<target>zadzwoń</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="call error" xml:space="preserve">
@@ -8220,6 +8288,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</trans-unit>
<trans-unit id="invite" xml:space="preserve">
<source>invite</source>
<target>zaproś</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="invited" xml:space="preserve">
@@ -8279,6 +8348,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>wiadomość</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message received" xml:space="preserve">
@@ -8313,6 +8383,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</trans-unit>
<trans-unit id="mute" xml:space="preserve">
<source>mute</source>
<target>wycisz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="never" xml:space="preserve">
@@ -8449,6 +8520,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</trans-unit>
<trans-unit id="search" xml:space="preserve">
<source>search</source>
<target>szukaj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
@@ -8537,6 +8609,7 @@ ostatnia otrzymana wiadomość: %2$@</target>
</trans-unit>
<trans-unit id="unmute" xml:space="preserve">
<source>unmute</source>
<target>wyłącz wyciszenie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
@@ -8586,6 +8659,7 @@ ostatnia otrzymana wiadomość: %2$@</target>
</trans-unit>
<trans-unit id="video" xml:space="preserve">
<source>video</source>
<target>wideo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="video call (not e2e encrypted)" xml:space="preserve">
@@ -8766,14 +8840,17 @@ ostatnia otrzymana wiadomość: %2$@</target>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">
<source>SimpleX SE</source>
<target>SimpleX SE</target>
<note>Bundle display name</note>
</trans-unit>
<trans-unit id="CFBundleName" xml:space="preserve">
<source>SimpleX SE</source>
<target>SimpleX SE</target>
<note>Bundle name</note>
</trans-unit>
<trans-unit id="NSHumanReadableCopyright" xml:space="preserve">
<source>Copyright © 2024 SimpleX Chat. All rights reserved.</source>
<target>Copyright © 2024 SimpleX Chat. Wszelkie prawa zastrzeżone.</target>
<note>Copyright (human-readable)</note>
</trans-unit>
</body>
@@ -8785,150 +8862,187 @@ ostatnia otrzymana wiadomość: %2$@</target>
<body>
<trans-unit id="%@" xml:space="preserve">
<source>%@</source>
<target>%@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App is locked!" xml:space="preserve">
<source>App is locked!</source>
<target>Aplikacja zablokowana!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Anuluj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
<source>Cannot access keychain to save database password</source>
<target>Nie można uzyskać dostępu do pęku kluczy aby zapisać hasło do bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot forward message" xml:space="preserve">
<source>Cannot forward message</source>
<target>Nie można przekazać wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Comment" xml:space="preserve">
<source>Comment</source>
<target>Komentarz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Currently maximum supported file size is %@." xml:space="preserve">
<source>Currently maximum supported file size is %@.</source>
<target>Obecnie maksymalny obsługiwany rozmiar pliku to %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Database downgrade required" xml:space="preserve">
<source>Database downgrade required</source>
<target>Wymagane obniżenie wersji bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Database encrypted!" xml:space="preserve">
<source>Database encrypted!</source>
<target>Baza danych zaszyfrowana!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Database error" xml:space="preserve">
<source>Database error</source>
<target>Błąd bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Database passphrase is different from saved in the keychain." xml:space="preserve">
<source>Database passphrase is different from saved in the keychain.</source>
<target>Hasło bazy danych jest inne niż zapisane w pęku kluczy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Database passphrase is required to open chat." xml:space="preserve">
<source>Database passphrase is required to open chat.</source>
<target>Hasło do bazy danych jest wymagane do otwarcia czatu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Database upgrade required" xml:space="preserve">
<source>Database upgrade required</source>
<target>Wymagana aktualizacja bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error preparing file" xml:space="preserve">
<source>Error preparing file</source>
<target>Błąd przygotowania pliku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error preparing message" xml:space="preserve">
<source>Error preparing message</source>
<target>Błąd przygotowania wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Błąd: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File error" xml:space="preserve">
<source>File error</source>
<target>Błąd pliku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Incompatible database version" xml:space="preserve">
<source>Incompatible database version</source>
<target>Niekompatybilna wersja bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Nieprawidłowe potwierdzenie migracji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keychain error" xml:space="preserve">
<source>Keychain error</source>
<target>Błąd pęku kluczy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Large file!" xml:space="preserve">
<source>Large file!</source>
<target>Duży plik!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No active profile" xml:space="preserve">
<source>No active profile</source>
<target>Brak aktywnego profilu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Open the app to downgrade the database." xml:space="preserve">
<source>Open the app to downgrade the database.</source>
<target>Otwórz aplikację aby obniżyć wersję bazy danych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Open the app to upgrade the database." xml:space="preserve">
<source>Open the app to upgrade the database.</source>
<target>Otwórz aplikację aby zaktualizować bazę danych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Passphrase" xml:space="preserve">
<source>Passphrase</source>
<target>Hasło</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please create a profile in the SimpleX app" xml:space="preserve">
<source>Please create a profile in the SimpleX app</source>
<target>Proszę utworzyć profil w aplikacji SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Selected chat preferences prohibit this message." xml:space="preserve">
<source>Selected chat preferences prohibit this message.</source>
<target>Wybrane preferencje czatu zabraniają tej wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending a message takes longer than expected." xml:space="preserve">
<source>Sending a message takes longer than expected.</source>
<target>Wysłanie wiadomości trwa dłużej niż oczekiwano.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending message…" xml:space="preserve">
<source>Sending message…</source>
<target>Wysyłanie wiadomości…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share" xml:space="preserve">
<source>Share</source>
<target>Udostępnij</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Slow network?" xml:space="preserve">
<source>Slow network?</source>
<target>Wolna sieć?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown database error: %@" xml:space="preserve">
<source>Unknown database error: %@</source>
<target>Nieznany błąd bazy danych: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unsupported format" xml:space="preserve">
<source>Unsupported format</source>
<target>Niewspierany format</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wait" xml:space="preserve">
<source>Wait</source>
<target>Czekaj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Nieprawidłowe hasło bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can allow sharing in Privacy &amp; Security / SimpleX Lock settings." xml:space="preserve">
<source>You can allow sharing in Privacy &amp; Security / SimpleX Lock settings.</source>
<target>Możesz zezwolić na udostępnianie w ustawieniach Prywatność i bezpieczeństwo / Blokada SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
@@ -5234,6 +5234,274 @@ Isso pode acontecer por causa de algum bug ou quando a conexão está comprometi
<target state="translated">%1$@ em %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
<target state="translated">Permitir que seus contatos deletem mensagens enviadas de maneira irreversível. (24 horas)</target>
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve" approved="no">
<source>%@ downloaded</source>
<target state="translated">baixado</target>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve" approved="no">
<source>%@ uploaded</source>
<target state="translated">transferido</target>
</trans-unit>
<trans-unit id="A new random profile will be shared." xml:space="preserve" approved="no">
<source>A new random profile will be shared.</source>
<target state="translated">Um novo perfil aleatório será compartilhado.</target>
</trans-unit>
<trans-unit id="Camera not available" xml:space="preserve" approved="no">
<source>Camera not available</source>
<target state="translated">Câmera indisponível</target>
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve" approved="no">
<source>Admins can block a member for all.</source>
<target state="translated">Administradores podem bloquear um membro para todos.</target>
</trans-unit>
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
<source>Allow to irreversibly delete sent messages. (24 hours)</source>
<target state="translated">Permitir que mensagens enviadas sejam deletadas de maneira irreversível. (24 horas)</target>
</trans-unit>
<trans-unit id="Apply" xml:space="preserve" approved="no">
<source>Apply</source>
<target state="translated">Aplicar</target>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve" approved="no">
<source>Accent</source>
<target state="translated">Esquema</target>
</trans-unit>
<trans-unit id="Accept connection request?" xml:space="preserve" approved="no">
<source>Accept connection request?</source>
<target state="translated">Aceitar solicitação de conexão?</target>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve" approved="no">
<source>Active connections</source>
<target state="translated">Conexões ativas</target>
</trans-unit>
<trans-unit id="Add contact" xml:space="preserve" approved="no">
<source>Add contact</source>
<target state="translated">Adicionar contato</target>
</trans-unit>
<trans-unit id="Additional accent" xml:space="preserve" approved="no">
<source>Additional accent</source>
<target state="translated">Esquema adicional</target>
</trans-unit>
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve" approved="no">
<source>All new messages from %@ will be hidden!</source>
<target state="translated">Todas as novas mensagens de %@ serão ocultas!</target>
</trans-unit>
<trans-unit id="All profiles" xml:space="preserve" approved="no">
<source>All profiles</source>
<target state="translated">Todos perfis</target>
</trans-unit>
<trans-unit id="Allow calls?" xml:space="preserve" approved="no">
<source>Allow calls?</source>
<target state="translated">Permitir chamadas?</target>
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve" approved="no">
<source>Archive contacts to chat later.</source>
<target state="translated">Arquivar contatos para conversar depois.</target>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve" approved="no">
<source>Blur media</source>
<target state="translated">Censurar mídia</target>
</trans-unit>
<trans-unit id="Calls prohibited!" xml:space="preserve" approved="no">
<source>Calls prohibited!</source>
<target state="translated">Chamadas proibidas!</target>
</trans-unit>
<trans-unit id="Can't call contact" xml:space="preserve" approved="no">
<source>Can't call contact</source>
<target state="translated">Não foi possível ligar para o contato</target>
</trans-unit>
<trans-unit id="%lld messages marked deleted" xml:space="preserve" approved="no">
<source>%lld messages marked deleted</source>
<target state="translated">mensagens deletadas</target>
</trans-unit>
<trans-unit id="0 sec" xml:space="preserve" approved="no">
<source>0 sec</source>
<target state="translated">0 seg</target>
</trans-unit>
<trans-unit id="%lld messages blocked" xml:space="preserve" approved="no">
<source>%lld messages blocked</source>
<target state="translated">mensagens bloqueadas</target>
</trans-unit>
<trans-unit id="%lld messages blocked by admin" xml:space="preserve" approved="no">
<source>%lld messages blocked by admin</source>
<target state="translated">mensagens bloqueadas pelo administrador</target>
</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" approved="no">
<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 state="translated">**Nota**: usar o mesmo banco de dados em dois dispositivos irá quebrar a desencriptação das mensagens de suas conexões como uma medida de segurança.</target>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve" approved="no">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target state="translated">- entrega de mensagens mais estável.
- grupos melhorados.
- e muito mais!</target>
</trans-unit>
<trans-unit id="All messages will be deleted - this cannot be undone!" xml:space="preserve" approved="no">
<source>All messages will be deleted - this cannot be undone!</source>
<target state="translated">Todas as mensagens serão deletadas - isto não pode ser desfeito!</target>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve" approved="no">
<source>Allow to send files and media.</source>
<target state="translated">Permitir o envio de arquivos e mídia.</target>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve" approved="no">
<source>Allow to send SimpleX links.</source>
<target state="translated">Permitir envio de links SimpleX.</target>
</trans-unit>
<trans-unit id="Block for all" xml:space="preserve" approved="no">
<source>Block for all</source>
<target state="translated">Bloquear para todos</target>
</trans-unit>
<trans-unit id="Block member" xml:space="preserve" approved="no">
<source>Block member</source>
<target state="translated">Bloquear membro</target>
</trans-unit>
<trans-unit id="Blocked by admin" xml:space="preserve" approved="no">
<source>Blocked by admin</source>
<target state="translated">Bloqueado por um administrador</target>
</trans-unit>
<trans-unit id="Block group members" xml:space="preserve" approved="no">
<source>Block group members</source>
<target state="translated">Bloquear membros de grupo</target>
</trans-unit>
<trans-unit id="Block member for all?" xml:space="preserve" approved="no">
<source>Block member for all?</source>
<target state="translated">Bloquear membro para todos?</target>
</trans-unit>
<trans-unit id="Block member?" xml:space="preserve" approved="no">
<source>Block member?</source>
<target state="translated">Bloquear membro?</target>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
<source>Both you and your contact can irreversibly delete sent messages. (24 hours)</source>
<target state="translated">Você e seu contato podem apagar mensagens enviadas de maneira irreversível. (24 horas)</target>
</trans-unit>
<trans-unit id="Can't call member" xml:space="preserve" approved="no">
<source>Can't call member</source>
<target state="translated">Não foi possível ligar para este membro</target>
</trans-unit>
<trans-unit id="Can't message member" xml:space="preserve" approved="no">
<source>Can't message member</source>
<target state="translated">Não foi possível enviar mensagem para este membro</target>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve" approved="no">
<source>Cancel migration</source>
<target state="translated">Cancelar migração</target>
</trans-unit>
<trans-unit id="Abort" xml:space="preserve" approved="no">
<source>Abort</source>
<target state="translated">Abortar</target>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve" approved="no">
<source>Abort changing address</source>
<target state="translated">Abortar troca de endereço</target>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve" approved="no">
<source>Abort changing address?</source>
<target state="translated">Abortar troca de endereço?</target>
</trans-unit>
<trans-unit id="- optionally notify deleted contacts.&#10;- profile names with spaces.&#10;- and more!" xml:space="preserve" approved="no">
<source>- optionally notify deleted contacts.
- profile names with spaces.
- and more!</source>
<target state="translated">- notificar contatos apagados de maneira opcional.
- nome de perfil com espaços.
- e muito mais!</target>
</trans-unit>
<trans-unit id="Allow sharing" xml:space="preserve" approved="no">
<source>Allow sharing</source>
<target state="translated">Permitir compartilhamento</target>
</trans-unit>
<trans-unit id="Block" xml:space="preserve" approved="no">
<source>Block</source>
<target state="translated">Bloquear</target>
</trans-unit>
<trans-unit id="Additional accent 2" xml:space="preserve" approved="no">
<source>Additional accent 2</source>
<target state="translated">Esquema adicional 2</target>
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve" approved="no">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target state="translated">Alteração de endereço será abortada. O endereço antigo será utilizado.</target>
</trans-unit>
<trans-unit id="Advanced settings" xml:space="preserve" approved="no">
<source>Advanced settings</source>
<target state="translated">Configurações avançadas</target>
</trans-unit>
<trans-unit id="All data is private to your device." xml:space="preserve" approved="no">
<source>All data is private to your device.</source>
<target state="translated">Toda informação é privada em seu dispositivo.</target>
</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" approved="no">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target state="translated">Todos os seus contatos, conversas e arquivos serão encriptados e enviados em pedaços para nós XFTP.</target>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve" approved="no">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target state="translated">Permitir deletar mensagens de maneira irreversível apenas se seu contato permitir para você. (24 horas)</target>
</trans-unit>
<trans-unit id="Already connecting!" xml:space="preserve" approved="no">
<source>Already connecting!</source>
<target state="translated">Já está conectando!</target>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve" approved="no">
<source>Already joining the group!</source>
<target state="translated">Já está entrando no grupo!</target>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve" approved="no">
<source>Always use private routing.</source>
<target state="translated">Sempre use rotas privadas.</target>
</trans-unit>
<trans-unit id="Apply to" xml:space="preserve" approved="no">
<source>Apply to</source>
<target state="translated">Aplicar em</target>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve" approved="no">
<source>Archiving database</source>
<target state="translated">Arquivando banco de dados</target>
</trans-unit>
<trans-unit id="Black" xml:space="preserve" approved="no">
<source>Black</source>
<target state="translated">Preto</target>
</trans-unit>
<trans-unit id="Cannot forward message" xml:space="preserve" approved="no">
<source>Cannot forward message</source>
<target state="translated">Não é possível encaminhar mensagem</target>
</trans-unit>
<trans-unit id="(new)" xml:space="preserve" approved="no">
<source>(new)</source>
<target state="translated">(novo)</target>
</trans-unit>
<trans-unit id="(this device v%@)" xml:space="preserve" approved="no">
<source>(this device v%@)</source>
<target state="translated">este dispositivo</target>
</trans-unit>
<trans-unit id="**Add contact**: to create a new invitation link, or connect via a link you received." xml:space="preserve" approved="no">
<source>**Add contact**: to create a new invitation link, or connect via a link you received.</source>
<target state="translated">**Adicionar contato**: criar um novo link de convite ou conectar via um link que você recebeu.</target>
</trans-unit>
<trans-unit id="**Create group**: to create a new group." xml:space="preserve" approved="no">
<source>**Create group**: to create a new group.</source>
<target state="translated">**Criar grupo**: criar um novo grupo.</target>
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve" approved="no">
<source>**Warning**: the archive will be removed.</source>
<target state="translated">**Aviso**: o arquivo será removido.</target>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve" approved="no">
<source>A few more things</source>
<target state="translated">E mais algumas coisas</target>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve" approved="no">
<source>Archived contacts</source>
<target state="translated">Contatos arquivados</target>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pt-BR" datatype="plaintext">
@@ -947,6 +947,7 @@
</trans-unit>
<trans-unit id="Archive contacts to chat later." xml:space="preserve">
<source>Archive contacts to chat later.</source>
<target>Архивируйте контакты чтобы продолжить переписку.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archived contacts" xml:space="preserve">
@@ -1056,6 +1057,7 @@
</trans-unit>
<trans-unit id="Better networking" xml:space="preserve">
<source>Better networking</source>
<target>Улучшенные сетевые функции</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
@@ -1100,6 +1102,7 @@
</trans-unit>
<trans-unit id="Blur for better privacy." xml:space="preserve">
<source>Blur for better privacy.</source>
<target>Размыть для конфиденциальности.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Blur media" xml:space="preserve">
@@ -1325,6 +1328,7 @@
</trans-unit>
<trans-unit id="Chat list" xml:space="preserve">
<source>Chat list</source>
<target>Список чатов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
@@ -1414,6 +1418,7 @@
</trans-unit>
<trans-unit id="Color chats with the new themes." xml:space="preserve">
<source>Color chats with the new themes.</source>
<target>Добавьте цвета к чатам в настройках.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Color mode" xml:space="preserve">
@@ -1518,6 +1523,7 @@
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
<source>Connect to your friends faster.</source>
<target>Соединяйтесь с друзьями быстрее.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
@@ -2170,7 +2176,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Delete up to 20 messages at once." xml:space="preserve">
<source>Delete up to 20 messages at once.</source>
<target>Удаляйте до 20 сообщений одновременно.</target>
<target>Удаляйте до 20 сообщений за раз.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete user profile?" xml:space="preserve">
@@ -4378,11 +4384,6 @@ This is your link for group %@!</source>
<target>Состояние сети</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<target>Новый чат</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Новый Код</target>
@@ -4395,6 +4396,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="New chat experience 🎉" xml:space="preserve">
<source>New chat experience 🎉</source>
<target>Новый интерфейс 🎉</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
@@ -4429,6 +4431,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="New media options" xml:space="preserve">
<source>New media options</source>
<target>Новые медиа-опции</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member role" xml:space="preserve">
@@ -4841,6 +4844,7 @@ Requires compatible VPN.</source>
</trans-unit>
<trans-unit id="Play from the chat list." xml:space="preserve">
<source>Play from the chat list.</source>
<target>Открыть из списка чатов.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
@@ -4984,7 +4988,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Конфиденциальная доставка сообщений 🚀</target>
<target>Конфиденциальная доставка 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
@@ -5427,6 +5431,7 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
<source>Reset all hints</source>
<target>Сбросить все подсказки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all statistics" xml:space="preserve">
@@ -6086,6 +6091,7 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Share from other apps." xml:space="preserve">
<source>Share from other apps.</source>
<target>Поделитесь из других приложений.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -6774,6 +6780,7 @@ You will be prompted to complete authentication before this feature is enabled.<
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
<source>Toggle chat list:</source>
<target>Переключите список чатов:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
@@ -6783,6 +6790,7 @@ You will be prompted to complete authentication before this feature is enabled.<
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
<source>Toolbar opacity</source>
<target>Прозрачность тулбара</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Total" xml:space="preserve">
@@ -7441,6 +7449,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
<source>You can change it in Appearance settings.</source>
<target>Вы можете изменить это в настройках Интерфейса.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -4080,10 +4080,6 @@ This is your link for group %@!</source>
<target>สถานะเครือข่าย</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>รหัสผ่านใหม่</target>
@@ -4280,10 +4280,6 @@ Bu senin grup için bağlantın %@!</target>
<target>Ağ durumu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>Yeni şifre</target>
File diff suppressed because it is too large Load Diff
@@ -4225,10 +4225,6 @@ This is your link for group %@!</source>
<target>网络状态</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Chat" xml:space="preserve">
<source>New Chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New Passcode" xml:space="preserve">
<source>New Passcode</source>
<target>新密码</target>
@@ -314,7 +314,7 @@
</trans-unit>
<trans-unit id="About SimpleX Chat" xml:space="preserve" approved="no">
<source>About SimpleX Chat</source>
<target state="translated">關於 SimpleX 對話</target>
<target state="translated">關於 SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent color" xml:space="preserve" approved="no">
@@ -445,7 +445,7 @@
</trans-unit>
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve" approved="no">
<source>Allow your contacts to send disappearing messages.</source>
<target state="translated">允許的聯絡人傳送自動銷毀的訊息。</target>
<target state="translated">允許的聯絡人傳送限時訊息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve" approved="no">
@@ -5898,6 +5898,230 @@ It can happen because of some bug or when the connection is compromised.</source
<target state="translated">%@ 和 %@ 已連接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve" approved="no">
<source>%@ downloaded</source>
<target state="translated">%@ 下載</target>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve" approved="no">
<source>%@ uploaded</source>
<target state="translated">%@ 上傳</target>
</trans-unit>
<trans-unit id="Abort" xml:space="preserve" approved="no">
<source>Abort</source>
<target state="translated">中止</target>
</trans-unit>
<trans-unit id="**Create group**: to create a new group." xml:space="preserve" approved="no">
<source>**Create group**: to create a new group.</source>
<target state="translated">**創建群組**: 創建一個新的群組。</target>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve" approved="no">
<source>Abort changing address</source>
<target state="translated">中止更改地址</target>
</trans-unit>
<trans-unit id="Accept connection request?" xml:space="preserve" approved="no">
<source>Accept connection request?</source>
<target state="translated">接受連線請求?</target>
</trans-unit>
<trans-unit id="Camera not available" xml:space="preserve" approved="no">
<source>Camera not available</source>
<target state="translated">相機不可用</target>
</trans-unit>
<trans-unit id="All messages will be deleted - this cannot be undone!" xml:space="preserve" approved="no">
<source>All messages will be deleted - this cannot be undone!</source>
<target state="translated">所有訊息都將被刪除 - 這不能還原!</target>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve" approved="no">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target state="translated">只有你的聯絡人允許的情況下,才允許不可逆地將訊息刪除。(24小時)</target>
</trans-unit>
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
<source>Allow to irreversibly delete sent messages. (24 hours)</source>
<target state="translated">允許將不可撤銷的訊息刪除。(24小時)</target>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
<target state="translated">允許您的聯絡人不可復原地刪除已傳送的訊息。(24小時)</target>
</trans-unit>
<trans-unit id="Bad desktop address" xml:space="preserve" approved="no">
<source>Bad desktop address</source>
<target state="translated">無效的桌面地址</target>
</trans-unit>
<trans-unit id="Error decrypting file" xml:space="preserve" approved="no">
<source>Error decrypting file</source>
<target state="translated">解密檔案時出錯</target>
</trans-unit>
<trans-unit id="Add contact" xml:space="preserve" approved="no">
<source>Add contact</source>
<target state="translated">新增聯絡人</target>
</trans-unit>
<trans-unit id="Advanced settings" xml:space="preserve" approved="no">
<source>Advanced settings</source>
<target state="translated">進階設定</target>
</trans-unit>
<trans-unit id="Allow calls?" xml:space="preserve" approved="no">
<source>Allow calls?</source>
<target state="translated">允許通話?</target>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve" approved="no">
<source>Allow to send files and media.</source>
<target state="translated">允許傳送檔案和媒體。</target>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve" approved="no">
<source>Already joining the group!</source>
<target state="translated">已加入群組!</target>
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve" approved="no">
<source>App data migration</source>
<target state="translated">應用資料轉移</target>
</trans-unit>
<trans-unit id="Apply" xml:space="preserve" approved="no">
<source>Apply</source>
<target state="translated">應用</target>
</trans-unit>
<trans-unit id="Apply to" xml:space="preserve" approved="no">
<source>Apply to</source>
<target state="translated">應用到</target>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve" approved="no">
<source>Archive and upload</source>
<target state="translated">儲存並上傳</target>
</trans-unit>
<trans-unit id="Block" xml:space="preserve" approved="no">
<source>Block</source>
<target state="translated">封鎖</target>
</trans-unit>
<trans-unit id="Block group members" xml:space="preserve" approved="no">
<source>Block group members</source>
<target state="translated">封鎖群組成員</target>
</trans-unit>
<trans-unit id="Block member" xml:space="preserve" approved="no">
<source>Block member</source>
<target state="translated">封鎖成員</target>
</trans-unit>
<trans-unit id="Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" xml:space="preserve" approved="no">
<source>Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</source>
<target state="translated">保加利亞語、芬蘭語、泰語和烏克蘭語——感謝使用者們和[Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)</target>
</trans-unit>
<trans-unit id="Can't call member" xml:space="preserve" approved="no">
<source>Can't call member</source>
<target state="translated">無法與成員通話</target>
</trans-unit>
<trans-unit id="Can't message member" xml:space="preserve" approved="no">
<source>Can't message member</source>
<target state="translated">無法傳送訊息給成員</target>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve" approved="no">
<source>Cancel migration</source>
<target state="translated">取消遷移</target>
</trans-unit>
<trans-unit id="Chat database exported" xml:space="preserve" approved="no">
<source>Chat database exported</source>
<target state="translated">導出聊天數據庫</target>
</trans-unit>
<trans-unit id="0 sec" xml:space="preserve" approved="no">
<source>0 sec</source>
<target state="translated">0 秒</target>
</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" approved="no">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target state="translated">你的所有聯絡人、對話和文件將被安全加密並切塊上傳到設置的 XFTP 中繼。</target>
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve" approved="no">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target state="translated">將取消地址更改。將使用舊聯絡地址。</target>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve" approved="no">
<source>Archiving database</source>
<target state="translated">正在儲存資料庫</target>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve" approved="no">
<source>Cellular</source>
<target state="translated">行動網路</target>
</trans-unit>
<trans-unit id="%@, %@ and %lld members" xml:space="preserve" approved="no">
<source>%@, %@ and %lld members</source>
<target state="translated">%@, %@ 和 %lld 成員</target>
</trans-unit>
<trans-unit id="%lld messages marked deleted" xml:space="preserve" approved="no">
<source>%lld messages marked deleted</source>
<target state="translated">%lld 條訊息已刪除</target>
</trans-unit>
<trans-unit id="Already connecting!" xml:space="preserve" approved="no">
<source>Already connecting!</source>
<target state="translated">已連接!</target>
</trans-unit>
<trans-unit id="Block member?" xml:space="preserve" approved="no">
<source>Block member?</source>
<target state="translated">封鎖成員?</target>
</trans-unit>
<trans-unit id="(new)" xml:space="preserve" approved="no">
<source>(new)</source>
<target state="translated">(新)</target>
</trans-unit>
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve" approved="no">
<source>%@, %@ and %lld other members connected</source>
<target state="translated">%@, %@ 和 %lld 個成員已連接</target>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve" approved="no">
<source>A few more things</source>
<target state="translated">其他</target>
</trans-unit>
<trans-unit id="Show last messages" xml:space="preserve" approved="no">
<source>Show last messages</source>
<target state="translated">顯示最新的訊息</target>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve" approved="no">
<source>App encrypts new local files (except videos).</source>
<target state="translated">應用程式將為新的本機文件(影片除外)加密。</target>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve" approved="no">
<source>Better groups</source>
<target state="translated">更加的群組</target>
</trans-unit>
<trans-unit id="%lld new interface languages" xml:space="preserve" approved="no">
<source>%lld new interface languages</source>
<target state="translated">%lld 種新的介面語言</target>
</trans-unit>
<trans-unit id="Blocked by admin" xml:space="preserve" approved="no">
<source>Blocked by admin</source>
<target state="translated">由管理員封鎖</target>
</trans-unit>
<trans-unit id="Both you and your contact can irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
<source>Both you and your contact can irreversibly delete sent messages. (24 hours)</source>
<target state="translated">您與您的聯絡人都可以不可復原地删除已傳送的訊息。(24小時)</target>
</trans-unit>
<trans-unit id="Encrypt local files" xml:space="preserve" approved="no">
<source>Encrypt local files</source>
<target state="translated">加密本機檔案</target>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve" approved="no">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target state="translated">- 更穩定的傳送!
- 更好的社群!
- 以及更多!</target>
</trans-unit>
<trans-unit id="- optionally notify deleted contacts.&#10;- profile names with spaces.&#10;- and more!" xml:space="preserve" approved="no">
<source>- optionally notify deleted contacts.
- profile names with spaces.
- and more!</source>
<target state="translated">- 可選擇通知已刪除的聯絡人
- 帶空格的共人資料名稱。
-以及更多!</target>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve" approved="no">
<source>Abort changing address?</source>
<target state="translated">中止更改地址?</target>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve" approved="no">
<source>Allow to send SimpleX links.</source>
<target state="translated">允許傳送 SimpleX 連結。</target>
</trans-unit>
<trans-unit id="Background" xml:space="preserve" approved="no">
<source>Background</source>
<target state="translated">後台</target>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="zh-Hant" datatype="plaintext">
@@ -339,7 +339,9 @@ class NotificationService: UNNotificationServiceExtension {
CXProvider.reportNewIncomingVoIPPushPayload([
"displayName": invitation.contact.displayName,
"contactId": invitation.contact.id,
"media": invitation.callType.media.rawValue
"callUUID": invitation.callUUID ?? "",
"media": invitation.callType.media.rawValue,
"callTs": invitation.callTs.timeIntervalSince1970
]) { error in
logger.debug("reportNewIncomingVoIPPushPayload result: \(error)")
deliver(error == nil ? nil : createCallInvitationNtf(invitation))
+24 -1
View File
@@ -132,7 +132,7 @@ struct ShareView: View {
switch content {
case let .image(preview, _): imagePreview(preview)
case let .movie(preview, _, _): imagePreview(preview)
case let .url(linkPreview): imagePreview(linkPreview.image)
case let .url(preview): linkPreview(preview)
case let .data(cryptoFile):
previewArea {
Image(systemName: "doc.fill")
@@ -160,6 +160,29 @@ struct ShareView: View {
}
}
@ViewBuilder private func linkPreview(_ linkPreview: LinkPreview) -> some View {
previewArea {
HStack(alignment: .center, spacing: 8) {
if let uiImage = UIImage(base64Encoded: linkPreview.image) {
Image(uiImage: uiImage)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(maxWidth: 80, maxHeight: 60)
}
VStack(alignment: .center, spacing: 4) {
Text(linkPreview.title)
.lineLimit(1)
Text(linkPreview.uri.absoluteString)
.font(.caption)
.lineLimit(1)
.foregroundColor(.secondary)
}
.padding(.vertical, 5)
.frame(maxWidth: .infinity, minHeight: 60)
}
}
}
@ViewBuilder private func previewArea<V: View>(@ViewBuilder content: @escaping () -> V) -> some View {
HStack(alignment: .center, spacing: 8) {
content()
@@ -107,5 +107,5 @@
"Wrong database passphrase" = "Falsches Datenbank-Passwort";
/* No comment provided by engineer. */
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Du kannst das Teilen in den Einstellungen zu Datenschutz & Sicherheit bzw. SimpleX-Sperre erlauben.";
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Du kannst das Teilen in den Einstellungen zu Datenschutz & Sicherheit - SimpleX-Sperre erlauben.";
@@ -82,15 +82,27 @@
/* No comment provided by engineer. */
"Selected chat preferences prohibit this message." = "Les paramètres de chat sélectionnés ne permettent pas l'envoi de ce message.";
/* No comment provided by engineer. */
"Sending a message takes longer than expected." = "L'envoi d'un message prend plus de temps que prévu.";
/* No comment provided by engineer. */
"Sending message…" = "Envoi du message…";
/* No comment provided by engineer. */
"Share" = "Partager";
/* No comment provided by engineer. */
"Slow network?" = "Réseau lent?";
/* No comment provided by engineer. */
"Unknown database error: %@" = "Erreur inconnue de la base de données: %@";
/* No comment provided by engineer. */
"Unsupported format" = "Format non pris en charge";
/* No comment provided by engineer. */
"Wait" = "Attendez";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Mauvaise phrase secrète pour la base de données";
@@ -107,5 +107,5 @@
"Wrong database passphrase" = "Hibás adatbázis jelmondat";
/* No comment provided by engineer. */
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "A megosztást az Adatvédelem és biztonság / SimpleX zár menüpontban engedélyezheti.";
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "A megosztást az Adatvédelem és biztonság / SimpleX zár menüben engedélyezheti.";
@@ -1,7 +1,9 @@
/*
InfoPlist.strings
SimpleX
/* Bundle display name */
"CFBundleDisplayName" = "SimpleX SE";
/* Bundle name */
"CFBundleName" = "SimpleX SE";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. Wszelkie prawa zastrzeżone.";
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
@@ -1,7 +1,111 @@
/*
Localizable.strings
SimpleX
/* No comment provided by engineer. */
"%@" = "%@";
/* No comment provided by engineer. */
"App is locked!" = "Aplikacja zablokowana!";
/* No comment provided by engineer. */
"Cancel" = "Anuluj";
/* No comment provided by engineer. */
"Cannot access keychain to save database password" = "Nie można uzyskać dostępu do pęku kluczy aby zapisać hasło do bazy danych";
/* No comment provided by engineer. */
"Cannot forward message" = "Nie można przekazać wiadomości";
/* No comment provided by engineer. */
"Comment" = "Komentarz";
/* No comment provided by engineer. */
"Currently maximum supported file size is %@." = "Obecnie maksymalny obsługiwany rozmiar pliku to %@.";
/* No comment provided by engineer. */
"Database downgrade required" = "Wymagane obniżenie wersji bazy danych";
/* No comment provided by engineer. */
"Database encrypted!" = "Baza danych zaszyfrowana!";
/* No comment provided by engineer. */
"Database error" = "Błąd bazy danych";
/* No comment provided by engineer. */
"Database passphrase is different from saved in the keychain." = "Hasło bazy danych jest inne niż zapisane w pęku kluczy.";
/* No comment provided by engineer. */
"Database passphrase is required to open chat." = "Hasło do bazy danych jest wymagane do otwarcia czatu.";
/* No comment provided by engineer. */
"Database upgrade required" = "Wymagana aktualizacja bazy danych";
/* No comment provided by engineer. */
"Error preparing file" = "Błąd przygotowania pliku";
/* No comment provided by engineer. */
"Error preparing message" = "Błąd przygotowania wiadomości";
/* No comment provided by engineer. */
"Error: %@" = "Błąd: %@";
/* No comment provided by engineer. */
"File error" = "Błąd pliku";
/* No comment provided by engineer. */
"Incompatible database version" = "Niekompatybilna wersja bazy danych";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Nieprawidłowe potwierdzenie migracji";
/* No comment provided by engineer. */
"Keychain error" = "Błąd pęku kluczy";
/* No comment provided by engineer. */
"Large file!" = "Duży plik!";
/* No comment provided by engineer. */
"No active profile" = "Brak aktywnego profilu";
/* No comment provided by engineer. */
"Ok" = "Ok";
/* No comment provided by engineer. */
"Open the app to downgrade the database." = "Otwórz aplikację aby obniżyć wersję bazy danych.";
/* No comment provided by engineer. */
"Open the app to upgrade the database." = "Otwórz aplikację aby zaktualizować bazę danych.";
/* No comment provided by engineer. */
"Passphrase" = "Hasło";
/* No comment provided by engineer. */
"Please create a profile in the SimpleX app" = "Proszę utworzyć profil w aplikacji SimpleX";
/* No comment provided by engineer. */
"Selected chat preferences prohibit this message." = "Wybrane preferencje czatu zabraniają tej wiadomości.";
/* No comment provided by engineer. */
"Sending a message takes longer than expected." = "Wysłanie wiadomości trwa dłużej niż oczekiwano.";
/* No comment provided by engineer. */
"Sending message…" = "Wysyłanie wiadomości…";
/* No comment provided by engineer. */
"Share" = "Udostępnij";
/* No comment provided by engineer. */
"Slow network?" = "Wolna sieć?";
/* No comment provided by engineer. */
"Unknown database error: %@" = "Nieznany błąd bazy danych: %@";
/* No comment provided by engineer. */
"Unsupported format" = "Niewspierany format";
/* No comment provided by engineer. */
"Wait" = "Czekaj";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Nieprawidłowe hasło bazy danych";
/* No comment provided by engineer. */
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Możesz zezwolić na udostępnianie w ustawieniach Prywatność i bezpieczeństwo / Blokada SimpleX.";
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
@@ -1,7 +1,9 @@
/*
InfoPlist.strings
SimpleX
/* Bundle display name */
"CFBundleDisplayName" = "SimpleX SE";
/* Bundle name */
"CFBundleName" = "SimpleX SE";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. Всі права захищені.";
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
@@ -1,7 +1,111 @@
/*
Localizable.strings
SimpleX
/* No comment provided by engineer. */
"%@" = "%@";
/* No comment provided by engineer. */
"App is locked!" = "Додаток заблоковано!";
/* No comment provided by engineer. */
"Cancel" = "Скасувати";
/* No comment provided by engineer. */
"Cannot access keychain to save database password" = "Не вдається отримати доступ до зв'язки ключів для збереження пароля до бази даних";
/* No comment provided by engineer. */
"Cannot forward message" = "Неможливо переслати повідомлення";
/* No comment provided by engineer. */
"Comment" = "Коментар";
/* No comment provided by engineer. */
"Currently maximum supported file size is %@." = "Наразі максимальний підтримуваний розмір файлу - %@.";
/* No comment provided by engineer. */
"Database downgrade required" = "Потрібне оновлення бази даних";
/* No comment provided by engineer. */
"Database encrypted!" = "База даних зашифрована!";
/* No comment provided by engineer. */
"Database error" = "Помилка в базі даних";
/* No comment provided by engineer. */
"Database passphrase is different from saved in the keychain." = "Парольна фраза бази даних відрізняється від збереженої у в’язці ключів.";
/* No comment provided by engineer. */
"Database passphrase is required to open chat." = "Для відкриття чату потрібно ввести пароль до бази даних.";
/* No comment provided by engineer. */
"Database upgrade required" = "Потрібне оновлення бази даних";
/* No comment provided by engineer. */
"Error preparing file" = "Помилка підготовки файлу";
/* No comment provided by engineer. */
"Error preparing message" = "Повідомлення про підготовку до помилки";
/* No comment provided by engineer. */
"Error: %@" = "Помилка: %@";
/* No comment provided by engineer. */
"File error" = "Помилка файлу";
/* No comment provided by engineer. */
"Incompatible database version" = "Несумісна версія бази даних";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Недійсне підтвердження міграції";
/* No comment provided by engineer. */
"Keychain error" = "Помилка зв'язки ключів";
/* No comment provided by engineer. */
"Large file!" = "Великий файл!";
/* No comment provided by engineer. */
"No active profile" = "Немає активного профілю";
/* No comment provided by engineer. */
"Ok" = "Гаразд";
/* No comment provided by engineer. */
"Open the app to downgrade the database." = "Відкрийте програму, щоб знизити версію бази даних.";
/* No comment provided by engineer. */
"Open the app to upgrade the database." = "Відкрийте програму, щоб оновити базу даних.";
/* No comment provided by engineer. */
"Passphrase" = "Парольна фраза";
/* No comment provided by engineer. */
"Please create a profile in the SimpleX app" = "Будь ласка, створіть профіль у додатку SimpleX";
/* No comment provided by engineer. */
"Selected chat preferences prohibit this message." = "Вибрані налаштування чату забороняють це повідомлення.";
/* No comment provided by engineer. */
"Sending a message takes longer than expected." = "Надсилання повідомлення займає більше часу, ніж очікувалося.";
/* No comment provided by engineer. */
"Sending message…" = "Надсилаю повідомлення…";
/* No comment provided by engineer. */
"Share" = "Поділіться";
/* No comment provided by engineer. */
"Slow network?" = "Повільна мережа?";
/* No comment provided by engineer. */
"Unknown database error: %@" = "Невідома помилка бази даних: %@";
/* No comment provided by engineer. */
"Unsupported format" = "Непідтримуваний формат";
/* No comment provided by engineer. */
"Wait" = "Зачекай";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Неправильна ключова фраза до бази даних";
/* No comment provided by engineer. */
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Ви можете дозволити спільний доступ у налаштуваннях Конфіденційність і безпека / SimpleX Lock.";
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
+49 -45
View File
@@ -135,7 +135,6 @@
5CE4407927ADB701007B033A /* EmojiItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407827ADB701007B033A /* EmojiItemView.swift */; };
5CEACCE327DE9246000BD591 /* ComposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCE227DE9246000BD591 /* ComposeView.swift */; };
5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; };
5CEBD7462A5C0A8F00665FE2 /* KeyboardPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */; };
5CEBD7482A5F115D00665FE2 /* SetDeliveryReceiptsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */; };
5CF937202B24DE8C00E1D781 /* SharedFileSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */; };
5CF937232B2503D000E1D781 /* NSESubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF937212B25034A00E1D781 /* NSESubscriber.swift */; };
@@ -178,6 +177,8 @@
64E972072881BB22008DBC02 /* CIGroupInvitationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64E972062881BB22008DBC02 /* CIGroupInvitationView.swift */; };
64EEB0F72C353F1C00972D62 /* ServersSummaryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64EEB0F62C353F1C00972D62 /* ServersSummaryView.swift */; };
64F1CC3B28B39D8600CD1FB1 /* IncognitoHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64F1CC3A28B39D8600CD1FB1 /* IncognitoHelp.swift */; };
8C01E9C12C8EFC33008A4B0A /* objc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C01E9C02C8EFC33008A4B0A /* objc.m */; };
8C01E9C22C8EFF8F008A4B0A /* objc.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C01E9BF2C8EFBB6008A4B0A /* objc.h */; };
8C69FE7D2B8C7D2700267E38 /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C69FE7C2B8C7D2700267E38 /* AppSettings.swift */; };
8C74C3E52C1B900600039E77 /* ThemeTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7E3CE32C0DEAC400BFF63A /* ThemeTypes.swift */; };
8C74C3E72C1B901900039E77 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C852B072C1086D100BA61E8 /* Color.swift */; };
@@ -215,15 +216,15 @@
D77B92DC2952372200A5A1CC /* SwiftyGif in Frameworks */ = {isa = PBXBuildFile; productRef = D77B92DB2952372200A5A1CC /* SwiftyGif */; };
D7F0E33929964E7E0068AF69 /* LZString in Frameworks */ = {isa = PBXBuildFile; productRef = D7F0E33829964E7E0068AF69 /* LZString */; };
E51CC1E62C62085600DB91FE /* OneHandUICard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E51CC1E52C62085600DB91FE /* OneHandUICard.swift */; };
E5CC47842CA31C3A00551ACF /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5CC477F2CA31C3900551ACF /* libgmpxx.a */; };
E5CC47852CA31C3A00551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5CC47802CA31C3900551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP.a */; };
E5CC47862CA31C3A00551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5CC47812CA31C3900551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP-ghc9.6.3.a */; };
E5CC47872CA31C3A00551ACF /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5CC47822CA31C3A00551ACF /* libgmp.a */; };
E5CC47882CA31C3A00551ACF /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5CC47832CA31C3A00551ACF /* libffi.a */; };
E5DCF8DB2C56FAC1007928CC /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; };
E5DCF9712C590272007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF96F2C590272007928CC /* Localizable.strings */; };
E5DCF9842C5902CE007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9822C5902CE007928CC /* Localizable.strings */; };
E5DCF9982C5906FF007928CC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9962C5906FF007928CC /* InfoPlist.strings */; };
E5E2183F2C655B410013B4C6 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183A2C655B410013B4C6 /* libgmp.a */; };
E5E218402C655B410013B4C6 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183B2C655B410013B4C6 /* libgmpxx.a */; };
E5E218412C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183C2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a */; };
E5E218422C655B410013B4C6 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183D2C655B410013B4C6 /* libffi.a */; };
E5E218432C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5E2183E2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -474,7 +475,6 @@
5CE6C7B42AAB1527007F345C /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = "<group>"; };
5CEACCE227DE9246000BD591 /* ComposeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeView.swift; sourceTree = "<group>"; };
5CEACCEC27DEA495000BD591 /* MsgContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MsgContentView.swift; sourceTree = "<group>"; };
5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardPadding.swift; sourceTree = "<group>"; };
5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetDeliveryReceiptsView.swift; sourceTree = "<group>"; };
5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedFileSubscriber.swift; sourceTree = "<group>"; };
5CF937212B25034A00E1D781 /* NSESubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSESubscriber.swift; sourceTree = "<group>"; };
@@ -518,6 +518,8 @@
64E972062881BB22008DBC02 /* CIGroupInvitationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIGroupInvitationView.swift; sourceTree = "<group>"; };
64EEB0F62C353F1C00972D62 /* ServersSummaryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServersSummaryView.swift; sourceTree = "<group>"; };
64F1CC3A28B39D8600CD1FB1 /* IncognitoHelp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncognitoHelp.swift; sourceTree = "<group>"; };
8C01E9BF2C8EFBB6008A4B0A /* objc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = objc.h; sourceTree = "<group>"; };
8C01E9C02C8EFC33008A4B0A /* objc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = objc.m; sourceTree = "<group>"; };
8C69FE7C2B8C7D2700267E38 /* AppSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettings.swift; sourceTree = "<group>"; };
8C74C3EB2C1B92A900039E77 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; };
8C74C3ED2C1B942300039E77 /* ChatWallpaper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatWallpaper.swift; sourceTree = "<group>"; };
@@ -552,6 +554,11 @@
D741547929AF90B00022400A /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/PushKit.framework; sourceTree = DEVELOPER_DIR; };
D7AA2C3429A936B400737B40 /* MediaEncryption.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = MediaEncryption.playground; path = Shared/MediaEncryption.playground; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
E51CC1E52C62085600DB91FE /* OneHandUICard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneHandUICard.swift; sourceTree = "<group>"; };
E5CC477F2CA31C3900551ACF /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
E5CC47802CA31C3900551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP.a"; sourceTree = "<group>"; };
E5CC47812CA31C3900551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP-ghc9.6.3.a"; sourceTree = "<group>"; };
E5CC47822CA31C3A00551ACF /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
E5CC47832CA31C3A00551ACF /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
E5DCF9702C590272007928CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
E5DCF9722C590274007928CC /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
E5DCF9732C590275007928CC /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
@@ -604,11 +611,6 @@
E5DCF9A62C590731007928CC /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E5DCF9A72C590732007928CC /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E5DCF9A82C590732007928CC /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E5E2183A2C655B410013B4C6 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
E5E2183B2C655B410013B4C6 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
E5E2183C2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a"; sourceTree = "<group>"; };
E5E2183D2C655B410013B4C6 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
E5E2183E2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -647,12 +649,12 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E5E218412C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a in Frameworks */,
E5E218432C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a in Frameworks */,
E5E218402C655B410013B4C6 /* libgmpxx.a in Frameworks */,
E5CC47852CA31C3A00551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP.a in Frameworks */,
E5CC47872CA31C3A00551ACF /* libgmp.a in Frameworks */,
E5CC47842CA31C3A00551ACF /* libgmpxx.a in Frameworks */,
E5CC47882CA31C3A00551ACF /* libffi.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
E5E218422C655B410013B4C6 /* libffi.a in Frameworks */,
E5E2183F2C655B410013B4C6 /* libgmp.a in Frameworks */,
E5CC47862CA31C3A00551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP-ghc9.6.3.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */,
);
@@ -731,11 +733,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
E5E2183D2C655B410013B4C6 /* libffi.a */,
E5E2183A2C655B410013B4C6 /* libgmp.a */,
E5E2183B2C655B410013B4C6 /* libgmpxx.a */,
E5E2183E2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8-ghc9.6.3.a */,
E5E2183C2C655B410013B4C6 /* libHSsimplex-chat-6.0.0.5-LgHyBNgR6mx4TwahlxfNH8.a */,
E5CC47832CA31C3A00551ACF /* libffi.a */,
E5CC47822CA31C3A00551ACF /* libgmp.a */,
E5CC477F2CA31C3900551ACF /* libgmpxx.a */,
E5CC47812CA31C3900551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP-ghc9.6.3.a */,
E5CC47802CA31C3900551ACF /* libHSsimplex-chat-6.0.5.0-3qcee2iGFVOIynW0cRTIaP.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -786,7 +788,6 @@
18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */,
64466DCB29FFE3E800E3D48D /* MailView.swift */,
64C3B0202A0D359700E19930 /* CustomTimePicker.swift */,
5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */,
8C7F8F0D2C19C0C100D16888 /* ViewModifiers.swift */,
8C74C3ED2C1B942300039E77 /* ChatWallpaper.swift */,
8C9BC2642C240D5100875A27 /* ThemeModeEditor.swift */,
@@ -979,6 +980,8 @@
5CE2BA96284537A800EC33A6 /* dummy.m */,
5CD67B8D2B0E858A00C510B1 /* hs_init.h */,
5CD67B8E2B0E858A00C510B1 /* hs_init.c */,
8C01E9BF2C8EFBB6008A4B0A /* objc.h */,
8C01E9C02C8EFC33008A4B0A /* objc.m */,
);
path = SimpleXChat;
sourceTree = "<group>";
@@ -1116,6 +1119,7 @@
files = (
5CE2BA77284530BF00EC33A6 /* SimpleXChat.h in Headers */,
5CD67B8F2B0E858A00C510B1 /* hs_init.h in Headers */,
8C01E9C22C8EFF8F008A4B0A /* objc.h in Headers */,
5CE2BA952845354B00EC33A6 /* SimpleX.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1435,7 +1439,6 @@
646BB38E283FDB6D001CE359 /* LocalAuthenticationUtils.swift in Sources */,
8C74C3EA2C1B90AF00039E77 /* ThemeManager.swift in Sources */,
5C7505A227B65FDB00BE3227 /* CIMetaView.swift in Sources */,
5CEBD7462A5C0A8F00665FE2 /* KeyboardPadding.swift in Sources */,
5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */,
5CB634B129E5EFEA0066AD6B /* PasscodeView.swift in Sources */,
8C69FE7D2B8C7D2700267E38 /* AppSettings.swift in Sources */,
@@ -1543,6 +1546,7 @@
8C74C3E72C1B901900039E77 /* Color.swift in Sources */,
5CD67B902B0E858A00C510B1 /* hs_init.c in Sources */,
5CE2BA91284533A300EC33A6 /* Notifications.swift in Sources */,
8C01E9C12C8EFC33008A4B0A /* objc.m in Sources */,
5CE2BA79284530CC00EC33A6 /* SimpleXChat.docc in Sources */,
5CE2BA90284533A300EC33A6 /* JSON.swift in Sources */,
5CE2BA8B284533A300EC33A6 /* ChatTypes.swift in Sources */,
@@ -1883,7 +1887,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1908,7 +1912,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES_THIN;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1932,7 +1936,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1957,7 +1961,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1973,11 +1977,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -1993,11 +1997,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2018,7 +2022,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -2033,7 +2037,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -2055,7 +2059,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -2070,7 +2074,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -2092,7 +2096,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2118,7 +2122,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -2143,7 +2147,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2169,7 +2173,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -2194,7 +2198,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -2209,7 +2213,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2228,7 +2232,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 231;
CURRENT_PROJECT_VERSION = 239;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -2243,7 +2247,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 6.0;
MARKETING_VERSION = 6.0.5;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2320,7 +2324,7 @@
repositoryURL = "https://github.com/twostraws/CodeScanner";
requirement = {
kind = exactVersion;
version = 2.1.1;
version = 2.5.0;
};
};
8C73C1162C21E17B00892670 /* XCRemoteSwiftPackageReference "Yams" */ = {
@@ -6,8 +6,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/twostraws/CodeScanner",
"state" : {
"revision" : "c27a66149b7483fe42e2ec6aad61d5c3fffe522d",
"version" : "2.1.1"
"revision" : "34da57fb63b47add20de8a85da58191523ccce57",
"version" : "2.5.0"
}
},
{
@@ -23,7 +23,6 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/kirualex/SwiftyGif",
"state" : {
"branch" : "master",
"revision" : "5e8619335d394901379c9add5c4c1c2f420b3800"
}
},
+113 -40
View File
@@ -8,6 +8,7 @@
import Foundation
import SwiftUI
import Network
public let jsonDecoder = getJSONDecoder()
public let jsonEncoder = getJSONEncoder()
@@ -537,7 +538,7 @@ public enum ChatResponse: Decodable, Error {
case networkConfig(networkConfig: NetCfg)
case contactInfo(user: UserRef, contact: Contact, connectionStats_: ConnectionStats?, customUserProfile: Profile?)
case groupMemberInfo(user: UserRef, groupInfo: GroupInfo, member: GroupMember, connectionStats_: ConnectionStats?)
case queueInfo(user: UserRef, rcvMsgInfo: RcvMsgInfo?, queueInfo: QueueInfo)
case queueInfo(user: UserRef, rcvMsgInfo: RcvMsgInfo?, queueInfo: ServerQueueInfo)
case contactSwitchStarted(user: UserRef, contact: Contact, connectionStats: ConnectionStats)
case groupMemberSwitchStarted(user: UserRef, groupInfo: GroupInfo, member: GroupMember, connectionStats: ConnectionStats)
case contactSwitchAborted(user: UserRef, contact: Contact, connectionStats: ConnectionStats)
@@ -1094,12 +1095,12 @@ public enum GroupLinkPlan: Decodable, Hashable {
case known(groupInfo: GroupInfo)
}
struct NewUser: Encodable, Hashable {
struct NewUser: Encodable {
var profile: Profile?
var pastTimestamp: Bool
}
public enum ChatPagination: Hashable {
public enum ChatPagination {
case last(count: Int)
case after(chatItemId: Int64, count: Int)
case before(chatItemId: Int64, count: Int)
@@ -1315,7 +1316,7 @@ public struct ServerAddress: Decodable {
)
}
public struct NetCfg: Codable, Equatable, Hashable {
public struct NetCfg: Codable, Equatable {
public var socksProxy: String? = nil
var socksMode: SocksMode = .always
public var hostMode: HostMode = .publicHost
@@ -1369,18 +1370,18 @@ public struct NetCfg: Codable, Equatable, Hashable {
public var enableKeepAlive: Bool { tcpKeepAlive != nil }
}
public enum HostMode: String, Codable, Hashable {
public enum HostMode: String, Codable {
case onionViaSocks
case onionHost = "onion"
case publicHost = "public"
}
public enum SocksMode: String, Codable, Hashable {
public enum SocksMode: String, Codable {
case always = "always"
case onion = "onion"
}
public enum SMPProxyMode: String, Codable, Hashable, SelectableItem {
public enum SMPProxyMode: String, Codable, SelectableItem {
case always = "always"
case unknown = "unknown"
case unprotected = "unprotected"
@@ -1400,7 +1401,7 @@ public enum SMPProxyMode: String, Codable, Hashable, SelectableItem {
public static let values: [SMPProxyMode] = [.always, .unknown, .unprotected, .never]
}
public enum SMPProxyFallback: String, Codable, Hashable, SelectableItem {
public enum SMPProxyFallback: String, Codable, SelectableItem {
case allow = "allow"
case allowProtected = "allowProtected"
case prohibit = "prohibit"
@@ -1418,7 +1419,7 @@ public enum SMPProxyFallback: String, Codable, Hashable, SelectableItem {
public static let values: [SMPProxyFallback] = [.allow, .allowProtected, .prohibit]
}
public enum OnionHosts: String, Identifiable, Hashable {
public enum OnionHosts: String, Identifiable {
case no
case prefer
case require
@@ -1452,7 +1453,7 @@ public enum OnionHosts: String, Identifiable, Hashable {
public static let values: [OnionHosts] = [.no, .prefer, .require]
}
public enum TransportSessionMode: String, Codable, Identifiable, Hashable {
public enum TransportSessionMode: String, Codable, Identifiable {
case user
case entity
@@ -1468,7 +1469,7 @@ public enum TransportSessionMode: String, Codable, Identifiable, Hashable {
public static let values: [TransportSessionMode] = [.user, .entity]
}
public struct KeepAliveOpts: Codable, Equatable, Hashable {
public struct KeepAliveOpts: Codable, Equatable {
public var keepIdle: Int // seconds
public var keepIntvl: Int // seconds
public var keepCnt: Int // times
@@ -1476,7 +1477,64 @@ public struct KeepAliveOpts: Codable, Equatable, Hashable {
public static let defaults: KeepAliveOpts = KeepAliveOpts(keepIdle: 30, keepIntvl: 15, keepCnt: 4)
}
public enum NetworkStatus: Decodable, Equatable, Hashable {
public struct NetworkProxy: Equatable, Codable {
public var host: String = ""
public var port: Int = 0
public var auth: NetworkProxyAuth = .username
public var username: String = ""
public var password: String = ""
public static var def: NetworkProxy {
NetworkProxy()
}
public var valid: Bool {
let hostOk = switch NWEndpoint.Host(host) {
case .ipv4: true
case .ipv6: true
default: false
}
return hostOk &&
port > 0 && port <= 65535 &&
NetworkProxy.validCredential(username) && NetworkProxy.validCredential(password)
}
public static func validCredential(_ s: String) -> Bool {
!s.contains(":") && !s.contains("@")
}
public func toProxyString() -> String? {
if !valid { return nil }
var res = ""
switch auth {
case .username:
let usernameTrimmed = username.trimmingCharacters(in: .whitespaces)
let passwordTrimmed = password.trimmingCharacters(in: .whitespaces)
if usernameTrimmed != "" || passwordTrimmed != "" {
res += usernameTrimmed + ":" + passwordTrimmed + "@"
} else {
res += "@"
}
case .isolate: ()
}
if host != "" {
if host.contains(":") {
res += "[\(host.trimmingCharacters(in: [" ", "[", "]"]))]"
} else {
res += host.trimmingCharacters(in: .whitespaces)
}
}
res += ":\(port)"
return res
}
}
public enum NetworkProxyAuth: String, Codable {
case username
case isolate
}
public enum NetworkStatus: Decodable, Equatable {
case unknown
case connected
case disconnected
@@ -1514,7 +1572,7 @@ public enum NetworkStatus: Decodable, Equatable, Hashable {
}
}
public struct ConnNetworkStatus: Decodable, Hashable {
public struct ConnNetworkStatus: Decodable {
public var agentConnId: String
public var networkStatus: NetworkStatus
}
@@ -1539,7 +1597,7 @@ public enum MsgFilter: String, Codable, Hashable {
case mentions
}
public struct UserMsgReceiptSettings: Codable, Hashable {
public struct UserMsgReceiptSettings: Codable {
public var enable: Bool
public var clearOverrides: Bool
@@ -1588,7 +1646,7 @@ public enum SndSwitchStatus: String, Codable, Hashable {
case sendingQTEST = "sending_qtest"
}
public enum QueueDirection: String, Decodable, Hashable {
public enum QueueDirection: String, Decodable {
case rcv
case snd
}
@@ -1643,12 +1701,12 @@ public struct AutoAccept: Codable, Hashable {
}
}
public protocol SelectableItem: Hashable, Identifiable {
public protocol SelectableItem: Identifiable, Equatable {
var label: LocalizedStringKey { get }
static var values: [Self] { get }
}
public struct DeviceToken: Decodable, Hashable {
public struct DeviceToken: Decodable {
var pushProvider: PushProvider
var token: String
@@ -1662,12 +1720,12 @@ public struct DeviceToken: Decodable, Hashable {
}
}
public enum PushEnvironment: String, Hashable {
public enum PushEnvironment: String {
case development
case production
}
public enum PushProvider: String, Decodable, Hashable {
public enum PushProvider: String, Decodable {
case apns_dev
case apns_prod
@@ -1681,7 +1739,7 @@ public enum PushProvider: String, Decodable, Hashable {
// This notification mode is for app core, UI uses AppNotificationsMode.off to mean completely disable,
// and .local for periodic background checks
public enum NotificationsMode: String, Decodable, SelectableItem, Hashable {
public enum NotificationsMode: String, Decodable, SelectableItem {
case off = "OFF"
case periodic = "PERIODIC"
case instant = "INSTANT"
@@ -1699,7 +1757,7 @@ public enum NotificationsMode: String, Decodable, SelectableItem, Hashable {
public static var values: [NotificationsMode] = [.instant, .periodic, .off]
}
public enum NotificationPreviewMode: String, SelectableItem, Codable, Hashable {
public enum NotificationPreviewMode: String, SelectableItem, Codable {
case hidden
case contact
case message
@@ -1717,7 +1775,7 @@ public enum NotificationPreviewMode: String, SelectableItem, Codable, Hashable {
public static var values: [NotificationPreviewMode] = [.message, .contact, .hidden]
}
public struct RemoteCtrlInfo: Decodable, Hashable {
public struct RemoteCtrlInfo: Decodable {
public var remoteCtrlId: Int64
public var ctrlDeviceName: String
public var sessionState: RemoteCtrlSessionState?
@@ -1727,7 +1785,7 @@ public struct RemoteCtrlInfo: Decodable, Hashable {
}
}
public enum RemoteCtrlSessionState: Decodable, Hashable {
public enum RemoteCtrlSessionState: Decodable {
case starting
case searching
case connecting
@@ -1742,17 +1800,17 @@ public enum RemoteCtrlStopReason: Decodable {
case disconnected
}
public struct CtrlAppInfo: Decodable, Hashable {
public struct CtrlAppInfo: Decodable {
public var appVersionRange: AppVersionRange
public var deviceName: String
}
public struct AppVersionRange: Decodable, Hashable {
public struct AppVersionRange: Decodable {
public var minVersion: String
public var maxVersion: String
}
public struct CoreVersionInfo: Decodable, Hashable {
public struct CoreVersionInfo: Decodable {
public var version: String
public var simplexmqVersion: String
public var simplexmqCommit: String
@@ -2090,20 +2148,22 @@ public enum RemoteCtrlError: Decodable, Hashable {
case protocolError
}
public struct MigrationFileLinkData: Codable, Hashable {
public struct MigrationFileLinkData: Codable {
let networkConfig: NetworkConfig?
public init(networkConfig: NetworkConfig) {
self.networkConfig = networkConfig
}
public struct NetworkConfig: Codable, Hashable {
public struct NetworkConfig: Codable {
let socksProxy: String?
let networkProxy: NetworkProxy?
let hostMode: HostMode?
let requiredHostMode: Bool?
public init(socksProxy: String?, hostMode: HostMode?, requiredHostMode: Bool?) {
public init(socksProxy: String?, networkProxy: NetworkProxy?, hostMode: HostMode?, requiredHostMode: Bool?) {
self.socksProxy = socksProxy
self.networkProxy = networkProxy
self.hostMode = hostMode
self.requiredHostMode = requiredHostMode
}
@@ -2112,6 +2172,7 @@ public struct MigrationFileLinkData: Codable, Hashable {
return if let hostMode, let requiredHostMode {
NetworkConfig(
socksProxy: nil,
networkProxy: nil,
hostMode: hostMode == .onionViaSocks ? .onionHost : hostMode,
requiredHostMode: requiredHostMode
)
@@ -2129,8 +2190,9 @@ public struct MigrationFileLinkData: Codable, Hashable {
}
}
public struct AppSettings: Codable, Equatable, Hashable {
public struct AppSettings: Codable, Equatable {
public var networkConfig: NetCfg? = nil
public var networkProxy: NetworkProxy? = nil
public var privacyEncryptLocalFiles: Bool? = nil
public var privacyAskToApproveRelays: Bool? = nil
public var privacyAcceptImages: Bool? = nil
@@ -2162,6 +2224,7 @@ public struct AppSettings: Codable, Equatable, Hashable {
var empty = AppSettings()
let def = AppSettings.defaults
if networkConfig != def.networkConfig { empty.networkConfig = networkConfig }
if networkProxy != def.networkProxy { empty.networkProxy = networkProxy }
if privacyEncryptLocalFiles != def.privacyEncryptLocalFiles { empty.privacyEncryptLocalFiles = privacyEncryptLocalFiles }
if privacyAskToApproveRelays != def.privacyAskToApproveRelays { empty.privacyAskToApproveRelays = privacyAskToApproveRelays }
if privacyAcceptImages != def.privacyAcceptImages { empty.privacyAcceptImages = privacyAcceptImages }
@@ -2194,6 +2257,7 @@ public struct AppSettings: Codable, Equatable, Hashable {
public static var defaults: AppSettings {
AppSettings (
networkConfig: NetCfg.defaults,
networkProxy: NetworkProxy.def,
privacyEncryptLocalFiles: true,
privacyAskToApproveRelays: true,
privacyAcceptImages: true,
@@ -2224,7 +2288,7 @@ public struct AppSettings: Codable, Equatable, Hashable {
}
}
public enum AppSettingsNotificationMode: String, Codable, Hashable {
public enum AppSettingsNotificationMode: String, Codable {
case off
case periodic
case instant
@@ -2252,13 +2316,13 @@ public enum AppSettingsNotificationMode: String, Codable, Hashable {
// case message
//}
public enum AppSettingsLockScreenCalls: String, Codable, Hashable {
public enum AppSettingsLockScreenCalls: String, Codable {
case disable
case show
case accept
}
public struct UserNetworkInfo: Codable, Equatable, Hashable {
public struct UserNetworkInfo: Codable, Equatable {
public let networkType: UserNetworkType
public let online: Bool
@@ -2268,7 +2332,7 @@ public struct UserNetworkInfo: Codable, Equatable, Hashable {
}
}
public enum UserNetworkType: String, Codable, Hashable {
public enum UserNetworkType: String, Codable {
case none
case cellular
case wifi
@@ -2286,7 +2350,7 @@ public enum UserNetworkType: String, Codable, Hashable {
}
}
public struct RcvMsgInfo: Codable, Hashable {
public struct RcvMsgInfo: Codable {
var msgId: Int64
var msgDeliveryId: Int64
var msgDeliveryStatus: String
@@ -2294,7 +2358,16 @@ public struct RcvMsgInfo: Codable, Hashable {
var agentMsgMeta: String
}
public struct QueueInfo: Codable, Hashable {
public struct ServerQueueInfo: Codable {
var server: String
var rcvId: String
var sndId: String
var ntfId: String?
var status: String
var info: QueueInfo
}
public struct QueueInfo: Codable {
var qiSnd: Bool
var qiNtf: Bool
var qiSub: QSub?
@@ -2302,25 +2375,25 @@ public struct QueueInfo: Codable, Hashable {
var qiMsg: MsgInfo?
}
public struct QSub: Codable, Hashable {
public struct QSub: Codable {
var qSubThread: QSubThread
var qDelivered: String?
}
public enum QSubThread: String, Codable, Hashable {
public enum QSubThread: String, Codable {
case noSub
case subPending
case subThread
case prohibitSub
}
public struct MsgInfo: Codable, Hashable {
public struct MsgInfo: Codable {
var msgId: String
var msgTs: Date
var msgType: MsgType
}
public enum MsgType: String, Codable, Hashable {
public enum MsgType: String, Codable {
case message
case quota
}
+6 -1
View File
@@ -35,6 +35,7 @@ public let GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS = "privacyAskToApproveRel
// replaces DEFAULT_PROFILE_IMAGE_CORNER_RADIUS
public let GROUP_DEFAULT_PROFILE_IMAGE_CORNER_RADIUS = "profileImageCornerRadius"
let GROUP_DEFAULT_NTF_BADGE_COUNT = "ntgBadgeCount"
public let GROUP_DEFAULT_NETWORK_SOCKS_PROXY = "networkSocksProxy"
let GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS = "networkUseOnionHosts"
let GROUP_DEFAULT_NETWORK_SESSION_MODE = "networkSessionMode"
let GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE = "networkSMPProxyMode"
@@ -327,6 +328,7 @@ public class Default<T> {
}
public func getNetCfg() -> NetCfg {
let socksProxy = groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY)
let onionHosts = networkUseOnionHostsGroupDefault.get()
let (hostMode, requiredHostMode) = onionHosts.hostMode
let sessionMode = networkSessionModeGroupDefault.get()
@@ -349,6 +351,7 @@ public func getNetCfg() -> NetCfg {
tcpKeepAlive = nil
}
return NetCfg(
socksProxy: socksProxy,
hostMode: hostMode,
requiredHostMode: requiredHostMode,
sessionMode: sessionMode,
@@ -365,11 +368,13 @@ public func getNetCfg() -> NetCfg {
)
}
public func setNetCfg(_ cfg: NetCfg) {
public func setNetCfg(_ cfg: NetCfg, networkProxy: NetworkProxy?) {
networkUseOnionHostsGroupDefault.set(OnionHosts(netCfg: cfg))
networkSessionModeGroupDefault.set(cfg.sessionMode)
networkSMPProxyModeGroupDefault.set(cfg.smpProxyMode)
networkSMPProxyFallbackGroupDefault.set(cfg.smpProxyFallback)
let socksProxy = networkProxy?.toProxyString()
groupDefaults.set(socksProxy, forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY)
groupDefaults.set(cfg.tcpConnectTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT)
groupDefaults.set(cfg.tcpTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT)
groupDefaults.set(cfg.tcpTimeoutPerKb, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB)
+2 -3
View File
@@ -42,6 +42,7 @@ public struct RcvCallInvitation: Decodable {
public var contact: Contact
public var callType: CallType
public var sharedKey: String?
public var callUUID: String?
public var callTs: Date
public var callTypeText: LocalizedStringKey {
get {
@@ -52,10 +53,8 @@ public struct RcvCallInvitation: Decodable {
}
}
public var callkitUUID: UUID? = UUID()
private enum CodingKeys: String, CodingKey {
case user, contact, callType, sharedKey, callTs
case user, contact, callType, sharedKey, callUUID, callTs
}
public static let sampleData = RcvCallInvitation(
+6
View File
@@ -1500,6 +1500,12 @@ public struct ChatData: Decodable, Identifiable, Hashable, ChatLike {
public var id: ChatId { get { chatInfo.id } }
public init(chatInfo: ChatInfo, chatItems: [ChatItem], chatStats: ChatStats = ChatStats()) {
self.chatInfo = chatInfo
self.chatItems = chatItems
self.chatStats = chatStats
}
public static func invalidJSON(_ json: String) -> ChatData {
ChatData(
chatInfo: .invalidJSON(json: json),
+1
View File
@@ -10,6 +10,7 @@
#define SimpleX_h
#include "hs_init.h"
#include "objc.h"
extern void hs_init(int argc, char **argv[]);
+20
View File
@@ -0,0 +1,20 @@
//
// objc.h
// SimpleX (iOS)
//
// Created by Stanislav Dmitrenko on 09.09.2024.
// Copyright © 2024 SimpleX Chat. All rights reserved.
//
#ifndef objc_h
#define objc_h
#import <Foundation/Foundation.h>
@interface ObjC : NSObject
+ (BOOL)catchException:(void(^)(void))tryBlock error:(__autoreleasing NSError **)error;
@end
#endif /* objc_h */
+25
View File
@@ -0,0 +1,25 @@
//
// objc.m
// SimpleXChat
//
// Created by Stanislav Dmitrenko on 09.09.2024.
// Copyright © 2024 SimpleX Chat. All rights reserved.
//
#import "objc.h"
@implementation ObjC
// https://stackoverflow.com/a/36454808
+ (BOOL)catchException:(void(^)(void))tryBlock error:(__autoreleasing NSError **)error {
@try {
tryBlock();
return YES;
}
@catch (NSException *exception) {
*error = [[NSError alloc] initWithDomain: exception.name code: 0 userInfo: exception.userInfo];
return NO;
}
}
@end
+149 -5
View File
@@ -314,13 +314,13 @@
"A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." = "**Für jeden Kontakt und jedes Gruppenmitglied** wird eine separate TCP-Verbindung genutzt.\n**Bitte beachten Sie**: Wenn Sie viele Verbindungen haben, kann der Batterieverbrauch und die Datennutzung wesentlich höher sein und einige Verbindungen können scheitern.";
/* No comment provided by engineer. */
"Abort" = "Abbrechen";
"Abort" = "Beenden";
/* No comment provided by engineer. */
"Abort changing address" = "Wechsel der Empfängeradresse abbrechen";
"Abort changing address" = "Wechsel der Empfängeradresse beenden";
/* No comment provided by engineer. */
"Abort changing address?" = "Wechsel der Empfängeradresse abbrechen?";
"Abort changing address?" = "Wechsel der Empfängeradresse beenden?";
/* No comment provided by engineer. */
"About SimpleX" = "Über SimpleX";
@@ -401,7 +401,7 @@
"Address" = "Adresse";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Der Wechsel der Empfängeradresse wird abgebrochen. Die bisherige Adresse wird weiter verwendet.";
"Address change will be aborted. Old receiving address will be used." = "Der Wechsel der Empfängeradresse wird beendet. Die bisherige Adresse wird weiter verwendet.";
/* member role */
"admin" = "Admin";
@@ -472,6 +472,9 @@
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Erlauben Sie Anrufe nur dann, wenn es Ihr Kontakt ebenfalls erlaubt.";
/* No comment provided by engineer. */
"Allow calls?" = "Anrufe erlauben?";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Erlauben Sie verschwindende Nachrichten nur dann, wenn es Ihr Kontakt ebenfalls erlaubt.";
@@ -592,6 +595,12 @@
/* No comment provided by engineer. */
"Archive and upload" = "Archivieren und Hochladen";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Kontakte für spätere Chats archivieren.";
/* No comment provided by engineer. */
"Archived contacts" = "Archivierte Kontakte";
/* No comment provided by engineer. */
"Archiving database" = "Datenbank wird archiviert";
@@ -667,6 +676,9 @@
/* No comment provided by engineer. */
"Better messages" = "Verbesserungen bei Nachrichten";
/* No comment provided by engineer. */
"Better networking" = "Kontrollieren Sie Ihr Netzwerk";
/* No comment provided by engineer. */
"Black" = "Schwarz";
@@ -700,6 +712,9 @@
/* No comment provided by engineer. */
"Blocked by admin" = "wurde vom Administrator blockiert";
/* No comment provided by engineer. */
"Blur for better privacy." = "Für bessere Privatsphäre verpixeln.";
/* No comment provided by engineer. */
"Blur media" = "Medium unscharf machen";
@@ -727,6 +742,9 @@
/* No comment provided by engineer. */
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Per Chat-Profil (Voreinstellung) oder [per Verbindung](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
/* No comment provided by engineer. */
"call" = "Anrufen";
/* No comment provided by engineer. */
"Call already ended!" = "Anruf ist bereits beendet!";
@@ -742,15 +760,27 @@
/* No comment provided by engineer. */
"Calls" = "Anrufe";
/* No comment provided by engineer. */
"Calls prohibited!" = "Anrufe nicht zugelassen!";
/* No comment provided by engineer. */
"Camera not available" = "Kamera nicht verfügbar";
/* No comment provided by engineer. */
"Can't call contact" = "Kontakt kann nicht angerufen werden";
/* No comment provided by engineer. */
"Can't call member" = "Mitglied kann nicht angerufen werden";
/* No comment provided by engineer. */
"Can't invite contact!" = "Kontakt kann nicht eingeladen werden!";
/* No comment provided by engineer. */
"Can't invite contacts!" = "Kontakte können nicht eingeladen werden!";
/* No comment provided by engineer. */
"Can't message member" = "Mitglied kann nicht benachrichtigt werden";
/* No comment provided by engineer. */
"Cancel" = "Abbrechen";
@@ -851,6 +881,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Der Chat ist angehalten. Wenn Sie diese Datenbank bereits auf einem anderen Gerät genutzt haben, sollten Sie diese vor dem Starten des Chats wieder zurückspielen.";
/* No comment provided by engineer. */
"Chat list" = "Chat-Liste";
/* No comment provided by engineer. */
"Chat migrated!" = "Chat wurde migriert!";
@@ -902,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Überprüfung zurücknehmen";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Farbige Chats mit neuen Designs.";
/* No comment provided by engineer. */
"Color mode" = "Farbvariante";
@@ -929,6 +965,9 @@
/* No comment provided by engineer. */
"Confirm" = "Bestätigen";
/* No comment provided by engineer. */
"Confirm contact deletion?" = "Löschen des Kontakts bestätigen?";
/* No comment provided by engineer. */
"Confirm database upgrades" = "Datenbank-Aktualisierungen bestätigen";
@@ -968,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "Mit den SimpleX Chat-Entwicklern verbinden.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Schneller mit Ihren Freunden verbinden.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Mit Ihnen selbst verbinden?";
@@ -1034,6 +1076,9 @@
/* No comment provided by engineer. */
"Connecting server… (error: %@)" = "Mit dem Server verbinden… (Fehler: %@)";
/* No comment provided by engineer. */
"Connecting to contact, please wait or check later!" = "Verbinde mit Kontakt, bitte warten oder später erneut überprüfen!";
/* No comment provided by engineer. */
"Connecting to desktop" = "Mit dem Desktop verbinden";
@@ -1043,6 +1088,9 @@
/* No comment provided by engineer. */
"Connection" = "Verbindung";
/* No comment provided by engineer. */
"Connection and servers status." = "Verbindungs- und Server-Status.";
/* No comment provided by engineer. */
"Connection error" = "Verbindungsfehler";
@@ -1082,6 +1130,9 @@
/* No comment provided by engineer. */
"Contact already exists" = "Der Kontakt ist bereits vorhanden";
/* No comment provided by engineer. */
"Contact deleted!" = "Kontakt gelöscht!";
/* No comment provided by engineer. */
"contact has e2e encryption" = "Kontakt nutzt E2E-Verschlüsselung";
@@ -1094,12 +1145,18 @@
/* notification */
"Contact is connected" = "Mit Ihrem Kontakt verbunden";
/* No comment provided by engineer. */
"Contact is deleted." = "Kontakt wurde gelöscht.";
/* No comment provided by engineer. */
"Contact name" = "Kontaktname";
/* No comment provided by engineer. */
"Contact preferences" = "Kontakt-Präferenzen";
/* No comment provided by engineer. */
"Contact will be deleted - this cannot be undone!" = "Kontakt wird gelöscht. Dies kann nicht rückgängig gemacht werden!";
/* No comment provided by engineer. */
"Contacts" = "Kontakte";
@@ -1109,6 +1166,9 @@
/* No comment provided by engineer. */
"Continue" = "Weiter";
/* No comment provided by engineer. */
"Conversation deleted!" = "Unterhaltung gelöscht!";
/* No comment provided by engineer. */
"Copy" = "Kopieren";
@@ -1332,6 +1392,9 @@
/* No comment provided by engineer. */
"Delete contact" = "Kontakt löschen";
/* No comment provided by engineer. */
"Delete contact?" = "Kontakt löschen?";
/* No comment provided by engineer. */
"Delete database" = "Datenbank löschen";
@@ -1395,9 +1458,15 @@
/* server test step */
"Delete queue" = "Lösche Warteschlange";
/* No comment provided by engineer. */
"Delete up to 20 messages at once." = "Löschen Sie bis zu 20 Nachrichten auf einmal.";
/* No comment provided by engineer. */
"Delete user profile?" = "Benutzerprofil löschen?";
/* No comment provided by engineer. */
"Delete without notification" = "Ohne Benachrichtigung löschen";
/* deleted chat item */
"deleted" = "Gelöscht";
@@ -1458,6 +1527,9 @@
/* No comment provided by engineer. */
"Develop" = "Entwicklung";
/* No comment provided by engineer. */
"Developer options" = "Optionen für Entwickler";
/* No comment provided by engineer. */
"Developer tools" = "Entwicklertools";
@@ -1771,7 +1843,7 @@
"Error" = "Fehler";
/* No comment provided by engineer. */
"Error aborting address change" = "Fehler beim Abbrechen des Adresswechsels";
"Error aborting address change" = "Fehler beim Beenden des Adresswechsels";
/* No comment provided by engineer. */
"Error accepting contact request" = "Fehler beim Annehmen der Kontaktanfrage";
@@ -2464,6 +2536,9 @@
/* group name */
"invitation to group %@" = "Einladung zur Gruppe %@";
/* No comment provided by engineer. */
"invite" = "Einladen";
/* No comment provided by engineer. */
"Invite friends" = "Freunde einladen";
@@ -2509,6 +2584,9 @@
/* 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." = "Dies kann unter folgenden Umständen passieren:\n1. Die Nachrichten verfallen auf dem sendenden Client-System nach 2 Tagen oder auf dem Server nach 30 Tagen.\n2. Die Nachrichten-Entschlüsselung ist fehlgeschlagen, da von Ihnen oder Ihrem Kontakt ein altes Datenbank-Backup genutzt wurde.\n3. Die Verbindung wurde kompromittiert.";
/* No comment provided by engineer. */
"It protects your IP address and connections." = "Ihre IP-Adresse und Verbindungen werden geschützt.";
/* 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 (%@)." = "Es sieht so aus, als ob Sie bereits über diesen Link verbunden sind. Wenn das nicht der Fall ist, gab es einen Fehler (%@).";
@@ -2551,6 +2629,9 @@
/* No comment provided by engineer. */
"Keep" = "Behalten";
/* No comment provided by engineer. */
"Keep conversation" = "Unterhaltung behalten";
/* No comment provided by engineer. */
"Keep the app open to use it from desktop" = "Die App muss geöffnet bleiben, um sie vom Desktop aus nutzen zu können";
@@ -2695,6 +2776,9 @@
/* No comment provided by engineer. */
"Menus" = "Menüs";
/* No comment provided by engineer. */
"message" = "Nachricht";
/* item status text */
"Message delivery error" = "Fehler bei der Nachrichtenzustellung";
@@ -2842,6 +2926,9 @@
/* No comment provided by engineer. */
"Multiple chat profiles" = "Mehrere Chat-Profile";
/* No comment provided by engineer. */
"mute" = "Stummschalten";
/* swipe action */
"Mute" = "Stummschalten";
@@ -2875,6 +2962,9 @@
/* No comment provided by engineer. */
"New chat" = "Neuer Chat";
/* No comment provided by engineer. */
"New chat experience 🎉" = "Neue Chat-Erfahrung 🎉";
/* notification */
"New contact request" = "Neue Kontaktanfrage";
@@ -2893,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Neu in %@";
/* No comment provided by engineer. */
"New media options" = "Neue Medien-Optionen";
/* No comment provided by engineer. */
"New member role" = "Neue Mitgliedsrolle";
@@ -3021,6 +3114,9 @@
/* No comment provided by engineer. */
"Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." = "Nur die Endgeräte speichern die Benutzerprofile, Kontakte, Gruppen und Nachrichten, welche über eine **2-Schichten Ende-zu-Ende-Verschlüsselung** gesendet werden.";
/* No comment provided by engineer. */
"Only delete conversation" = "Nur die Unterhaltung löschen";
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Gruppen-Präferenzen können nur von Gruppen-Eigentümern geändert werden.";
@@ -3177,6 +3273,12 @@
/* No comment provided by engineer. */
"PING interval" = "PING-Intervall";
/* No comment provided by engineer. */
"Play from the chat list." = "Direkt aus der Chat-Liste abspielen.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Bitten Sie Ihren Kontakt darum, Anrufe zu aktivieren.";
/* No comment provided by engineer. */
"Please ask your contact to enable sending voice messages." = "Bitten Sie Ihren Kontakt darum, das Senden von Sprachnachrichten zu aktivieren.";
@@ -3357,6 +3459,9 @@
/* No comment provided by engineer. */
"Rate the app" = "Bewerten Sie die App";
/* No comment provided by engineer. */
"Reachable chat toolbar" = "Erreichbare Chat-Symbolleiste";
/* chat item menu */
"React…" = "Reagiere…";
@@ -3544,6 +3649,9 @@
/* No comment provided by engineer. */
"Reset" = "Zurücksetzen";
/* No comment provided by engineer. */
"Reset all hints" = "Alle Hinweise zurücksetzen";
/* No comment provided by engineer. */
"Reset all statistics" = "Alle Statistiken zurücksetzen";
@@ -3697,6 +3805,9 @@
/* No comment provided by engineer. */
"Scan server QR code" = "Scannen Sie den QR-Code des Servers";
/* No comment provided by engineer. */
"search" = "Suchen";
/* No comment provided by engineer. */
"Search" = "Suche";
@@ -3781,6 +3892,9 @@
/* No comment provided by engineer. */
"Send live message" = "Live Nachricht senden";
/* No comment provided by engineer. */
"Send message to enable calls." = "Nachricht senden, um Anrufe zu aktivieren.";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Nachrichten werden direkt versendet, wenn die IP-Adresse geschützt ist, und Ihr oder der Zielserver kein privates Routing unterstützt.";
@@ -3961,6 +4075,9 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "Die Adresse mit Kontakten teilen?";
/* No comment provided by engineer. */
"Share from other apps." = "Aus anderen Apps heraus teilen.";
/* No comment provided by engineer. */
"Share link" = "Link teilen";
@@ -4384,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Um die Ende-zu-Ende-Verschlüsselung mit Ihrem Kontakt zu überprüfen, müssen Sie den Sicherheitscode in Ihren Apps vergleichen oder scannen.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Chat-Liste umschalten:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Inkognito beim Verbinden einschalten.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Deckkraft der Symbolleiste";
/* No comment provided by engineer. */
"Total" = "Summe aller Abonnements";
@@ -4489,6 +4612,9 @@
/* authentication reason */
"Unlock app" = "App entsperren";
/* No comment provided by engineer. */
"unmute" = "Stummschaltung aufheben";
/* swipe action */
"Unmute" = "Stummschaltung aufheben";
@@ -4582,6 +4708,9 @@
/* No comment provided by engineer. */
"Use the app while in the call." = "Die App kann während eines Anrufs genutzt werden.";
/* No comment provided by engineer. */
"Use the app with one hand." = "Die App mit einer Hand nutzen.";
/* No comment provided by engineer. */
"User profile" = "Benutzerprofil";
@@ -4636,6 +4765,9 @@
/* No comment provided by engineer. */
"Via secure quantum resistant protocol." = "Über ein sicheres quantenbeständiges Protokoll.";
/* No comment provided by engineer. */
"video" = "Video";
/* No comment provided by engineer. */
"Video call" = "Videoanruf";
@@ -4846,6 +4978,9 @@
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Sie können Anrufe ohne Geräte- und App-Authentifizierung vom Sperrbildschirm aus annehmen.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "Kann von Ihnen in den Erscheinungsbild-Einstellungen geändert werden.";
/* No comment provided by engineer. */
"You can create it later" = "Sie können dies später erstellen";
@@ -4867,6 +5002,9 @@
/* notification body */
"You can now chat with %@" = "Sie können nun Nachrichten an %@ versenden";
/* No comment provided by engineer. */
"You can send messages to %@ from Archived contacts." = "Sie können aus den archivierten Kontakten heraus Nachrichten an %@ versenden.";
/* No comment provided by engineer. */
"You can set lock screen notification preview via settings." = "Über die Geräte-Einstellungen können Sie die Benachrichtigungsvorschau im Sperrbildschirm erlauben.";
@@ -4882,6 +5020,9 @@
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "Sie können den Chat über die App-Einstellungen / Datenbank oder durch Neustart der App starten";
/* No comment provided by engineer. */
"You can still view conversation with %@ in the list of chats." = "Sie können in der Chatliste weiterhin die Unterhaltung mit %@ einsehen.";
/* No comment provided by engineer. */
"You can turn on SimpleX Lock via Settings." = "Sie können die SimpleX-Sperre über die Einstellungen aktivieren.";
@@ -4942,6 +5083,9 @@
/* No comment provided by engineer. */
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "Sie dürfen die neueste Version Ihrer Chat-Datenbank NUR auf einem Gerät verwenden, andernfalls erhalten Sie möglicherweise keine Nachrichten mehr von einigen Ihrer Kontakte.";
/* No comment provided by engineer. */
"You need to allow your contact to call to be able to call them." = "Sie müssen Ihrem Kontakt Anrufe zu Ihnen erlauben, bevor Sie ihn selbst anrufen können.";
/* No comment provided by engineer. */
"You need to allow your contact to send voice messages to be able to send them." = "Sie müssen Ihrem Kontakt das Senden von Sprachnachrichten erlauben, um diese senden zu können.";
+82 -43
View File
@@ -356,10 +356,10 @@
"accepted call" = "llamada aceptada";
/* No comment provided by engineer. */
"Acknowledged" = "Recibido";
"Acknowledged" = "Confirmaciones";
/* No comment provided by engineer. */
"Acknowledgement errors" = "Errores de reconocimiento";
"Acknowledgement errors" = "Errores de confirmación";
/* No comment provided by engineer. */
"Active connections" = "Conexiones activas";
@@ -437,7 +437,7 @@
"All data is erased when it is entered." = "Al introducirlo todos los datos son eliminados.";
/* No comment provided by engineer. */
"All data is private to your device." = "Todos los datos son privados para tu dispositivo.";
"All data is private to your device." = "Todos los datos son privados y están en tu dispositivo.";
/* No comment provided by engineer. */
"All group members will remain connected." = "Todos los miembros del grupo permanecerán conectados.";
@@ -506,7 +506,7 @@
"Allow to send files and media." = "Se permite enviar archivos y multimedia.";
/* No comment provided by engineer. */
"Allow to send SimpleX links." = "Permitir enviar enlaces SimpleX.";
"Allow to send SimpleX links." = "Se permite enviar enlaces SimpleX.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Permites enviar mensajes de voz.";
@@ -595,6 +595,9 @@
/* No comment provided by engineer. */
"Archive and upload" = "Archivar y subir";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Archiva contactos para charlar más tarde.";
/* No comment provided by engineer. */
"Archived contacts" = "Contactos archivados";
@@ -673,6 +676,9 @@
/* No comment provided by engineer. */
"Better messages" = "Mensajes mejorados";
/* No comment provided by engineer. */
"Better networking" = "Uso de red mejorado";
/* No comment provided by engineer. */
"Black" = "Negro";
@@ -706,6 +712,9 @@
/* No comment provided by engineer. */
"Blocked by admin" = "Bloqueado por administrador";
/* No comment provided by engineer. */
"Blur for better privacy." = "Difumina para mayor privacidad.";
/* No comment provided by engineer. */
"Blur media" = "Difuminar multimedia";
@@ -852,7 +861,7 @@
"Chat console" = "Consola de Chat";
/* No comment provided by engineer. */
"Chat database" = "Base de datos del chat";
"Chat database" = "Base de datos de SimpleX";
/* No comment provided by engineer. */
"Chat database deleted" = "Base de datos eliminada";
@@ -864,13 +873,16 @@
"Chat database imported" = "Base de datos importada";
/* No comment provided by engineer. */
"Chat is running" = "Chat está en ejecución";
"Chat is running" = "SimpleX está en ejecución";
/* No comment provided by engineer. */
"Chat is stopped" = "Chat está parado";
"Chat is stopped" = "SimpleX 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 parado. Si has usado esta base de datos en otro dispositivo, debes transferirla de vuelta antes de iniciar Chat.";
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "SimpleX está parado. Si has usado esta base de datos en otro dispositivo, debes transferirla de vuelta antes de iniciar SimpleX.";
/* No comment provided by engineer. */
"Chat list" = "Lista de chats";
/* No comment provided by engineer. */
"Chat migrated!" = "¡Chat migrado!";
@@ -923,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Eliminar verificación";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Colorea los chats con los nuevos temas.";
/* No comment provided by engineer. */
"Color mode" = "Modo de color";
@@ -939,7 +954,7 @@
"complete" = "completado";
/* No comment provided by engineer. */
"Completed" = "Completado";
"Completed" = "Completadas";
/* No comment provided by engineer. */
"Configure ICE servers" = "Configure servidores ICE";
@@ -972,7 +987,7 @@
"Confirm password" = "Confirmar contraseña";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Confirma que recuerdas la frase de contraseña de la base de datos para migrarla.";
"Confirm that you remember database passphrase to migrate it." = "Para migrar confirma que recuerdas la frase de contraseña de la base de datos.";
/* No comment provided by engineer. */
"Confirm upload" = "Confirmar subida";
@@ -992,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "contacta con los desarrolladores de SimpleX Chat.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Conecta más rápido con tus amigos.";
/* No comment provided by engineer. */
"Connect to yourself?" = "¿Conectarte a tí mismo?";
@@ -1017,7 +1035,7 @@
"connected" = "conectado";
/* No comment provided by engineer. */
"Connected" = "Conectado";
"Connected" = "Conectadas";
/* No comment provided by engineer. */
"Connected desktop" = "Ordenador conectado";
@@ -1071,7 +1089,7 @@
"Connection" = "Conexión";
/* No comment provided by engineer. */
"Connection and servers status." = "Estado de conexión y servidores.";
"Connection and servers status." = "Estado de tu conexión y servidores.";
/* No comment provided by engineer. */
"Connection error" = "Error conexión";
@@ -1203,7 +1221,7 @@
"Create your profile" = "Crea tu perfil";
/* No comment provided by engineer. */
"Created" = "Creado";
"Created" = "Creadas";
/* No comment provided by engineer. */
"Created at" = "Creado";
@@ -1339,7 +1357,7 @@
"Delete %lld messages of members?" = "¿Eliminar %lld mensajes de miembros?";
/* No comment provided by engineer. */
"Delete %lld messages?" = "¿Elimina %lld mensajes?";
"Delete %lld messages?" = "¿Eliminar %lld mensajes?";
/* No comment provided by engineer. */
"Delete address" = "Eliminar dirección";
@@ -1453,7 +1471,7 @@
"deleted" = "eliminado";
/* No comment provided by engineer. */
"Deleted" = "Eliminado";
"Deleted" = "Eliminadas";
/* No comment provided by engineer. */
"Deleted at" = "Eliminado";
@@ -1468,7 +1486,7 @@
"deleted group" = "grupo eliminado";
/* No comment provided by engineer. */
"Deletion errors" = "Errores de borrado";
"Deletion errors" = "Errores de eliminación";
/* No comment provided by engineer. */
"Delivery" = "Entrega";
@@ -1588,7 +1606,7 @@
"Do it later" = "Hacer más tarde";
/* No comment provided by engineer. */
"Do not send history to new members." = "No enviar historial a miembros nuevos.";
"Do not send history to new members." = "No se envía el historial a los miembros nuevos.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "NO enviar mensajes directamente incluso si tu servidor o el de destino no soportan enrutamiento privado.";
@@ -1975,7 +1993,7 @@
"Error starting chat" = "Error al iniciar Chat";
/* No comment provided by engineer. */
"Error stopping chat" = "Error al parar Chat";
"Error stopping chat" = "Error al parar SimpleX";
/* No comment provided by engineer. */
"Error switching profile!" = "¡Error al cambiar perfil!";
@@ -2030,7 +2048,7 @@
"Expand" = "Expandir";
/* No comment provided by engineer. */
"expired" = "expirado";
"expired" = "expirados";
/* No comment provided by engineer. */
"Export database" = "Exportar base de datos";
@@ -2189,7 +2207,7 @@
"Full name:" = "Nombre completo:";
/* No comment provided by engineer. */
"Fully decentralized visible only to members." = "Completamente descentralizado: sólo visible a los miembros.";
"Fully decentralized visible only to members." = "Completamente descentralizado y sólo visible para los miembros.";
/* No comment provided by engineer. */
"Fully re-implemented - work in background!" = "Completamente reimplementado: ¡funciona en segundo plano!";
@@ -2399,7 +2417,7 @@
"Improved server configuration" = "Configuración del servidor mejorada";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Para continuar, Chat debe estar parado.";
"In order to continue, chat should be stopped." = "Para continuar, SimpleX debe estar parado.";
/* No comment provided by engineer. */
"In reply to" = "En respuesta a";
@@ -2777,7 +2795,7 @@
"Message forwarded" = "Mensaje reenviado";
/* item status description */
"Message may be delivered later if member becomes active." = "El mensaje puede ser entregado más tarde si el miembro vuelve a estar activo.";
"Message may be delivered later if member becomes active." = "El mensaje podría ser entregado más tarde si el miembro vuelve a estar activo.";
/* No comment provided by engineer. */
"Message queue info" = "Información cola de mensajes";
@@ -2945,7 +2963,7 @@
"New chat" = "Nuevo chat";
/* No comment provided by engineer. */
"New Chat" = "Nuevo Chat";
"New chat experience 🎉" = "Nueva experiencia de chat 🎉";
/* notification */
"New contact request" = "Nueva solicitud de contacto";
@@ -2965,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Nuevo en %@";
/* No comment provided by engineer. */
"New media options" = "Nuevas opciones multimedia";
/* No comment provided by engineer. */
"New member role" = "Nuevo rol de miembro";
@@ -3002,7 +3023,7 @@
"No device token!" = "¡Sin dispositivo token!";
/* item status description */
"No direct connection yet, message is forwarded by admin." = "Aún no hay conexión directa, el mensaje es reenviado por el administrador.";
"No direct connection yet, message is forwarded by admin." = "Aún no hay conexión directa con este miembro, el mensaje es reenviado por el administrador.";
/* No comment provided by engineer. */
"no e2e encryption" = "sin cifrar";
@@ -3232,7 +3253,7 @@
"peer-to-peer" = "p2p";
/* No comment provided by engineer. */
"Pending" = "Pendiente";
"Pending" = "Pendientes";
/* No comment provided by engineer. */
"People can connect to you only via the links you share." = "Las personas pueden conectarse contigo solo mediante los enlaces que compartes.";
@@ -3252,6 +3273,9 @@
/* No comment provided by engineer. */
"PING interval" = "Intervalo PING";
/* No comment provided by engineer. */
"Play from the chat list." = "Reproduce desde la lista de chats.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Por favor, pide a tu contacto que active las llamadas.";
@@ -3391,7 +3415,7 @@
"Prohibit sending files and media." = "No permitir el envío de archivos y multimedia.";
/* No comment provided by engineer. */
"Prohibit sending SimpleX links." = "No permitir el envío de enlaces SimpleX.";
"Prohibit sending SimpleX links." = "No se permite enviar enlaces SimpleX.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "No se permiten mensajes de voz.";
@@ -3415,7 +3439,7 @@
"Protocol timeout per KB" = "Timeout protocolo por KB";
/* No comment provided by engineer. */
"Proxied" = "Con proxy";
"Proxied" = "Como proxy";
/* No comment provided by engineer. */
"Proxied servers" = "Servidores con proxy";
@@ -3493,7 +3517,7 @@
"Received reply" = "Respuesta recibida";
/* No comment provided by engineer. */
"Received total" = "Total recibido";
"Received total" = "Total recibidos";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "La dirección de recepción pasará a otro servidor. El cambio se completará cuando el remitente esté en línea.";
@@ -3626,7 +3650,10 @@
"Reset" = "Restablecer";
/* No comment provided by engineer. */
"Reset all statistics" = "Restablecer estadísticas";
"Reset all hints" = "Reiniciar todas las pistas";
/* No comment provided by engineer. */
"Reset all statistics" = "Restablecer todas las estadísticas";
/* No comment provided by engineer. */
"Reset all statistics?" = "¿Restablecer todas las estadísticas?";
@@ -3680,7 +3707,7 @@
"Role" = "Rol";
/* No comment provided by engineer. */
"Run chat" = "Ejecutar chat";
"Run chat" = "Ejecutar SimpleX";
/* No comment provided by engineer. */
"Safely receive files" = "Recibe archivos de forma segura";
@@ -3806,7 +3833,7 @@
"Secure queue" = "Cola segura";
/* No comment provided by engineer. */
"Secured" = "Seguro";
"Secured" = "Aseguradas";
/* No comment provided by engineer. */
"Security assessment" = "Evaluación de la seguridad";
@@ -3890,7 +3917,7 @@
"Send them from gallery or custom keyboards." = "Envíalos desde la galería o desde teclados personalizados.";
/* No comment provided by engineer. */
"Send up to 100 last messages to new members." = "Enviar hasta 100 últimos mensajes a los miembros nuevos.";
"Send up to 100 last messages to new members." = "Se envían hasta 100 mensajes más recientes a los miembros nuevos.";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "El remitente ha cancelado la transferencia de archivos.";
@@ -3929,7 +3956,7 @@
"Sent at: %@" = "Enviado: %@";
/* No comment provided by engineer. */
"Sent directly" = "Enviado directamente";
"Sent directly" = "Directamente";
/* notification */
"Sent file event" = "Evento de archivo enviado";
@@ -3947,10 +3974,10 @@
"Sent reply" = "Respuesta enviada";
/* No comment provided by engineer. */
"Sent total" = "Total enviado";
"Sent total" = "Total enviados";
/* No comment provided by engineer. */
"Sent via proxy" = "Enviado mediante proxy";
"Sent via proxy" = "Mediante proxy";
/* No comment provided by engineer. */
"Server address" = "Dirección del servidor";
@@ -4048,6 +4075,9 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "¿Compartir la dirección con los contactos?";
/* No comment provided by engineer. */
"Share from other apps." = "Comparte desde otras aplicaciones.";
/* No comment provided by engineer. */
"Share link" = "Compartir enlace";
@@ -4076,7 +4106,7 @@
"Show message status" = "Estado del mensaje";
/* No comment provided by engineer. */
"Show percentage" = "Mostrar porcentaje";
"Show percentage" = "Mostrar porcentajes";
/* No comment provided by engineer. */
"Show preview" = "Mostrar vista previa";
@@ -4193,13 +4223,13 @@
"Stop" = "Parar";
/* No comment provided by engineer. */
"Stop chat" = "Parar chat";
"Stop chat" = "Parar SimpleX";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Para habilitar las acciones sobre la base de datos, debes parar Chat";
"Stop chat to enable database actions" = "Para habilitar las acciones sobre la base de datos, debes parar SimpleX";
/* 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 parar Chat. Mientras tanto 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 SimpleX. Mientras tanto no podrás recibir ni enviar mensajes.";
/* No comment provided by engineer. */
"Stop chat?" = "¿Parar Chat?";
@@ -4322,7 +4352,7 @@
"The app can notify you when you receive messages or contact requests - please open settings to enable." = "La aplicación puede notificarte cuando recibas mensajes o solicitudes de contacto: por favor, abre la configuración para activarlo.";
/* No comment provided by engineer. */
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "La aplicación pedirá que confirmes las descargas desde servidores de archivos desconocidos (excepto .onion).";
"The app will ask to confirm downloads from unknown file servers (except .onion)." = "La aplicación pedirá que confirmes las descargas desde servidores de archivos desconocidos (excepto si son .onion).";
/* No comment provided by engineer. */
"The attempt to change database passphrase was not completed." = "El intento de cambiar la contraseña de la base de datos no se ha completado.";
@@ -4388,7 +4418,7 @@
"These settings are for your current profile **%@**." = "Esta configuración afecta a tu perfil actual **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact and group settings." = "Se pueden anular en la configuración de contactos.";
"They can be overridden in contact and group settings." = "Se puede modificar desde la configuración particular de cada grupo y contacto.";
/* No comment provided by engineer. */
"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.";
@@ -4471,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Para verificar el cifrado de extremo a extremo con tu contacto, compara (o escanea) el código en ambos dispositivos.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Alternar lista de chats:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Activa incógnito al conectar.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Opacidad barra";
/* No comment provided by engineer. */
"Total" = "Total";
@@ -4673,7 +4709,7 @@
"Use the app while in the call." = "Usar la aplicación durante la llamada.";
/* No comment provided by engineer. */
"Use the app with one hand." = "Usa la aplicación con una mano.";
"Use the app with one hand." = "Usa la aplicación con una sola mano.";
/* No comment provided by engineer. */
"User profile" = "Perfil de usuario";
@@ -4942,6 +4978,9 @@
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Puede aceptar llamadas desde la pantalla de bloqueo, sin autenticación de dispositivos y aplicaciones.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "Puedes cambiar la posición de la barra desde el menú Apariencia.";
/* No comment provided by engineer. */
"You can create it later" = "Puedes crearla más tarde";
@@ -5147,7 +5186,7 @@
"Your profile" = "Tu perfil";
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Tu perfil **%@** será compartido.";
"Your profile **%@** will be shared." = "El perfil **%@** será compartido.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos.\nLos servidores SimpleX no pueden ver tu perfil.";
+187 -13
View File
@@ -314,7 +314,7 @@
"A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." = "Une connexion TCP distincte sera utilisée **pour chaque contact et membre de groupe**.\n**Veuillez noter** : si vous avez de nombreuses connexions, votre consommation de batterie et de réseau peut être nettement plus élevée et certaines liaisons peuvent échouer.";
/* No comment provided by engineer. */
"Abort" = "Annuler";
"Abort" = "Abandonner";
/* No comment provided by engineer. */
"Abort changing address" = "Annuler le changement d'adresse";
@@ -472,6 +472,9 @@
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Autoriser les appels que si votre contact les autorise.";
/* No comment provided by engineer. */
"Allow calls?" = "Autoriser les appels?";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Autorise les messages éphémères seulement si votre contact vous lautorise.";
@@ -590,7 +593,13 @@
"Apply to" = "Appliquer à";
/* No comment provided by engineer. */
"Archive and upload" = "Archiver et transférer";
"Archive and upload" = "Archiver et téléverser";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Archiver les contacts pour discuter plus tard.";
/* No comment provided by engineer. */
"Archived contacts" = "Contacts archivés";
/* No comment provided by engineer. */
"Archiving database" = "Archivage de la base de données";
@@ -667,6 +676,9 @@
/* No comment provided by engineer. */
"Better messages" = "Meilleurs messages";
/* No comment provided by engineer. */
"Better networking" = "Meilleure gestion de réseau";
/* No comment provided by engineer. */
"Black" = "Noir";
@@ -700,6 +712,9 @@
/* No comment provided by engineer. */
"Blocked by admin" = "Bloqué par l'administrateur";
/* No comment provided by engineer. */
"Blur for better privacy." = "Rendez les images floues et protégez-les contre les regards indiscrets.";
/* No comment provided by engineer. */
"Blur media" = "Flouter les médias";
@@ -727,6 +742,9 @@
/* No comment provided by engineer. */
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Par profil de chat (par défaut) ou [par connexion](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
/* No comment provided by engineer. */
"call" = "appeler";
/* No comment provided by engineer. */
"Call already ended!" = "Appel déjà terminé !";
@@ -742,15 +760,27 @@
/* No comment provided by engineer. */
"Calls" = "Appels";
/* No comment provided by engineer. */
"Calls prohibited!" = "Les appels ne sont pas autorisés!";
/* No comment provided by engineer. */
"Camera not available" = "Caméra non disponible";
/* No comment provided by engineer. */
"Can't call contact" = "Impossible d'appeler le contact";
/* No comment provided by engineer. */
"Can't call member" = "Impossible d'appeler le membre";
/* No comment provided by engineer. */
"Can't invite contact!" = "Impossible d'inviter le contact!";
/* No comment provided by engineer. */
"Can't invite contacts!" = "Impossible d'inviter les contacts !";
/* No comment provided by engineer. */
"Can't message member" = "Impossible d'envoyer un message à ce membre";
/* No comment provided by engineer. */
"Cancel" = "Annuler";
@@ -836,6 +866,9 @@
/* No comment provided by engineer. */
"Chat database deleted" = "Base de données du chat supprimée";
/* No comment provided by engineer. */
"Chat database exported" = "Exportation de la base de données des discussions";
/* No comment provided by engineer. */
"Chat database imported" = "Base de données du chat importée";
@@ -848,6 +881,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Le chat est arrêté. Si vous avez déjà utilisé cette base de données sur un autre appareil, vous devez la transférer à nouveau avant de démarrer le chat.";
/* No comment provided by engineer. */
"Chat list" = "Liste de discussion";
/* No comment provided by engineer. */
"Chat migrated!" = "Messagerie transférée!";
@@ -899,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Retirer la vérification";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Colorez vos discussions avec les nouveaux thèmes.";
/* No comment provided by engineer. */
"Color mode" = "Mode de couleur";
@@ -915,7 +954,7 @@
"complete" = "complet";
/* No comment provided by engineer. */
"Completed" = "Complété";
"Completed" = "Complétées";
/* No comment provided by engineer. */
"Configure ICE servers" = "Configurer les serveurs ICE";
@@ -926,6 +965,9 @@
/* No comment provided by engineer. */
"Confirm" = "Confirmer";
/* No comment provided by engineer. */
"Confirm contact deletion?" = "Confirmer la suppression du contact?";
/* No comment provided by engineer. */
"Confirm database upgrades" = "Confirmer la mise à niveau de la base de données";
@@ -965,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "se connecter aux developpeurs de SimpleX Chat.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Connectez-vous à vos amis plus rapidement.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Se connecter à soi-même ?";
@@ -1031,6 +1076,9 @@
/* No comment provided by engineer. */
"Connecting server… (error: %@)" = "Connexion au serveur… (erreur : %@)";
/* No comment provided by engineer. */
"Connecting to contact, please wait or check later!" = "Connexion au contact, veuillez patienter ou vérifier plus tard!";
/* No comment provided by engineer. */
"Connecting to desktop" = "Connexion au bureau";
@@ -1040,6 +1088,9 @@
/* No comment provided by engineer. */
"Connection" = "Connexion";
/* No comment provided by engineer. */
"Connection and servers status." = "État de la connexion et des serveurs.";
/* No comment provided by engineer. */
"Connection error" = "Erreur de connexion";
@@ -1079,6 +1130,9 @@
/* No comment provided by engineer. */
"Contact already exists" = "Contact déjà existant";
/* No comment provided by engineer. */
"Contact deleted!" = "Contact supprimé !";
/* No comment provided by engineer. */
"contact has e2e encryption" = "Ce contact a le chiffrement de bout en bout";
@@ -1091,12 +1145,18 @@
/* notification */
"Contact is connected" = "Le contact est connecté";
/* No comment provided by engineer. */
"Contact is deleted." = "Le contact est supprimé.";
/* No comment provided by engineer. */
"Contact name" = "Nom du contact";
/* No comment provided by engineer. */
"Contact preferences" = "Préférences de contact";
/* No comment provided by engineer. */
"Contact will be deleted - this cannot be undone!" = "Le contact sera supprimé - il n'est pas possible de revenir en arrière!";
/* No comment provided by engineer. */
"Contacts" = "Contacts";
@@ -1106,6 +1166,9 @@
/* No comment provided by engineer. */
"Continue" = "Continuer";
/* No comment provided by engineer. */
"Conversation deleted!" = "Conversation supprimée!";
/* No comment provided by engineer. */
"Copy" = "Copier";
@@ -1158,7 +1221,7 @@
"Create your profile" = "Créez votre profil";
/* No comment provided by engineer. */
"Created" = "Créé";
"Created" = "Créées";
/* No comment provided by engineer. */
"Created at" = "Créé à";
@@ -1329,6 +1392,9 @@
/* No comment provided by engineer. */
"Delete contact" = "Supprimer le contact";
/* No comment provided by engineer. */
"Delete contact?" = "Supprimer le contact?";
/* No comment provided by engineer. */
"Delete database" = "Supprimer la base de données";
@@ -1392,14 +1458,20 @@
/* server test step */
"Delete queue" = "Supprimer la file d'attente";
/* No comment provided by engineer. */
"Delete up to 20 messages at once." = "Supprimez jusqu'à 20 messages à la fois.";
/* No comment provided by engineer. */
"Delete user profile?" = "Supprimer le profil utilisateur ?";
/* No comment provided by engineer. */
"Delete without notification" = "Supprimer sans notification";
/* deleted chat item */
"deleted" = "supprimé";
/* No comment provided by engineer. */
"Deleted" = "Supprimé";
"Deleted" = "Supprimées";
/* No comment provided by engineer. */
"Deleted at" = "Supprimé à";
@@ -1455,6 +1527,9 @@
/* No comment provided by engineer. */
"Develop" = "Développer";
/* No comment provided by engineer. */
"Developer options" = "Options pour les développeurs";
/* No comment provided by engineer. */
"Developer tools" = "Outils du développeur";
@@ -2461,6 +2536,9 @@
/* group name */
"invitation to group %@" = "invitation au groupe %@";
/* No comment provided by engineer. */
"invite" = "inviter";
/* No comment provided by engineer. */
"Invite friends" = "Inviter des amis";
@@ -2506,6 +2584,9 @@
/* 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." = "Cela peut arriver quand :\n1. Les messages ont expiré dans le client expéditeur après 2 jours ou sur le serveur après 30 jours.\n2. Le déchiffrement du message a échoué, car vous ou votre contact avez utilisé une ancienne sauvegarde de base de données.\n3. La connexion a été compromise.";
/* No comment provided by engineer. */
"It protects your IP address and connections." = "Il protège votre adresse IP et vos connexions.";
/* 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 (%@)." = "Il semblerait que vous êtes déjà connecté via ce lien. Si ce n'est pas le cas, il y a eu une erreur (%@).";
@@ -2548,6 +2629,9 @@
/* No comment provided by engineer. */
"Keep" = "Conserver";
/* No comment provided by engineer. */
"Keep conversation" = "Garder la conversation";
/* No comment provided by engineer. */
"Keep the app open to use it from desktop" = "Garder l'application ouverte pour l'utiliser depuis le bureau";
@@ -2659,6 +2743,9 @@
/* No comment provided by engineer. */
"Max 30 seconds, received instantly." = "Max 30 secondes, réception immédiate.";
/* No comment provided by engineer. */
"Media & file servers" = "Serveurs de fichiers et de médias";
/* blur media */
"Medium" = "Modéré";
@@ -2689,6 +2776,9 @@
/* No comment provided by engineer. */
"Menus" = "Menus";
/* No comment provided by engineer. */
"message" = "message";
/* item status text */
"Message delivery error" = "Erreur de distribution du message";
@@ -2725,6 +2815,9 @@
/* No comment provided by engineer. */
"Message reception" = "Réception de message";
/* No comment provided by engineer. */
"Message servers" = "Serveurs de messages";
/* No comment provided by engineer. */
"Message source remains private." = "La source du message reste privée.";
@@ -2833,6 +2926,9 @@
/* No comment provided by engineer. */
"Multiple chat profiles" = "Différents profils de chat";
/* No comment provided by engineer. */
"mute" = "muet";
/* swipe action */
"Mute" = "Muet";
@@ -2866,6 +2962,9 @@
/* No comment provided by engineer. */
"New chat" = "Nouveau chat";
/* No comment provided by engineer. */
"New chat experience 🎉" = "Nouvelle expérience de discussion 🎉";
/* notification */
"New contact request" = "Nouvelle demande de contact";
@@ -2884,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Nouveautés de la %@";
/* No comment provided by engineer. */
"New media options" = "Nouvelles options de médias";
/* No comment provided by engineer. */
"New member role" = "Nouveau rôle";
@@ -3012,6 +3114,9 @@
/* No comment provided by engineer. */
"Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." = "Seuls les appareils clients stockent les profils des utilisateurs, les contacts, les groupes et les messages envoyés avec un **chiffrement de bout en bout à deux couches**.";
/* No comment provided by engineer. */
"Only delete conversation" = "Ne supprimer que la conversation";
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Seuls les propriétaires du groupe peuvent modifier les préférences du groupe.";
@@ -3168,6 +3273,12 @@
/* No comment provided by engineer. */
"PING interval" = "Intervalle de PING";
/* No comment provided by engineer. */
"Play from the chat list." = "Aperçu depuis la liste de conversation.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Veuillez demander à votre contact d'autoriser les appels.";
/* No comment provided by engineer. */
"Please ask your contact to enable sending voice messages." = "Veuillez demander à votre contact de permettre l'envoi de messages vocaux.";
@@ -3348,6 +3459,9 @@
/* No comment provided by engineer. */
"Rate the app" = "Évaluer l'app";
/* No comment provided by engineer. */
"Reachable chat toolbar" = "Barre d'outils accessible";
/* chat item menu */
"React…" = "Réagissez…";
@@ -3535,6 +3649,9 @@
/* No comment provided by engineer. */
"Reset" = "Réinitialisation";
/* No comment provided by engineer. */
"Reset all hints" = "Rétablir tous les conseils";
/* No comment provided by engineer. */
"Reset all statistics" = "Réinitialiser toutes les statistiques";
@@ -3610,6 +3727,9 @@
/* No comment provided by engineer. */
"Save and notify group members" = "Enregistrer et en informer les membres du groupe";
/* No comment provided by engineer. */
"Save and reconnect" = "Sauvegarder et se reconnecter";
/* No comment provided by engineer. */
"Save and update group profile" = "Enregistrer et mettre à jour le profil du groupe";
@@ -3685,6 +3805,9 @@
/* No comment provided by engineer. */
"Scan server QR code" = "Scanner un code QR de serveur";
/* No comment provided by engineer. */
"search" = "rechercher";
/* No comment provided by engineer. */
"Search" = "Rechercher";
@@ -3710,7 +3833,7 @@
"Secure queue" = "File d'attente sécurisée";
/* No comment provided by engineer. */
"Secured" = "Sécurisé";
"Secured" = "Sécurisées";
/* No comment provided by engineer. */
"Security assessment" = "Évaluation de sécurité";
@@ -3764,11 +3887,14 @@
"Send errors" = "Erreurs d'envoi";
/* No comment provided by engineer. */
"Send link previews" = "Envoi d'aperçus de liens";
"Send link previews" = "Aperçu des liens";
/* No comment provided by engineer. */
"Send live message" = "Envoyer un message dynamique";
/* No comment provided by engineer. */
"Send message to enable calls." = "Envoyer un message pour activer les appels.";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Envoyer les messages de manière directe lorsque l'adresse IP est protégée et que votre serveur ou le serveur de destination ne prend pas en charge le routage privé.";
@@ -3869,7 +3995,7 @@
"Server requires authorization to create queues, check password" = "Le serveur requiert une autorisation pour créer des files d'attente, vérifiez le mot de passe";
/* server test error */
"Server requires authorization to upload, check password" = "Le serveur requiert une autorisation pour uploader, vérifiez le mot de passe";
"Server requires authorization to upload, check password" = "Le serveur requiert une autorisation pour téléverser, vérifiez le mot de passe";
/* No comment provided by engineer. */
"Server test failed!" = "Échec du test du serveur !";
@@ -3949,6 +4075,9 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "Partager l'adresse avec vos contacts ?";
/* No comment provided by engineer. */
"Share from other apps." = "Partager depuis d'autres applications.";
/* No comment provided by engineer. */
"Share link" = "Partager le lien";
@@ -3971,7 +4100,7 @@
"Show developer options" = "Afficher les options pour les développeurs";
/* No comment provided by engineer. */
"Show last messages" = "Voir les derniers messages";
"Show last messages" = "Aperçu des derniers messages";
/* No comment provided by engineer. */
"Show message status" = "Afficher le statut du message";
@@ -3980,7 +4109,7 @@
"Show percentage" = "Afficher le pourcentage";
/* No comment provided by engineer. */
"Show preview" = "Afficher l'aperçu";
"Show preview" = "Aperçu affiché";
/* No comment provided by engineer. */
"Show QR code" = "Afficher le code QR";
@@ -4054,9 +4183,15 @@
/* blur media */
"Soft" = "Léger";
/* No comment provided by engineer. */
"Some file(s) were not exported:" = "Certains fichiers n'ont pas été exportés:";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import - you may see Chat console for more details." = "Des erreurs non fatales se sont produites lors de l'importation - vous pouvez consulter la console de chat pour plus de détails.";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import:" = "L'importation a entraîné des erreurs non fatales:";
/* notification title */
"Somebody" = "Quelqu'un";
@@ -4130,7 +4265,7 @@
"Submit" = "Soumettre";
/* No comment provided by engineer. */
"Subscribed" = "Inscrit";
"Subscribed" = "Inscriptions";
/* No comment provided by engineer. */
"Subscription errors" = "Erreurs d'inscription";
@@ -4171,6 +4306,9 @@
/* No comment provided by engineer. */
"Tap to scan" = "Appuyez pour scanner";
/* No comment provided by engineer. */
"TCP connection" = "Connexion TCP";
/* No comment provided by engineer. */
"TCP connection timeout" = "Délai de connexion TCP";
@@ -4363,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Pour vérifier le chiffrement de bout en bout avec votre contact, comparez (ou scannez) le code sur vos appareils.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Afficher la liste des conversations:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Basculer en mode incognito lors de la connexion.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Opacité de la barre d'outils";
/* No comment provided by engineer. */
"Total" = "Total";
@@ -4468,6 +4612,9 @@
/* authentication reason */
"Unlock app" = "Déverrouiller l'app";
/* No comment provided by engineer. */
"unmute" = "démuter";
/* swipe action */
"Unmute" = "Démute";
@@ -4489,6 +4636,9 @@
/* No comment provided by engineer. */
"Update network settings?" = "Mettre à jour les paramètres réseau ?";
/* No comment provided by engineer. */
"Update settings?" = "Mettre à jour les paramètres?";
/* rcv group event chat item */
"updated group profile" = "mise à jour du profil de groupe";
@@ -4508,7 +4658,7 @@
"Upload failed" = "Échec de l'envoi";
/* server test step */
"Upload file" = "Transférer le fichier";
"Upload file" = "Téléverser le fichier";
/* No comment provided by engineer. */
"Uploaded" = "Téléversé";
@@ -4558,6 +4708,9 @@
/* No comment provided by engineer. */
"Use the app while in the call." = "Utiliser l'application pendant l'appel.";
/* No comment provided by engineer. */
"Use the app with one hand." = "Utiliser l'application d'une main.";
/* No comment provided by engineer. */
"User profile" = "Profil d'utilisateur";
@@ -4612,6 +4765,9 @@
/* No comment provided by engineer. */
"Via secure quantum resistant protocol." = "Via un protocole sécurisé de cryptographie post-quantique.";
/* No comment provided by engineer. */
"video" = "vidéo";
/* No comment provided by engineer. */
"Video call" = "Appel vidéo";
@@ -4619,7 +4775,7 @@
"video call (not e2e encrypted)" = "appel vidéo (sans chiffrement)";
/* No comment provided by engineer. */
"Video will be received when your contact completes uploading it." = "La vidéo ne sera reçue que lorsque votre contact aura fini de la transférer.";
"Video will be received when your contact completes uploading it." = "La vidéo ne sera reçue que lorsque votre contact aura fini la mettre en ligne.";
/* No comment provided by engineer. */
"Video will be received when your contact is online, please wait or check later!" = "La vidéo ne sera reçue que lorsque votre contact sera en ligne. Veuillez patienter ou vérifier plus tard !";
@@ -4822,6 +4978,9 @@
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Vous pouvez accepter des appels à partir de l'écran de verrouillage, sans authentification de l'appareil ou de l'application.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "Vous pouvez choisir de le modifier dans les paramètres d'apparence.";
/* No comment provided by engineer. */
"You can create it later" = "Vous pouvez la créer plus tard";
@@ -4843,6 +5002,9 @@
/* notification body */
"You can now chat with %@" = "Vous pouvez maintenant envoyer des messages à %@";
/* No comment provided by engineer. */
"You can send messages to %@ from Archived contacts." = "Vous pouvez envoyer des messages à %@ à partir des contacts archivés.";
/* No comment provided by engineer. */
"You can set lock screen notification preview via settings." = "Vous pouvez configurer l'aperçu des notifications sur l'écran de verrouillage via les paramètres.";
@@ -4858,6 +5020,9 @@
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "Vous pouvez lancer le chat via Paramètres / Base de données ou en redémarrant l'app";
/* No comment provided by engineer. */
"You can still view conversation with %@ in the list of chats." = "Vous pouvez toujours voir la conversation avec %@ dans la liste des discussions.";
/* No comment provided by engineer. */
"You can turn on SimpleX Lock via Settings." = "Vous pouvez activer SimpleX Lock dans les Paramètres.";
@@ -4909,9 +5074,18 @@
/* snd group event chat item */
"you left" = "vous avez quitté";
/* No comment provided by engineer. */
"You may migrate the exported database." = "Vous pouvez migrer la base de données exportée.";
/* No comment provided by engineer. */
"You may save the exported archive." = "Vous pouvez enregistrer l'archive exportée.";
/* No comment provided by engineer. */
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "Vous devez utiliser la version la plus récente de votre base de données de chat sur un seul appareil UNIQUEMENT, sinon vous risquez de ne plus recevoir les messages de certains contacts.";
/* No comment provided by engineer. */
"You need to allow your contact to call to be able to call them." = "Vous devez autoriser votre contact à appeler pour pouvoir l'appeler.";
/* No comment provided by engineer. */
"You need to allow your contact to send voice messages to be able to send them." = "Vous devez autoriser votre contact à envoyer des messages vocaux pour pouvoir en envoyer.";
+71 -32
View File
@@ -209,10 +209,10 @@
"%lld members" = "%lld tag";
/* No comment provided by engineer. */
"%lld messages blocked" = "%lld üzenet blokkolva";
"%lld messages blocked" = "%lld üzenet letiltva";
/* No comment provided by engineer. */
"%lld messages blocked by admin" = "%lld üzenet blokkolva az admin által";
"%lld messages blocked by admin" = "%lld üzenet letiltva az admin által";
/* No comment provided by engineer. */
"%lld messages marked deleted" = "%lld törlésre megjelölt üzenet";
@@ -595,6 +595,9 @@
/* No comment provided by engineer. */
"Archive and upload" = "Archiválás és feltöltés";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Ismerősök archiválása a későbbi csevegéshez.";
/* No comment provided by engineer. */
"Archived contacts" = "Archivált ismerősök";
@@ -656,10 +659,10 @@
"Bad desktop address" = "Hibás számítógép cím";
/* integrity error chat item */
"bad message hash" = "téves üzenet hash";
"bad message hash" = "hibás az üzenet ellenőrzőösszege";
/* No comment provided by engineer. */
"Bad message hash" = "Téves üzenet hash";
"Bad message hash" = "Hibás az üzenet ellenőrzőösszege";
/* integrity error chat item */
"bad message ID" = "téves üzenet ID";
@@ -673,32 +676,35 @@
/* No comment provided by engineer. */
"Better messages" = "Jobb üzenetek";
/* No comment provided by engineer. */
"Better networking" = "Jobb hálózatkezelés";
/* No comment provided by engineer. */
"Black" = "Fekete";
/* No comment provided by engineer. */
"Block" = "Blokkolás";
"Block" = "Letiltás";
/* No comment provided by engineer. */
"Block for all" = "Letiltás mindenki számára";
/* No comment provided by engineer. */
"Block group members" = "Csoporttagok blokkolása";
"Block group members" = "Csoporttagok letiltása";
/* No comment provided by engineer. */
"Block member" = "Tag blokkolása";
"Block member" = "Tag letiltása";
/* No comment provided by engineer. */
"Block member for all?" = "Mindenki számára letiltja ezt a tagot?";
/* No comment provided by engineer. */
"Block member?" = "Tag blokkolása?";
"Block member?" = "Tag letiltása?";
/* marked deleted chat item preview text */
"blocked" = "blokkolva";
"blocked" = "letiltva";
/* rcv group event chat item */
"blocked %@" = "letiltotta őt: %@";
"blocked %@" = "letiltotta %@-t";
/* marked deleted chat item preview text */
"blocked by admin" = "letiltva az admin által";
@@ -706,6 +712,9 @@
/* No comment provided by engineer. */
"Blocked by admin" = "Letiltva az admin által";
/* No comment provided by engineer. */
"Blur for better privacy." = "Elhomályosítás a jobb adatvédelemért.";
/* No comment provided by engineer. */
"Blur media" = "Média elhomályosítása";
@@ -872,6 +881,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "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.";
/* No comment provided by engineer. */
"Chat list" = "Csevegőlista";
/* No comment provided by engineer. */
"Chat migrated!" = "A csevegés átköltöztetve!";
@@ -923,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Hitelesítés törlése";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Csevegések színezése új témákkal.";
/* No comment provided by engineer. */
"Color mode" = "Színmód";
@@ -992,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "Kapcsolódás a SimpleX Chat fejlesztőkhöz.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Kapcsolódjon gyorsabban az ismerőseihez.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Kapcsolódás saját magához?";
@@ -1414,7 +1432,7 @@
"Delete link?" = "Hivatkozás törlése?";
/* No comment provided by engineer. */
"Delete member message?" = "Csoporttag üzenet törlése?";
"Delete member message?" = "Csoporttag üzenetének törlése?";
/* No comment provided by engineer. */
"Delete message?" = "Üzenet törlése?";
@@ -1477,7 +1495,7 @@
"Delivery receipts are disabled!" = "A kézbesítési jelentések ki vannak kapcsolva!";
/* No comment provided by engineer. */
"Delivery receipts!" = "Kézbesítési igazolások!";
"Delivery receipts!" = "Üzenet kézbesítési jelentések!";
/* No comment provided by engineer. */
"Description" = "Leírás";
@@ -1810,10 +1828,10 @@
"Enter this device name…" = "Eszköznév megadása…";
/* placeholder */
"Enter welcome message…" = "Üdvözlő üzenetet megadása…";
"Enter welcome message…" = "Üdvözlő üzenet megadása…";
/* placeholder */
"Enter welcome message… (optional)" = "Üdvözlő üzenetet megadása… (opcionális)";
"Enter welcome message… (optional)" = "Üdvözlő üzenet megadása… (opcionális)";
/* No comment provided by engineer. */
"Enter your name…" = "Adjon meg egy nevet…";
@@ -1981,7 +1999,7 @@
"Error switching profile!" = "Hiba a profil váltásakor!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Hiba a kapcsolat szinkronizálása során";
"Error synchronizing connection" = "Hiba a kapcsolat szinkronizálása közben";
/* No comment provided by engineer. */
"Error updating group link" = "Hiba a csoport hivatkozás frissítésekor";
@@ -2345,7 +2363,7 @@
"ICE servers (one per line)" = "ICE-kiszolgálók (soronként egy)";
/* No comment provided by engineer. */
"If you can't meet in person, show QR code in a video call, or share the link." = "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.";
"If you can't meet in person, show QR code in a video call, or share the link." = "Ha nem tud személyesen találkozni, mutassa meg a QR-kódot egy videohívás közben, vagy ossza meg a hivatkozást.";
/* No comment provided by engineer. */
"If you enter this passcode when opening the app, all app data will be irreversibly removed!" = "Ha az alkalmazás megnyitásakor megadja ezt a jelkódot, az összes alkalmazásadat véglegesen törlődik!";
@@ -2765,7 +2783,7 @@
"Message delivery error" = "Üzenetkézbesítési hiba";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Üzenetkézbesítési bizonylatok!";
"Message delivery receipts!" = "Üzenet kézbesítési jelentések!";
/* item status text */
"Message delivery warning" = "Üzenet kézbesítési figyelmeztetés";
@@ -2795,7 +2813,7 @@
"message received" = "üzenet érkezett";
/* No comment provided by engineer. */
"Message reception" = "Üzenetjelentés";
"Message reception" = "Üzenet kézbesítési jelentés";
/* No comment provided by engineer. */
"Message servers" = "Üzenetkiszolgálók";
@@ -2945,7 +2963,7 @@
"New chat" = "Új beszélgetés";
/* No comment provided by engineer. */
"New Chat" = "Új csevegés";
"New chat experience 🎉" = "Új csevegési élmény 🎉";
/* notification */
"New contact request" = "Új kapcsolattartási kérelem";
@@ -2965,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Újdonságok a(z) %@ verzióban";
/* No comment provided by engineer. */
"New media options" = "Új médiabeállítások";
/* No comment provided by engineer. */
"New member role" = "Új tag szerepköre";
@@ -3252,6 +3273,9 @@
/* No comment provided by engineer. */
"PING interval" = "PING időköze";
/* No comment provided by engineer. */
"Play from the chat list." = "Lejátszás a csevegési listából.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Kérje meg az ismerősét, hogy engedélyezze a hívásokat.";
@@ -3406,7 +3430,7 @@
"Protect your chat profiles with a password!" = "Csevegési profiljok védelme jelszóval!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Védje IP-címét az ismerősei által kiválasztott üzenetküldő átjátszókkal szemben.\nEngedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.";
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Védje IP-címét az ismerősei által kiválasztott üzenetküldő átjátszókkal szemben.\nEngedélyezze a Beállítások / Hálózat és kiszolgálók menüben.";
/* No comment provided by engineer. */
"Protocol timeout" = "Protokoll időtúllépés";
@@ -3581,7 +3605,7 @@
"removed" = "eltávolítva";
/* rcv group event chat item */
"removed %@" = "%@ eltávolítva";
"removed %@" = "eltávolította őt: %@";
/* profile update event chat item */
"removed contact address" = "törölt kapcsolattartási cím";
@@ -3625,6 +3649,9 @@
/* No comment provided by engineer. */
"Reset" = "Alaphelyzetbe állítás";
/* No comment provided by engineer. */
"Reset all hints" = "Tippek visszaállítása";
/* No comment provided by engineer. */
"Reset all statistics" = "Minden statisztika visszaállítása";
@@ -3971,7 +3998,7 @@
"Server requires authorization to upload, check password" = "A kiszolgálónak engedélyre van szüksége a várólisták feltöltéséhez, ellenőrizze jelszavát";
/* No comment provided by engineer. */
"Server test failed!" = "Sikertelen kiszolgáló-teszt!";
"Server test failed!" = "Sikertelen kiszolgáló teszt!";
/* No comment provided by engineer. */
"Server type" = "Kiszolgáló típusa";
@@ -4048,6 +4075,9 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "Megosztja a címet az ismerőseivel?";
/* No comment provided by engineer. */
"Share from other apps." = "Megosztás más alkalmazásokból.";
/* No comment provided by engineer. */
"Share link" = "Hivatkozás megosztása";
@@ -4157,10 +4187,10 @@
"Some file(s) were not exported:" = "Néhány fájl nem került exportálásra:";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import - you may see Chat console for more details." = "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.";
"Some non-fatal errors occurred during import - you may see Chat console for more details." = "Néhány nem végzetes hiba történt az importálás közben további részletekért a csevegési konzolban olvashat.";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import:" = "Néhány nem végzetes hiba történt az importálás során:";
"Some non-fatal errors occurred during import:" = "Néhány nem végzetes hiba történt az importálás közben:";
/* notification title */
"Somebody" = "Valaki";
@@ -4337,13 +4367,13 @@
"The contact you shared this link with will NOT be able to connect!" = "Ismerőse, akivel megosztotta ezt a hivatkozást, NEM fog tudni kapcsolódni!";
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "A létrehozott archívum a Beállítások / Adatbázis / Régi adatbázis-archívum menüpontban érhető el.";
"The created archive is available via app Settings / Database / Old database archive." = "A létrehozott archívum a Beállítások / Adatbázis / Régi adatbázis-archívum menüben érhető el.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "A titkosítás működik, és új titkosítási egyezményre nincs szükség. Ez kapcsolati hibákat eredményezhet!";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "Az előző üzenet hash-e más.";
"The hash of the previous message is different." = "Az előző üzenet ellenőrzőösszege különbözik.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "A következő üzenet azonosítója hibás (kisebb vagy egyenlő az előzővel).\nEz valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.";
@@ -4364,7 +4394,7 @@
"The next generation of private messaging" = "A privát üzenetküldés következő generációja";
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "A régi adatbázis nem került eltávolításra az átköltöztetés során, így törölhető.";
"The old database was not removed during the migration, it can be deleted." = "A régi adatbázis nem került eltávolításra az átköltöztetés közben, így törölhető.";
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Profilja csak az ismerőseivel kerül megosztásra.";
@@ -4471,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Csevegőlista átváltása:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Inkognitó mód kapcsolódáskor.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Eszköztár átlátszatlansága";
/* No comment provided by engineer. */
"Total" = "Összesen";
@@ -4517,7 +4553,7 @@
"Unblock member?" = "Tag feloldása?";
/* rcv group event chat item */
"unblocked %@" = "%@ feloldva";
"unblocked %@" = "feloldotta %@ letiltását";
/* No comment provided by engineer. */
"Unexpected migration state" = "Váratlan átköltöztetési állapot";
@@ -4937,11 +4973,14 @@
"you are observer" = "megfigyelő szerep";
/* snd group event chat item */
"you blocked %@" = "blokkolta őt: %@";
"you blocked %@" = "ön letiltotta %@-t";
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Hívásokat fogadhat a lezárási képernyőről, eszköz- és alkalmazáshitelesítés nélkül.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "Ezt a „Megjelenés” menüben módosíthatja.";
/* No comment provided by engineer. */
"You can create it later" = "Létrehozás később";
@@ -4949,7 +4988,7 @@
"You can enable later via Settings" = "Később engedélyezheti a Beállításokban";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Később engedélyezheti őket az alkalmazás Adatvédelem és biztonság menüpontban.";
"You can enable them later via app Privacy & Security settings." = "Később engedélyezheti őket az alkalmazás Adatvédelem és biztonság menüben.";
/* No comment provided by engineer. */
"You can give another try." = "Megpróbálhatja még egyszer.";
@@ -4979,7 +5018,7 @@
"You can share your address as a link or QR code - anybody can connect to you." = "Megoszthatja a címét egy hivatkozásként vagy QR-kódként így bárki kapcsolódhat önhöz.";
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "A csevegést az alkalmazás Beállítások / Adatbázis menü segítségével vagy az alkalmazás újraindításával indíthatja el";
"You can start chat via app Settings / Database or by restarting the app" = "A csevegést az alkalmazás Beállítások / Adatbázis menüben vagy az alkalmazás újraindításával indíthatja el";
/* No comment provided by engineer. */
"You can still view conversation with %@ in the list of chats." = "A(z) %@ nevű ismerősével folytatott beszélgetéseit továbbra is megtekintheti a csevegések listájában.";
@@ -5066,7 +5105,7 @@
"you shared one-time link incognito" = "egyszer használatos hivatkozást osztott meg inkognitóban";
/* snd group event chat item */
"you unblocked %@" = "feloldotta %@ blokkolását";
"you unblocked %@" = "ön feloldotta %@ letiltását";
/* No comment provided by engineer. */
"You will be connected to group when the group host's device is online, please wait or check later!" = "Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!";
+41 -2
View File
@@ -595,6 +595,9 @@
/* No comment provided by engineer. */
"Archive and upload" = "Archivia e carica";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Archivia contatti per chattare più tardi.";
/* No comment provided by engineer. */
"Archived contacts" = "Contatti archiviati";
@@ -673,6 +676,9 @@
/* No comment provided by engineer. */
"Better messages" = "Messaggi migliorati";
/* No comment provided by engineer. */
"Better networking" = "Rete migliorata";
/* No comment provided by engineer. */
"Black" = "Nero";
@@ -706,6 +712,9 @@
/* No comment provided by engineer. */
"Blocked by admin" = "Bloccato dall'amministratore";
/* No comment provided by engineer. */
"Blur for better privacy." = "Sfoca per una privacy maggiore.";
/* No comment provided by engineer. */
"Blur media" = "Sfocatura file multimediali";
@@ -872,6 +881,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "La chat è ferma. Se hai già usato questo database su un altro dispositivo, dovresti trasferirlo prima di avviare la chat.";
/* No comment provided by engineer. */
"Chat list" = "Elenco delle chat";
/* No comment provided by engineer. */
"Chat migrated!" = "Chat migrata!";
@@ -923,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Annulla la verifica";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Colora le chat con i nuovi temi.";
/* No comment provided by engineer. */
"Color mode" = "Modalità di colore";
@@ -992,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "connettiti agli sviluppatori di SimpleX Chat.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Connettiti più velocemente ai tuoi amici.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Connettersi a te stesso?";
@@ -1071,7 +1089,7 @@
"Connection" = "Connessione";
/* No comment provided by engineer. */
"Connection and servers status." = "Stato di connessione e server.";
"Connection and servers status." = "Stato della connessione e dei server.";
/* No comment provided by engineer. */
"Connection error" = "Errore di connessione";
@@ -2945,7 +2963,7 @@
"New chat" = "Nuova chat";
/* No comment provided by engineer. */
"New Chat" = "Nuova chat";
"New chat experience 🎉" = "Una nuova esperienza di chat 🎉";
/* notification */
"New contact request" = "Nuova richiesta di contatto";
@@ -2965,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Novità nella %@";
/* No comment provided by engineer. */
"New media options" = "Nuove opzioni multimediali";
/* No comment provided by engineer. */
"New member role" = "Nuovo ruolo del membro";
@@ -3252,6 +3273,9 @@
/* No comment provided by engineer. */
"PING interval" = "Intervallo PING";
/* No comment provided by engineer. */
"Play from the chat list." = "Riproduci dall'elenco delle chat.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Chiedi al contatto di attivare le chiamate.";
@@ -3625,6 +3649,9 @@
/* No comment provided by engineer. */
"Reset" = "Ripristina";
/* No comment provided by engineer. */
"Reset all hints" = "Ripristina tutti i suggerimenti";
/* No comment provided by engineer. */
"Reset all statistics" = "Azzera tutte le statistiche";
@@ -4048,6 +4075,9 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "Condividere l'indirizzo con i contatti?";
/* No comment provided by engineer. */
"Share from other apps." = "Condividi da altre app.";
/* No comment provided by engineer. */
"Share link" = "Condividi link";
@@ -4471,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Per verificare la crittografia end-to-end con il tuo contatto, confrontate (o scansionate) il codice sui vostri dispositivi.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Cambia l'elenco delle chat:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Attiva/disattiva l'incognito quando ti colleghi.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Opacità barra degli strumenti";
/* No comment provided by engineer. */
"Total" = "Totale";
@@ -4942,6 +4978,9 @@
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Puoi accettare chiamate dalla schermata di blocco, senza l'autenticazione del dispositivo e dell'app.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "Puoi cambiarlo nelle impostazioni dell'aspetto.";
/* No comment provided by engineer. */
"You can create it later" = "Puoi crearlo più tardi";
+42 -3
View File
@@ -595,6 +595,9 @@
/* No comment provided by engineer. */
"Archive and upload" = "Archiveren en uploaden";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Archiveer contacten om later te chatten.";
/* No comment provided by engineer. */
"Archived contacts" = "Gearchiveerde contacten";
@@ -673,6 +676,9 @@
/* No comment provided by engineer. */
"Better messages" = "Betere berichten";
/* No comment provided by engineer. */
"Better networking" = "Beter netwerk";
/* No comment provided by engineer. */
"Black" = "Zwart";
@@ -706,6 +712,9 @@
/* No comment provided by engineer. */
"Blocked by admin" = "Geblokkeerd door beheerder";
/* No comment provided by engineer. */
"Blur for better privacy." = "Vervagen voor betere privacy.";
/* No comment provided by engineer. */
"Blur media" = "Vervaag media";
@@ -872,6 +881,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Chat is gestopt. Als je deze database al op een ander apparaat hebt gebruikt, moet je deze terugzetten voordat je met chatten begint.";
/* No comment provided by engineer. */
"Chat list" = "Chatlijst";
/* No comment provided by engineer. */
"Chat migrated!" = "Chat gemigreerd!";
@@ -923,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Verwijderd verificatie";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Kleurchats met de nieuwe thema's.";
/* No comment provided by engineer. */
"Color mode" = "Kleur mode";
@@ -992,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "maak verbinding met SimpleX Chat-ontwikkelaars.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Maak sneller verbinding met je vrienden.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Verbinding maken met jezelf?";
@@ -2612,7 +2630,7 @@
"Keep" = "Bewaar";
/* No comment provided by engineer. */
"Keep conversation" = "Blijf in gesprek";
"Keep conversation" = "Behoud het gesprek";
/* No comment provided by engineer. */
"Keep the app open to use it from desktop" = "Houd de app geopend om deze vanaf de desktop te gebruiken";
@@ -2945,7 +2963,7 @@
"New chat" = "Nieuw gesprek";
/* No comment provided by engineer. */
"New Chat" = "Nieuw Gesprek";
"New chat experience 🎉" = "Nieuwe chatervaring 🎉";
/* notification */
"New contact request" = "Nieuw contactverzoek";
@@ -2965,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Nieuw in %@";
/* No comment provided by engineer. */
"New media options" = "Nieuwe media-opties";
/* No comment provided by engineer. */
"New member role" = "Nieuwe leden rol";
@@ -3252,6 +3273,9 @@
/* No comment provided by engineer. */
"PING interval" = "PING interval";
/* No comment provided by engineer. */
"Play from the chat list." = "Afspelen via de gesprekken lijst.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Vraag uw contactpersoon om oproepen in te schakelen.";
@@ -3436,7 +3460,7 @@
"Rate the app" = "Beoordeel de app";
/* No comment provided by engineer. */
"Reachable chat toolbar" = "Bereikbare chat werkbalk";
"Reachable chat toolbar" = "Toegankelijke chatwerkbalk";
/* chat item menu */
"React…" = "Reageer…";
@@ -3625,6 +3649,9 @@
/* No comment provided by engineer. */
"Reset" = "Resetten";
/* No comment provided by engineer. */
"Reset all hints" = "Alle hints resetten";
/* No comment provided by engineer. */
"Reset all statistics" = "Reset alle statistieken";
@@ -4048,6 +4075,9 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "Adres delen met contacten?";
/* No comment provided by engineer. */
"Share from other apps." = "Delen vanuit andere apps.";
/* No comment provided by engineer. */
"Share link" = "Deel link";
@@ -4471,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Vergelijk (of scan) de code op uw apparaten om end-to-end-codering met uw contact te verifiëren.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Chatlijst wisselen:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Schakel incognito in tijdens het verbinden.";
/* No comment provided by engineer. */
"Toolbar opacity" = "De transparantie van de werkbalk";
/* No comment provided by engineer. */
"Total" = "Totaal";
@@ -4942,6 +4978,9 @@
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "U kunt oproepen van het vergrendelingsscherm accepteren, zonder apparaat- en app-verificatie.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "U kunt dit wijzigen in de instellingen onder uiterlijk.";
/* No comment provided by engineer. */
"You can create it later" = "U kan het later maken";
+234
View File
@@ -472,6 +472,9 @@
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Zezwalaj na połączenia tylko wtedy, gdy Twój kontakt na to pozwala.";
/* No comment provided by engineer. */
"Allow calls?" = "Zezwolić na połączenia?";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Zezwól na znikające wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli.";
@@ -493,6 +496,9 @@
/* No comment provided by engineer. */
"Allow sending disappearing messages." = "Zezwól na wysyłanie znikających wiadomości.";
/* No comment provided by engineer. */
"Allow sharing" = "Zezwól na udostępnianie";
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages. (24 hours)" = "Zezwól na nieodwracalne usunięcie wysłanych wiadomości. (24 godziny)";
@@ -589,6 +595,12 @@
/* No comment provided by engineer. */
"Archive and upload" = "Archiwizuj i prześlij";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Archiwizuj kontakty aby porozmawiać później.";
/* No comment provided by engineer. */
"Archived contacts" = "Zarchiwizowane kontakty";
/* No comment provided by engineer. */
"Archiving database" = "Archiwizowanie bazy danych";
@@ -664,6 +676,9 @@
/* No comment provided by engineer. */
"Better messages" = "Lepsze wiadomości";
/* No comment provided by engineer. */
"Better networking" = "Lepsze sieciowanie";
/* No comment provided by engineer. */
"Black" = "Czarny";
@@ -697,6 +712,12 @@
/* No comment provided by engineer. */
"Blocked by admin" = "Zablokowany przez admina";
/* No comment provided by engineer. */
"Blur for better privacy." = "Rozmycie dla lepszej prywatności.";
/* No comment provided by engineer. */
"Blur media" = "Rozmycie mediów";
/* No comment provided by engineer. */
"bold" = "pogrubiona";
@@ -721,6 +742,9 @@
/* No comment provided by engineer. */
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Według profilu czatu (domyślnie) lub [według połączenia](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
/* No comment provided by engineer. */
"call" = "zadzwoń";
/* No comment provided by engineer. */
"Call already ended!" = "Połączenie już zakończone!";
@@ -736,15 +760,27 @@
/* No comment provided by engineer. */
"Calls" = "Połączenia";
/* No comment provided by engineer. */
"Calls prohibited!" = "Połączenia zakazane!";
/* No comment provided by engineer. */
"Camera not available" = "Kamera nie dostępna";
/* No comment provided by engineer. */
"Can't call contact" = "Nie można zadzwonić do kontaktu";
/* No comment provided by engineer. */
"Can't call member" = "Nie można zadzwonić do członka";
/* No comment provided by engineer. */
"Can't invite contact!" = "Nie można zaprosić kontaktu!";
/* No comment provided by engineer. */
"Can't invite contacts!" = "Nie można zaprosić kontaktów!";
/* No comment provided by engineer. */
"Can't message member" = "Nie można wysłać wiadomości do członka";
/* No comment provided by engineer. */
"Cancel" = "Anuluj";
@@ -830,6 +866,9 @@
/* No comment provided by engineer. */
"Chat database deleted" = "Baza danych czatu usunięta";
/* No comment provided by engineer. */
"Chat database exported" = "Wyeksportowano bazę danych czatu";
/* No comment provided by engineer. */
"Chat database imported" = "Zaimportowano bazę danych czatu";
@@ -842,6 +881,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Czat został zatrzymany. Jeśli korzystałeś już z tej bazy danych na innym urządzeniu, powinieneś przenieść ją z powrotem przed rozpoczęciem czatu.";
/* No comment provided by engineer. */
"Chat list" = "Lista czatów";
/* No comment provided by engineer. */
"Chat migrated!" = "Czat zmigrowany!";
@@ -893,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Wyczyść weryfikację";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Koloruj czaty z nowymi motywami.";
/* No comment provided by engineer. */
"Color mode" = "Tryb koloru";
@@ -920,6 +965,9 @@
/* No comment provided by engineer. */
"Confirm" = "Potwierdź";
/* No comment provided by engineer. */
"Confirm contact deletion?" = "Potwierdzić usunięcie kontaktu?";
/* No comment provided by engineer. */
"Confirm database upgrades" = "Potwierdź aktualizacje bazy danych";
@@ -959,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "połącz się z deweloperami SimpleX Chat.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Szybciej łącz się ze znajomymi.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Połączyć się ze sobą?";
@@ -1025,6 +1076,9 @@
/* No comment provided by engineer. */
"Connecting server… (error: %@)" = "Łączenie z serwerem... (błąd: %@)";
/* No comment provided by engineer. */
"Connecting to contact, please wait or check later!" = "Łączenie z kontaktem, poczekaj lub sprawdź później!";
/* No comment provided by engineer. */
"Connecting to desktop" = "Łączenie z komputerem";
@@ -1034,6 +1088,9 @@
/* No comment provided by engineer. */
"Connection" = "Połączenie";
/* No comment provided by engineer. */
"Connection and servers status." = "Stan połączenia i serwerów.";
/* No comment provided by engineer. */
"Connection error" = "Błąd połączenia";
@@ -1043,6 +1100,9 @@
/* chat list item title (it should not be shown */
"connection established" = "połączenie ustanowione";
/* No comment provided by engineer. */
"Connection notifications" = "Powiadomienia o połączeniu";
/* No comment provided by engineer. */
"Connection request sent!" = "Prośba o połączenie wysłana!";
@@ -1070,6 +1130,9 @@
/* No comment provided by engineer. */
"Contact already exists" = "Kontakt już istnieje";
/* No comment provided by engineer. */
"Contact deleted!" = "Kontakt usunięty!";
/* No comment provided by engineer. */
"contact has e2e encryption" = "kontakt posiada szyfrowanie e2e";
@@ -1082,12 +1145,18 @@
/* notification */
"Contact is connected" = "Kontakt jest połączony";
/* No comment provided by engineer. */
"Contact is deleted." = "Kontakt jest usunięty.";
/* No comment provided by engineer. */
"Contact name" = "Nazwa kontaktu";
/* No comment provided by engineer. */
"Contact preferences" = "Preferencje kontaktu";
/* No comment provided by engineer. */
"Contact will be deleted - this cannot be undone!" = "Kontakt zostanie usunięty nie można tego cofnąć!";
/* No comment provided by engineer. */
"Contacts" = "Kontakty";
@@ -1097,6 +1166,9 @@
/* No comment provided by engineer. */
"Continue" = "Kontynuuj";
/* No comment provided by engineer. */
"Conversation deleted!" = "Rozmowa usunięta!";
/* No comment provided by engineer. */
"Copy" = "Kopiuj";
@@ -1281,6 +1353,9 @@
swipe action */
"Delete" = "Usuń";
/* No comment provided by engineer. */
"Delete %lld messages of members?" = "Usunąć %lld wiadomości członków?";
/* No comment provided by engineer. */
"Delete %lld messages?" = "Usunąć %lld wiadomości?";
@@ -1317,6 +1392,9 @@
/* No comment provided by engineer. */
"Delete contact" = "Usuń kontakt";
/* No comment provided by engineer. */
"Delete contact?" = "Usunąć kontakt?";
/* No comment provided by engineer. */
"Delete database" = "Usuń bazę danych";
@@ -1380,9 +1458,15 @@
/* server test step */
"Delete queue" = "Usuń kolejkę";
/* No comment provided by engineer. */
"Delete up to 20 messages at once." = "Usuń do 20 wiadomości na raz.";
/* No comment provided by engineer. */
"Delete user profile?" = "Usunąć profil użytkownika?";
/* No comment provided by engineer. */
"Delete without notification" = "Usuń bez powiadomienia";
/* deleted chat item */
"deleted" = "usunięty";
@@ -1425,9 +1509,15 @@
/* No comment provided by engineer. */
"Desktop devices" = "Urządzenia komputerowe";
/* No comment provided by engineer. */
"Destination server address of %@ is incompatible with forwarding server %@ settings." = "Adres serwera docelowego %@ jest niekompatybilny z ustawieniami serwera przekazującego %@.";
/* snd error text */
"Destination server error: %@" = "Błąd docelowego serwera: %@";
/* No comment provided by engineer. */
"Destination server version of %@ is incompatible with forwarding server %@." = "Wersja serwera docelowego %@ jest niekompatybilna z serwerem przekierowującym %@.";
/* No comment provided by engineer. */
"Detailed statistics" = "Szczegółowe statystyki";
@@ -1437,6 +1527,9 @@
/* No comment provided by engineer. */
"Develop" = "Deweloperskie";
/* No comment provided by engineer. */
"Developer options" = "Opcje deweloperskie";
/* No comment provided by engineer. */
"Developer tools" = "Narzędzia deweloperskie";
@@ -1476,6 +1569,9 @@
/* No comment provided by engineer. */
"disabled" = "wyłączony";
/* No comment provided by engineer. */
"Disabled" = "Wyłączony";
/* No comment provided by engineer. */
"Disappearing message" = "Znikająca wiadomość";
@@ -1623,6 +1719,9 @@
/* enabled status */
"enabled" = "włączone";
/* No comment provided by engineer. */
"Enabled" = "Włączony";
/* No comment provided by engineer. */
"Enabled for" = "Włączony dla";
@@ -1764,6 +1863,9 @@
/* No comment provided by engineer. */
"Error changing setting" = "Błąd zmiany ustawienia";
/* No comment provided by engineer. */
"Error connecting to forwarding server %@. Please try later." = "Błąd połączenia z serwerem przekierowania %@. Spróbuj ponownie później.";
/* No comment provided by engineer. */
"Error creating address" = "Błąd tworzenia adresu";
@@ -2074,6 +2176,15 @@
/* No comment provided by engineer. */
"Forwarded from" = "Przekazane dalej od";
/* No comment provided by engineer. */
"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Serwer przekazujący %@ nie mógł połączyć się z serwerem docelowym %@. Spróbuj ponownie później.";
/* No comment provided by engineer. */
"Forwarding server address is incompatible with network settings: %@." = "Adres serwera przekierowującego jest niekompatybilny z ustawieniami sieciowymi: %@.";
/* No comment provided by engineer. */
"Forwarding server version is incompatible with network settings: %@." = "Wersja serwera przekierowującego jest niekompatybilna z ustawieniami sieciowymi: %@.";
/* snd error text */
"Forwarding server: %@\nDestination server error: %@" = "Serwer przekazujący: %1$@\nBłąd serwera docelowego: %2$@";
@@ -2425,6 +2536,9 @@
/* group name */
"invitation to group %@" = "zaproszenie do grupy %@";
/* No comment provided by engineer. */
"invite" = "zaproś";
/* No comment provided by engineer. */
"Invite friends" = "Zaproś znajomych";
@@ -2470,6 +2584,9 @@
/* 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." = "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.\n3. Połączenie zostało skompromitowane.";
/* No comment provided by engineer. */
"It protects your IP address and connections." = "Chroni Twój adres IP i połączenia.";
/* 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 (%@)." = "Wygląda na to, że jesteś już połączony przez ten link. Jeśli tak nie jest, wystąpił błąd (%@).";
@@ -2512,6 +2629,9 @@
/* No comment provided by engineer. */
"Keep" = "Zachowaj";
/* No comment provided by engineer. */
"Keep conversation" = "Zachowaj rozmowę";
/* No comment provided by engineer. */
"Keep the app open to use it from desktop" = "Zostaw aplikację otwartą i używaj ją z komputera";
@@ -2623,6 +2743,12 @@
/* No comment provided by engineer. */
"Max 30 seconds, received instantly." = "Maksymalnie 30 sekund, odbierane natychmiast.";
/* No comment provided by engineer. */
"Media & file servers" = "Serwery mediów i plików";
/* blur media */
"Medium" = "Średni";
/* member role */
"member" = "członek";
@@ -2650,6 +2776,9 @@
/* No comment provided by engineer. */
"Menus" = "Menu";
/* No comment provided by engineer. */
"message" = "wiadomość";
/* item status text */
"Message delivery error" = "Błąd dostarczenia wiadomości";
@@ -2686,6 +2815,9 @@
/* No comment provided by engineer. */
"Message reception" = "Odebranie wiadomości";
/* No comment provided by engineer. */
"Message servers" = "Serwery wiadomości";
/* No comment provided by engineer. */
"Message source remains private." = "Źródło wiadomości pozostaje prywatne.";
@@ -2794,6 +2926,9 @@
/* No comment provided by engineer. */
"Multiple chat profiles" = "Wiele profili czatu";
/* No comment provided by engineer. */
"mute" = "wycisz";
/* swipe action */
"Mute" = "Wycisz";
@@ -2827,6 +2962,9 @@
/* No comment provided by engineer. */
"New chat" = "Nowy czat";
/* No comment provided by engineer. */
"New chat experience 🎉" = "Nowe możliwości czatu 🎉";
/* notification */
"New contact request" = "Nowa prośba o kontakt";
@@ -2845,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Nowość w %@";
/* No comment provided by engineer. */
"New media options" = "Nowe opcje mediów";
/* No comment provided by engineer. */
"New member role" = "Nowa rola członka";
@@ -2914,6 +3055,9 @@
/* No comment provided by engineer. */
"Not compatible!" = "Nie kompatybilny!";
/* No comment provided by engineer. */
"Nothing selected" = "Nic nie jest zaznaczone";
/* No comment provided by engineer. */
"Notifications" = "Powiadomienia";
@@ -2970,6 +3114,9 @@
/* No comment provided by engineer. */
"Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." = "Tylko urządzenia klienckie przechowują profile użytkowników, kontakty, grupy i wiadomości wysyłane za pomocą **2-warstwowego szyfrowania end-to-end**.";
/* No comment provided by engineer. */
"Only delete conversation" = "Usuń tylko rozmowę";
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Tylko właściciele grup mogą zmieniać preferencje grupy.";
@@ -3126,6 +3273,12 @@
/* No comment provided by engineer. */
"PING interval" = "Interwał PINGU";
/* No comment provided by engineer. */
"Play from the chat list." = "Odtwórz z listy czatów.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Poproś kontakt o włącznie połączeń.";
/* No comment provided by engineer. */
"Please ask your contact to enable sending voice messages." = "Poproś Twój kontakt o włączenie wysyłania wiadomości głosowych.";
@@ -3306,6 +3459,9 @@
/* No comment provided by engineer. */
"Rate the app" = "Oceń aplikację";
/* No comment provided by engineer. */
"Reachable chat toolbar" = "Osiągalny pasek narzędzi czatu";
/* chat item menu */
"React…" = "Reaguj…";
@@ -3493,6 +3649,9 @@
/* No comment provided by engineer. */
"Reset" = "Resetuj";
/* No comment provided by engineer. */
"Reset all hints" = "Zresetuj wszystkie wskazówki";
/* No comment provided by engineer. */
"Reset all statistics" = "Resetuj wszystkie statystyki";
@@ -3568,6 +3727,9 @@
/* No comment provided by engineer. */
"Save and notify group members" = "Zapisz i powiadom członków grupy";
/* No comment provided by engineer. */
"Save and reconnect" = "Zapisz i połącz ponownie";
/* No comment provided by engineer. */
"Save and update group profile" = "Zapisz i zaktualizuj profil grupowy";
@@ -3643,6 +3805,9 @@
/* No comment provided by engineer. */
"Scan server QR code" = "Zeskanuj kod QR serwera";
/* No comment provided by engineer. */
"search" = "szukaj";
/* No comment provided by engineer. */
"Search" = "Szukaj";
@@ -3682,6 +3847,9 @@
/* chat item action */
"Select" = "Wybierz";
/* No comment provided by engineer. */
"Selected %lld" = "Zaznaczono %lld";
/* No comment provided by engineer. */
"Selected chat preferences prohibit this message." = "Wybrane preferencje czatu zabraniają tej wiadomości.";
@@ -3724,6 +3892,9 @@
/* No comment provided by engineer. */
"Send live message" = "Wyślij wiadomość na żywo";
/* No comment provided by engineer. */
"Send message to enable calls." = "Wyślij wiadomość aby włączyć połączenia.";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Wysyłaj wiadomości bezpośrednio, gdy adres IP jest chroniony i Twój lub docelowy serwer nie obsługuje prywatnego trasowania.";
@@ -3904,12 +4075,18 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "Udostępnić adres kontaktom?";
/* No comment provided by engineer. */
"Share from other apps." = "Udostępnij z innych aplikacji.";
/* No comment provided by engineer. */
"Share link" = "Udostępnij link";
/* No comment provided by engineer. */
"Share this 1-time invite link" = "Udostępnij ten jednorazowy link";
/* No comment provided by engineer. */
"Share to SimpleX" = "Udostępnij do SimpleX";
/* No comment provided by engineer. */
"Share with contacts" = "Udostępnij kontaktom";
@@ -4003,9 +4180,18 @@
/* No comment provided by engineer. */
"SMP server" = "Serwer SMP";
/* blur media */
"Soft" = "Łagodny";
/* No comment provided by engineer. */
"Some file(s) were not exported:" = "Niektóre plik(i) nie zostały wyeksportowane:";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import - you may see Chat console for more details." = "Podczas importu wystąpiły niekrytyczne błędy - więcej szczegółów można znaleźć w konsoli czatu.";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import:" = "Podczas importu wystąpiły niekrytyczne błędy:";
/* notification title */
"Somebody" = "Ktoś";
@@ -4072,6 +4258,9 @@
/* No comment provided by engineer. */
"strike" = "strajk";
/* blur media */
"Strong" = "Silne";
/* No comment provided by engineer. */
"Submit" = "Zatwierdź";
@@ -4117,6 +4306,9 @@
/* No comment provided by engineer. */
"Tap to scan" = "Dotknij, aby zeskanować";
/* No comment provided by engineer. */
"TCP connection" = "Połączenie TCP";
/* No comment provided by engineer. */
"TCP connection timeout" = "Limit czasu połączenia TCP";
@@ -4192,6 +4384,12 @@
/* No comment provided by engineer. */
"The message will be marked as moderated for all members." = "Wiadomość zostanie oznaczona jako moderowana dla wszystkich członków.";
/* No comment provided by engineer. */
"The messages will be deleted for all members." = "Wiadomości zostaną usunięte dla wszystkich członków.";
/* No comment provided by engineer. */
"The messages will be marked as moderated for all members." = "Wiadomości zostaną oznaczone jako moderowane dla wszystkich członków.";
/* No comment provided by engineer. */
"The next generation of private messaging" = "Następna generacja prywatnych wiadomości";
@@ -4303,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Aby zweryfikować szyfrowanie end-to-end z Twoim kontaktem porównaj (lub zeskanuj) kod na waszych urządzeniach.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Przełącz listę czatów:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Przełącz incognito przy połączeniu.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Nieprzezroczystość paska narzędzi";
/* No comment provided by engineer. */
"Total" = "Łącznie";
@@ -4408,6 +4612,9 @@
/* authentication reason */
"Unlock app" = "Odblokuj aplikację";
/* No comment provided by engineer. */
"unmute" = "wyłącz wyciszenie";
/* swipe action */
"Unmute" = "Wyłącz wyciszenie";
@@ -4429,6 +4636,9 @@
/* No comment provided by engineer. */
"Update network settings?" = "Zaktualizować ustawienia sieci?";
/* No comment provided by engineer. */
"Update settings?" = "Zaktualizować ustawienia?";
/* rcv group event chat item */
"updated group profile" = "zaktualizowano profil grupy";
@@ -4498,6 +4708,9 @@
/* No comment provided by engineer. */
"Use the app while in the call." = "Używaj aplikacji podczas połączenia.";
/* No comment provided by engineer. */
"Use the app with one hand." = "Korzystaj z aplikacji jedną ręką.";
/* No comment provided by engineer. */
"User profile" = "Profil użytkownika";
@@ -4552,6 +4765,9 @@
/* No comment provided by engineer. */
"Via secure quantum resistant protocol." = "Dzięki bezpiecznemu protokołowi odpornego kwantowo.";
/* No comment provided by engineer. */
"video" = "wideo";
/* No comment provided by engineer. */
"Video call" = "Połączenie wideo";
@@ -4762,6 +4978,9 @@
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Możesz przyjmować połączenia z ekranu blokady, bez uwierzytelniania urządzenia i aplikacji.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "Możesz to zmienić w ustawieniach wyglądu.";
/* No comment provided by engineer. */
"You can create it later" = "Możesz go utworzyć później";
@@ -4783,6 +5002,9 @@
/* notification body */
"You can now chat with %@" = "Możesz teraz wysyłać wiadomości do %@";
/* No comment provided by engineer. */
"You can send messages to %@ from Archived contacts." = "Możesz wysyłać wiadomości do %@ ze zarchiwizowanych kontaktów.";
/* No comment provided by engineer. */
"You can set lock screen notification preview via settings." = "Podgląd powiadomień na ekranie blokady można ustawić w ustawieniach.";
@@ -4798,6 +5020,9 @@
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "Możesz rozpocząć czat poprzez Ustawienia aplikacji / Baza danych lub poprzez ponowne uruchomienie aplikacji";
/* No comment provided by engineer. */
"You can still view conversation with %@ in the list of chats." = "Nadal możesz przeglądać rozmowę z %@ na liście czatów.";
/* No comment provided by engineer. */
"You can turn on SimpleX Lock via Settings." = "Możesz włączyć blokadę SimpleX poprzez Ustawienia.";
@@ -4849,9 +5074,18 @@
/* snd group event chat item */
"you left" = "wyszedłeś";
/* No comment provided by engineer. */
"You may migrate the exported database." = "Możesz zmigrować wyeksportowaną bazy danych.";
/* No comment provided by engineer. */
"You may save the exported archive." = "Możesz zapisać wyeksportowane archiwum.";
/* No comment provided by engineer. */
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "Musisz używać najnowszej wersji bazy danych czatu TYLKO na jednym urządzeniu, w przeciwnym razie możesz przestać otrzymywać wiadomości od niektórych kontaktów.";
/* No comment provided by engineer. */
"You need to allow your contact to call to be able to call them." = "Aby móc dzwonić, musisz zezwolić kontaktowi na połączenia.";
/* No comment provided by engineer. */
"You need to allow your contact to send voice messages to be able to send them." = "Musisz zezwolić Twojemu kontaktowi na wysyłanie wiadomości głosowych, aby móc je wysyłać.";
+42 -3
View File
@@ -595,6 +595,9 @@
/* No comment provided by engineer. */
"Archive and upload" = "Архивировать и загрузить";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Архивируйте контакты чтобы продолжить переписку.";
/* No comment provided by engineer. */
"Archived contacts" = "Архивированные контакты";
@@ -673,6 +676,9 @@
/* No comment provided by engineer. */
"Better messages" = "Улучшенные сообщения";
/* No comment provided by engineer. */
"Better networking" = "Улучшенные сетевые функции";
/* No comment provided by engineer. */
"Black" = "Черная";
@@ -706,6 +712,9 @@
/* No comment provided by engineer. */
"Blocked by admin" = "Заблокирован администратором";
/* No comment provided by engineer. */
"Blur for better privacy." = "Размыть для конфиденциальности.";
/* No comment provided by engineer. */
"Blur media" = "Размытие изображений";
@@ -872,6 +881,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Чат остановлен. Если вы уже использовали эту базу данных на другом устройстве, перенесите ее обратно до запуска чата.";
/* No comment provided by engineer. */
"Chat list" = "Список чатов";
/* No comment provided by engineer. */
"Chat migrated!" = "Чат мигрирован!";
@@ -923,6 +935,9 @@
/* No comment provided by engineer. */
"Clear verification" = "Сбросить подтверждение";
/* No comment provided by engineer. */
"Color chats with the new themes." = "Добавьте цвета к чатам в настройках.";
/* No comment provided by engineer. */
"Color mode" = "Режим цветов";
@@ -992,6 +1007,9 @@
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "соединитесь с разработчиками.";
/* No comment provided by engineer. */
"Connect to your friends faster." = "Соединяйтесь с друзьями быстрее.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Соединиться с самим собой?";
@@ -1441,7 +1459,7 @@
"Delete queue" = "Удаление очереди";
/* No comment provided by engineer. */
"Delete up to 20 messages at once." = "Удаляйте до 20 сообщений одновременно.";
"Delete up to 20 messages at once." = "Удаляйте до 20 сообщений за раз.";
/* No comment provided by engineer. */
"Delete user profile?" = "Удалить профиль пользователя?";
@@ -2945,7 +2963,7 @@
"New chat" = "Новый чат";
/* No comment provided by engineer. */
"New Chat" = "Новый чат";
"New chat experience 🎉" = "Новый интерфейс 🎉";
/* notification */
"New contact request" = "Новый запрос на соединение";
@@ -2965,6 +2983,9 @@
/* No comment provided by engineer. */
"New in %@" = "Новое в %@";
/* No comment provided by engineer. */
"New media options" = "Новые медиа-опции";
/* No comment provided by engineer. */
"New member role" = "Роль члена группы";
@@ -3252,6 +3273,9 @@
/* No comment provided by engineer. */
"PING interval" = "Интервал PING";
/* No comment provided by engineer. */
"Play from the chat list." = "Открыть из списка чатов.";
/* No comment provided by engineer. */
"Please ask your contact to enable calls." = "Попросите Вашего контакта разрешить звонки.";
@@ -3334,7 +3358,7 @@
"Private message routing" = "Конфиденциальная доставка сообщений";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Конфиденциальная доставка сообщений 🚀";
"Private message routing 🚀" = "Конфиденциальная доставка 🚀";
/* name of notes to self */
"Private notes" = "Личные заметки";
@@ -3625,6 +3649,9 @@
/* No comment provided by engineer. */
"Reset" = "Сбросить";
/* No comment provided by engineer. */
"Reset all hints" = "Сбросить все подсказки";
/* No comment provided by engineer. */
"Reset all statistics" = "Сбросить всю статистику";
@@ -4048,6 +4075,9 @@
/* No comment provided by engineer. */
"Share address with contacts?" = "Поделиться адресом с контактами?";
/* No comment provided by engineer. */
"Share from other apps." = "Поделитесь из других приложений.";
/* No comment provided by engineer. */
"Share link" = "Поделиться ссылкой";
@@ -4471,9 +4501,15 @@
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Чтобы подтвердить end-to-end шифрование с Вашим контактом сравните (или сканируйте) код безопасности на Ваших устройствах.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Переключите список чатов:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Установите режим Инкогнито при соединении.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Прозрачность тулбара";
/* No comment provided by engineer. */
"Total" = "Всего";
@@ -4942,6 +4978,9 @@
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Вы можете принимать звонки на экране блокировки, без аутентификации.";
/* No comment provided by engineer. */
"You can change it in Appearance settings." = "Вы можете изменить это в настройках Интерфейса.";
/* No comment provided by engineer. */
"You can create it later" = "Вы можете создать его позже";
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -15,7 +15,7 @@ android {
namespace = "chat.simplex.app"
minSdk = 26
//noinspection OldTargetApi
targetSdk = 33
targetSdk = 34
// !!!
// skip version code after release to F-Droid, as it uses two version codes
versionCode = (extra["android.version_code"] as String).toInt()
@@ -126,29 +126,29 @@ android {
dependencies {
implementation(project(":common"))
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.core:core-ktx:1.13.1")
//implementation("androidx.compose.ui:ui:${rootProject.extra["compose.version"] as String}")
//implementation("androidx.compose.material:material:$compose_version")
//implementation("androidx.compose.ui:ui-tooling-preview:$compose_version")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-process:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
val workVersion = "2.9.0"
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.4")
implementation("androidx.lifecycle:lifecycle-process:2.8.4")
implementation("androidx.activity:activity-compose:1.9.1")
val workVersion = "2.9.1"
implementation("androidx.work:work-runtime-ktx:$workVersion")
implementation("androidx.work:work-multiprocess:$workVersion")
implementation("com.jakewharton:process-phoenix:2.2.0")
implementation("com.jakewharton:process-phoenix:3.0.0")
//Camera Permission
implementation("com.google.accompanist:accompanist-permissions:0.23.0")
implementation("com.google.accompanist:accompanist-permissions:0.34.0")
//implementation("androidx.compose.material:material-icons-extended:$compose_version")
//implementation("androidx.compose.ui:ui-util:$compose_version")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
//androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version")
debugImplementation("androidx.compose.ui:ui-tooling:1.6.4")
}
@@ -21,6 +21,12 @@
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<!-- Requirements that allows to specify foreground service types -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application
android:name="SimplexApp"
android:allowBackup="false"
@@ -133,7 +139,9 @@
android:name=".SimplexService"
android:enabled="true"
android:exported="false"
android:stopWithTask="false"></service>
android:stopWithTask="false"
android:foregroundServiceType="remoteMessaging"
/>
<!-- SimplexService restart on reboot -->
@@ -141,7 +149,9 @@
android:name=".CallService"
android:enabled="true"
android:exported="false"
android:stopWithTask="false"/>
android:stopWithTask="false"
android:foregroundServiceType="mediaPlayback|microphone|camera|remoteMessaging"
/>
<receiver
android:name=".CallService$CallActionReceiver"
@@ -2,17 +2,18 @@ package chat.simplex.app
import android.app.*
import android.content.*
import android.content.pm.ServiceInfo
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.*
import androidx.compose.ui.graphics.asAndroidBitmap
import androidx.core.app.NotificationCompat
import androidx.core.app.ServiceCompat
import androidx.core.content.ContextCompat
import chat.simplex.app.model.NtfManager.EndCallAction
import chat.simplex.app.views.call.CallActivity
import chat.simplex.common.model.NotificationPreviewMode
import chat.simplex.common.platform.*
import chat.simplex.common.views.call.CallState
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
import kotlinx.datetime.Instant
@@ -34,7 +35,7 @@ class CallService: Service() {
} else {
Log.d(TAG, "null intent. Probably restarted by the system.")
}
startForeground(CALL_SERVICE_ID, serviceNotification)
ServiceCompat.startForeground(this, CALL_SERVICE_ID, createNotificationIfNeeded(), foregroundServiceType())
return START_STICKY
}
@@ -42,8 +43,7 @@ class CallService: Service() {
super.onCreate()
Log.d(TAG, "Call service created")
notificationManager = createNotificationChannel()
updateNotification()
startForeground(CALL_SERVICE_ID, serviceNotification)
ServiceCompat.startForeground(this, CALL_SERVICE_ID, updateNotification(), foregroundServiceType())
}
override fun onDestroy() {
@@ -69,7 +69,14 @@ class CallService: Service() {
}
}
fun updateNotification() {
private fun createNotificationIfNeeded(): Notification {
val ntf = serviceNotification
if (ntf != null) return ntf
return updateNotification()
}
fun updateNotification(): Notification {
val call = chatModel.activeCall.value
val previewMode = appPreferences.notificationPreviewMode.get()
val title = if (previewMode == NotificationPreviewMode.HIDDEN.name)
@@ -83,8 +90,31 @@ class CallService: Service() {
else
base64ToBitmap(image).asAndroidBitmap()
serviceNotification = createNotification(title, text, largeIcon, call?.connectedAt)
startForeground(CALL_SERVICE_ID, serviceNotification)
val ntf = createNotification(title, text, largeIcon, call?.connectedAt)
serviceNotification = ntf
ServiceCompat.startForeground(this, CALL_SERVICE_ID, ntf, foregroundServiceType())
return ntf
}
private fun foregroundServiceType(): Int {
val call = chatModel.activeCall.value
return if (call == null) {
if (Build.VERSION.SDK_INT >= 34) {
ServiceInfo.FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
} else {
0
}
} else if (Build.VERSION.SDK_INT >= 30) {
if (call.supportsVideo()) {
ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK or ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE or ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA
} else {
ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK or ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE
}
} else if (Build.VERSION.SDK_INT >= 29) {
ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
} else {
0
}
}
private fun createNotificationChannel(): NotificationManager? {
@@ -19,6 +19,7 @@ import chat.simplex.common.views.chatlist.*
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.onboarding.*
import chat.simplex.common.platform.*
import chat.simplex.res.MR
import kotlinx.coroutines.*
import java.lang.ref.WeakReference
@@ -53,7 +54,7 @@ class MainActivity: FragmentActivity() {
SimplexApp.context.schedulePeriodicWakeUp()
}
override fun onNewIntent(intent: Intent?) {
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
processIntent(intent)
processExternalIntent(intent)
@@ -149,7 +150,12 @@ fun processIntent(intent: Intent?) {
"android.intent.action.VIEW" -> {
val uri = intent.data
if (uri != null) {
chatModel.appOpenUrl.value = null to uri.toURI()
val transformedUri = uri.toURIOrNull()
if (transformedUri != null) {
chatModel.appOpenUrl.value = null to transformedUri
} else {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_parsing_uri_title), generalGetString(MR.strings.error_parsing_uri_desc))
}
}
}
}

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