Compare commits

...

119 Commits

Author SHA1 Message Date
Moritz Angermann d438cec674 Disable i686-linux-static build 2024-04-21 10:09:25 +00:00
Moritz Angermann e4c5dbdb08 Disable aarch64-linux-static build. 2024-04-21 10:09:04 +00:00
Moritz Angermann 5d1a393131 Disable windows builds 2024-04-21 10:08:09 +00:00
Evgeny Poberezkin 8e3a713a49 ui: limit max size of events, sort members by role (#4058) 2024-04-21 10:57:54 +01:00
Evgeny Poberezkin 7cec79e79b 5.7-beta.1: ios 208, android 197, desktop 38 2024-04-20 22:07:04 +01:00
Evgeny Poberezkin e9db7e8e58 ios: export translations 2024-04-20 19:57:40 +01:00
Evgeny Poberezkin f53882049f ios: update core library 2024-04-20 19:54:47 +01:00
Evgeny Poberezkin 8f4c9a673a core: 5.7.0.1 2024-04-20 19:39:20 +01:00
Evgeny Poberezkin 02f980e968 core: update simplexmq (better newtork congestion handling, larger connection timeouts) (#4055)
* core: update simplexmq (better newtork congestion handling, larger connection timeouts)

* ui: update default TCP connect timeout, add receiving concurrency

* update simplexmq
2024-04-20 19:35:11 +01:00
Stanislav Dmitrenko 412f75219a android: select audio source (#4040)
* android, desktop: select audio source

* improvements

* fix possible crash

* changes
2024-04-20 19:19:37 +01:00
Evgeny Poberezkin c8c81a840b core: revert build to use two branches (#4052)
* Revert "scripts: ghc version update (#4010)"

This reverts commit 35b7f2cb1c.

* Revert "Force include hs_init_with_rtsopts (#4028)"

This reverts commit 76a33a3743.

* Revert "core: fix nix config (#4003)"

This reverts commit f8e6a78a3b.

* Revert "ci: build armv7a with 8.10.7 in the main branches (master, stable) (#3733)"

This reverts commit 0d7a32877f.
2024-04-19 21:17:22 +01:00
Stanislav Dmitrenko 925cb39397 desktop: using system sound in screenshare (#4035)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-19 17:37:47 +01:00
Stanislav Dmitrenko f6ceb89c4b android, desktop: forward ui (#4039)
* android, desktop: forward ui

* changes

* attachment icon

* reorder lines

* reorder lines

* change

* inline content + formatted text

* fix header padding

* fix

* fix2

* Revert "fix header padding"

This reverts commit 63f2b15f02.

* broken default parameter

* changes

* more checks for file forwarding

* paddings

* padding

* padding and fix

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2024-04-19 17:36:32 +01:00
Evgeny Poberezkin a35d392f76 core: update simplexmq 2024-04-19 17:25:34 +01:00
spaced4ndy 1306c84938 ios: in item context menu don't show forward button if file doesn't exist, add download button (#4048) 2024-04-19 17:21:35 +01:00
Stanislav Dmitrenko 6484e36b82 ios: fix mute/unmute button state (#4046) 2024-04-19 17:20:31 +01:00
Stanislav Dmitrenko 918be31f2c desktop: fix freeze that happened when new chat items arrives while scrolling via scrollbar (#4050) 2024-04-19 15:57:00 +01:00
spaced4ndy 648884044f core: prohibit forwarding file if it's not found (#4047) 2024-04-19 11:31:44 +04:00
Stanislav Dmitrenko 505c6cb062 ios: prevent a crash when exiting the app (#4041)
* ios: prevent a crash when exiting the app

* log
2024-04-19 07:23:13 +01:00
Stanislav Dmitrenko 065c8f8861 ios: fix typing using keyboard suggestions (#4045) 2024-04-19 07:17:17 +01:00
spaced4ndy 6c509027f7 docs: IP address protection rfc (#4036) 2024-04-17 13:53:45 +04:00
Evgeny Poberezkin 4eafdc3723 blog: metadata in messengers (#4038)
* blog: metadata in messengers

* readme

* call.js

* picture

* revert call.js
2024-04-16 20:18:22 +01:00
spaced4ndy 77f5c678d5 ios: forward ui (#4024)
* wip

* wip

* fixes

* improvements

* info

* fix

* dont cleanup file

* info design, text

* text

* rework with LazyVStack

* delay

* refactor

* move delay

* fix

* refactor

* refactor 2

* keep current message

* forward with quote, context icons

* info

* preserve draft

* remove newline

* improve search

* info

* layout

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-16 09:28:39 +01:00
Stanislav Dmitrenko 5e71d00ace android, desktop: workaround of missing stuns support in calls (#4033)
* android, desktop: workaround of missing stuns support in calls

* const
2024-04-16 08:38:46 +01:00
Stanislav Dmitrenko c2169f7813 desktop: fix video calls in Firefox (#4034)
* desktop: fix video calls in Firefox

* one more play()
2024-04-16 08:22:40 +01:00
spaced4ndy 7ff4b05c90 core: remember new origin for received forwarded messages (#4032) 2024-04-15 17:19:37 +04:00
Evgeny Poberezkin d7f8bff957 Merge branch 'stable' 2024-04-15 11:16:33 +01:00
sh bda0917787 github: fix cla action (#4030) 2024-04-15 10:51:24 +01:00
Evgeny Poberezkin 0eae7f56f3 5.7-beta.0: ios 207, android 196, desktop 37 2024-04-14 21:14:15 +01:00
Stanislav Dmitrenko 24e3806b25 webrtc: updated credentials (#4011)
* webrtc: updated credentials

* no udp

* change

* stuns

* added stun back

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-14 19:18:12 +01:00
Evgeny Poberezkin f606e5742c ios: update library 2024-04-14 19:11:15 +01:00
Evgeny Poberezkin c6af2c285a core: 5.7.0.0 (#4027) 2024-04-14 17:31:56 +01:00
Stanislav Dmitrenko 35b7f2cb1c scripts: ghc version update (#4010) 2024-04-14 16:42:04 +01:00
Evgeny Poberezkin 76a33a3743 Force include hs_init_with_rtsopts (#4028)
Co-authored-by: Moritz Angermann <moritz.angermann@gmail.com>
2024-04-14 16:12:34 +01:00
Evgeny Poberezkin b6fd5e61b6 Merge branch 'stable' 2024-04-13 12:12:51 +01:00
artur fe639eed48 docs: Add Polish translation (#4001)
* docs: Add polish translation

* README: Add link to polish translation

* docs: Polish version of README - Fix links

* docs: Add links to polish translation, fix

* docs: Fix polish translation thanks to support team

* docs: Add links to polish translation in english version of docs

* fix links

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-13 12:12:21 +01:00
spaced4ndy 638fd3756a core: correctly populate data for items forwarded from groups (#4025) 2024-04-13 11:52:39 +01:00
Stanislav Dmitrenko de81434b36 android, desktop: role-based preferences, SimpleX links preference (#4023)
* android, desktop: role-based preferences, SimpleX links preference

* disable for now

* different way of disabling send button

* mic icon filled

* icons

* braces

* colors

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-13 11:51:10 +01:00
Evgeny Poberezkin 433b3652fb core: simplexmq 5.6.2.2 2024-04-13 09:33:37 +01:00
Alexander Bondarenko 86fe2212c3 chat: forward files with streaming re-encryption (#4022)
* chat: forward files with streaming re-encryption

* refactor
2024-04-13 09:32:43 +01:00
Evgeny Poberezkin 182225a5b1 ios: role-based preferences, SimpleX links preference (#4021)
* ios: role-based preferences, SimpleX links preference

* disable some options
2024-04-12 11:29:58 +01:00
spaced4ndy e10c63dc64 ui: deletable field (#4019) 2024-04-12 13:10:47 +04:00
spaced4ndy 29941729d2 ui: forwarded item header (#4017) 2024-04-12 12:56:09 +04:00
spaced4ndy ee53377070 core: fix forwarded item deletion (#4018) 2024-04-12 12:55:04 +04:00
spaced4ndy 0deb6a4eb1 ui: forward types (#4008)
* ios: forward types

* android

* move
2024-04-11 13:58:56 +01:00
Stanislav Dmitrenko b84ef0ce35 android: network observer (#3992)
* android: network observer

* removed unused code

* rename

* rename

* new line

* rename

* changes in logic

* adapted to ios logic

* change

* change

* change

* networkLost

* item in settings

* reorder

* changes

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-11 13:26:24 +01:00
Stanislav Dmitrenko 34dee32def android, desktop: sound prompts and vibration (#3997)
* android, desktop: sound prompts and vibration

* moved audio playing to js

* Revert "moved audio playing to js"

This reverts commit a9355c2d88.

* sound from speaker/earpiece

* better

* changes

* license of audio

* reorder lines

* loop fix

* awaiting call receipt

* desktop

* new line
2024-04-11 13:19:00 +01:00
Stanislav Dmitrenko 94851f177b ios: noRcvUser handling while downloading a file in migration process (#4012) 2024-04-11 12:05:01 +01:00
Stanislav Dmitrenko e560b49d14 ios: sound prompts and vibration during calls (#4005)
* ios: sound prompts and vibration

* awaiting call receipt

* update

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-11 12:02:41 +01:00
Stanislav Dmitrenko d8b52ee0d3 ios: network observer (#3996)
* ios: network observer

* update

* remove metered

* update tcpTimeoutPerKb

* network connection in settings

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-11 11:31:30 +01:00
Evgeny Poberezkin a9c0f356b4 ios: update core library 2024-04-11 11:25:06 +01:00
Evgeny Poberezkin 8a3710482b core: update simplexmq 2024-04-11 10:47:51 +01:00
Evgeny Poberezkin b3a4ea8e57 core: api to update user network state (#3998)
* core: api to update user network state

* simplexmq

* update simplexmq

* simplexmq
2024-04-10 23:32:55 +01:00
Evgeny Poberezkin 4be6c69633 core: update simplexmq 2024-04-10 08:49:06 +01:00
Evgeny Poberezkin 005d99ad50 docs: trasparency reports (#4007) 2024-04-09 21:45:48 +01:00
Narasimha-sc 36f86beafd docs: device linking info on downloads page #4004 2024-04-09 20:30:08 +01:00
Evgeny Poberezkin 1fa79a2654 android, desktop: fix incorrect event type for critical/internal error alerts 2024-04-09 18:18:11 +01:00
Evgeny Poberezkin 72611084d3 core: debug events (#4006) 2024-04-09 17:31:52 +01:00
Evgeny Poberezkin a5db36469d core: api to forward messages (#3968)
* wip

* wip

* test

* mute

* tests

* simplify (only bool flag)

* re-encrypt file

* tests

* more tests (wip)

* fix relative paths, refactor

* more tests

* more locks

* fix, tests

* more tests

* rework (revert from bool to ids)

* update schema

* more tests

* add to info

* ForwardedMsg container

* Revert "ForwardedMsg container"

This reverts commit bb57f12151.

* parser

* more tests

* rework api

* more locks

* test

* move

* remove from

* view

* prohibit editing

* item info view

---------

Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2024-04-09 16:02:59 +04:00
Evgeny Poberezkin f8e6a78a3b core: fix nix config (#4003)
* bump

* more compilers

* i686 32bit only 8.10.7

---------

Co-authored-by: Moritz Angermann <moritz.angermann@gmail.com>
2024-04-09 08:15:29 +01:00
spaced4ndy 5b0c8e0f76 core: improve some tests (#4000) 2024-04-08 18:16:29 +04:00
Evgeny Poberezkin 2968cd0460 rfc: protocol extensions for channels/super-peers (#3980) 2024-04-05 16:46:37 +01:00
Evgeny Poberezkin 8ffb4e500e Merge branch 'stable' 2024-04-05 15:30:09 +01:00
Stanislav Dmitrenko 6133993cfe android, desktop: fix build error related to JVM version (#3995) 2024-04-05 15:29:41 +01:00
Evgeny Poberezkin 0d7a32877f ci: build armv7a with 8.10.7 in the main branches (master, stable) (#3733)
Co-authored-by: Moritz Angermann <moritz.angermann@gmail.com>
2024-04-05 12:24:34 +01:00
Evgeny Poberezkin 18efc28d16 core: additional group preferences: prohibit SimpleX links, restrict some features to specific roles (#3964)
* core: additional group preferences: prohibit SimpleX links, restrict some features to specific roles

* add role to group preference items, tests
2024-04-04 20:41:56 +01:00
spaced4ndy 069395c2a0 core: entity locks (#3962)
* core: entity locks

* more locks

* update sha256map

* add delay

* clean up

* empty

* fix tests

* empty

* empty

* more delays

* empty

* comment delays

* Revert "comment delays"

This reverts commit 4245b545fb.

* Revert "Revert "comment delays""

This reverts commit f803386945.

* take lock in the beginning of processing loop

* empty

* empty

* remove lock

* rework file locks

* empty

* fix

* empty

* add connection locks

* empty

* fix test

* empty

* remove commented delays

* add to debug locks

* update

* refactor

* refactor

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-04 19:24:42 +01:00
Stanislav Dmitrenko a725d2efac desktop (windows): fix build (#3990) 2024-04-04 14:18:33 +01:00
Evgeny Poberezkin 5f9710e4bb blog: post 2024-04-04 13:17:20 +01:00
Evgeny Poberezkin ea6c5bfb0b 5.6.1: ios 206, android 193, desktop 36 2024-04-04 08:58:24 +01:00
Stanislav Dmitrenko 14c279d1e0 android: possibly, prevent TooManyRequests exception (#3989)
* android: possibly, prevent TooManyRequests exception

* new line
2024-04-03 15:15:44 +01:00
Stanislav Dmitrenko d2de81100d android: workaround of pager's bug (#3988) 2024-04-03 15:11:04 +01:00
Stanislav Dmitrenko 9b28ae6d9e desktop: remote connection host/port fix (#3987) 2024-04-03 11:58:32 +01:00
Evgeny Poberezkin ea862a8f34 core: 5.6.1.1 (simplexmq 5.6.2.1) 2024-04-03 11:43:42 +01:00
Evgeny Poberezkin 2bd1a82b7d core: revert "deps: switch to base64 via simplexmq (#3957)" (#3985)
* Revert "deps: switch to base64 via simplexmq (#3957)"

This reverts commit d65137882b.

* update simplexmq
2024-04-03 10:47:38 +01:00
Evgeny Poberezkin 97a37634ef ios: 5.6.1 build 205 2024-04-03 01:47:01 +01:00
Stanislav Dmitrenko 28fbc1cd84 desktop: correct height of a window (#3982) 2024-04-02 20:05:14 +01:00
Stanislav Dmitrenko b8ee2af5b7 deskop: show window icon (#3983)
* deskop: show window icon

* size
2024-04-02 18:57:23 +01:00
Stanislav Dmitrenko c234809894 ios: improvement of chat item context menu (#3981)
* ios: improvement of chat item context menu

* rename

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-04-02 17:00:24 +01:00
Evgeny Poberezkin e1a997877a rfc: groups based on super-peers (WIP) (#3917) 2024-04-01 15:04:13 +01:00
Evgeny Poberezkin 69218952c3 core: 5.6.1.0 2024-04-01 14:36:45 +01:00
Evgeny Poberezkin dc2591b0bf ios: build settings (#3978) 2024-04-01 13:55:26 +01:00
Evgeny Poberezkin 2272b77b53 ios: refactor notifications (#3976)
* ios: refactor notifications

* refactor
2024-04-01 13:52:28 +01:00
Evgeny Poberezkin d90e2f4436 core: remove mtl typeclasses to reduce overhead (#3975)
* core: remove mtl typeclasses to reduce overhead

* strict data, optimization

* update simplexmq, clean up

* un-unlift attachRevHTTP2Client

* remote

---------

Co-authored-by: Alexander Bondarenko <486682+dpwiz@users.noreply.github.com>
2024-04-01 13:34:45 +01:00
Evgeny Poberezkin 9b6ca23dcb ios: fix UI freezes on start and when exiting background (#3972)
* ios: fix UI freezes on start and when exiting background

* remove unused code

* comments
2024-03-29 22:58:36 +00:00
Evgeny Poberezkin 1410b4bd85 ios: prevent call to apiContactInfo after the app is suspended 2024-03-29 19:43:16 +00:00
Evgeny Poberezkin 42a35e8c72 ios: prevent call to listUsers after the app is suspended and database is closed 2024-03-29 18:58:55 +00:00
Evgeny Poberezkin 86fe28f1ed core: chat hooks allowing to extend or customize chat core (#3953)
* core: chat hooks allowing to extend or customize chat core

* update

* json

* custom response

* user in db queries
2024-03-29 18:30:17 +00:00
Evgeny Poberezkin 735359c279 android: strings for permissions 2024-03-29 18:28:54 +00:00
Stanislav Dmitrenko 3d20465662 android: more user-friendly way of granting permissions in call (#3945)
* android: more user-friendly way of granting permissions in call

* changes

* ask permissions without click at first

* changes in logic and UI

* enhancements

* show alert only when non in PiP

* change

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-03-29 18:19:36 +00:00
Stanislav Dmitrenko b64ae90850 ios: NotificationService refactoring (#3961)
* ios: NotificationService refactoring

* refactor

* removed unused code

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-03-28 17:28:10 +00:00
spaced4ndy 366b58ead5 core: don't save async commands records for ack (#3904) 2024-03-28 19:52:06 +04:00
spaced4ndy 32bcaad126 ui: add missing error types (#3925) 2024-03-28 17:49:09 +04:00
Alexander Bondarenko d65137882b deps: switch to base64 via simplexmq (#3957)
* deps: switch to base64 via simplexmq

* update error text

* update nix

* set simplexmq to master

* update paths
2024-03-28 13:09:04 +00:00
spaced4ndy 095d613f01 website: translations (#3960)
* Translated using Weblate (Polish)

Currently translated at 100.0% (254 of 254 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (254 of 254 strings)

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

* Translated using Weblate (Hebrew)

Currently translated at 100.0% (254 of 254 strings)

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

* Translated using Weblate (Finnish)

Currently translated at 100.0% (254 of 254 strings)

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

* Translated using Weblate (Finnish)

Currently translated at 100.0% (254 of 254 strings)

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

---------

Co-authored-by: Jakub <fioletowy.temp@tutanota.com>
Co-authored-by: whoami11 <hvhdinik@gmail.com>
Co-authored-by: You and me <trash.93m78@slmail.me>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
2024-03-28 12:30:31 +00:00
spaced4ndy f22beefbd4 ui: translations (#3959)
* Translated using Weblate (German)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (French)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Italian)

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

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 98.3% (1659 of 1687 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 98.2% (1657 of 1687 strings)

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

* Translated using Weblate (Arabic)

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

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

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 0.3% (5 of 1478 strings)

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

* Translated using Weblate (Hebrew)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Hebrew)

Currently translated at 41.7% (617 of 1478 strings)

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

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 98.4% (1661 of 1687 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 45.2% (763 of 1687 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 3.7% (55 of 1478 strings)

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

* Translated using Weblate (Hebrew)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 99.4% (1678 of 1687 strings)

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

* Translated using Weblate (Portuguese)

Currently translated at 3.7% (56 of 1478 strings)

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

* Translated using Weblate (Dutch)

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

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

* Translated using Weblate (Portuguese)

Currently translated at 7.3% (109 of 1478 strings)

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

* Translated using Weblate (Bulgarian)

Currently translated at 96.7% (1430 of 1478 strings)

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

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 5.6% (96 of 1687 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (1688 of 1688 strings)

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

* Translated using Weblate (Dutch)

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

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

* Translated using Weblate (Bulgarian)

Currently translated at 99.4% (1470 of 1478 strings)

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

* Translated using Weblate (Bulgarian)

Currently translated at 99.9% (1687 of 1688 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1688 of 1688 strings)

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

* Translated using Weblate (Vietnamese)

Currently translated at 6.0% (102 of 1688 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% (1688 of 1688 strings)

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

* android

* ios import

* ios export

---------

Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: subjection yogirt <subjectiongithub@yogirt.com>
Co-authored-by: whoami11 <hvhdinik@gmail.com>
Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Miyu Sakatsuki <miyu-sakatsuki@outlook.jp>
Co-authored-by: zenobit <zen@osowoso.xyz>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: You and me <trash.93m78@slmail.me>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
Co-authored-by: Andre <andrefeliciano@duck.com>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: elgratea <weblate@fastmail.com>
Co-authored-by: tuananh-ng <158744840+tuananh-ng@users.noreply.github.com>
2024-03-28 12:27:58 +00:00
spaced4ndy c9bf36291b ios: fix default (#3958) 2024-03-27 09:59:15 +00:00
spaced4ndy 42ebe8bc60 core: batch broadcast send db operations (#3956)
* core: batch broadcast send db operations

* refactor

* Update src/Simplex/Chat.hs

Co-authored-by: Alexander Bondarenko <486682+dpwiz@users.noreply.github.com>

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Alexander Bondarenko <486682+dpwiz@users.noreply.github.com>
2024-03-27 11:49:14 +04:00
Stanislav Dmitrenko 96fb61ccfc desktop: show toast if failed to show notification (#3955)
* desktop: show toast if failed to show notification

* longer timeout

* returned old version of the lib
2024-03-26 12:43:45 +00:00
spaced4ndy 1d698c114f docs: communicate rejection rfc (#3946) 2024-03-26 11:29:28 +04:00
Stanislav Dmitrenko 154ce5843d android, desktop: update dependencies (#3954)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-03-25 15:59:00 +00:00
Evgeny Poberezkin a5817d9feb core: fix cabal paths (#3952)
* fixed install cabal file paths.

* updated package.yaml

* fix

---------

Co-authored-by: Andor Kesselman <andor@magic-pro-3.local>
2024-03-25 08:24:46 +00:00
Evgeny Poberezkin 72082af139 docs: update version 2024-03-23 19:20:37 +00:00
Evgeny Poberezkin eb36704f59 Merge branch 'stable' 2024-03-23 18:42:53 +00:00
Evgeny Poberezkin 84fbff6148 blog: v5.6 release, non-profit governance (#3951)
* blog: v5.6 release

* images, preview

* corrections

* update image

* update readme
2024-03-23 18:42:18 +00:00
Evgeny Poberezkin dd75d30c08 blog: update PQ encryption post (#3948)
* blog: update pq encryption post

* correction
2024-03-23 18:29:05 +00:00
spaced4ndy 52803ae976 core: add delays to some failing tests (#3947) 2024-03-22 22:01:11 +04:00
spaced4ndy ec73a31cb5 directory: fix double logic inversion on roles check, incorrect error message (#3944) 2024-03-22 15:07:01 +04:00
Evgeny Poberezkin 6ad5048b58 5.6: ios 204, android 191, desktop 35 2024-03-21 22:30:30 +00:00
Stanislav Dmitrenko ca0ce4dfdd ios: making chat state .active when starting chat, correctly handle hidden users when deleting the last profile (#3936)
* ios: making chat state .active when starting chat

* changes

* refactor

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-03-21 19:36:05 +00:00
spaced4ndy d27502ec47 ios: restore reveal/hide animation (#3933)
* ios: restore reveal/hide animation

* remove comment

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-03-21 19:12:47 +00:00
spaced4ndy 655ad4d813 ui: translations (#3940)
* Translated using Weblate (Dutch)

Currently translated at 96.6% (1622 of 1679 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 96.2% (1624 of 1687 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 97.0% (1638 of 1687 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% (1687 of 1687 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 96.9% (1433 of 1478 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 98.5% (1456 of 1478 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (1687 of 1687 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% (1478 of 1478 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 97.0% (1637 of 1687 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 96.6% (1631 of 1687 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 97.2% (1640 of 1687 strings)

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

* Translated using Weblate (Italian)

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

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

* Translated using Weblate (Czech)

Currently translated at 95.2% (1607 of 1687 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 97.0% (1637 of 1687 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% (1687 of 1687 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (French)

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

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Czech)

Currently translated at 98.2% (1657 of 1687 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (1686 of 1687 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 95.1% (1406 of 1478 strings)

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

* Translated using Weblate (Turkish)

Currently translated at 97.2% (1438 of 1478 strings)

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

* Translated using Weblate (Turkish)

Currently translated at 100.0% (1687 of 1687 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.6% (1681 of 1687 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 99.6% (1681 of 1687 strings)

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

* Translated using Weblate (Polish)

Currently translated at 99.9% (1686 of 1687 strings)

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

* Translated using Weblate (Polish)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 99.8% (1685 of 1687 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 99.8% (1476 of 1478 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 95.8% (1617 of 1687 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1687 of 1687 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (1478 of 1478 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (1687 of 1687 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% (1478 of 1478 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% (1687 of 1687 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 95.9% (1619 of 1687 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 95.8% (1417 of 1478 strings)

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

* Translated using Weblate (Russian)

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

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

* android

* import

* export

* ru corrections

* export/update ru

---------

Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: zenobit <zen@osowoso.xyz>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: B.O.S.S <BxOxSxS@protonmail.com>
Co-authored-by: cervezagua <cervezagua@pm.me>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-03-21 19:07:12 +00:00
Evgeny Poberezkin e0566599a4 core: 5.6.0.4 (#3939) 2024-03-21 19:00:19 +00:00
Evgeny Poberezkin 2546ad5351 Translated using Weblate (Czech) (#3941)
Currently translated at 99.2% (252 of 254 strings)

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

Co-authored-by: zenobit <zen@osowoso.xyz>
2024-03-21 17:37:56 +00:00
Stanislav Dmitrenko 0706e6e464 android: stopping chat after deleting the last user (#3937)
* android: stopping chat after deleting the last user

* fix for hidden users + onboarding
2024-03-21 14:02:38 +00:00
spaced4ndy c2adf40b5a ui: align finalize migration destructive/default button colors (#3938)
* ios: align finalize migration destructive/default button colors

* android
2024-03-21 14:00:27 +00:00
Stanislav Dmitrenko b220ea23e2 ios: stop chat after deleting the last profile (#3935) 2024-03-21 13:58:04 +00:00
spaced4ndy a16e3eebd1 ui: improve "allow PQ" button (#3932)
* ios: improve "allow PQ" button

* android
2024-03-21 09:13:18 +00:00
Stanislav Dmitrenko 6d54c21774 ios: chatitem height with menu workaround (#3930)
* ios: chatitem height with menu workaround

* turned on animation

* disabled animation in some places again
2024-03-20 17:49:53 +00:00
308 changed files with 16418 additions and 2690 deletions
+9 -3
View File
@@ -5,14 +5,20 @@ on:
pull_request_target:
types: [opened, closed, synchronize]
permissions:
actions: write
contents: write
pull-requests: write
statuses: write
jobs:
CLAssistant:
runs-on: ubuntu-latest
steps:
- name: "CLA Assistant"
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request'
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
# Beta Release
uses: cla-assistant/github-action@v2.1.3-beta
uses: cla-assistant/github-action@v2.3.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# the below token should have repo scope and must be manually added by you in the repository's secret
@@ -33,4 +39,4 @@ jobs:
#custom-pr-sign-comment: 'The signature to be committed in order to sign the CLA'
#custom-allsigned-prcomment: 'pull request comment when all contributors has signed, defaults to **CLA Assistant Lite bot** All Contributors have signed the CLA.'
#lock-pullrequest-aftermerge: false - if you don't want this bot to automatically lock the pull request after merging (default - true)
#use-dco-flag: true - If you are using DCO instead of CLA
#use-dco-flag: true - If you are using DCO instead of CLA
+5 -2
View File
@@ -4,7 +4,7 @@
[![Join on Reddit](https://img.shields.io/reddit/subreddit-subscribers/SimpleXChat?style=social)](https://www.reddit.com/r/SimpleXChat)
<a rel="me" href="https://mastodon.social/@simplex">![Follow on Mastodon](https://img.shields.io/mastodon/follow/108619463746856738?domain=https%3A%2F%2Fmastodon.social&style=social)</a>
| 30/03/2023 | EN, [FR](/docs/lang/fr/README.md), [CZ](/docs/lang/cs/README.md) |
| 30/03/2023 | EN, [FR](/docs/lang/fr/README.md), [CZ](/docs/lang/cs/README.md), [PL](/docs/lang/pl/README.md) |
<img src="images/simplex-chat-logo.svg" alt="SimpleX logo" width="100%">
@@ -234,6 +234,8 @@ You can use SimpleX with your own servers and still communicate with people usin
Recent and important updates:
[Mar 23, 2024. SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration.](./blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.md)
[Mar 14, 2024. SimpleX Chat v5.6 beta: adding quantum resistance to Signal double ratchet algorithm.](./blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md)
[Jan 24, 2024. SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect.](./blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.md)
@@ -377,8 +379,9 @@ Please also join [#simplex-devs](https://simplex.chat/contact#/?v=1-2&smp=smp%3A
- ✅ Using mobile profiles from the desktop app.
- ✅ Private notes.
- ✅ Improve sending videos (including encryption of locally stored videos).
- ✅ Post-quantum resistant key exchange in double ratchet protocol.
- 🏗 Improve stability and reduce battery usage.
- 🏗 Improve experience for the new users.
- 🏗 Post-quantum resistant key exchange in double ratchet protocol.
- 🏗 Large groups, communities and public channels.
- 🏗 Message delivery relay for senders (to conceal IP address from the recipients' servers and to reduce the traffic).
- Privacy & security slider - a simple way to set all settings at once.
+19
View File
@@ -103,6 +103,7 @@ final class ChatModel: ObservableObject {
// 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> = [:]
@@ -778,6 +779,24 @@ final class Chat: ObservableObject, Identifiable {
var viewId: String { get { "\(chatInfo.id) \(created.timeIntervalSince1970)" } }
func groupFeatureEnabled(_ feature: GroupFeature) -> Bool {
if case let .group(groupInfo) = self.chatInfo {
let p = groupInfo.fullGroupPreferences
return switch feature {
case .timedMessages: p.timedMessages.on
case .directMessages: p.directMessages.on(for: groupInfo.membership)
case .fullDelete: p.fullDelete.on
case .reactions: p.reactions.on
case .voice: p.voice.on(for: groupInfo.membership)
case .files: p.files.on(for: groupInfo.membership)
case .simplexLinks: p.simplexLinks.on(for: groupInfo.membership)
case .history: p.history.on
}
} else {
return true
}
}
public static var sampleData: Chat = Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])
}
@@ -0,0 +1,73 @@
//
// NetworkObserver.swift
// SimpleX (iOS)
//
// Created by Avently on 05.04.2024.
// Copyright © 2024 SimpleX Chat. All rights reserved.
//
import Foundation
import Network
import SimpleXChat
class NetworkObserver {
static let shared = NetworkObserver()
private let queue: DispatchQueue = DispatchQueue(label: "chat.simplex.app.NetworkObserver")
private var prevInfo: UserNetworkInfo? = nil
private var monitor: NWPathMonitor?
private let monitorLock: DispatchQueue = DispatchQueue(label: "chat.simplex.app.monitorLock")
func restartMonitor() {
monitorLock.sync {
monitor?.cancel()
let mon = NWPathMonitor()
mon.pathUpdateHandler = { [weak self] path in
self?.networkPathChanged(path: path)
}
mon.start(queue: queue)
monitor = mon
}
}
private func networkPathChanged(path: NWPath) {
let info = UserNetworkInfo(
networkType: networkTypeFromPath(path),
online: path.status == .satisfied
)
if (prevInfo != info) {
prevInfo = info
setNetworkInfo(info)
}
}
private func networkTypeFromPath(_ path: NWPath) -> UserNetworkType {
if path.usesInterfaceType(.wiredEthernet) {
.ethernet
} else if path.usesInterfaceType(.wifi) {
.wifi
} else if path.usesInterfaceType(.cellular) {
.cellular
} else if path.usesInterfaceType(.other) {
.other
} else {
.none
}
}
private static var networkObserver: NetworkObserver? = nil
private func setNetworkInfo(_ info: UserNetworkInfo) {
logger.debug("setNetworkInfo Network changed: \(String(describing: info))")
DispatchQueue.main.sync {
ChatModel.shared.networkInfo = info
}
if !hasChatCtrl() { return }
self.monitorLock.sync {
do {
try apiSetNetworkInfo(info)
} catch let err {
logger.error("setNetworkInfo error: \(responseError(err))")
}
}
}
}
+44 -46
View File
@@ -21,6 +21,8 @@ public let CURRENT_CHAT_VERSION: Int = 2
// version range that supports establishing direct connection with a group member (xGrpDirectInvVRange in core)
public let CREATE_MEMBER_CONTACT_VRANGE = VersionRange(minVersion: 2, maxVersion: CURRENT_CHAT_VERSION)
private let networkStatusesLock = DispatchQueue(label: "chat.simplex.app.network-statuses.lock")
enum TerminalItem: Identifiable {
case cmd(Date, ChatCommand)
case resp(Date, ChatResponse)
@@ -351,11 +353,20 @@ func apiGetChatItemInfo(type: ChatType, id: Int64, itemId: Int64) async throws -
throw r
}
func apiForwardChatItem(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemId: Int64) async -> ChatItem? {
let cmd: ChatCommand = .apiForwardChatItem(toChatType: toChatType, toChatId: toChatId, fromChatType: fromChatType, fromChatId: fromChatId, itemId: itemId)
return await processSendMessageCmd(toChatType: toChatType, cmd: cmd)
}
func apiSendMessage(type: ChatType, id: Int64, file: CryptoFile?, quotedItemId: Int64?, msg: MsgContent, live: Bool = false, ttl: Int? = nil) async -> ChatItem? {
let chatModel = ChatModel.shared
let cmd: ChatCommand = .apiSendMessage(type: type, id: id, file: file, quotedItemId: quotedItemId, msg: msg, live: live, ttl: ttl)
return await processSendMessageCmd(toChatType: type, cmd: cmd)
}
private func processSendMessageCmd(toChatType: ChatType, cmd: ChatCommand) async -> ChatItem? {
let chatModel = ChatModel.shared
let r: ChatResponse
if type == .direct {
if toChatType == .direct {
var cItem: ChatItem? = nil
let endTask = beginBGTask({
if let cItem = cItem {
@@ -395,7 +406,7 @@ func apiCreateChatItem(noteFolderId: Int64, file: CryptoFile?, msg: MsgContent)
}
private func sendMessageErrorAlert(_ r: ChatResponse) {
logger.error("apiSendMessage error: \(String(describing: r))")
logger.error("send message error: \(String(describing: r))")
AlertManager.shared.showAlertMsg(
title: "Error sending message",
message: "Error: \(String(describing: r))"
@@ -532,6 +543,12 @@ func setNetworkConfig(_ cfg: NetCfg, ctrl: chat_ctrl? = nil) throws {
throw r
}
func apiSetNetworkInfo(_ networkInfo: UserNetworkInfo) throws {
let r = chatSendCmdSync(.apiSetNetworkInfo(networkInfo: networkInfo))
if case .cmdOk = r { return }
throw r
}
func reconnectAllServers() async throws {
try await sendCommandOkResp(.reconnectAllServers)
}
@@ -1295,6 +1312,7 @@ func initializeChat(start: Bool, confirmStart: Bool = false, dbKey: String? = ni
defer { m.ctrlInitInProgress = false }
(m.chatDbEncrypted, m.chatDbStatus) = chatMigrateInit(dbKey, confirmMigrations: confirmMigrations)
if m.chatDbStatus != .ok { return }
NetworkObserver.shared.restartMonitor()
// If we migrated successfully means previous re-encryption process on database level finished successfully too
if encryptionStartedDefault.get() {
encryptionStartedDefault.set(false)
@@ -1460,6 +1478,8 @@ class ChatReceiver {
private var receiveMessages = true
private var _lastMsgTime = Date.now
var messagesChannel: ((ChatResponse) -> Void)? = nil
static let shared = ChatReceiver()
var lastMsgTime: Date { get { _lastMsgTime } }
@@ -1477,6 +1497,9 @@ class ChatReceiver {
if let msg = await chatRecvMsg() {
self._lastMsgTime = .now
await processReceivedMsg(msg)
if let messagesChannel {
messagesChannel(msg)
}
}
_ = try? await Task.sleep(nanoseconds: 7_500_000)
}
@@ -1566,34 +1589,30 @@ func processReceivedMsg(_ res: ChatResponse) async {
m.removeChat(mergedContact.id)
}
}
case let .contactsSubscribed(_, contactRefs):
await updateContactsStatus(contactRefs, status: .connected)
case let .contactsDisconnected(_, contactRefs):
await updateContactsStatus(contactRefs, status: .disconnected)
case let .contactSubSummary(_, contactSubscriptions):
await MainActor.run {
for sub in contactSubscriptions {
// no need to update contact here, and it is slow
// if active(user) {
// m.updateContact(sub.contact)
// }
if let err = sub.contactError {
processContactSubError(sub.contact, err)
} else {
m.setContactNetworkStatus(sub.contact, .connected)
}
}
}
case let .networkStatus(status, connections):
await MainActor.run {
// dispatch queue to synchronize access
networkStatusesLock.sync {
var ns = m.networkStatuses
// slow loop is on the background thread
for cId in connections {
m.networkStatuses[cId] = status
ns[cId] = status
}
// fast model update is on the main thread
DispatchQueue.main.sync {
m.networkStatuses = ns
}
}
case let .networkStatuses(_, statuses): ()
await MainActor.run {
// dispatch queue to synchronize access
networkStatusesLock.sync {
var ns = m.networkStatuses
// slow loop is on the background thread
for s in statuses {
m.networkStatuses[s.agentConnId] = s.networkStatus
ns[s.agentConnId] = s.networkStatus
}
// fast model update is on the main thread
DispatchQueue.main.sync {
m.networkStatuses = ns
}
}
case let .newChatItem(user, aChatItem):
@@ -1793,7 +1812,6 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
case let .sndFileCompleteXFTP(user, aChatItem, _):
await chatItemSimpleUpdate(user, aChatItem)
Task { cleanupFile(aChatItem) }
case let .sndFileError(user, aChatItem, _):
if let aChatItem = aChatItem {
await chatItemSimpleUpdate(user, aChatItem)
@@ -1944,26 +1962,6 @@ func chatItemSimpleUpdate(_ user: any UserLike, _ aChatItem: AChatItem) async {
}
}
func updateContactsStatus(_ contactRefs: [ContactRef], status: NetworkStatus) async {
let m = ChatModel.shared
await MainActor.run {
for c in contactRefs {
m.networkStatuses[c.agentConnId] = status
}
}
}
func processContactSubError(_ contact: Contact, _ chatError: ChatError) {
let m = ChatModel.shared
var err: String
switch chatError {
case .errorAgent(agentError: .BROKER(_, .NETWORK)): err = "network"
case .errorAgent(agentError: .SMP(smpErr: .AUTH)): err = "contact deleted"
default: err = String(describing: chatError)
}
m.setContactNetworkStatus(contact, .error(connectionError: err))
}
func refreshCallInvitations() throws {
let m = ChatModel.shared
let callInvitations = try justRefreshCallInvitations()
@@ -9,6 +9,7 @@
import SwiftUI
import WebKit
import SimpleXChat
import AVFoundation
struct ActiveCallView: View {
@EnvironmentObject var m: ChatModel
@@ -21,6 +22,7 @@ struct ActiveCallView: View {
@Binding var canConnectCall: Bool
@State var prevColorScheme: ColorScheme = .dark
@State var pipShown = false
@State var wasConnected = false
var body: some View {
ZStack(alignment: .topLeading) {
@@ -69,6 +71,11 @@ struct ActiveCallView: View {
Task { await m.callCommand.setClient(nil) }
AppDelegate.keepScreenOn(false)
client?.endCall()
CallSoundsPlayer.shared.stop()
try? AVAudioSession.sharedInstance().setCategory(.soloAmbient)
if (wasConnected) {
CallSoundsPlayer.shared.vibrate(long: true)
}
}
.background(m.activeCallViewIsCollapsed ? .clear : .black)
// Quite a big delay when opening/closing the view when a scheme changes (globally) this way. It's not needed when CallKit is used since status bar is green with white text on it
@@ -103,6 +110,11 @@ struct ActiveCallView: View {
call.callState = .invitationSent
call.localCapabilities = capabilities
}
if call.supportsVideo {
try? AVAudioSession.sharedInstance().setCategory(.playback, options: .defaultToSpeaker)
}
CallSoundsPlayer.shared.startConnectingCallSound()
activeCallWaitDeliveryReceipt()
}
case let .offer(offer, iceCandidates, capabilities):
Task {
@@ -126,6 +138,8 @@ struct ActiveCallView: View {
}
await MainActor.run {
call.callState = .negotiated
CallSoundsPlayer.shared.stop()
try? AVAudioSession.sharedInstance().setCategory(.soloAmbient)
}
}
case let .ice(iceCandidates):
@@ -144,6 +158,10 @@ struct ActiveCallView: View {
: CallController.shared.reportIncomingCall(call: call, connectedAt: nil)
call.callState = .connected
call.connectedAt = .now
if !wasConnected {
CallSoundsPlayer.shared.vibrate(long: false)
wasConnected = true
}
}
if state.connectionState == "closed" {
closeCallView(client)
@@ -161,6 +179,10 @@ struct ActiveCallView: View {
call.callState = .connected
call.connectionInfo = connectionInfo
call.connectedAt = .now
if !wasConnected {
CallSoundsPlayer.shared.vibrate(long: false)
wasConnected = true
}
case .ended:
closeCallView(client)
call.callState = .ended
@@ -187,6 +209,22 @@ struct ActiveCallView: View {
}
}
private func activeCallWaitDeliveryReceipt() {
ChatReceiver.shared.messagesChannel = { msg in
guard let call = ChatModel.shared.activeCall, call.callState == .invitationSent else {
ChatReceiver.shared.messagesChannel = nil
return
}
if case let .chatItemStatusUpdated(_, msg) = msg,
msg.chatInfo.id == call.contact.id,
case .sndCall = msg.chatItem.content,
case .sndRcvd = msg.chatItem.meta.itemStatus {
CallSoundsPlayer.shared.startInCallSound()
ChatReceiver.shared.messagesChannel = nil
}
}
}
private func closeCallView(_ client: WebRTCClient) {
if m.activeCall != nil {
m.showCallView = false
@@ -8,6 +8,7 @@
import Foundation
import AVFoundation
import UIKit
class SoundPlayer {
static let shared = SoundPlayer()
@@ -43,3 +44,63 @@ class SoundPlayer {
audioPlayer = nil
}
}
class CallSoundsPlayer {
static let shared = CallSoundsPlayer()
private var audioPlayer: AVAudioPlayer?
private var playerTask: Task = Task {}
private func start(_ soundName: String, delayMs: Double) {
audioPlayer?.stop()
playerTask.cancel()
logger.debug("start \(soundName)")
guard let path = Bundle.main.path(forResource: soundName, ofType: "mp3", inDirectory: "sounds") else {
logger.debug("start: file not found")
return
}
do {
let player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
if player.prepareToPlay() {
audioPlayer = player
}
} catch {
logger.debug("start: AVAudioPlayer error \(error.localizedDescription)")
}
playerTask = Task {
while let player = audioPlayer {
player.play()
do {
try await Task.sleep(nanoseconds: UInt64((player.duration * 1_000_000_000) + delayMs * 1_000_000))
} catch {
break
}
}
}
}
func startConnectingCallSound() {
start("connecting_call", delayMs: 0)
}
func startInCallSound() {
// Taken from https://github.com/TelegramOrg/Telegram-Android
// https://github.com/TelegramOrg/Telegram-Android/blob/master/LICENSE
start("in_call", delayMs: 1000)
}
func stop() {
playerTask.cancel()
audioPlayer?.stop()
audioPlayer = nil
}
func vibrate(long: Bool) {
// iOS just don't want to vibrate more than once after a short period of time, and all 'styles' feel the same
if long {
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
} else {
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
}
}
}
+4 -3
View File
@@ -431,17 +431,18 @@ struct RTCIceServer: Codable, Equatable {
}
// the servers are expected in this format:
// stun:stun.simplex.im:443?transport=tcp
// turn:private:yleob6AVkiNI87hpR94Z@turn.simplex.im:443?transport=tcp
// stuns:stun.simplex.im:443?transport=tcp
// turns:private2:Hxuq2QxUjnhj96Zq2r4HjqHRj@turn.simplex.im:443?transport=tcp
func parseRTCIceServer(_ str: String) -> RTCIceServer? {
var s = replaceScheme(str, "stun:")
s = replaceScheme(s, "stuns:")
s = replaceScheme(s, "turn:")
s = replaceScheme(s, "turns:")
if let u: URL = URL(string: s),
let scheme = u.scheme,
let host = u.host,
let port = u.port,
u.path == "" && (scheme == "stun" || scheme == "turn" || scheme == "turns") {
u.path == "" && (scheme == "stun" || scheme == "stuns" || scheme == "turn" || scheme == "turns") {
let query = u.query == nil || u.query == "" ? "" : "?" + (u.query ?? "")
return RTCIceServer(
urls: ["\(scheme):\(host):\(port)\(query)"],
@@ -49,7 +49,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
}
private let rtcAudioSession = RTCAudioSession.sharedInstance()
private let audioQueue = DispatchQueue(label: "audio")
private let audioQueue = DispatchQueue(label: "chat.simplex.app.audio")
private var sendCallResponse: (WVAPIMessage) async -> Void
var activeCall: Binding<Call?>
private var localRendererAspectRatio: Binding<CGFloat?>
@@ -65,14 +65,14 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
self.localRendererAspectRatio = localRendererAspectRatio
rtcAudioSession.useManualAudio = CallController.useCallKit()
rtcAudioSession.isAudioEnabled = !CallController.useCallKit()
logger.debug("WebRTCClient: rtcAudioSession has manual audio \(self.rtcAudioSession.useManualAudio) and audio enabled \(self.rtcAudioSession.isAudioEnabled)}")
logger.debug("WebRTCClient: rtcAudioSession has manual audio \(self.rtcAudioSession.useManualAudio) and audio enabled \(self.rtcAudioSession.isAudioEnabled)")
super.init()
}
let defaultIceServers: [WebRTC.RTCIceServer] = [
WebRTC.RTCIceServer(urlStrings: ["stun:stun.simplex.im:443"]),
WebRTC.RTCIceServer(urlStrings: ["turn:turn.simplex.im:443?transport=udp"], username: "private", credential: "yleob6AVkiNI87hpR94Z"),
WebRTC.RTCIceServer(urlStrings: ["turn:turn.simplex.im:443?transport=tcp"], username: "private", credential: "yleob6AVkiNI87hpR94Z"),
WebRTC.RTCIceServer(urlStrings: ["stuns:stun.simplex.im:443"]),
//WebRTC.RTCIceServer(urlStrings: ["turns:turn.simplex.im:443?transport=udp"], username: "private2", credential: "Hxuq2QxUjnhj96Zq2r4HjqHRj"),
WebRTC.RTCIceServer(urlStrings: ["turns:turn.simplex.im:443?transport=tcp"], username: "private2", credential: "Hxuq2QxUjnhj96Zq2r4HjqHRj"),
]
func initializeCall(_ iceServers: [WebRTC.RTCIceServer]?, _ mediaType: CallMediaType, _ aesKey: String?, _ relay: Bool?) -> Call {
@@ -579,7 +579,7 @@ struct ChatInfoView: View {
let ct = try await apiSetContactPQ(contact.apiId, true)
contact = ct
await MainActor.run {
chatModel.updateContact(contact)
chatModel.updateContact(ct)
dismiss()
}
} catch let error {
@@ -11,6 +11,7 @@ import SimpleXChat
struct CIChatFeatureView: View {
@EnvironmentObject var m: ChatModel
@ObservedObject var chat: Chat
var chatItem: ChatItem
@Binding var revealed: Bool
var feature: Feature
@@ -18,7 +19,7 @@ struct CIChatFeatureView: View {
var iconColor: Color
var body: some View {
if !revealed, let fs = mergedFeautures() {
if !revealed, let fs = mergedFeatures() {
HStack {
ForEach(fs, content: featureIconView)
}
@@ -47,7 +48,7 @@ struct CIChatFeatureView: View {
}
}
private func mergedFeautures() -> [FeatureInfo]? {
private func mergedFeatures() -> [FeatureInfo]? {
var fs: [FeatureInfo] = []
var icons: Set<String> = []
if var i = m.getChatItemIndex(chatItem) {
@@ -67,8 +68,8 @@ struct CIChatFeatureView: View {
switch ci.content {
case let .rcvChatFeature(feature, enabled, param): FeatureInfo(feature, enabled.iconColor, param)
case let .sndChatFeature(feature, enabled, param): FeatureInfo(feature, enabled.iconColor, param)
case let .rcvGroupFeature(feature, preference, param): FeatureInfo(feature, preference.enable.iconColor, param)
case let .sndGroupFeature(feature, preference, param): FeatureInfo(feature, preference.enable.iconColor, param)
case let .rcvGroupFeature(feature, preference, param, role): FeatureInfo(feature, preference.enabled(role, for: chat.chatInfo.groupInfo?.membership).iconColor, param)
case let .sndGroupFeature(feature, preference, param, role): FeatureInfo(feature, preference.enabled(role, for: chat.chatInfo.groupInfo?.membership).iconColor, param)
default: nil
}
}
@@ -103,6 +104,6 @@ struct CIChatFeatureView: View {
struct CIChatFeatureView_Previews: PreviewProvider {
static var previews: some View {
let enabled = FeatureEnabled(forUser: false, forContact: false)
CIChatFeatureView(chatItem: ChatItem.getChatFeatureSample(.fullDelete, enabled), revealed: Binding.constant(true), feature: ChatFeature.fullDelete, iconColor: enabled.iconColor)
CIChatFeatureView(chat: Chat.sampleData, chatItem: ChatItem.getChatFeatureSample(.fullDelete, enabled), revealed: Binding.constant(true), feature: ChatFeature.fullDelete, iconColor: enabled.iconColor)
}
}
@@ -17,6 +17,7 @@ struct CIEventView: View {
.padding(.horizontal, 6)
.padding(.vertical, 4)
.textSelection(.disabled)
.lineLimit(3)
}
}
@@ -69,19 +69,12 @@ struct CIFileView: View {
return false
}
private func fileSizeValid() -> Bool {
if let file = file {
return file.fileSize <= getMaxFileSize(file.fileProtocol)
}
return false
}
private func fileAction() {
logger.debug("CIFileView fileAction")
if let file = file {
switch (file.fileStatus) {
case .rcvInvitation:
if fileSizeValid() {
if fileSizeValid(file) {
Task {
logger.debug("CIFileView fileAction - in .rcvInvitation, in Task")
if let user = m.currentUser {
@@ -143,7 +136,7 @@ struct CIFileView: View {
case .sndCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .sndError: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .rcvInvitation:
if fileSizeValid() {
if fileSizeValid(file) {
fileIcon("arrow.down.doc.fill", color: .accentColor)
} else {
fileIcon("doc.fill", color: .orange, innerIcon: "exclamationmark", innerIconSize: 12)
@@ -201,6 +194,13 @@ struct CIFileView: View {
}
}
func fileSizeValid(_ file: CIFile?) -> Bool {
if let file = file {
return file.fileSize <= getMaxFileSize(file.fileProtocol)
}
return false
}
func saveCryptoFile(_ fileSource: CryptoFile) {
if let cfArgs = fileSource.cryptoArgs {
let url = getAppFilePath(fileSource.filePath)
@@ -70,14 +70,14 @@ struct CIImageView: View {
}
private func imageView(_ img: UIImage) -> some View {
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : img.imageData == nil ? .infinity : maxWidth
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth
DispatchQueue.main.async { imgWidth = w }
return ZStack(alignment: .topTrailing) {
if img.imageData == nil {
Image(uiImage: img)
.resizable()
.scaledToFit()
.frame(maxWidth: w)
.frame(width: w)
} else {
SwiftyGif(image: img)
.frame(width: w, height: w * img.size.height / img.size.width)
@@ -126,7 +126,7 @@ struct CIVideoView: View {
if !decryptionInProgress {
Button {
decrypt(file: file) {
if let decrypted = urlDecrypted {
if urlDecrypted != nil {
videoPlaying = true
player?.play()
}
@@ -243,13 +243,13 @@ struct CIVideoView: View {
}
private func imageView(_ img: UIImage) -> some View {
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : .infinity
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth
DispatchQueue.main.async { videoWidth = w }
return ZStack(alignment: .topTrailing) {
Image(uiImage: img)
.resizable()
.scaledToFit()
.frame(maxWidth: w)
.frame(width: w)
loadingIndicator()
}
}
@@ -65,6 +65,8 @@ struct FramedItemView: View {
}
}
}
} else if let itemForwarded = chatItem.meta.itemForwarded {
framedItemHeader(icon: "arrowshape.turn.up.forward", caption: Text(itemForwarded.text(chat.chatInfo.chatType)).italic(), pad: true)
}
ChatItemContentView(chat: chat, chatItem: chatItem, revealed: $revealed, msgContentView: framedMsgContentView)
@@ -163,7 +165,7 @@ struct FramedItemView: View {
)
}
@ViewBuilder func framedItemHeader(icon: String? = nil, caption: Text) -> some View {
@ViewBuilder func framedItemHeader(icon: String? = nil, caption: Text, pad: Bool = false) -> some View {
let v = HStack(spacing: 6) {
if let icon = icon {
Image(systemName: icon)
@@ -178,7 +180,7 @@ struct FramedItemView: View {
.foregroundColor(.secondary)
.padding(.horizontal, 12)
.padding(.top, 6)
.padding(.bottom, chatItem.quotedItem == nil ? 6 : 0) // TODO think how to regroup
.padding(.bottom, pad || (chatItem.quotedItem == nil && chatItem.meta.itemForwarded == nil) ? 6 : 0)
.overlay(DetermineWidth())
.frame(minWidth: msgWidth, alignment: .leading)
.background(chatItemFrameContextColor(chatItem, colorScheme))
@@ -353,9 +355,9 @@ private struct MetaColorPreferenceKey: PreferenceKey {
func onlyImageOrVideo(_ ci: ChatItem) -> Bool {
if case let .image(text, _) = ci.content.msgContent {
return ci.meta.itemDeleted == nil && !ci.meta.isLive && ci.quotedItem == nil && text == ""
return ci.meta.itemDeleted == nil && !ci.meta.isLive && ci.quotedItem == nil && ci.meta.itemForwarded == nil && text == ""
} else if case let .video(text, _, _) = ci.content.msgContent {
return ci.meta.itemDeleted == nil && !ci.meta.isLive && ci.quotedItem == nil && text == ""
return ci.meta.itemDeleted == nil && !ci.meta.isLive && ci.quotedItem == nil && ci.meta.itemForwarded == nil && text == ""
}
return false
}
@@ -0,0 +1,152 @@
//
// ChatItemForwardingView.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 12.04.2024.
// Copyright © 2024 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct ChatItemForwardingView: View {
@EnvironmentObject var chatModel: ChatModel
@Environment(\.dismiss) var dismiss
var ci: ChatItem
var fromChatInfo: ChatInfo
@Binding var composeState: ComposeState
@State private var searchText: String = ""
@FocusState private var searchFocused
var body: some View {
NavigationView {
forwardListView()
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("Cancel") {
dismiss()
}
}
ToolbarItem(placement: .principal) {
Text("Forward")
.bold()
}
}
}
}
@ViewBuilder private func forwardListView() -> some View {
VStack(alignment: .leading) {
let chatsToForwardTo = filterChatsToForwardTo()
if !chatsToForwardTo.isEmpty {
ScrollView {
LazyVStack(alignment: .leading, spacing: 8) {
searchFieldView(text: $searchText, focussed: $searchFocused)
.padding(.leading, 2)
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
let chats = s == "" ? chatsToForwardTo : chatsToForwardTo.filter { filterChatSearched($0, s) }
ForEach(chats) { chat in
Divider()
forwardListNavLinkView(chat)
.disabled(chatModel.deletedChats.contains(chat.chatInfo.id))
}
}
.padding(.horizontal)
.padding(.vertical, 8)
.background(Color(uiColor: .systemBackground))
.cornerRadius(12)
.padding(.horizontal)
}
.background(Color(.systemGroupedBackground))
} else {
emptyList()
}
}
}
private func filterChatsToForwardTo() -> [Chat] {
var filteredChats = chatModel.chats.filter({ canForwardToChat($0) })
if let index = filteredChats.firstIndex(where: { $0.chatInfo.chatType == .local }) {
let privateNotes = filteredChats.remove(at: index)
filteredChats.insert(privateNotes, at: 0)
}
return filteredChats
}
private func filterChatSearched(_ chat: Chat, _ searchStr: String) -> Bool {
let cInfo = chat.chatInfo
return switch cInfo {
case let .direct(contact):
viewNameContains(cInfo, searchStr) ||
contact.profile.displayName.localizedLowercase.contains(searchStr) ||
contact.fullName.localizedLowercase.contains(searchStr)
default:
viewNameContains(cInfo, searchStr)
}
func viewNameContains(_ cInfo: ChatInfo, _ s: String) -> Bool {
cInfo.chatViewName.localizedLowercase.contains(s)
}
}
private func canForwardToChat(_ chat: Chat) -> Bool {
switch chat.chatInfo {
case let .direct(contact): contact.sendMsgEnabled && !contact.nextSendGrpInv
case let .group(groupInfo): groupInfo.sendMsgEnabled
case let .local(noteFolder): noteFolder.sendMsgEnabled
case .contactRequest: false
case .contactConnection: false
case .invalidJSON: false
}
}
private func emptyList() -> some View {
Text("No filtered chats")
.foregroundColor(.secondary)
.frame(maxWidth: .infinity)
}
@ViewBuilder private func forwardListNavLinkView(_ chat: Chat) -> some View {
Button {
dismiss()
if chat.id == fromChatInfo.id {
composeState = ComposeState(
message: composeState.message,
preview: composeState.linkPreview != nil ? composeState.preview : .noPreview,
contextItem: .forwardingItem(chatItem: ci, fromChatInfo: fromChatInfo)
)
} else {
composeState = ComposeState.init(forwardingItem: ci, fromChatInfo: fromChatInfo)
chatModel.chatId = chat.id
}
} label: {
HStack {
ChatInfoImage(chat: chat)
.frame(width: 30, height: 30)
.padding(.trailing, 2)
Text(chat.chatInfo.chatViewName)
.foregroundColor(.primary)
.lineLimit(1)
if chat.chatInfo.incognito {
Spacer()
Image(systemName: "theatermasks")
.resizable()
.scaledToFit()
.frame(width: 22, height: 22)
.foregroundColor(.secondary)
}
}
.frame(maxWidth: .infinity, alignment: .leading)
}
}
}
#Preview {
ChatItemForwardingView(
ci: ChatItem.getSample(1, .directSnd, .now, "hello"),
fromChatInfo: .direct(contact: Contact.sampleData),
composeState: Binding.constant(ComposeState(message: "hello"))
)
}
@@ -11,6 +11,7 @@ import SimpleXChat
struct ChatItemInfoView: View {
@EnvironmentObject var chatModel: ChatModel
@Environment(\.dismiss) var dismiss
@Environment(\.colorScheme) var colorScheme
var ci: ChatItem
@Binding var chatItemInfo: ChatItemInfo?
@@ -21,6 +22,7 @@ struct ChatItemInfoView: View {
enum CIInfoTab {
case history
case quote
case forwarded
case delivery
}
@@ -68,9 +70,20 @@ struct ChatItemInfoView: View {
if ci.quotedItem != nil {
numTabs += 1
}
if chatItemInfo?.forwardedFromChatItem != nil {
numTabs += 1
}
return numTabs
}
private var local: Bool {
switch ci.chatDir {
case .localSnd: true
case .localRcv: true
default: false
}
}
@ViewBuilder private func itemInfoView() -> some View {
if numTabs > 1 {
TabView(selection: $selection) {
@@ -93,6 +106,13 @@ struct ChatItemInfoView: View {
}
.tag(CIInfoTab.quote)
}
if let forwardedFromItem = chatItemInfo?.forwardedFromChatItem {
forwardedFromTab(forwardedFromItem)
.tabItem {
Label(local ? "Saved" : "Forwarded", systemImage: "arrowshape.turn.up.forward")
}
.tag(CIInfoTab.forwarded)
}
}
.onAppear {
if chatItemInfo?.memberDeliveryStatuses != nil {
@@ -275,6 +295,75 @@ struct ChatItemInfoView: View {
: Color(uiColor: .tertiarySystemGroupedBackground)
}
@ViewBuilder private func forwardedFromTab(_ forwardedFromItem: AChatItem) -> some View {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
details()
Divider().padding(.vertical)
Text(local ? "Saved from" : "Forwarded from")
.font(.title2)
.padding(.bottom, 4)
forwardedFromView(forwardedFromItem)
}
.padding()
}
.frame(maxHeight: .infinity, alignment: .top)
}
private func forwardedFromView(_ forwardedFromItem: AChatItem) -> some View {
VStack(alignment: .leading, spacing: 8) {
Button {
Task {
await MainActor.run {
chatModel.chatId = forwardedFromItem.chatInfo.id
dismiss()
}
}
} label: {
forwardedFromSender(forwardedFromItem)
}
if !local {
Divider().padding(.top, 32)
Text("Recipient(s) can't see who this message is from.")
.font(.caption)
.foregroundColor(.secondary)
}
}
}
@ViewBuilder private func forwardedFromSender(_ forwardedFromItem: AChatItem) -> some View {
HStack {
ChatInfoImage(chat: Chat(chatInfo: forwardedFromItem.chatInfo))
.frame(width: 48, height: 48)
.padding(.trailing, 6)
if forwardedFromItem.chatItem.chatDir.sent {
VStack(alignment: .leading) {
Text("you")
.italic()
.foregroundColor(.primary)
Text(forwardedFromItem.chatInfo.chatViewName)
.foregroundColor(.secondary)
.lineLimit(1)
}
} else if case let .groupRcv(groupMember) = forwardedFromItem.chatItem.chatDir {
VStack(alignment: .leading) {
Text(groupMember.chatViewName)
.foregroundColor(.primary)
.lineLimit(1)
Text(forwardedFromItem.chatInfo.chatViewName)
.foregroundColor(.secondary)
.lineLimit(1)
}
} else {
Text(forwardedFromItem.chatInfo.chatViewName)
.foregroundColor(.primary)
.lineLimit(1)
}
}
}
@ViewBuilder private func deliveryTab(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> some View {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
@@ -46,7 +46,7 @@ struct ChatItemView: View {
let ci = chatItem
if chatItem.meta.itemDeleted != nil && (!revealed || chatItem.isDeletedContent) {
MarkedDeletedItemView(chat: chat, chatItem: chatItem, revealed: $revealed)
} else if ci.quotedItem == nil && ci.meta.itemDeleted == nil && !ci.meta.isLive {
} else if ci.quotedItem == nil && ci.meta.itemForwarded == nil && ci.meta.itemDeleted == nil && !ci.meta.isLive {
if let mc = ci.content.msgContent, mc.isText && isShortEmoji(ci.content.text) {
EmojiItemView(chat: chat, chatItem: ci)
} else if ci.content.text.isEmpty, case let .voice(_, duration) = ci.content.msgContent {
@@ -102,9 +102,9 @@ struct ChatItemContentView<Content: View>: View {
case let .rcvChatPreference(feature, allowed, param):
CIFeaturePreferenceView(chat: chat, chatItem: chatItem, feature: feature, allowed: allowed, param: param)
case let .sndChatPreference(feature, _, _):
CIChatFeatureView(chatItem: chatItem, revealed: $revealed, feature: feature, icon: feature.icon, iconColor: .secondary)
case let .rcvGroupFeature(feature, preference, _): chatFeatureView(feature, preference.enable.iconColor)
case let .sndGroupFeature(feature, preference, _): chatFeatureView(feature, preference.enable.iconColor)
CIChatFeatureView(chat: chat, chatItem: chatItem, revealed: $revealed, feature: feature, icon: feature.icon, iconColor: .secondary)
case let .rcvGroupFeature(feature, preference, _, role): chatFeatureView(feature, preference.enabled(role, for: chat.chatInfo.groupInfo?.membership).iconColor)
case let .sndGroupFeature(feature, preference, _, role): chatFeatureView(feature, preference.enabled(role, for: chat.chatInfo.groupInfo?.membership).iconColor)
case let .rcvChatFeatureRejected(feature): chatFeatureView(feature, .red)
case let .rcvGroupFeatureRejected(feature): chatFeatureView(feature, .red)
case .sndModerated: deletedItemView()
@@ -149,7 +149,7 @@ struct ChatItemContentView<Content: View>: View {
}
private func chatFeatureView(_ feature: Feature, _ iconColor: Color) -> some View {
CIChatFeatureView(chatItem: chatItem, revealed: $revealed, feature: feature, iconColor: iconColor)
CIChatFeatureView(chat: chat, chatItem: chatItem, revealed: $revealed, feature: feature, iconColor: iconColor)
}
private var mergedGroupEventText: Text? {
+78 -20
View File
@@ -17,6 +17,7 @@ struct ChatView: View {
@Environment(\.colorScheme) var colorScheme
@Environment(\.dismiss) var dismiss
@Environment(\.presentationMode) var presentationMode
@Environment(\.scenePhase) var scenePhase
@State @ObservedObject var chat: Chat
@State private var showChatInfoSheet: Bool = false
@State private var showAddMembersSheet: Bool = false
@@ -82,7 +83,11 @@ struct ChatView: View {
initChatView()
}
.onChange(of: chatModel.chatId) { cId in
if cId != nil {
showChatInfoSheet = false
if let cId {
if let c = chatModel.getChat(cId) {
chat = c
}
initChatView()
} else {
dismiss()
@@ -178,7 +183,7 @@ struct ChatView: View {
.disabled(!contact.ready || !contact.active)
}
searchButton()
toggleNtfsButton(chat)
ToggleNtfsButton(chat: chat)
.disabled(!contact.ready || !contact.active)
} label: {
Image(systemName: "ellipsis")
@@ -207,7 +212,7 @@ struct ChatView: View {
}
Menu {
searchButton()
toggleNtfsButton(chat)
ToggleNtfsButton(chat: chat)
} label: {
Image(systemName: "ellipsis")
}
@@ -234,7 +239,9 @@ struct ChatView: View {
private func initChatView() {
let cInfo = chat.chatInfo
if case let .direct(contact) = cInfo {
// This check prevents the call to apiContactInfo after the app is suspended, and the database is closed.
if case .active = scenePhase,
case let .direct(contact) = cInfo {
Task {
do {
let (stats, _) = try await apiContactInfo(chat.chatInfo.apiId)
@@ -248,7 +255,8 @@ struct ChatView: View {
}
}
}
if chatModel.draftChatId == cInfo.id, let draft = chatModel.draft {
if chatModel.draftChatId == cInfo.id && !composeState.forwarding,
let draft = chatModel.draft {
composeState = draft
}
if chat.chatStats.unreadChat {
@@ -293,7 +301,7 @@ struct ChatView: View {
}
private func voiceWithoutFrame(_ ci: ChatItem) -> Bool {
ci.content.msgContent?.isVoice == true && ci.content.text.count == 0 && ci.quotedItem == nil
ci.content.msgContent?.isVoice == true && ci.content.text.count == 0 && ci.quotedItem == nil && ci.meta.itemForwarded == nil
}
private func chatItemsList() -> some View {
@@ -339,8 +347,8 @@ struct ChatView: View {
.onChange(of: searchText) { _ in
loadChat(chat: chat, search: searchText)
}
.onChange(of: chatModel.chatId) { _ in
if let chatId = chatModel.chatId, let c = chatModel.getChat(chatId) {
.onChange(of: chatModel.chatId) { chatId in
if let chatId, let c = chatModel.getChat(chatId) {
chat = c
showChatInfoSheet = false
loadChat(chat: c)
@@ -511,6 +519,7 @@ struct ChatView: View {
chat: chat,
chatItem: ci,
maxWidth: maxWidth,
itemWidth: maxWidth,
composeState: $composeState,
selectedMember: $selectedMember,
chatView: self
@@ -523,6 +532,7 @@ struct ChatView: View {
@ObservedObject var chat: Chat
var chatItem: ChatItem
var maxWidth: CGFloat
@State var itemWidth: CGFloat
@Binding var composeState: ComposeState
@Binding var selectedMember: GMember?
var chatView: ChatView
@@ -534,6 +544,7 @@ struct ChatView: View {
@State private var revealed = false
@State private var showChatItemInfoSheet: Bool = false
@State private var chatItemInfo: ChatItemInfo?
@State private var showForwardingSheet: Bool = false
@State private var allowMenu: Bool = true
@@ -557,7 +568,12 @@ struct ChatView: View {
chatItemView(ci, nil, prev)
}
} else {
chatItemView(chatItem, range, prevItem)
// Switch branches just to work around context menu problem when 'revealed' changes but size of item isn't
if revealed {
chatItemView(chatItem, range, prevItem)
} else {
chatItemView(chatItem, range, prevItem)
}
}
}
}
@@ -646,7 +662,7 @@ struct ChatView: View {
playbackState: $playbackState,
playbackTime: $playbackTime
)
.uiKitContextMenu(maxWidth: maxWidth, menu: uiMenu, allowMenu: $allowMenu)
.uiKitContextMenu(hasImageOrVideo: ci.content.msgContent?.isImageOrVideo == true, maxWidth: maxWidth, itemWidth: $itemWidth, menu: uiMenu, allowMenu: $allowMenu)
.accessibilityLabel("")
if ci.content.msgContent != nil && (ci.meta.itemDeleted == nil || revealed) && ci.reactions.count > 0 {
chatItemReactions(ci)
@@ -657,7 +673,7 @@ struct ChatView: View {
Button("Delete for me", role: .destructive) {
deleteMessage(.cidmInternal)
}
if let di = deletingItem, di.meta.editable && !di.localNote {
if let di = deletingItem, di.meta.deletable && !di.localNote {
Button(broadcastDeleteButtonText, role: .destructive) {
deleteMessage(.cidmBroadcast)
}
@@ -683,6 +699,14 @@ struct ChatView: View {
}) {
ChatItemInfoView(ci: ci, chatItemInfo: $chatItemInfo)
}
.sheet(isPresented: $showForwardingSheet) {
if #available(iOS 16.0, *) {
ChatItemForwardingView(ci: ci, fromChatInfo: chat.chatInfo, composeState: $composeState)
.presentationDetents([.fraction(0.8)])
} else {
ChatItemForwardingView(ci: ci, fromChatInfo: chat.chatInfo, composeState: $composeState)
}
}
}
private func showMemberImage(_ member: GroupMember, _ prevItem: ChatItem?) -> Bool {
@@ -761,10 +785,17 @@ struct ChatView: View {
} else {
menu.append(saveFileAction(fileSource))
}
} else if let file = ci.file, case .rcvInvitation = file.fileStatus, fileSizeValid(file) {
menu.append(downloadFileAction(file))
}
if ci.meta.editable && !mc.isVoice && !live {
menu.append(editAction(ci))
}
if ci.meta.itemDeleted == nil
&& (ci.file == nil || (fileSource != nil && fileExists))
&& !ci.isLiveDummy && !live {
menu.append(forwardUIAction(ci))
}
if !ci.isLiveDummy {
menu.append(viewInfoUIAction(ci))
}
@@ -816,6 +847,15 @@ struct ChatView: View {
}
}
private func forwardUIAction(_ ci: ChatItem) -> UIAction {
UIAction(
title: NSLocalizedString("Forward", comment: "chat item action"),
image: UIImage(systemName: "arrowshape.turn.up.forward")
) { _ in
showForwardingSheet = true
}
}
private func reactionUIMenuPreiOS16(_ rs: [UIAction]) -> UIMenu {
UIMenu(
title: NSLocalizedString("React…", comment: "chat item menu"),
@@ -913,7 +953,21 @@ struct ChatView: View {
saveCryptoFile(fileSource)
}
}
private func downloadFileAction(_ file: CIFile) -> UIAction {
UIAction(
title: NSLocalizedString("Download", comment: "chat item action"),
image: UIImage(systemName: "arrow.down.doc")
) { _ in
Task {
logger.debug("ChatView downloadFileAction, in Task")
if let user = m.currentUser {
await receiveFile(user: user, fileId: file.fileId)
}
}
}
}
private func editAction(_ ci: ChatItem) -> UIAction {
UIAction(
title: NSLocalizedString("Edit", comment: "chat item action"),
@@ -1162,14 +1216,18 @@ struct ChatView: View {
}
}
@ViewBuilder func toggleNtfsButton(_ chat: Chat) -> some View {
Button {
toggleNotifications(chat, enableNtfs: !chat.chatInfo.ntfsEnabled)
} label: {
if chat.chatInfo.ntfsEnabled {
Label("Mute", systemImage: "speaker.slash")
} else {
Label("Unmute", systemImage: "speaker.wave.2")
struct ToggleNtfsButton: View {
@ObservedObject var chat: Chat
var body: some View {
Button {
toggleNotifications(chat, enableNtfs: !chat.chatInfo.ntfsEnabled)
} label: {
if chat.chatInfo.ntfsEnabled {
Label("Mute", systemImage: "speaker.slash")
} else {
Label("Unmute", systemImage: "speaker.wave.2")
}
}
}
}
@@ -23,6 +23,7 @@ enum ComposeContextItem {
case noContextItem
case quotedItem(chatItem: ChatItem)
case editingItem(chatItem: ChatItem)
case forwardingItem(chatItem: ChatItem, fromChatInfo: ChatInfo)
}
enum VoiceMessageRecordingState {
@@ -72,6 +73,13 @@ struct ComposeState {
}
}
init(forwardingItem: ChatItem, fromChatInfo: ChatInfo) {
self.message = ""
self.preview = .noPreview
self.contextItem = .forwardingItem(chatItem: forwardingItem, fromChatInfo: fromChatInfo)
self.voiceMessageRecordingState = .noRecording
}
func copy(
message: String? = nil,
liveMessage: LiveMessage? = nil,
@@ -102,12 +110,19 @@ struct ComposeState {
}
}
var forwarding: Bool {
switch contextItem {
case .forwardingItem: return true
default: return false
}
}
var sendEnabled: Bool {
switch preview {
case let .mediaPreviews(media): return !media.isEmpty
case .voicePreview: return voiceMessageRecordingState == .finished
case .filePreview: return true
default: return !message.isEmpty || liveMessage != nil
default: return !message.isEmpty || forwarding || liveMessage != nil
}
}
@@ -153,7 +168,7 @@ struct ComposeState {
}
var attachmentDisabled: Bool {
if editing || liveMessage != nil || inProgress { return true }
if editing || forwarding || liveMessage != nil || inProgress { return true }
switch preview {
case .noPreview: return false
case .linkPreview: return false
@@ -161,6 +176,16 @@ struct ComposeState {
}
}
var attachmentPreview: Bool {
switch preview {
case .noPreview: false
case .linkPreview: false
case let .mediaPreviews(mediaPreviews): !mediaPreviews.isEmpty
case .voicePreview: false
case .filePreview: true
}
}
var empty: Bool {
message == "" && noPreview
}
@@ -234,6 +259,7 @@ struct ComposeView: View {
@Binding var keyboardVisible: Bool
@State var linkUrl: URL? = nil
@State var hasSimplexLink: Bool = false
@State var prevLinkUrl: URL? = nil
@State var pendingLinkUrl: URL? = nil
@State var cancelledLinks: Set<String> = []
@@ -260,6 +286,16 @@ struct ComposeView: View {
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
ContextInvitingContactMemberView()
}
let simplexLinkProhibited = hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks)
let fileProhibited = composeState.attachmentPreview && !chat.groupFeatureEnabled(.files)
let voiceProhibited = composeState.voicePreview && !chat.chatInfo.featureEnabled(.voice)
if simplexLinkProhibited {
msgNotAllowedView("SimpleX links not allowed", icon: "link")
} else if fileProhibited {
msgNotAllowedView("Files and media not allowed", icon: "doc")
} else if voiceProhibited {
msgNotAllowedView("Voice messages not allowed", icon: "mic")
}
contextItemView()
switch (composeState.editing, composeState.preview) {
case (true, .filePreview): EmptyView()
@@ -278,7 +314,7 @@ struct ComposeView: View {
.padding(.bottom, 12)
.padding(.leading, 12)
if case let .group(g) = chat.chatInfo,
!g.fullGroupPreferences.files.on {
!g.fullGroupPreferences.files.on(for: g.membership) {
b.disabled(true).onTapGesture {
AlertManager.shared.showAlertMsg(
title: "Files and media prohibited!",
@@ -303,6 +339,7 @@ struct ComposeView: View {
},
nextSendGrpInv: chat.chatInfo.contact?.nextSendGrpInv ?? false,
voiceMessageAllowed: chat.chatInfo.featureEnabled(.voice),
disableSendButton: simplexLinkProhibited || fileProhibited || voiceProhibited,
showEnableVoiceMessagesAlert: chat.chatInfo.showEnableVoiceMessagesAlert,
startVoiceMessageRecording: {
Task {
@@ -337,13 +374,18 @@ struct ComposeView: View {
}
}
}
.onChange(of: composeState.message) { _ in
.onChange(of: composeState.message) { msg in
if composeState.linkPreviewAllowed {
if composeState.message.count > 0 {
showLinkPreview(composeState.message)
if msg.count > 0 {
showLinkPreview(msg)
} else {
resetLinkPreview()
hasSimplexLink = false
}
} else if msg.count > 0 && !chat.groupFeatureEnabled(.simplexLinks) {
(_, hasSimplexLink) = parseMessage(msg)
} else {
hasSimplexLink = false
}
}
.onChange(of: chat.userCanSend) { canSend in
@@ -610,6 +652,18 @@ struct ComposeView: View {
}
}
private func msgNotAllowedView(_ reason: LocalizedStringKey, icon: String) -> some View {
HStack {
Image(systemName: icon).foregroundColor(.secondary)
Text(reason).italic()
}
.padding(12)
.frame(minHeight: 50)
.frame(maxWidth: .infinity, alignment: .leading)
.background(Color(uiColor: .tertiarySystemGroupedBackground))
.padding(.top, 8)
}
@ViewBuilder private func contextItemView() -> some View {
switch composeState.contextItem {
case .noContextItem:
@@ -628,6 +682,14 @@ struct ComposeView: View {
contextIcon: "pencil",
cancelContextItem: { clearState() }
)
case let .forwardingItem(chatItem: forwardedItem, _):
ContextItemView(
chat: chat,
contextItem: forwardedItem,
contextIcon: "arrowshape.turn.up.forward",
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) },
showSender: false
)
}
}
@@ -649,6 +711,11 @@ struct ComposeView: View {
}
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
await sendMemberContactInvitation()
} else if case let .forwardingItem(ci, fromChatInfo) = composeState.contextItem {
sent = await forwardItem(ci, fromChatInfo)
if !composeState.message.isEmpty {
sent = await send(checkLinkPreview(), quoted: sent?.id, live: false, ttl: nil)
}
} else if case let .editingItem(ci) = composeState.contextItem {
sent = await updateMessage(ci, live: live)
} else if let liveMessage = liveMessage, liveMessage.sentMsg != nil {
@@ -694,7 +761,15 @@ struct ComposeView: View {
}
}
}
await MainActor.run { clearState(live: live) }
await MainActor.run {
let wasForwarding = composeState.forwarding
clearState(live: live)
if wasForwarding,
chatModel.draftChatId == chat.chatInfo.id,
let draft = chatModel.draft {
composeState = draft
}
}
return sent
func sending() async {
@@ -815,10 +890,26 @@ struct ComposeView: View {
return nil
}
func forwardItem(_ forwardedItem: ChatItem, _ fromChatInfo: ChatInfo) async -> ChatItem? {
if let chatItem = await apiForwardChatItem(
toChatType: chat.chatInfo.chatType,
toChatId: chat.chatInfo.apiId,
fromChatType: fromChatInfo.chatType,
fromChatId: fromChatInfo.apiId,
itemId: forwardedItem.id
) {
await MainActor.run {
chatModel.addChatItem(chat.chatInfo, chatItem)
}
return chatItem
}
return nil
}
func checkLinkPreview() -> MsgContent {
switch (composeState.preview) {
case let .linkPreview(linkPreview: linkPreview):
if let url = parseMessage(msgText),
if let url = parseMessage(msgText).url,
let linkPreview = linkPreview,
url == linkPreview.uri {
return .link(text: msgText, preview: linkPreview)
@@ -947,7 +1038,7 @@ struct ComposeView: View {
private func showLinkPreview(_ s: String) {
prevLinkUrl = linkUrl
linkUrl = parseMessage(s)
(linkUrl, hasSimplexLink) = parseMessage(s)
if let url = linkUrl {
if url != composeState.linkPreview?.uri && url != pendingLinkUrl {
pendingLinkUrl = url
@@ -964,13 +1055,17 @@ struct ComposeView: View {
}
}
private func parseMessage(_ msg: String) -> URL? {
let parsedMsg = parseSimpleXMarkdown(msg)
let uri = parsedMsg?.first(where: { ft in
private func parseMessage(_ msg: String) -> (url: URL?, hasSimplexLink: Bool) {
guard let parsedMsg = parseSimpleXMarkdown(msg) else { return (nil, false) }
let url: URL? = if let uri = parsedMsg.first(where: { ft in
ft.format == .uri && !cancelledLinks.contains(ft.text) && !isSimplexLink(ft.text)
})
if let uri = uri { return URL(string: uri.text) }
else { return nil }
}) {
URL(string: uri.text)
} else {
nil
}
let simplexLink = parsedMsg.contains(where: { ft in ft.format?.isSimplexLink ?? false })
return (url, simplexLink)
}
private func isSimplexLink(_ link: String) -> Bool {
@@ -15,6 +15,7 @@ struct ContextItemView: View {
let contextItem: ChatItem
let contextIcon: String
let cancelContextItem: () -> Void
var showSender: Bool = true
var body: some View {
HStack {
@@ -23,7 +24,7 @@ struct ContextItemView: View {
.aspectRatio(contentMode: .fit)
.frame(width: 16, height: 16)
.foregroundColor(.secondary)
if let sender = contextItem.memberDisplayName {
if showSender, let sender = contextItem.memberDisplayName {
VStack(alignment: .leading, spacing: 4) {
Text(sender).font(.caption).foregroundColor(.secondary)
msgContentView(lines: 2)
@@ -48,14 +49,26 @@ struct ContextItemView: View {
}
private func msgContentView(lines: Int) -> some View {
MsgContentView(
chat: chat,
text: contextItem.text,
formattedText: contextItem.formattedText,
showSecrets: false
)
.multilineTextAlignment(isRightToLeft(contextItem.text) ? .trailing : .leading)
.lineLimit(lines)
contextMsgPreview()
.multilineTextAlignment(isRightToLeft(contextItem.text) ? .trailing : .leading)
.lineLimit(lines)
}
private func contextMsgPreview() -> Text {
return attachment() + messageText(contextItem.text, contextItem.formattedText, nil, preview: true, showSecrets: false)
func attachment() -> Text {
switch contextItem.content.msgContent {
case .file: return image("doc.fill")
case .image: return image("photo")
case .voice: return image("play.fill")
default: return Text("")
}
}
func image(_ s: String) -> Text {
Text(Image(systemName: s)).foregroundColor(Color(uiColor: .tertiaryLabel)) + Text(" ")
}
}
}
@@ -16,7 +16,6 @@ struct NativeTextEditor: UIViewRepresentable {
@Binding var disableEditing: Bool
@Binding var height: CGFloat
@Binding var focused: Bool
let alignment: TextAlignment
let onImagesAdded: ([UploadContent]) -> Void
private let minHeight: CGFloat = 37
@@ -30,13 +29,16 @@ struct NativeTextEditor: UIViewRepresentable {
func makeUIView(context: Context) -> UITextView {
let field = CustomUITextField(height: _height)
field.text = text
field.textAlignment = alignment == .leading ? .left : .right
field.textAlignment = alignment(text)
field.autocapitalizationType = .sentences
field.setOnTextChangedListener { newText, images in
if !disableEditing {
// Speed up the process of updating layout, reduce jumping content on screen
if !isShortEmoji(newText) { updateHeight(field) }
text = newText
field.textAlignment = alignment(text)
updateFont(field)
// Speed up the process of updating layout, reduce jumping content on screen
updateHeight(field)
self.height = field.frame.size.height
} else {
field.text = text
}
@@ -53,10 +55,12 @@ struct NativeTextEditor: UIViewRepresentable {
}
func updateUIView(_ field: UITextView, context: Context) {
field.text = text
field.textAlignment = alignment == .leading ? .left : .right
updateFont(field)
updateHeight(field)
if field.markedTextRange == nil && field.text != text {
field.text = text
field.textAlignment = alignment(text)
updateFont(field)
updateHeight(field)
}
}
private func updateHeight(_ field: UITextView) {
@@ -73,12 +77,19 @@ struct NativeTextEditor: UIViewRepresentable {
}
private func updateFont(_ field: UITextView) {
field.font = isShortEmoji(field.text)
let newFont = isShortEmoji(field.text)
? (field.text.count < 4 ? largeEmojiUIFont : mediumEmojiUIFont)
: UIFont.preferredFont(forTextStyle: .body)
if field.font != newFont {
field.font = newFont
}
}
}
private func alignment(_ text: String) -> NSTextAlignment {
isRightToLeft(text) ? .right : .left
}
private class CustomUITextField: UITextView, UITextViewDelegate {
var height: Binding<CGFloat>
var newHeight: CGFloat = 0
@@ -205,7 +216,6 @@ struct NativeTextEditor_Previews: PreviewProvider{
disableEditing: Binding.constant(false),
height: Binding.constant(100),
focused: Binding.constant(false),
alignment: TextAlignment.leading,
onImagesAdded: { _ in }
)
.fixedSize(horizontal: false, vertical: true)
@@ -20,6 +20,7 @@ struct SendMessageView: View {
var nextSendGrpInv: Bool = false
var showVoiceMessageButton: Bool = true
var voiceMessageAllowed: Bool = true
var disableSendButton = false
var showEnableVoiceMessagesAlert: ChatInfo.ShowEnableVoiceMessagesAlert = .other
var startVoiceMessageRecording: (() -> Void)? = nil
var finishVoiceMessageRecording: (() -> Void)? = nil
@@ -53,13 +54,11 @@ struct SendMessageView: View {
.padding(.vertical, 8)
.frame(maxWidth: .infinity)
} else {
let alignment: TextAlignment = isRightToLeft(composeState.message) ? .trailing : .leading
NativeTextEditor(
text: $composeState.message,
disableEditing: $composeState.inProgress,
height: $teHeight,
focused: $keyboardVisible,
alignment: alignment,
onImagesAdded: onMediaAdded
)
.allowsTightening(false)
@@ -109,6 +108,7 @@ struct SendMessageView: View {
} else if showVoiceMessageButton
&& composeState.message.isEmpty
&& !composeState.editing
&& !composeState.forwarding
&& composeState.liveMessage == nil
&& ((composeState.noPreview && vmrs == .noRecording)
|| (vmrs == .recording && holdingVMR)) {
@@ -184,7 +184,8 @@ struct SendMessageView: View {
!composeState.sendEnabled ||
composeState.inProgress ||
(!voiceMessageAllowed && composeState.voicePreview) ||
composeState.endLiveDisabled
composeState.endLiveDisabled ||
disableSendButton
)
.frame(width: 29, height: 29)
.contextMenu{
@@ -223,7 +224,8 @@ struct SendMessageView: View {
@ViewBuilder private func sendButtonContextMenuItems() -> some View {
if composeState.liveMessage == nil,
!composeState.editing {
!composeState.editing,
!composeState.forwarding {
if case .noContextItem = composeState.contextItem,
!composeState.voicePreview,
let send = sendLiveMessage,
@@ -62,7 +62,7 @@ struct GroupChatInfoView: View {
NavigationView {
let members = chatModel.groupMembers
.filter { m in let status = m.wrapped.memberStatus; return status != .memLeft && status != .memRemoved }
.sorted { $0.displayName.lowercased() < $1.displayName.lowercased() }
.sorted { $0.wrapped.memberRole > $1.wrapped.memberRole }
List {
groupInfoHeader()
@@ -83,7 +83,7 @@ struct GroupMemberInfoView: View {
Section {
if let contactId = member.memberContactId, let chat = knownDirectChat(contactId) {
knownDirectChatButton(chat)
} else if groupInfo.fullGroupPreferences.directMessages.on {
} else if groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
if let contactId = member.memberContactId {
newDirectChatButton(contactId)
} else if member.activeConn?.peerChatVRange.isCompatibleRange(CREATE_MEMBER_CONTACT_VRANGE) ?? false {
@@ -110,7 +110,7 @@ struct GroupMemberInfoView: View {
Label("Share address", systemImage: "square.and.arrow.up")
}
if let contactId = member.memberContactId {
if knownDirectChat(contactId) == nil && !groupInfo.fullGroupPreferences.directMessages.on {
if knownDirectChat(contactId) == nil && !groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
connectViaAddressButton(contactLink)
}
} else {
@@ -9,6 +9,12 @@
import SwiftUI
import SimpleXChat
private let featureRoles: [(role: GroupMemberRole?, text: LocalizedStringKey)] = [
(nil, "all members"),
(.admin, "admins"),
(.owner, "owners")
]
struct GroupPreferencesView: View {
@Environment(\.dismiss) var dismiss: DismissAction
@EnvironmentObject var chatModel: ChatModel
@@ -24,10 +30,12 @@ struct GroupPreferencesView: View {
List {
featureSection(.timedMessages, $preferences.timedMessages.enable)
featureSection(.fullDelete, $preferences.fullDelete.enable)
featureSection(.directMessages, $preferences.directMessages.enable)
featureSection(.directMessages, $preferences.directMessages.enable, $preferences.directMessages.role)
featureSection(.reactions, $preferences.reactions.enable)
featureSection(.voice, $preferences.voice.enable)
featureSection(.files, $preferences.files.enable)
featureSection(.voice, $preferences.voice.enable, $preferences.voice.role)
featureSection(.files, $preferences.files.enable, $preferences.files.role)
// TODO enable simplexLinks preference in 5.8
// featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role)
featureSection(.history, $preferences.history.enable)
if groupInfo.canEdit {
@@ -64,7 +72,7 @@ struct GroupPreferencesView: View {
}
}
private func featureSection(_ feature: GroupFeature, _ enableFeature: Binding<GroupFeatureEnabled>) -> some View {
private func featureSection(_ feature: GroupFeature, _ enableFeature: Binding<GroupFeatureEnabled>, _ enableForRole: Binding<GroupMemberRole?>? = nil) -> some View {
Section {
let color: Color = enableFeature.wrappedValue == .on ? .green : .secondary
let icon = enableFeature.wrappedValue == .on ? feature.iconFilled : feature.icon
@@ -87,6 +95,16 @@ struct GroupPreferencesView: View {
)
.frame(height: 36)
}
if enableFeature.wrappedValue == .on, let enableForRole {
Picker("Enabled for", selection: enableForRole) {
ForEach(featureRoles, id: \.role) { fr in
Text(fr.text)
}
}
.frame(height: 36)
// remove in v5.8
.disabled(true)
}
} else {
settingsRow(icon, color: color) {
infoRow(Text(feature.text), enableFeature.wrappedValue.text)
@@ -94,10 +112,26 @@ struct GroupPreferencesView: View {
if timedOn {
infoRow("Delete after", timeText(preferences.timedMessages.ttl))
}
if enableFeature.wrappedValue == .on, let enableForRole {
HStack {
Text("Enabled for").foregroundColor(.secondary)
Spacer()
Text(
featureRoles.first(where: { fr in fr.role == enableForRole.wrappedValue })?.text
?? "all members"
)
.foregroundColor(.secondary)
}
}
}
} footer: {
Text(feature.enableDescription(enableFeature.wrappedValue, groupInfo.canEdit))
}
.onChange(of: enableFeature.wrappedValue) { enabled in
if case .off = enabled {
enableForRole?.wrappedValue = nil
}
}
}
private func savePreferences() {
@@ -92,7 +92,7 @@ struct ChatListNavLink: View {
.swipeActions(edge: .leading, allowsFullSwipe: true) {
markReadButton()
toggleFavoriteButton()
toggleNtfsButton(chat)
ToggleNtfsButton(chat: chat)
}
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
if !chat.chatItems.isEmpty {
@@ -181,7 +181,7 @@ struct ChatListNavLink: View {
.swipeActions(edge: .leading, allowsFullSwipe: true) {
markReadButton()
toggleFavoriteButton()
toggleNtfsButton(chat)
ToggleNtfsButton(chat: chat)
}
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
if !chat.chatItems.isEmpty {
@@ -12,6 +12,7 @@ private let fillColorLight = Color(uiColor: UIColor(red: 0.99, green: 0.99, blue
struct UserPicker: View {
@EnvironmentObject var m: ChatModel
@Environment(\.colorScheme) var colorScheme
@Environment(\.scenePhase) var scenePhase
@Binding var showSettings: Bool
@Binding var showConnectDesktop: Bool
@Binding var userPickerVisible: Bool
@@ -91,7 +92,10 @@ struct UserPicker: View {
.opacity(userPickerVisible ? 1.0 : 0.0)
.onAppear {
do {
m.users = try listUsers()
// 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))")
}
@@ -11,11 +11,20 @@ import UIKit
import SwiftUI
extension View {
func uiKitContextMenu(maxWidth: CGFloat, menu: Binding<UIMenu>, allowMenu: Binding<Bool>) -> some View {
func uiKitContextMenu(hasImageOrVideo: Bool, maxWidth: CGFloat, itemWidth: Binding<CGFloat>, menu: Binding<UIMenu>, allowMenu: Binding<Bool>) -> some View {
Group {
if allowMenu.wrappedValue {
InteractionView(content: self, maxWidth: maxWidth, menu: menu)
.fixedSize(horizontal: true, vertical: false)
if hasImageOrVideo {
InteractionView(content:
self.environmentObject(ChatModel.shared)
.overlay(DetermineWidthImageVideoItem())
.onPreferenceChange(DetermineWidthImageVideoItem.Key.self) { itemWidth.wrappedValue = $0 == 0 ? maxWidth : $0 }
, maxWidth: maxWidth, itemWidth: itemWidth, menu: menu)
.frame(maxWidth: itemWidth.wrappedValue)
} else {
InteractionView(content: self.environmentObject(ChatModel.shared), maxWidth: maxWidth, itemWidth: itemWidth, menu: menu)
.fixedSize(horizontal: true, vertical: false)
}
} else {
self
}
@@ -31,13 +40,14 @@ private class HostingViewHolder: UIView {
struct InteractionView<Content: View>: UIViewRepresentable {
let content: Content
var maxWidth: CGFloat
var itemWidth: Binding<CGFloat>
@Binding var menu: UIMenu
func makeUIView(context: Context) -> UIView {
let view = HostingViewHolder()
view.contentSize = CGSizeMake(maxWidth, .infinity)
view.backgroundColor = .clear
let hostView = UIHostingController(rootView: content)
view.contentSize = hostView.view.intrinsicContentSize
hostView.view.translatesAutoresizingMaskIntoConstraints = false
let constraints = [
hostView.view.topAnchor.constraint(equalTo: view.topAnchor),
@@ -57,7 +67,11 @@ struct InteractionView<Content: View>: UIViewRepresentable {
}
func updateUIView(_ uiView: UIView, context: Context) {
(uiView as! HostingViewHolder).contentSize = uiView.subviews[0].sizeThatFits(CGSizeMake(maxWidth, .infinity))
let was = (uiView as! HostingViewHolder).contentSize
(uiView as! HostingViewHolder).contentSize = uiView.subviews[0].sizeThatFits(CGSizeMake(itemWidth.wrappedValue, .infinity))
if was != (uiView as! HostingViewHolder).contentSize {
uiView.invalidateIntrinsicContentSize()
}
}
func makeCoordinator() -> Coordinator {
@@ -21,6 +21,19 @@ struct DetermineWidth: View {
}
}
struct DetermineWidthImageVideoItem: View {
typealias Key = MaximumWidthImageVideoPreferenceKey
var body: some View {
GeometryReader { proxy in
Color.clear
.preference(
key: MaximumWidthImageVideoPreferenceKey.self,
value: proxy.size.width
)
}
}
}
struct MaximumWidthPreferenceKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
@@ -28,6 +41,13 @@ struct MaximumWidthPreferenceKey: PreferenceKey {
}
}
struct MaximumWidthImageVideoPreferenceKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = max(value, nextValue())
}
}
struct DetermineWidth_Previews: PreviewProvider {
static var previews: some View {
DetermineWidth()
@@ -150,7 +150,7 @@ struct MigrateFromDevice: View {
return Alert(
title: Text(title),
message: Text(text),
primaryButton: .destructive(Text("Delete")) {
primaryButton: .default(Text("Delete")) {
deleteChatAndDismiss()
},
secondaryButton: .cancel()
@@ -448,6 +448,9 @@ struct MigrateToDevice: View {
case .rcvFileError:
alert = .error(title: "Download failed", error: "File was deleted or link is invalid")
migrationState = .downloadFailed(totalBytes: totalBytes, link: link, archivePath: archivePath)
case .chatError(_, .error(.noRcvFileUser)):
alert = .error(title: "Download failed", error: "File was deleted or link is invalid")
migrationState = .downloadFailed(totalBytes: totalBytes, link: link, archivePath: archivePath)
default:
logger.debug("unsupported event: \(msg.responseType)")
}
@@ -166,8 +166,10 @@ private func createProfile(_ displayName: String, showAlert: (UserProfileAlert)
)
let m = ChatModel.shared
do {
AppChatState.shared.set(.active)
m.currentUser = try apiCreateActiveUser(profile)
if m.users.isEmpty {
// .isEmpty check is redundant here, but it makes it clearer what is going on
if m.users.isEmpty || m.users.allSatisfy({ $0.user.hidden }) {
try startChat()
withAnimation {
onboardingStageDefault.set(.step3_CreateSimpleXAddress)
@@ -51,9 +51,10 @@ struct AdvancedNetworkSettings: View {
}
.disabled(currentNetCfg == NetCfg.proxyDefaults)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [7_500000, 10_000000, 15_000000, 20_000000, 30_000000, 45_000000], label: secondsLabel)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [5_000000, 7_500000, 10_000000, 15_000000, 20_000000, 30_000000, 40_000000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout", selection: $netCfg.tcpTimeout, values: [5_000000, 7_000000, 10_000000, 15_000000, 20_000000, 30_000000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout per KB", selection: $netCfg.tcpTimeoutPerKb, values: [15_000, 30_000, 45_000, 60_000, 90_000, 120_000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout per KB", selection: $netCfg.tcpTimeoutPerKb, values: [2_500, 5_000, 10_000, 15_000, 20_000, 30_000], label: secondsLabel)
intSettingPicker("Receiving concurrency", selection: $netCfg.rcvConcurrency, values: [1, 2, 4, 8, 12, 16, 24], label: "")
timeoutSettingPicker("PING interval", selection: $netCfg.smpPingInterval, values: [120_000000, 300_000000, 600_000000, 1200_000000, 2400_000000, 3600_000000], label: secondsLabel)
intSettingPicker("PING count", selection: $netCfg.smpPingCount, values: [1, 2, 3, 5, 8], label: "")
Toggle("Enable TCP keep-alive", isOn: $enableKeepAlive)
@@ -24,6 +24,7 @@ private enum NetworkAlert: Identifiable {
}
struct NetworkAndServers: View {
@EnvironmentObject var m: ChatModel
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@State private var cfgLoaded = false
@State private var currentNetCfg = NetCfg.defaults
@@ -82,6 +83,14 @@ struct NetworkAndServers: View {
Text("WebRTC ICE servers")
}
}
Section("Network connection") {
HStack {
Text(m.networkInfo.networkType.text)
Spacer()
Image(systemName: "circle.fill").foregroundColor(m.networkInfo.online ? .green : .red)
}
}
}
}
.onAppear {
@@ -276,6 +276,7 @@ struct UserProfilesView: View {
// Deleting the last visible user while having hidden one(s)
try await deleteUser()
try await changeActiveUserAsync_(nil, viewPwd: nil)
try? await stopChatAsync()
await MainActor.run {
onboardingStageDefault.set(.step1_SimpleXInfo)
m.onboardingStage = .step1_SimpleXInfo
@@ -631,6 +631,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Администраторите могат да блокират член за всички.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +691,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Всички ваши контакти, разговори и файлове ще бъдат сигурно криптирани и качени на парчета в конфигурираните XFTP релета.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +739,10 @@
<target>Позволи необратимо изтриване на изпратените съобщения. (24 часа)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Позволи изпращане на файлове и медия.</target>
@@ -819,6 +825,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Миграция на данните от приложението</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +865,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Приложи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Архивиране и качване</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Архивиране на база данни</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1070,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Отмени миграцията</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1083,10 @@
<target>Файлът не може да бъде получен</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Промени</target>
@@ -1165,6 +1180,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Чатът е мигриран!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1263,6 +1279,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Потвърди мрежовите настройки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1294,12 @@
</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>Потвърдете, че помните паролата на базата данни, преди да я мигрирате.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Потвърди качването</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1563,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Създаване на архивен линк</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1788,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Изтриване на базата данни от това устройство</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2081,13 @@ This cannot be undone!</source>
<target>Понижи версията и отвори чата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Неуспешно изтегляне</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2097,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Архива се изтегля</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Подробности за линка се изтеглят</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2162,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Активиране в личните чатове (БЕТА)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2195,10 @@ This cannot be undone!</source>
<target>Активирай kод за достъп за самоунищожение</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Криптирай</target>
@@ -2253,6 +2286,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Въведи парола</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2351,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Грешка при разрешаване на PQ криптиране за контакт</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2446,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Грешка при изтеглянето на архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2526,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Грешка при запазване на настройките</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2601,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Грешка при качването на архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Грешка при проверката на паролата:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2661,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Експортираният файл не съществува</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2724,10 @@ This cannot be undone!</source>
<target>Файловете и медията са забранени в тази група.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Файловете и медията са забранени!</target>
@@ -2696,10 +2740,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Завърши миграцията</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Завършете миграцията на другото устройство.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2793,18 @@ This cannot be undone!</source>
<target>За конзолата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Намерено настолно устройство</target>
@@ -2857,6 +2915,10 @@ This cannot be undone!</source>
<target>Членовете на групата могат необратимо да изтриват изпратените съобщения. (24 часа)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Членовете на групата могат да изпращат лични съобщения.</target>
@@ -2994,6 +3056,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Унгарски интерфейс</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3126,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Неуспешно импортиране</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Импортиране на архив</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3151,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="In order to continue, chat should be stopped." xml:space="preserve">
<source>In order to continue, chat should be stopped.</source>
<target>За да продължите, чатът трябва да бъде спрян.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3268,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Невалидно потвърждение за мигриране</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3641,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Съобщението е твърде голямо</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3601,26 +3669,32 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Мигрирай устройството</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Мигриране от друго устройство</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Мигрирай тук</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Миграция към друго устройство</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Мигрирайте към друго устройство чрез QR код.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Мигриране</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3704,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Миграцията е завършена</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3782,10 @@ This is your link for group %@!</source>
<target>Мрежа и сървъри</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Мрежови настройки</target>
@@ -3817,6 +3896,10 @@ This is your link for group %@!</source>
<target>Няма история</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Няма разрешение за запис на гласово съобщение</target>
@@ -3993,6 +4076,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Отвори миграцията към друго устройство</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4096,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>Или постави архивен линк</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4106,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Или сигурно споделете този линк към файла</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4114,10 @@ This is your link for group %@!</source>
<target>Или покажи този код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING бройка</target>
@@ -4110,6 +4200,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Обаждания "картина в картина"</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">
@@ -4134,6 +4225,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Моля, потвърдете, че мрежовите настройки са правилни за това устройство.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4287,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>Постквантово E2EE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4380,10 @@ Error: %@</source>
<target>Забрани реакциите на съобщенията.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Забрани изпращането на лични съобщения до членовете.</target>
@@ -4334,10 +4431,12 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Push сървър</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Квантово устойчиво криптиране</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4514,10 @@ Error: %@</source>
<target>Получаващият адрес ще бъде променен към друг сървър. Промяната на адреса ще завърши, след като подателят е онлайн.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Получаващият се файл ще бъде спрян.</target>
@@ -4430,6 +4533,10 @@ Error: %@</source>
<target>Скорошна история и подобрен [bot за директория за групи](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPd jdLW3%23%2F%3Fv%3D1-2% 26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Получателите виждат актуализации, докато ги въвеждате.</target>
@@ -4527,10 +4634,12 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Повтори изтеглянето</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Повтори импортирането</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4649,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Повтори качването</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4754,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>По-безопасни групи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4837,19 @@ Error: %@</source>
<target>Запази съобщението при посрещане?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Запазените WebRTC ICE сървъри ще бъдат премахнати</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Запазено съобщение</target>
@@ -5013,6 +5132,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Задаване на парола</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5192,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>Покажи QR код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5273,14 @@ Error: %@</source>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX линкове</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5345,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Спри чата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5390,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Спиране на чата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5642,12 @@ It can happen because of some bug or when the connection is compromised.</source
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Този чат е защитен чрез криптиране от край до край.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Този чат е защитен от квантово устойчиво криптиране от край до край.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5813,6 +5946,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Неуспешно качване</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5822,6 +5956,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Архивът се качва</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5876,6 +6011,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Използвайте приложението по време на разговора.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5915,10 +6051,12 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Проверете паролата на базата данни</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Провери паролата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5981,6 +6119,10 @@ To connect, please ask your contact to create another connection link and check
<target>Гласовите съобщения са забранени в тази група.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Гласовите съобщения са забранени!</target>
@@ -6013,6 +6155,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Внимание: стартирането на чата на множество устройства не се поддържа и ще доведе до неуспешно изпращане на съобщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6037,6 +6180,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Съобщението при посрещане е твърде дълго</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6059,6 +6203,14 @@ To connect, please ask your contact to create another connection link and check
<target>Когато споделяте инкогнито профил с някого, този профил ще се използва за групите, в които той ви кани.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>С криптирани файлове и медия.</target>
@@ -6187,6 +6339,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Можете да опитате още веднъж.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6540,6 +6693,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>админ</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>съгласуване на криптиране за %@…</target>
@@ -6550,6 +6707,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>съгласуване на криптиране…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>винаги</target>
@@ -6880,6 +7041,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>събитие се случи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>групата е изтрита</target>
@@ -7087,6 +7252,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>собственик</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>peer-to-peer</target>
@@ -7094,6 +7263,7 @@ SimpleX сървърите не могат да видят вашия профи
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>квантово устойчиво e2e криптиране</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7136,6 +7306,14 @@ SimpleX сървърите не могат да видят вашия профи
<target>ви острани</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>сек.</target>
@@ -7173,6 +7351,7 @@ SimpleX сървърите не могат да видят вашия профи
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>стандартно криптиране от край до край</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7275,6 +7454,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>да</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>вие сте поканени в групата</target>
@@ -720,6 +720,10 @@
<target>Povolit nevratné smazání odeslaných zpráv. (24 hodin)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Povolit odesílání souborů a médii.</target>
@@ -1043,6 +1047,10 @@
<target>Nelze přijmout soubor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Změnit</target>
@@ -1999,6 +2007,10 @@ This cannot be undone!</source>
<target>Snížit a otevřít chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<note>No comment provided by engineer.</note>
@@ -2104,6 +2116,10 @@ This cannot be undone!</source>
<target>Povolit sebedestrukční heslo</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Šifrovat</target>
@@ -2611,6 +2627,10 @@ This cannot be undone!</source>
<target>Soubory a média jsou zakázány v této skupině.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Soubory a média jsou zakázány!</target>
@@ -2674,6 +2694,18 @@ This cannot be undone!</source>
<target>Pro konzoli</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -2780,6 +2812,10 @@ This cannot be undone!</source>
<target>Členové skupiny mohou nevratně mazat odeslané zprávy. (24 hodin)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Členové skupiny mohou posílat přímé zprávy.</target>
@@ -3609,6 +3645,10 @@ This is your link for group %@!</source>
<target>Síť a servery</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Nastavení sítě</target>
@@ -3718,6 +3758,10 @@ This is your link for group %@!</source>
<target>Žádná historie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Nemáte oprávnění nahrávat hlasové zprávy</target>
@@ -3923,6 +3967,10 @@ This is your link for group %@!</source>
<source>Or show this code</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Počet PING</target>
@@ -4173,6 +4221,10 @@ Error: %@</source>
<target>Zakázat reakce na zprávy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Zakázat odesílání přímých zpráv členům.</target>
@@ -4300,6 +4352,10 @@ Error: %@</source>
<target>Přijímací adresa bude změněna na jiný server. Změna adresy bude dokončena po připojení odesílatele.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Příjem souboru bude zastaven.</target>
@@ -4314,6 +4370,10 @@ Error: %@</source>
<source>Recent history and improved [directory bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Příjemci uvidí aktualizace během jejich psaní.</target>
@@ -4607,11 +4667,19 @@ Error: %@</source>
<target>Uložit uvítací zprávu?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Uložené servery WebRTC ICE budou odstraněny</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<note>message info title</note>
@@ -5026,6 +5094,14 @@ Error: %@</source>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>Odkazy na SimpleX</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5828,6 +5904,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<target>Hlasové zprávy jsou v této skupině zakázány.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Hlasové zprávy jsou zakázány!</target>
@@ -5905,6 +5985,14 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<target>Pokud s někým sdílíte inkognito profil, bude tento profil použit pro skupiny, do kterých vás pozve.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<note>No comment provided by engineer.</note>
@@ -6368,6 +6456,10 @@ Servery SimpleX nevidí váš profil.</target>
<target>správce</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>povoluji šifrování pro %@…</target>
@@ -6378,6 +6470,10 @@ Servery SimpleX nevidí váš profil.</target>
<target>povoluji šifrování…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>vždy</target>
@@ -6700,6 +6796,10 @@ Servery SimpleX nevidí váš profil.</target>
<source>event happened</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>skupina smazána</target>
@@ -6906,6 +7006,10 @@ Servery SimpleX nevidí váš profil.</target>
<target>vlastník</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>peer-to-peer</target>
@@ -6953,6 +7057,14 @@ Servery SimpleX nevidí váš profil.</target>
<target>odstranil vás</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sek</target>
@@ -7086,6 +7198,10 @@ Servery SimpleX nevidí váš profil.</target>
<target>ano</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>jste pozváni do skupiny</target>
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ heruntergeladen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ hochgeladen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Bitte beachten Sie**: Aus Sicherheitsgründen wird die Nachrichtenentschlüsselung Ihrer Verbindungen abgebrochen, wenn Sie die gleiche Datenbank auf zwei Geräten nutzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Warnung**: Das Archiv wird gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Administratoren können ein Gruppenmitglied für Alle blockieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Server hochgeladen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Unwiederbringliches löschen von gesendeten Nachrichten erlauben. (24 Stunden)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Das Senden von Dateien und Medien erlauben.</target>
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>App-Daten-Migration</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Anwenden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archivieren und Hochladen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Datenbank wird archiviert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Migration abbrechen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>Datei kann nicht empfangen werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Ändern</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Chat wurde migriert!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Wählen Sie auf dem neuen Gerät _Von einem anderen Gerät migrieren_ und scannen Sie den QR-Code.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Bestätigen Sie die Netzwerkeinstellungen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</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>Bitte bestätigen Sie für die Migration, dass Sie sich an Ihr Datenbank-Passwort erinnern.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Hochladen bestätigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Archiv-Link erzeugen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Datenbank auf diesem Gerät löschen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Datenbank herabstufen und den Chat öffnen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Herunterladen fehlgeschlagen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Archiv wird heruntergeladen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Link-Details werden heruntergeladen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Kann in direkten Chats aktiviert werden (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Selbstzerstörungs-Zugangscode aktivieren</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Verschlüsseln</target>
@@ -2253,6 +2291,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Passwort eingeben</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Fehler beim Zulassen der Kontakt-PQ-Verschlüsselung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Fehler beim Herunterladen des Archivs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Fehler beim Abspeichern der Einstellungen</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Fehler beim Hochladen des Archivs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Fehler bei der Überprüfung des Passworts:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Die exportierte Datei ist nicht vorhanden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>In dieser Gruppe sind Dateien und Medien nicht erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Dateien und Medien sind nicht erlaubt!</target>
@@ -2696,10 +2745,12 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Die Migration wird abgeschlossen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Die Migration auf dem anderen Gerät wird abgeschlossen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Für Konsole</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Gefundener Desktop</target>
@@ -2857,6 +2920,10 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Gruppenmitglieder können gesendete Nachrichten unwiederbringlich löschen. (24 Stunden)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Gruppenmitglieder können Direktnachrichten versenden.</target>
@@ -2994,6 +3061,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Ungarische Bedienoberfläche</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Import ist fehlgeschlagen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Archiv wird importiert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ Das kann nicht rückgängig gemacht werden!</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>Um fortzufahren, sollte der Chat beendet werden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ Das kann nicht rückgängig gemacht werden!</target>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Migrations-Bestätigung ungültig</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Die Nachricht ist zu lang</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Nachrichten, Dateien und Anrufe sind durch **Ende-zu-Ende-Verschlüsselung** mit Perfect Forward Secrecy, Ablehnung und Einbruchs-Wiederherstellung geschützt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Nachrichten, Dateien und Anrufe sind durch **Quantum-resistente E2E-Verschlüsselung** mit Perfect Forward Secrecy, Ablehnung und Einbruchs-Wiederherstellung geschützt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Gerät migrieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Von einem anderen Gerät migrieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Hierher migrieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Auf ein anderes Gerät migrieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Daten können über einen QR-Code auf ein anderes Gerät migriert werden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Migrieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Migration abgeschlossen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Netzwerk &amp; Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Netzwerkeinstellungen</target>
@@ -3817,6 +3903,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Kein Nachrichtenverlauf</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Keine Berechtigung für das Aufnehmen von Sprachnachrichten</target>
@@ -3993,6 +4083,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Migration auf ein anderes Gerät öffnen</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>Oder fügen Sie den Archiv-Link ein</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Oder teilen Sie diesen Datei-Link sicher</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Oder diesen QR-Code anzeigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING-Zähler</target>
@@ -4110,6 +4207,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Bild-in-Bild-Anrufe</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">
@@ -4134,6 +4232,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Bitte bestätigen Sie, dass die Netzwerkeinstellungen auf diesem Gerät richtig sind.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>Post-Quantum E2E-Verschlüsselung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Fehler: %@</target>
<target>Reaktionen auf Nachrichten nicht erlauben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Das Senden von Direktnachrichten an Gruppenmitglieder nicht erlauben.</target>
@@ -4334,10 +4438,12 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Push-Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Quantum-resistente Verschlüsselung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Fehler: %@</target>
<target>Die Empfängeradresse wird auf einen anderen Server geändert. Der Adresswechsel wird abgeschlossen, wenn der Absender wieder online ist.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Der Empfang der Datei wird beendet.</target>
@@ -4430,6 +4540,10 @@ Fehler: %@</target>
<target>Aktueller Nachrichtenverlauf und verbesserter [Gruppenverzeichnis-Bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Die Empfänger sehen Nachrichtenaktualisierungen, während Sie sie eingeben.</target>
@@ -4527,10 +4641,12 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Herunterladen wiederholen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Import wiederholen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Hochladen wiederholen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Sicherere Gruppen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Fehler: %@</target>
<target>Begrüßungsmeldung speichern?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Gespeicherte WebRTC ICE-Server werden entfernt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Gespeicherte Nachricht</target>
@@ -5013,6 +5139,7 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Passwort festlegen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>QR-Code anzeigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Fehler: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX-Links</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Chat beenden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Fehler: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Chat wird beendet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5649,12 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Dieser Chat ist durch Ende-zu-Ende-Verschlüsselung geschützt.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Dieser Chat ist durch Quantum-resistente Ende-zu-Ende-Verschlüsselung geschützt.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5554,7 +5694,7 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
</trans-unit>
<trans-unit id="To ask any questions and to receive updates:" xml:space="preserve">
<source>To ask any questions and to receive updates:</source>
<target>Um Fragen zu stellen und Aktualisierungen zu erhalten:</target>
<target>Um Fragen zu stellen und aktuelle Informationen zu erhalten:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To connect, your contact can scan QR code or use the link in the app." xml:space="preserve">
@@ -5813,6 +5953,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Hochladen fehlgeschlagen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5822,6 +5963,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Archiv wird hochgeladen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5876,6 +6018,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Die App kann während eines Anrufs genutzt werden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5915,10 +6058,12 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Überprüfen Sie das Datenbank-Passwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Überprüfen Sie das Passwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5981,6 +6126,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>In dieser Gruppe sind Sprachnachrichten nicht erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Sprachnachrichten sind nicht erlaubt!</target>
@@ -6013,6 +6162,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Warnung: Das Starten des Chats auf mehreren Geräten wird nicht unterstützt und wird zu Fehlern bei der Nachrichtenübermittlung führen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6037,6 +6187,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Die Begrüßungsmeldung ist zu lang</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6059,6 +6210,14 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>Wenn Sie ein Inkognito-Profil mit Jemandem teilen, wird dieses Profil auch für die Gruppen verwendet, für die Sie von diesem Kontakt eingeladen werden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Mit verschlüsselten Dateien und Medien.</target>
@@ -6096,6 +6255,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>Sie dürfen die selbe Datenbank **nicht** auf zwei Geräten nutzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6187,6 +6347,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Sie können es nochmal probieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6435,7 +6596,7 @@ Sie können diese Verbindung abbrechen und den Kontakt entfernen (und es später
</trans-unit>
<trans-unit id="Your contacts will remain connected." xml:space="preserve">
<source>Your contacts will remain connected.</source>
<target>Ihre Kontakte bleiben verbunden.</target>
<target>Ihre Kontakte bleiben weiterhin verbunden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
@@ -6540,6 +6701,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Admin</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>Verschlüsselung von %@ zustimmen…</target>
@@ -6550,6 +6715,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Verschlüsselung zustimmen…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>Immer</target>
@@ -6880,6 +7049,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>event happened</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>Gruppe gelöscht</target>
@@ -7087,6 +7260,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Eigentümer</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>Peer-to-Peer</target>
@@ -7094,6 +7271,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>Quantum-resistente E2E-Verschlüsselung</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7136,6 +7314,14 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>hat Sie aus der Gruppe entfernt</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sek</target>
@@ -7173,6 +7359,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>Standard-Ende-zu-Ende-Verschlüsselung</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7275,6 +7462,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Ja</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>Sie sind zu der Gruppe eingeladen</target>
@@ -743,6 +743,11 @@
<target>Allow to irreversibly delete sent messages. (24 hours)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<target>Allow to send SimpleX links.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Allow to send files and media.</target>
@@ -1083,6 +1088,11 @@
<target>Cannot receive file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Cellular</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Change</target>
@@ -2078,6 +2088,11 @@ This cannot be undone!</target>
<target>Downgrade and open chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<target>Download</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Download failed</target>
@@ -2188,6 +2203,11 @@ This cannot be undone!</target>
<target>Enable self-destruct passcode</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<target>Enabled for</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Encrypt</target>
@@ -2713,6 +2733,11 @@ This cannot be undone!</target>
<target>Files and media are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<target>Files and media not allowed</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Files and media prohibited!</target>
@@ -2778,6 +2803,21 @@ This cannot be undone!</target>
<target>For console</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<target>Forward</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Forwarded</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<target>Forwarded from</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Found desktop</target>
@@ -2888,6 +2928,11 @@ This cannot be undone!</target>
<target>Group members can irreversibly delete sent messages. (24 hours)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<target>Group members can send SimpleX links.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Group members can send direct messages.</target>
@@ -3753,6 +3798,11 @@ This is your link for group %@!</target>
<target>Network &amp; servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<target>Network connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Network settings</target>
@@ -3863,6 +3913,11 @@ This is your link for group %@!</target>
<target>No history</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<target>No network connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>No permission to record voice message</target>
@@ -4077,6 +4132,11 @@ This is your link for group %@!</target>
<target>Or show this code</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<target>Other</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING count</target>
@@ -4339,6 +4399,11 @@ Error: %@</target>
<target>Prohibit messages reactions.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<target>Prohibit sending SimpleX links.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Prohibit sending direct messages to members.</target>
@@ -4469,6 +4534,11 @@ Error: %@</target>
<target>Receiving address will be changed to a different server. Address change will complete after sender comes online.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Receiving concurrency</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Receiving file will be stopped.</target>
@@ -4484,6 +4554,11 @@ Error: %@</target>
<target>Recent history and improved [directory bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<target>Recipient(s) can't see who this message is from.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Recipients see updates as you type them.</target>
@@ -4784,11 +4859,21 @@ Error: %@</target>
<target>Save welcome message?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Saved</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Saved WebRTC ICE servers will be removed</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<target>Saved from</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Saved message</target>
@@ -5212,6 +5297,16 @@ Error: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX links</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<target>SimpleX links are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<target>SimpleX links not allowed</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -6050,6 +6145,11 @@ To connect, please ask your contact to create another connection link and check
<target>Voice messages are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<target>Voice messages not allowed</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Voice messages prohibited!</target>
@@ -6130,6 +6230,16 @@ To connect, please ask your contact to create another connection link and check
<target>When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<target>WiFi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<target>Wired ethernet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>With encrypted files and media.</target>
@@ -6613,6 +6723,11 @@ SimpleX servers cannot see your profile.</target>
<target>admin</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<target>admins</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>agreeing encryption for %@…</target>
@@ -6623,6 +6738,11 @@ SimpleX servers cannot see your profile.</target>
<target>agreeing encryption…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>all members</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>always</target>
@@ -6953,6 +7073,11 @@ SimpleX servers cannot see your profile.</target>
<target>event happened</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<target>forwarded</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>group deleted</target>
@@ -7160,6 +7285,11 @@ SimpleX servers cannot see your profile.</target>
<target>owner</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<target>owners</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>peer-to-peer</target>
@@ -7210,6 +7340,16 @@ SimpleX servers cannot see your profile.</target>
<target>removed you</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>saved</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<target>saved from %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sec</target>
@@ -7350,6 +7490,11 @@ SimpleX servers cannot see your profile.</target>
<target>yes</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<target>you</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>you are invited to group</target>
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ downloaded</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ cargado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Tenga en cuenta**: usar la misma base de datos en dos dispositivos interrumpirá el descifrado de mensajes de sus conexiones, como protección de seguridad.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Atención**: el archivo será eliminado.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Los admins pueden bloquear un miembro por todos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Todos sus contactos, conversaciones y archivos se cifrarán de forma segura y se subirán en fragmentos hacia puntos XFTP configurados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Se permite la eliminación irreversible de mensajes. (24 horas)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Se permite enviar archivos y multimedia.</target>
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Migración de datos de la aplicación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Aplicar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archivar y transferir</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Archivando base de datos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Cancelar migración</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>No se puede recibir el archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Cambiar</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Chat transferido !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Elija _Migrar desde otro dispositivo_ en el nuevo dispositivo y escanee el código QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Confirmar los ajustes de red</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</trans-unit>
<trans-unit id="Confirm that you remember database passphrase to migrate it." xml:space="preserve">
<source>Confirm that you remember database passphrase to migrate it.</source>
<target>Confirme que recuerda la frase secreta de la base de datos para migrarla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Confirmar subida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Creando enlace de archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Eliminar base de datos de este dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ This cannot be undone!</source>
<target>Degradar y abrir Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Error en la descarga</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Descargando archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Descargando detalles del enlace</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Activar en chats directos (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ This cannot be undone!</source>
<target>Activar código de autodestrucción</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Cifrar</target>
@@ -2253,6 +2291,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Introducir frase de contraseña</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Error al permitir cifrado PQ al contacto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Error al descargar el archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Error al guardar ajustes</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Error al subir el archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Error al verificar la frase de contraseña:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>El archivo exportado no existe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ This cannot be undone!</source>
<target>No se permiten archivos y multimedia en este grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>¡Archivos y multimedia no permitidos!</target>
@@ -2696,10 +2745,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Finalizar la migración</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Finalizar la migración en otro dispositivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ This cannot be undone!</source>
<target>Para consola</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Ordenador encontrado</target>
@@ -2857,6 +2920,10 @@ This cannot be undone!</source>
<target>Los miembros del grupo pueden eliminar mensajes de forma irreversible. (24 horas)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Los miembros del grupo pueden enviar mensajes directos.</target>
@@ -2994,6 +3061,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Interfaz húngara</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Error de importación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Importando archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="In order to continue, chat should be stopped." xml:space="preserve">
<source>In order to continue, chat should be stopped.</source>
<target>Para continuar, el chat debe ser interrumpido.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Confirmación de migración inválida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Mensaje demasiado grande</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Migrar dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Migrar desde otro dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Migrar aquí</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Migrar hacia otro dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Migrar hacia otro dispositivo mediante código QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Migrando</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Migración completada</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ This is your link for group %@!</source>
<target>Servidores y Redes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Configuración de red</target>
@@ -3817,6 +3903,10 @@ This is your link for group %@!</source>
<target>Sin historial</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Sin permiso para grabar mensajes de voz</target>
@@ -3993,6 +4083,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Abrir la migración hacia otro dispositivo</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>O pegar enlace del archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>O comparta de forma segura el enlace de este archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ This is your link for group %@!</source>
<target>O mostrar este código</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Contador PING</target>
@@ -4110,6 +4207,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Llamadas picture-in-picture</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">
@@ -4134,6 +4232,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Por favor confirme que la configuración de red es correcta para este dispositivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>E2EE postcuántica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Error: %@</target>
<target>No se permiten reacciones a los mensajes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>No se permiten mensajes directos entre miembros.</target>
@@ -4334,10 +4438,12 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Servidor push</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Cifrado resistente a la tecnología cuántica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Error: %@</target>
<target>La dirección de recepción pasará a otro servidor. El cambio se completará cuando el remitente esté en línea.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Se detendrá la recepción del archivo.</target>
@@ -4430,6 +4540,10 @@ Error: %@</target>
<target>Historial reciente y [bot del directorio](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) mejorados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Los destinatarios ven actualizarse mientras escribes.</target>
@@ -4527,10 +4641,12 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Repetir descarga</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Repetir importación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Repetir la carga</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Grupos más seguros</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Error: %@</target>
<target>¿Guardar mensaje de bienvenida?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Los servidores WebRTC ICE guardados serán eliminados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Mensaje guardado</target>
@@ -5013,6 +5139,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Definir frase de contraseña</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>Mostrar código QR</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Error: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>Enlaces SimpleX</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Detener el chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Detención del chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5649,12 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Este chat está protegido por cifrado de extremo a extremo.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5814,6 +5954,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Error de carga</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5823,6 +5964,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Subiendo el archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5877,6 +6019,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Usar la app durante la llamada.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5916,10 +6059,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Verificar la contraseña de la base de datos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Verificar frase de contraseña</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5982,6 +6127,10 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<target>Los mensajes de voz no están permitidos en este grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>¡Mensajes de voz no permitidos!</target>
@@ -6014,6 +6163,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6038,6 +6188,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>El mensaje de bienvenida es demasiado largo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6060,6 +6211,14 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<target>Cuando compartes un perfil incógnito con alguien, este perfil también se usará para los grupos a los que te inviten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Con cifrado de archivos y multimedia.</target>
@@ -6097,6 +6256,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>**No debe** usar la misma base de datos en dos dispositivos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6188,6 +6348,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Puede intentarlo de nuevo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6541,6 +6702,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>administrador</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>acordando cifrado para %@…</target>
@@ -6551,6 +6716,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>acordando cifrado…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>siempre</target>
@@ -6881,6 +7050,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>evento ocurrido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>grupo eliminado</target>
@@ -7088,6 +7261,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>propietario</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>p2p</target>
@@ -7095,6 +7272,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>cifrado e2e resistente a la cuántica</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7137,6 +7315,14 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>te ha expulsado</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>seg</target>
@@ -7174,6 +7360,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>cifrado estándar de extremo a extremo</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7276,6 +7463,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>sí</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>has sido invitado a un grupo</target>
@@ -715,6 +715,10 @@
<target>Salli lähetettyjen viestien peruuttamaton poistaminen. (24 tuntia)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Salli tiedostojen ja median lähettäminen.</target>
@@ -1036,6 +1040,10 @@
<target>Tiedostoa ei voi vastaanottaa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Muuta</target>
@@ -1992,6 +2000,10 @@ This cannot be undone!</source>
<target>Alenna ja avaa keskustelu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<note>No comment provided by engineer.</note>
@@ -2097,6 +2109,10 @@ This cannot be undone!</source>
<target>Ota itsetuhoava pääsykoodi käyttöön</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Salaa</target>
@@ -2601,6 +2617,10 @@ This cannot be undone!</source>
<target>Tiedostot ja media ovat tässä ryhmässä kiellettyjä.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Tiedostot ja media kielletty!</target>
@@ -2664,6 +2684,18 @@ This cannot be undone!</source>
<target>Konsoliin</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -2770,6 +2802,10 @@ This cannot be undone!</source>
<target>Ryhmän jäsenet voivat poistaa lähetetyt viestit peruuttamattomasti. (24 tuntia)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Ryhmän jäsenet voivat lähettää suoraviestejä.</target>
@@ -3599,6 +3635,10 @@ This is your link for group %@!</source>
<target>Verkko ja palvelimet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Verkkoasetukset</target>
@@ -3707,6 +3747,10 @@ This is your link for group %@!</source>
<target>Ei historiaa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Ei lupaa ääniviestin tallentamiseen</target>
@@ -3911,6 +3955,10 @@ This is your link for group %@!</source>
<source>Or show this code</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING-määrä</target>
@@ -4161,6 +4209,10 @@ Error: %@</source>
<target>Estä viestireaktiot.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Estä suorien viestien lähettäminen jäsenille.</target>
@@ -4288,6 +4340,10 @@ Error: %@</source>
<target>Vastaanotto-osoite vaihdetaan toiseen palvelimeen. Osoitteenmuutos tehdään sen jälkeen, kun lähettäjä tulee verkkoon.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Tiedoston vastaanotto pysäytetään.</target>
@@ -4302,6 +4358,10 @@ Error: %@</source>
<source>Recent history and improved [directory bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Vastaanottajat näkevät päivitykset, kun kirjoitat niitä.</target>
@@ -4595,11 +4655,19 @@ Error: %@</source>
<target>Tallenna tervetuloviesti?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Tallennetut WebRTC ICE -palvelimet poistetaan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<note>message info title</note>
@@ -5013,6 +5081,14 @@ Error: %@</source>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX-linkit</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5813,6 +5889,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<target>Ääniviestit ovat kiellettyjä tässä ryhmässä.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Ääniviestit kielletty!</target>
@@ -5890,6 +5970,14 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<target>Kun jaat inkognitoprofiilin jonkun kanssa, tätä profiilia käytetään ryhmissä, joihin tämä sinut kutsuu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<note>No comment provided by engineer.</note>
@@ -6353,6 +6441,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>ylläpitäjä</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>salauksesta sovitaan %@:lle…</target>
@@ -6363,6 +6455,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>hyväksyy salausta…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>aina</target>
@@ -6685,6 +6781,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>tapahtuma tapahtui</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>ryhmä poistettu</target>
@@ -6891,6 +6991,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>omistaja</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>vertais</target>
@@ -6938,6 +7042,14 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>poisti sinut</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sek</target>
@@ -7070,6 +7182,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>kyllä</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>sinut on kutsuttu ryhmään</target>
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ téléchargé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ envoyé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Remarque**: l'utilisation de la même base de données sur deux appareils interrompt le déchiffrement des messages provenant de vos connexions, par mesure de sécurité.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Avertissement**: l'archive sera supprimée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Les admins peuvent bloquer un membre pour tous.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Tous vos contacts, conversations et fichiers seront chiffrés en toute sécurité et transférés par morceaux vers les relais XFTP configurés.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Autoriser la suppression irréversible de messages envoyés. (24 heures)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Permet l'envoi de fichiers et de médias.</target>
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Transfert des données de l'application</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Appliquer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archiver et transférer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Archivage de la base de données</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Annuler le transfert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>Impossible de recevoir le fichier</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Changer</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Messagerie transférée!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Choisissez _Transferer depuis un autre appareil_ sur le nouvel appareil et scannez le code QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Confirmer les paramètres réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</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>Confirmer que vous vous souvenez de la phrase secrète de la base de données pour la transférer.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Confirmer la transmission</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Création d'un lien d'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Supprimer la base de données de cet appareil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ Cette opération ne peut être annulée !</target>
<target>Rétrograder et ouvrir le chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Échec du téléchargement</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Téléchargement de l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Téléchargement des détails du lien</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Activer dans les conversations directes (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ Cette opération ne peut être annulée !</target>
<target>Activer le code d'autodestruction</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Chiffrer</target>
@@ -2253,6 +2291,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Entrer la phrase secrète</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Erreur lors de la négociation du chiffrement PQ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Erreur lors du téléchargement de l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Erreur lors de l'enregistrement des paramètres</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Erreur lors de l'envoi de l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Erreur lors de la vérification de la phrase secrète:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Le fichier exporté n'existe pas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ Cette opération ne peut être annulée !</target>
<target>Les fichiers et les médias sont interdits dans ce groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Fichiers et médias interdits !</target>
@@ -2696,10 +2745,12 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Finaliser le transfert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Finalisez le transfert sur l'autre appareil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ Cette opération ne peut être annulée !</target>
<target>Pour la console</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Bureau trouvé</target>
@@ -2857,6 +2920,10 @@ Cette opération ne peut être annulée !</target>
<target>Les membres du groupe peuvent supprimer de manière irréversible les messages envoyés. (24 heures)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Les membres du groupe peuvent envoyer des messages directs.</target>
@@ -2994,6 +3061,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Interface en hongrois</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Échec de l'importation</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Importation de l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ Cette opération ne peut être annulée !</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>Pour continuer, le chat doit être interrompu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Confirmation de migration invalide</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Message trop volumineux</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Les messages, fichiers et appels sont protégés par un chiffrement **de bout en bout** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Les messages, fichiers et appels sont protégés par un chiffrement **e2e résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Transférer l'appareil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Transférer depuis un autre appareil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Transférer ici</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Transférer vers un autre appareil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Transférer vers un autre appareil via un code QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Transfert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Transfert terminé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Réseau et serveurs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Paramètres réseau</target>
@@ -3817,6 +3903,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Aucun historique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Pas l'autorisation d'enregistrer un message vocal</target>
@@ -3993,6 +4083,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Ouvrir le transfert vers un autre appareil</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>Ou coller le lien de l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Ou partagez en toute sécurité le lien de ce fichier</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Ou présenter ce code</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Nombre de PING</target>
@@ -4110,6 +4207,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Appels picture-in-picture</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">
@@ -4134,6 +4232,7 @@ Voici votre lien pour le groupe %@ !</target>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Veuillez confirmer que les paramètres réseau de cet appareil sont corrects.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>E2EE post-quantique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Erreur: %@</target>
<target>Interdire les réactions aux messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Interdire l'envoi de messages directs aux membres.</target>
@@ -4334,10 +4438,12 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Serveur Push</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Chiffrement résistant post-quantique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Erreur: %@</target>
<target>L'adresse de réception sera changée pour un autre serveur. Le changement d'adresse sera terminé lorsque l'expéditeur sera en ligne.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La réception du fichier sera interrompue.</target>
@@ -4430,6 +4540,10 @@ Erreur: %@</target>
<target>Historique récent et amélioration du [bot annuaire](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Les destinataires voient les mises à jour au fur et à mesure que vous leur écrivez.</target>
@@ -4527,10 +4641,12 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Répéter le téléchargement</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Répéter l'importation</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Répéter l'envoi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Groupes plus sûrs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Erreur: %@</target>
<target>Enregistrer le message d'accueil?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Les serveurs WebRTC ICE sauvegardés seront supprimés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Message enregistré</target>
@@ -5013,6 +5139,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Définir une phrase secrète</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>Afficher le code QR</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Erreur: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>Liens SimpleX</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Arrêter le chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Arrêt du chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5649,12 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Cette discussion est protégée par un chiffrement de bout en bout.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Cette discussion est protégée par un chiffrement de bout en bout résistant aux technologies quantiques.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5813,6 +5953,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Échec de l'envoi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5822,6 +5963,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Envoi de l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5876,6 +6018,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Utiliser l'application pendant l'appel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5915,10 +6058,12 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Vérifier la phrase secrète de la base de données</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Vérifier la phrase secrète</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5981,6 +6126,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Les messages vocaux sont interdits dans ce groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Messages vocaux interdits !</target>
@@ -6013,6 +6162,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6037,6 +6187,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Le message de bienvenue est trop long</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6059,6 +6210,14 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Lorsque vous partagez un profil incognito avec quelqu'un, ce profil sera utilisé pour les groupes auxquels il vous invite.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Avec les fichiers et les médias chiffrés.</target>
@@ -6096,6 +6255,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>Vous **ne devez pas** utiliser la même base de données sur deux appareils.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6187,6 +6347,7 @@ Répéter la demande d'adhésion ?</target>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Vous pouvez faire un nouvel essai.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6540,6 +6701,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>admin</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>négociation du chiffrement avec %@…</target>
@@ -6550,6 +6715,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>négociation du chiffrement…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>toujours</target>
@@ -6880,6 +7049,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>event happened</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>groupe supprimé</target>
@@ -7087,6 +7260,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>propriétaire</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>pair-à-pair</target>
@@ -7094,6 +7271,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>chiffrement e2e résistant post-quantique</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7136,6 +7314,14 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>vous a retiré</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sec</target>
@@ -7173,6 +7359,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>chiffrement de bout en bout standard</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7275,6 +7462,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>oui</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>vous êtes invité·e au groupe</target>
@@ -5311,6 +5311,11 @@ SimpleX servers cannot see your profile.</source>
<target state="translated">ללא היסטוריה</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ and %@" xml:space="preserve" approved="no">
<source>%@ and %@</source>
<target state="translated">%@ ו-%@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="he" datatype="plaintext">
@@ -737,6 +737,10 @@
<target>Elküldött üzenetek visszafordíthatatlan törlésének engedélyezése. (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Fájlok és médiatartalom küldésének engedélyezése.</target>
@@ -1072,6 +1076,10 @@
<target>Nem lehet fogadni a fájlt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Változtatás</target>
@@ -2060,6 +2068,10 @@ Ezt nem vonható vissza!</target>
<target>Visszatérés a korábbi verzióra és a csevegés megnyitása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<note>No comment provided by engineer.</note>
@@ -2166,6 +2178,10 @@ Ezt nem vonható vissza!</target>
<target>Önmegsemmisítő jelkód engedélyezése</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Titkosít</target>
@@ -2684,6 +2700,10 @@ Ezt nem vonható vissza!</target>
<target>A fájlok- és a médiatartalom küldése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>A fájlok- és a médiatartalom küldése le van tiltva!</target>
@@ -2747,6 +2767,18 @@ Ezt nem vonható vissza!</target>
<target>Konzolhoz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Megtalált számítógép</target>
@@ -2857,6 +2889,10 @@ Ezt nem vonható vissza!</target>
<target>Csoporttagok visszafordíthatatlanul törölhetik az elküldött üzeneteket. (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Csoporttagok küldhetnek közvetlen üzeneteket.</target>
@@ -3707,6 +3743,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Hálózat és kiszolgálók</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Hálózati beállítások</target>
@@ -3817,6 +3857,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Nincsenek előzmények</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Nincs engedély a hangüzenet rögzítésére</target>
@@ -4028,6 +4072,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Vagy mutassa meg ezt a kódot</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING számláló</target>
@@ -4287,6 +4335,10 @@ Hiba: %@</target>
<target>Az üzenetreakciók tiltása.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Közvetlen üzenetek küldésének letiltása tagok részére.</target>
@@ -4415,6 +4467,10 @@ Hiba: %@</target>
<target>A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>A fájl fogadása leállt.</target>
@@ -4430,6 +4486,10 @@ Hiba: %@</target>
<target>Legutóbbi előzmények és továbbfejlesztett [könyvtárbot] (simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2TxW3dfMfxy 3%23%2F%3Fv%3D1-2% 26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gloncbqjek4gloncbqjek.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>A címzettek a beírás közben látják a frissítéseket.</target>
@@ -4726,11 +4786,19 @@ Hiba: %@</target>
<target>Üdvözlőszöveg mentése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>A mentett WebRTC ICE kiszolgálók eltávolításra kerülnek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Mentett üzenet</target>
@@ -5152,6 +5220,14 @@ Hiba: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX hivatkozások</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5981,6 +6057,10 @@ A csatlakozáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsola
<target>A hangüzenetek küldése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>A hangüzenetek le vannak tilva!</target>
@@ -6059,6 +6139,14 @@ A csatlakozáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsola
<target>Inkognitóprofil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Titkosított fájlokkal és médiatartalommal.</target>
@@ -6540,6 +6628,10 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>admin</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>titkosítás jóváhagyása %@ számára…</target>
@@ -6550,6 +6642,10 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>titkosítás elfogadása…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>mindig</target>
@@ -6880,6 +6976,10 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>esemény történt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>a csoport törölve</target>
@@ -7087,6 +7187,10 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>tulajdonos</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>ponttól-pontig</target>
@@ -7136,6 +7240,14 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>eltávolítottak</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>mp</target>
@@ -7275,6 +7387,10 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>igen</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>meghívást kapott a csoportba</target>
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ scaricati</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ caricati</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Nota bene**: usare lo stesso database su due dispositivi bloccherà la decifrazione dei messaggi dalle tue connessioni, come misura di sicurezza.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Attenzione**: l'archivio verrà rimosso.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Gli amministratori possono bloccare un membro per tutti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Tutti i tuoi contatti, le conversazioni e i file verranno criptati in modo sicuro e caricati in blocchi sui relay XFTP configurati.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Permetti di eliminare irreversibilmente i messaggi inviati. (24 ore)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Consenti l'invio di file e contenuti multimediali.</target>
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Migrazione dati dell'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Applica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archivia e carica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Archiviazione del database</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Annulla migrazione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>Impossibile ricevere il file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Cambia</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Chat migrata!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Scegli _Migra da un altro dispositivo_ sul nuovo dispositivo e scansione il codice QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Conferma le impostazioni di rete</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</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>Conferma che ricordi la password del database da migrare.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Conferma caricamento</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ Questo è il tuo link una tantum!</target>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Creazione link dell'archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Elimina il database da questo dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ Non è reversibile!</target>
<target>Esegui downgrade e apri chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Scaricamento fallito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Scaricamento archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Scaricamento dettagli del link</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Attivala nelle chat dirette (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ Non è reversibile!</target>
<target>Attiva il codice di autodistruzione</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Crittografare</target>
@@ -2253,6 +2291,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Inserisci password</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Errore nel consentire la crittografia PQ al contatto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Errore di scaricamento dell'archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Errore di salvataggio delle impostazioni</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Errore di invio dell'archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Errore di verifica della password:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Il file esportato non esiste</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ Non è reversibile!</target>
<target>File e contenuti multimediali sono vietati in questo gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>File e contenuti multimediali vietati!</target>
@@ -2696,10 +2745,12 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Finalizza la migrazione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Finalizza la migrazione su un altro dispositivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ Non è reversibile!</target>
<target>Per console</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Desktop trovato</target>
@@ -2857,6 +2920,10 @@ Non è reversibile!</target>
<target>I membri del gruppo possono eliminare irreversibilmente i messaggi inviati. (24 ore)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>I membri del gruppo possono inviare messaggi diretti.</target>
@@ -2994,6 +3061,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Interfaccia in ungherese</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Importazione fallita</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Importazione archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ Non è reversibile!</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>Per continuare, la chat deve essere fermata.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ Non è reversibile!</target>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Conferma di migrazione non valida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Messaggio troppo grande</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>I messaggi, i file e le chiamate sono protetti da **crittografia end-to-end** con perfect forward secrecy, ripudio e recupero da intrusione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente alla quantistica** con perfect forward secrecy, ripudio e recupero da intrusione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Migra dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Migra da un altro dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Migra qui</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Migra ad un altro dispositivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Migra ad un altro dispositivo via codice QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Migrazione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Migrazione completata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Rete e server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Impostazioni di rete</target>
@@ -3817,6 +3903,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Nessuna cronologia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Nessuna autorizzazione per registrare messaggi vocali</target>
@@ -3993,6 +4083,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Apri migrazione ad un altro dispositivo</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>O incolla il link dell'archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>O condividi in modo sicuro questo link del file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>O mostra questo codice</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Conteggio PING</target>
@@ -4110,6 +4207,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Chiamate picture-in-picture</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">
@@ -4134,6 +4232,7 @@ Questo è il tuo link per il gruppo %@!</target>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Conferma che le impostazioni di rete sono corrette per questo dispositivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>E2EE post-quantistica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Errore: %@</target>
<target>Proibisci le reazioni ai messaggi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Proibisci l'invio di messaggi diretti ai membri.</target>
@@ -4334,10 +4438,12 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Server push</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Crittografia resistente alla quantistica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Errore: %@</target>
<target>L'indirizzo di ricezione verrà cambiato in un server diverso. La modifica dell'indirizzo verrà completata dopo che il mittente sarà in linea.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La ricezione del file verrà interrotta.</target>
@@ -4430,6 +4540,10 @@ Errore: %@</target>
<target>Cronologia recente e [bot della directory](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) migliorato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>I destinatari vedono gli aggiornamenti mentre li digiti.</target>
@@ -4527,10 +4641,12 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Ripeti scaricamento</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Ripeti importazione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Ripeti caricamento</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Gruppi più sicuri</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Errore: %@</target>
<target>Salvare il messaggio di benvenuto?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>I server WebRTC ICE salvati verranno rimossi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Messaggio salvato</target>
@@ -5013,6 +5139,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Imposta password</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>Mostra codice QR</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Errore: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>Link di SimpleX</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Ferma la chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Arresto della chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5649,12 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Questa chat è protetta da crittografia end-to-end.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Questa chat è protetta da crittografia end-to-end resistente alla quantistica.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5813,6 +5953,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Invio fallito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5822,6 +5963,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Invio dell'archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5876,6 +6018,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Usa l'app mentre sei in chiamata.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5915,10 +6058,12 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Verifica password del database</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Verifica password</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5981,6 +6126,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>I messaggi vocali sono vietati in questo gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Messaggi vocali vietati!</target>
@@ -6013,6 +6162,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Attenzione: avviare la chat su più dispositivi non è supportato e provocherà problemi di recapito dei messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6037,6 +6187,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Il messaggio di benvenuto è troppo lungo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6059,6 +6210,14 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Quando condividi un profilo in incognito con qualcuno, questo profilo verrà utilizzato per i gruppi a cui ti invitano.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Con file e multimediali criptati.</target>
@@ -6096,6 +6255,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>**Non devi** usare lo stesso database su due dispositivi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6187,6 +6347,7 @@ Ripetere la richiesta di ingresso?</target>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Puoi fare un altro tentativo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6540,6 +6701,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>amministratore</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>concordando la crittografia per %@…</target>
@@ -6550,6 +6715,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>concordando la crittografia…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>sempre</target>
@@ -6880,6 +7049,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>evento accaduto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>gruppo eliminato</target>
@@ -7087,6 +7260,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>proprietario</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>peer-to-peer</target>
@@ -7094,6 +7271,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>crittografia e2e resistente alla quantistica</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7136,6 +7314,14 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>ti ha rimosso/a</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sec</target>
@@ -7173,6 +7359,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>crittografia end-to-end standard</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7275,6 +7462,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>sì</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>sei stato/a invitato/a al gruppo</target>
@@ -719,6 +719,10 @@
<target>送信済みメッセージの永久削除を許可する。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>ファイルやメディアの送信を許可する。</target>
@@ -1042,6 +1046,10 @@
<target>ファイル受信ができません</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>変更</target>
@@ -1998,6 +2006,10 @@ This cannot be undone!</source>
<target>ダウングレードしてチャットを開く</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<note>No comment provided by engineer.</note>
@@ -2103,6 +2115,10 @@ This cannot be undone!</source>
<target>自己破壊パスコードを有効にする</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>暗号化する</target>
@@ -2608,6 +2624,10 @@ This cannot be undone!</source>
<target>このグループでは、ファイルとメディアは禁止されています。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>ファイルとメディアは禁止されています!</target>
@@ -2671,6 +2691,18 @@ This cannot be undone!</source>
<target>コンソール</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -2777,6 +2809,10 @@ This cannot be undone!</source>
<target>グループのメンバーがメッセージを完全削除することができます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>グループのメンバーがダイレクトメッセージを送信できます。</target>
@@ -3605,6 +3641,10 @@ This is your link for group %@!</source>
<target>ネットワークとサーバ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>ネットワーク設定</target>
@@ -3714,6 +3754,10 @@ This is your link for group %@!</source>
<target>履歴はありません</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>音声メッセージを録音する権限がありません</target>
@@ -3919,6 +3963,10 @@ This is your link for group %@!</source>
<source>Or show this code</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING回数</target>
@@ -4169,6 +4217,10 @@ Error: %@</source>
<target>メッセージへのリアクションは禁止されています。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>メンバー間のダイレクトメッセージを使用禁止にする。</target>
@@ -4295,6 +4347,10 @@ Error: %@</source>
<target>開発中の機能です!相手のクライアントが4.2でなければ機能しません。アドレス変更が完了すると、会話にメッセージが出ます。連絡相手 (またはグループのメンバー) からメッセージを受信できないかをご確認ください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>ファイルの受信を停止します。</target>
@@ -4309,6 +4365,10 @@ Error: %@</source>
<source>Recent history and improved [directory bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>受信者には、入力時に更新内容が表示されます。</target>
@@ -4602,11 +4662,19 @@ Error: %@</source>
<target>ウェルカムメッセージを保存しますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>保存されたWebRTC ICEサーバは削除されます</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<note>message info title</note>
@@ -5013,6 +5081,14 @@ Error: %@</source>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleXリンク</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5813,6 +5889,10 @@ To connect, please ask your contact to create another connection link and check
<target>このグループでは音声メッセージが使用禁止です。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>音声メッセージは使用禁止です!</target>
@@ -5890,6 +5970,14 @@ To connect, please ask your contact to create another connection link and check
<target>連絡相手にシークレットモードのプロフィールを共有すると、その連絡相手に招待されたグループでも同じプロフィールが使われます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<note>No comment provided by engineer.</note>
@@ -6353,6 +6441,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>管理者</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>%@の暗号化に同意しています…</target>
@@ -6363,6 +6455,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>暗号化に同意しています…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>常に</target>
@@ -6685,6 +6781,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>イベント発生</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>グループ削除済み</target>
@@ -6891,6 +6991,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>オーナー</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>P2P</target>
@@ -6938,6 +7042,14 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>あなたを除名しました</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>秒</target>
@@ -7070,6 +7182,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>はい</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>グループ招待が届きました</target>
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ gedownload</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ geüpload</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Let op**: als u dezelfde database op twee apparaten gebruikt, wordt de decodering van berichten van uw verbindingen verbroken, als veiligheidsmaatregel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Waarschuwing**: het archief wordt verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Beheerders kunnen een lid voor iedereen blokkeren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Al uw contacten, gesprekken en bestanden worden veilig gecodeerd en in delen geüpload naar geconfigureerde XFTP-relays.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Sta toe om verzonden berichten onomkeerbaar te verwijderen. (24 uur)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Sta toe om bestanden en media te verzenden.</target>
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Migratie van app-gegevens</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Toepassen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archiveren en uploaden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Database archiveren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Migratie annuleren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>Kan bestand niet ontvangen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Veranderen</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Chat gemigreerd!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Kies _Migreren vanaf een ander apparaat_ op het nieuwe apparaat en scan de QR-code.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Bevestig netwerk instellingen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</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>Bevestig dat u het wachtwoord voor de database onthoudt om deze te migreren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Bevestig het uploaden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ Dit is uw eigen eenmalige link!</target>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Archief link maken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Verwijder de database van dit apparaat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Downgraden en chat openen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Download mislukt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Archief downloaden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Link gegevens downloaden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Activeer in directe chats (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Zelfvernietigings wachtwoord inschakelen</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Versleutelen</target>
@@ -2253,6 +2291,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Voer het wachtwoord in</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Fout bij het toestaan van contact PQ-versleuteling</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Fout bij het downloaden van het archief</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Fout bij opslaan van instellingen</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Fout bij het uploaden van het archief</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Fout bij het verifiëren van het wachtwoord:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Geëxporteerd bestand bestaat niet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Bestanden en media zijn verboden in deze groep.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Bestanden en media verboden!</target>
@@ -2696,10 +2745,12 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Voltooi de migratie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Voltooi de migratie op een ander apparaat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Voor console</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Desktop gevonden</target>
@@ -2857,6 +2920,10 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Groepsleden kunnen verzonden berichten onherroepelijk verwijderen. (24 uur)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Groepsleden kunnen directe berichten sturen.</target>
@@ -2994,6 +3061,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Hongaarse interface</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Importeren is mislukt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Archief importeren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ Dit kan niet ongedaan gemaakt worden!</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>Om verder te kunnen gaan, moet de chat worden gestopt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Ongeldige migratie bevestiging</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Bericht te groot</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Berichten, bestanden en oproepen worden beschermd door **end-to-end codering** met perfecte voorwaartse geheimhouding, afwijzing en inbraakherstel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Berichten, bestanden en oproepen worden beschermd door **kwantumbestendige e2e encryptie** met perfecte voorwaartse geheimhouding, afwijzing en inbraakherstel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Apparaat migreren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Migreer vanaf een ander apparaat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Migreer hierheen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Migreer naar een ander apparaat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Migreer naar een ander apparaat via QR-code.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Migreren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Migratie voltooid</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ Dit is jouw link voor groep %@!</target>
<target>Netwerk &amp; servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Netwerk instellingen</target>
@@ -3817,6 +3903,10 @@ Dit is jouw link voor groep %@!</target>
<target>Geen geschiedenis</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Geen toestemming om spraakbericht op te nemen</target>
@@ -3978,7 +4068,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Open chat" xml:space="preserve">
<source>Open chat</source>
<target>Gesprekken openen</target>
<target>Chat openen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Open chat console" xml:space="preserve">
@@ -3993,6 +4083,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Open de migratie naar een ander apparaat</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>Of plak de archief link</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Of deel deze bestands link veilig</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ Dit is jouw link voor groep %@!</target>
<target>Of laat deze code zien</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING count</target>
@@ -4110,6 +4207,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Beeld-in-beeld oproepen</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">
@@ -4134,6 +4232,7 @@ Dit is jouw link voor groep %@!</target>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Controleer of de netwerk instellingen correct zijn voor dit apparaat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>Post-quantum E2EE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Fout: %@</target>
<target>Berichten reacties verbieden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Verbied het sturen van directe berichten naar leden.</target>
@@ -4334,10 +4438,12 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Push server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>quantum bestendige encryptie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Fout: %@</target>
<target>Het ontvangstadres wordt gewijzigd naar een andere server. Adres wijziging wordt voltooid nadat de afzender online is.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Het ontvangen van het bestand wordt gestopt.</target>
@@ -4430,6 +4540,10 @@ Fout: %@</target>
<target>Recente geschiedenis en verbeterde [directory bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Ontvangers zien updates terwijl u ze typt.</target>
@@ -4527,10 +4641,12 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Herhaal het downloaden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Herhaal import</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Herhaal het uploaden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Veiligere groepen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Fout: %@</target>
<target>Welkomst bericht opslaan?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Opgeslagen WebRTC ICE servers worden verwijderd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Opgeslagen bericht</target>
@@ -5013,6 +5139,7 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Wachtwoord instellen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>Toon QR-code</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Fout: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX links</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Stop chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Fout: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Chat stoppen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5649,12 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Deze chat is beveiligd met end-to-end codering.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Deze chat wordt beschermd door quantum bestendige end-to-end codering.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5813,6 +5953,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Upload mislukt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5822,6 +5963,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Archief uploaden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5876,6 +6018,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Gebruik de app tijdens het gesprek.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5915,10 +6058,12 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Controleer het wachtwoord van de database</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Controleer het wachtwoord</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5981,6 +6126,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<target>Spraak berichten zijn verboden in deze groep.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Spraak berichten verboden!</target>
@@ -6013,6 +6162,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Waarschuwing: het starten van de chat op meerdere apparaten wordt niet ondersteund en zal leiden tot mislukte bezorging van berichten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6037,6 +6187,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Welkomstbericht is te lang</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6059,6 +6210,14 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<target>Wanneer je een incognito profiel met iemand deelt, wordt dit profiel gebruikt voor de groepen waarvoor ze je uitnodigen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Met versleutelde bestanden en media.</target>
@@ -6096,6 +6255,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>U **mag** niet dezelfde database op twee apparaten gebruiken.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6187,6 +6347,7 @@ Deelnameverzoek herhalen?</target>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Je kunt het nog een keer proberen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6540,6 +6701,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>Beheerder</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>versleuteling overeenkomen voor %@…</target>
@@ -6550,6 +6715,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>versleuteling overeenkomen…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>altijd</target>
@@ -6880,6 +7049,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>gebeurtenis gebeurd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>groep verwijderd</target>
@@ -7087,6 +7260,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>Eigenaar</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>peer-to-peer</target>
@@ -7094,6 +7271,7 @@ SimpleX servers kunnen uw profiel niet zien.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>quantum bestendige e2e-codering</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7136,6 +7314,14 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>heeft je verwijderd</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sec</target>
@@ -7173,6 +7359,7 @@ SimpleX servers kunnen uw profiel niet zien.</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>standaard end-to-end encryptie</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7275,6 +7462,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>Ja</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>je bent uitgenodigd voor de groep</target>
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ pobrane</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ wgrane</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>*Uwaga*: używanie tej samej bazy danych na dwóch urządzeniach zepsuje odszyfrowywanie wiadomości twoich połączeń, jako zabezpieczenie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Ostrzeżenie**: archiwum zostanie usunięte.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Administratorzy mogą blokować członka dla wszystkich.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Wszystkie twoje kontakty, konwersacje i pliki będą bezpiecznie szyfrowane i wgrywane w kawałkach do skonfigurowanych przekaźników XFTP.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Zezwól na nieodwracalne usunięcie wysłanych wiadomości. (24 godziny)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Pozwól na wysyłanie plików i mediów.</target>
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Migracja danych aplikacji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Zastosuj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Archiwizuj i prześlij</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Archiwizowanie bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Anuluj migrację</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>Nie można odebrać pliku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Zmień</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Czat zmigrowany!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Wybierz _Zmigruj z innego urządzenia_ na nowym urządzeniu i zeskanuj kod QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Potwierdź ustawienia sieciowe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</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>Potwierdź, że pamiętasz hasło do bazy danych, aby ją zmigrować.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Potwierdź wgranie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Tworzenie linku archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Usuń bazę danych z tego urządzenia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ To nie może być cofnięte!</target>
<target>Obniż wersję i otwórz czat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Pobieranie nie udane</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Pobieranie archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Pobieranie szczegółów linku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Włącz w czatach bezpośrednich (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ To nie może być cofnięte!</target>
<target>Włącz pin samodestrukcji</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Szyfruj</target>
@@ -2253,6 +2291,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Wprowadź hasło</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Błąd pozwalania kontaktowi na szyfrowanie PQ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Błąd pobierania archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Błąd zapisywania ustawień</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Błąd wgrywania archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Błąd weryfikowania hasła:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Wyeksportowany plik nie istnieje</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ To nie może być cofnięte!</target>
<target>Pliki i media są zabronione w tej grupie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Pliki i media zabronione!</target>
@@ -2696,10 +2745,12 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Dokończ migrację</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Dokończ migrację na innym urządzeniu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ To nie może być cofnięte!</target>
<target>Dla konsoli</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Znaleziono komputer</target>
@@ -2857,6 +2920,10 @@ To nie może być cofnięte!</target>
<target>Członkowie grupy mogą nieodwracalnie usuwać wysłane wiadomości. (24 godziny)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Członkowie grupy mogą wysyłać bezpośrednie wiadomości.</target>
@@ -2994,6 +3061,7 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Węgierski interfejs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ To nie może być cofnięte!</target>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Import nie udał się</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Importowanie archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ To nie może być cofnięte!</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>Aby konturować, czat musi zostać zatrzymany.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ To nie może być cofnięte!</target>
</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="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Wiadomość jest zbyt duża</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Wiadomości, pliki i połączenia są chronione przez **szyfrowanie end-to-end** z doskonałym utajnianiem z wyprzedzeniem i odzyskiem po złamaniu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Wiadomości, pliki i połączenia są chronione przez **kwantowo odporne szyfrowanie end-to-end** z doskonałym utajnianiem z wyprzedzeniem i odzyskiem po złamaniu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Zmigruj urządzenie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Zmigruj z innego urządzenia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Zmigruj tutaj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Zmigruj do innego urządzenia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Zmigruj do innego urządzenia przez kod QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Migrowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Migracja zakończona</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ To jest twój link do grupy %@!</target>
<target>Sieć i serwery</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Ustawienia sieci</target>
@@ -3817,6 +3903,10 @@ To jest twój link do grupy %@!</target>
<target>Brak historii</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Brak uprawnień do nagrywania wiadomości głosowej</target>
@@ -3993,6 +4083,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Otwórz migrację na innym urządzeniu</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>Lub wklej link archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Lub bezpiecznie udostępnij ten link pliku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ To jest twój link do grupy %@!</target>
<target>Lub pokaż ten kod</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Liczba PINGÓW</target>
@@ -4110,6 +4207,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Połączenia obraz-w-obrazie</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">
@@ -4134,6 +4232,7 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Proszę potwierdzić, że ustawienia sieciowe są prawidłowe dla tego urządzenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>Postkwantowe E2EE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Błąd: %@</target>
<target>Zabroń reakcje wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Zabroń wysyłania bezpośrednich wiadomości do członków.</target>
@@ -4334,10 +4438,12 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Serwer Push</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Kwantowo odporne szyfrowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Błąd: %@</target>
<target>Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Odbieranie pliku zostanie przerwane.</target>
@@ -4430,6 +4540,10 @@ Błąd: %@</target>
<target>Ostania historia i ulepszony [bot adresowy](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Odbiorcy widzą aktualizacje podczas ich wpisywania.</target>
@@ -4527,10 +4641,12 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Powtórz pobieranie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Powtórz importowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Powtórz wgrywanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Bezpieczniejsze grupy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Błąd: %@</target>
<target>Zapisać wiadomość powitalną?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Zapisane serwery WebRTC ICE zostaną usunięte</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Zachowano wiadomość</target>
@@ -5013,6 +5139,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Ustaw hasło</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>Pokaż kod QR</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Błąd: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>Linki SimpleX</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Zatrzymaj czat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Zatrzymywanie czatu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5649,12 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Ten czat jest chroniony przez szyfrowanie end-to-end.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Ten czat jest chroniony przez kwantowo odporne szyfrowanie end-to-end.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5813,6 +5953,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Wgrywanie nie udane</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5822,6 +5963,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Wgrywanie archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5876,6 +6018,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Używaj aplikacji podczas połączenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5915,10 +6058,12 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Zweryfikuj hasło bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Zweryfikuj hasło</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5981,6 +6126,10 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Wiadomości głosowe są zabronione w tej grupie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Wiadomości głosowe zabronione!</target>
@@ -6013,6 +6162,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Ostrzeżenie: rozpoczęcie czatu na wielu urządzeniach nie jest wspierane i spowoduje niepowodzenia dostarczania wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6037,6 +6187,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Wiadomość powitalna jest zbyt długa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6059,6 +6210,14 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Gdy udostępnisz komuś profil incognito, będzie on używany w grupach, do których Cię zaprosi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Z zaszyfrowanymi plikami i multimediami.</target>
@@ -6096,6 +6255,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>**Nie możesz** używać tej samej bazy na dwóch urządzeniach.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6187,6 +6347,7 @@ Powtórzyć prośbę dołączenia?</target>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Możesz spróbować ponownie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6540,6 +6701,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>administrator</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>uzgadnianie szyfrowania dla %@…</target>
@@ -6550,6 +6715,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>uzgadnianie szyfrowania…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>zawsze</target>
@@ -6880,6 +7049,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>nowe wydarzenie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>grupa usunięta</target>
@@ -7087,6 +7260,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>właściciel</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>peer-to-peer</target>
@@ -7094,6 +7271,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>kwantowo odporne szyfrowanie e2e</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7136,6 +7314,14 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>usunął cię</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sek</target>
@@ -7173,6 +7359,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>standardowe szyfrowanie end-to-end</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7275,6 +7462,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>tak</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>jesteś zaproszony do grupy</target>
@@ -15,32 +15,39 @@
Available in v5.1</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<trans-unit id=" " xml:space="preserve" approved="no">
<source> </source>
<target state="translated"> </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<trans-unit id=" " xml:space="preserve" approved="no">
<source> </source>
<target state="translated"> </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
<trans-unit id=" " xml:space="preserve" approved="no">
<source> </source>
<target state="translated"> </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" (" xml:space="preserve">
<trans-unit id=" (" xml:space="preserve" approved="no">
<source> (</source>
<target state="translated"> (</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" (can be copied)" xml:space="preserve">
<trans-unit id=" (can be copied)" xml:space="preserve" approved="no">
<source> (can be copied)</source>
<target state="translated"> .(pode ser copiado)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="!1 colored!" xml:space="preserve">
<trans-unit id="!1 colored!" xml:space="preserve" approved="no">
<source>!1 colored!</source>
<target state="translated">!1 colorido!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="#secret#" xml:space="preserve">
<trans-unit id="#secret#" xml:space="preserve" approved="no">
<source>#secret#</source>
<target state="translated">#secreto#</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@" xml:space="preserve">
@@ -55,48 +62,59 @@ Available in v5.1</source>
<source>%@ / %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<trans-unit id="%@ is connected!" xml:space="preserve" approved="no">
<source>%@ is connected!</source>
<target state="translated">%@ está conectado!</target>
<note>notification title</note>
</trans-unit>
<trans-unit id="%@ is not verified" xml:space="preserve">
<trans-unit id="%@ is not verified" xml:space="preserve" approved="no">
<source>%@ is not verified</source>
<target state="translated">%@ não foi verificado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is verified" xml:space="preserve">
<trans-unit id="%@ is verified" xml:space="preserve" approved="no">
<source>%@ is verified</source>
<target state="translated">%@ foi verificado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<trans-unit id="%@ servers" xml:space="preserve" approved="no">
<source>%@ servers</source>
<target state="translated">%@ servidores</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
<trans-unit id="%@ wants to connect!" xml:space="preserve" approved="no">
<source>%@ wants to connect!</source>
<target state="translated">%@ quer se conectar!</target>
<note>notification title</note>
</trans-unit>
<trans-unit id="%d days" xml:space="preserve">
<trans-unit id="%d days" xml:space="preserve" approved="no">
<source>%d days</source>
<target state="translated">%d dias</target>
<note>message ttl</note>
</trans-unit>
<trans-unit id="%d hours" xml:space="preserve">
<trans-unit id="%d hours" xml:space="preserve" approved="no">
<source>%d hours</source>
<target state="translated">%d horas</target>
<note>message ttl</note>
</trans-unit>
<trans-unit id="%d min" xml:space="preserve">
<trans-unit id="%d min" xml:space="preserve" approved="no">
<source>%d min</source>
<target state="translated">%d minuto</target>
<note>message ttl</note>
</trans-unit>
<trans-unit id="%d months" xml:space="preserve">
<trans-unit id="%d months" xml:space="preserve" approved="no">
<source>%d months</source>
<target state="translated">%d meses</target>
<note>message ttl</note>
</trans-unit>
<trans-unit id="%d sec" xml:space="preserve">
<trans-unit id="%d sec" xml:space="preserve" approved="no">
<source>%d sec</source>
<target state="translated">%d segundo</target>
<note>message ttl</note>
</trans-unit>
<trans-unit id="%d skipped message(s)" xml:space="preserve">
<trans-unit id="%d skipped message(s)" xml:space="preserve" approved="no">
<source>%d skipped message(s)</source>
<target state="translated">%d mensagem(s) ignorada(s)</target>
<note>integrity error chat item</note>
</trans-unit>
<trans-unit id="%lld" xml:space="preserve">
@@ -107,28 +125,34 @@ Available in v5.1</source>
<source>%lld %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld contact(s) selected" xml:space="preserve">
<trans-unit id="%lld contact(s) selected" xml:space="preserve" approved="no">
<source>%lld contact(s) selected</source>
<target state="translated">%lld contato(s) selecionado(s)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld file(s) with total size of %@" xml:space="preserve">
<trans-unit id="%lld file(s) with total size of %@" xml:space="preserve" approved="no">
<source>%lld file(s) with total size of %@</source>
<target state="translated">%lld arquivo(s) com tamanho total de %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld members" xml:space="preserve">
<trans-unit id="%lld members" xml:space="preserve" approved="no">
<source>%lld members</source>
<target state="translated">%lld membros</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld minutes" xml:space="preserve">
<trans-unit id="%lld minutes" xml:space="preserve" approved="no">
<source>%lld minutes</source>
<target state="translated">%lld minutos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld second(s)" xml:space="preserve">
<trans-unit id="%lld second(s)" xml:space="preserve" approved="no">
<source>%lld second(s)</source>
<target state="translated">%lld segundo(s)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld seconds" xml:space="preserve">
<trans-unit id="%lld seconds" xml:space="preserve" approved="no">
<source>%lld seconds</source>
<target state="translated">%lld segundos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldd" xml:space="preserve">
@@ -159,12 +183,14 @@ Available in v5.1</source>
<source>%lldw</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
<trans-unit id="%u messages failed to decrypt." xml:space="preserve" approved="no">
<source>%u messages failed to decrypt.</source>
<target state="translated">%u mensagens não foram descriptografadas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<trans-unit id="%u messages skipped." xml:space="preserve" approved="no">
<source>%u messages skipped.</source>
<target state="translated">%u mensagens ignoradas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
@@ -175,48 +201,56 @@ Available in v5.1</source>
<source>)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Add new contact**: to create your one-time QR Code for your contact." xml:space="preserve">
<trans-unit id="**Add new contact**: to create your one-time QR Code for your contact." xml:space="preserve" approved="no">
<source>**Add new contact**: to create your one-time QR Code or link for your contact.</source>
<target state="translated">**Adicionar novo contato**: para criar seu QR Code único ou link para seu contato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Create link / QR code** for your contact to use." xml:space="preserve">
<source>**Create link / QR code** for your contact to use.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have." xml:space="preserve">
<trans-unit id="**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have." xml:space="preserve" approved="no">
<source>**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have.</source>
<target state="translated">**Mais privado**: verifique novas mensagens a cada 20 minutos. O token do dispositivo é compartilhado com o servidor SimpleX Chat, mas não com quantos contatos ou mensagens você possui.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." xml:space="preserve">
<trans-unit id="**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." xml:space="preserve" approved="no">
<source>**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app).</source>
<target state="translated">**Totalmente privado**: não use o servidor de notificações do SimpleX Chat, verifique as mensagens periodicamente em segundo plano (depende da frequência com que você usa o aplicativo).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Paste received link** or open it in the browser and tap **Open in mobile app**." xml:space="preserve">
<source>**Paste received link** or open it in the browser and tap **Open in mobile app**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve" approved="no">
<source>**Please note**: you will NOT be able to recover or change passphrase if you lose it.</source>
<target state="translated">**Atenção**: Você NÃO poderá recuperar ou alterar a senha caso a perca.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." xml:space="preserve">
<trans-unit id="**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." xml:space="preserve" approved="no">
<source>**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from.</source>
<target state="translated">**Recomendado**: O token do dispositivo e as notificações são enviados ao servidor de notificação do SimpleX Chat, mas não o conteúdo, o tamanho da mensagem ou de quem ela é.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Scan QR code**: to connect to your contact in person or via video call." xml:space="preserve">
<source>**Scan QR code**: to connect to your contact in person or via video call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Warning**: Instant push notifications require passphrase saved in Keychain." xml:space="preserve">
<trans-unit id="**Warning**: Instant push notifications require passphrase saved in Keychain." xml:space="preserve" approved="no">
<source>**Warning**: Instant push notifications require passphrase saved in Keychain.</source>
<target state="translated">**Aviso**: As notificações push instantâneas exigem uma senha salva nas Chaves.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve" approved="no">
<source>**e2e encrypted** audio call</source>
<target state="translated">** Criptografado e2e** chamada de áudio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** video call" xml:space="preserve">
<trans-unit id="**e2e encrypted** video call" xml:space="preserve" approved="no">
<source>**e2e encrypted** video call</source>
<target state="translated">**Criptografado e2e** chamada de vídeo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="*bold*" xml:space="preserve">
@@ -353,144 +387,175 @@ Available in v5.1</source>
<source>All group members will remain connected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." xml:space="preserve">
<trans-unit id="All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." xml:space="preserve" approved="no">
<source>All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.</source>
<target state="translated">Todas as mensagens serão apagadas isso não pode ser desfeito! As mensagens serão apagadas SOMENTE para você.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All your contacts will remain connected" xml:space="preserve">
<source>All your contacts will remain connected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
<trans-unit id="Allow" xml:space="preserve" approved="no">
<source>Allow</source>
<target state="translated">Permitir</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve" approved="no">
<source>Allow calls only if your contact allows them.</source>
<target state="translated">Permita chamadas somente se seu contato permitir.</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">
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve" approved="no">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target state="translated">Permita o desaparecimento de mensagens somente se o seu contato permitir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you." xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow sending direct messages to members." xml:space="preserve">
<trans-unit id="Allow sending direct messages to members." xml:space="preserve" approved="no">
<source>Allow sending direct messages to members.</source>
<target state="translated">Permitir o envio de mensagens diretas aos membros.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow sending disappearing messages." xml:space="preserve">
<trans-unit id="Allow sending disappearing messages." xml:space="preserve" approved="no">
<source>Allow sending disappearing messages.</source>
<target state="translated">Permitir o envio de mensagens que desaparecem.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to irreversibly delete sent messages." xml:space="preserve">
<source>Allow to irreversibly delete sent messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<trans-unit id="Allow to send voice messages." xml:space="preserve" approved="no">
<source>Allow to send voice messages.</source>
<target state="translated">Permitir enviar mensagens de voz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow voice messages only if your contact allows them." xml:space="preserve">
<trans-unit id="Allow voice messages only if your contact allows them." xml:space="preserve" approved="no">
<source>Allow voice messages only if your contact allows them.</source>
<target state="translated">Permita mensagens de voz apenas se o seu contato permitir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow voice messages?" xml:space="preserve">
<trans-unit id="Allow voice messages?" xml:space="preserve" approved="no">
<source>Allow voice messages?</source>
<target state="translated">Permitir mensagens de voz?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<trans-unit id="Allow your contacts to call you." xml:space="preserve" approved="no">
<source>Allow your contacts to call you.</source>
<target state="translated">Permita que seus contatos liguem para você.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve">
<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">Permita que seus contatos enviem mensagens que desaparecem.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve" approved="no">
<source>Allow your contacts to send voice messages.</source>
<target state="translated">Permita que seus contatos enviem mensagens de voz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Already connected?" xml:space="preserve">
<trans-unit id="Already connected?" xml:space="preserve" approved="no">
<source>Already connected?</source>
<target state="translated">Já conectado?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<trans-unit id="Always use relay" xml:space="preserve" approved="no">
<source>Always use relay</source>
<target state="translated">Sempre usar retransmissão</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Answer call" xml:space="preserve">
<trans-unit id="Answer call" xml:space="preserve" approved="no">
<source>Answer call</source>
<target state="translated">Atender chamada</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App build: %@" xml:space="preserve">
<trans-unit id="App build: %@" xml:space="preserve" approved="no">
<source>App build: %@</source>
<target state="translated">Versão do Aplicativo: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App icon" xml:space="preserve">
<trans-unit id="App icon" xml:space="preserve" approved="no">
<source>App icon</source>
<target state="translated">Ícone do Aplicativo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode" xml:space="preserve">
<trans-unit id="App passcode" xml:space="preserve" approved="no">
<source>App passcode</source>
<target state="translated">Senha do Aplicativo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<trans-unit id="App version" xml:space="preserve" approved="no">
<source>App version</source>
<target state="translated">Versão do Aplicativo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version: v%@" xml:space="preserve">
<trans-unit id="App version: v%@" xml:space="preserve" approved="no">
<source>App version: v%@</source>
<target state="translated">Versão do Aplicativo: v%@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Appearance" xml:space="preserve">
<trans-unit id="Appearance" xml:space="preserve" approved="no">
<source>Appearance</source>
<target state="translated">Aparência</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
<trans-unit id="Attach" xml:space="preserve" approved="no">
<source>Attach</source>
<target state="translated">Anexar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio &amp; video calls" xml:space="preserve">
<trans-unit id="Audio &amp; video calls" xml:space="preserve" approved="no">
<source>Audio &amp; video calls</source>
<target state="translated">Chamadas de áudio e vídeo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio and video calls" xml:space="preserve">
<trans-unit id="Audio and video calls" xml:space="preserve" approved="no">
<source>Audio and video calls</source>
<target state="translated">Chamadas de áudio e vídeo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
<trans-unit id="Audio/video calls" xml:space="preserve" approved="no">
<source>Audio/video calls</source>
<target state="translated">Chamadas de áudio/vídeo</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve" approved="no">
<source>Audio/video calls are prohibited.</source>
<target state="translated">Chamadas de áudio/vídeo são proibidas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<trans-unit id="Authentication cancelled" xml:space="preserve" approved="no">
<source>Authentication cancelled</source>
<target state="translated">Autenticação cancelada</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Authentication failed" xml:space="preserve">
<trans-unit id="Authentication failed" xml:space="preserve" approved="no">
<source>Authentication failed</source>
<target state="translated">Falha na autenticação</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication is required before the call is connected, but you may miss calls." xml:space="preserve">
<trans-unit id="Authentication is required before the call is connected, but you may miss calls." xml:space="preserve" approved="no">
<source>Authentication is required before the call is connected, but you may miss calls.</source>
<target state="translated">A autenticação é necessária antes que a chamada seja conectada, mas você pode perder chamadas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication unavailable" xml:space="preserve">
<trans-unit id="Authentication unavailable" xml:space="preserve" approved="no">
<source>Authentication unavailable</source>
<target state="translated">Autenticação indisponível</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept contact requests" xml:space="preserve">
<trans-unit id="Auto-accept contact requests" xml:space="preserve" approved="no">
<source>Auto-accept contact requests</source>
<target state="translated">Aceitar solicitações de contato automaticamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept images" xml:space="preserve">
@@ -4162,6 +4227,226 @@ SimpleX servers cannot see your profile.</source>
<source>\~strike~</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="## In reply to" xml:space="preserve" approved="no">
<source>## In reply to</source>
<target state="translated">## Em resposta a</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve" approved="no">
<source>%@ uploaded</source>
<target state="translated">%@ enviado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%d weeks" xml:space="preserve" approved="no">
<source>%d weeks</source>
<target state="translated">%d semanas</target>
<note>time interval</note>
</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">%lld mensagens bloqueadas pelo administrador</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld new interface languages" xml:space="preserve" approved="no">
<source>%lld new interface languages</source>
<target state="translated">%lld novas interface de idiomas</target>
<note>No comment provided by engineer.</note>
</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**: para criar um novo link de convite ou conectar-se por meio de um link que você recebeu.</target>
<note>No comment provided by engineer.</note>
</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**: para criar um novo grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve" 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">**Observação**: usar o mesmo banco de dados em dois dispositivos interromperá a descriptografia de mensagens de suas conexões, como proteção de segurança.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="## History" xml:space="preserve" approved="no">
<source>## History</source>
<target state="translated">## Histórico</target>
<note>copied message info</note>
</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">**Atenção**: O arquivo será removido.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ and %@" xml:space="preserve" approved="no">
<source>%@ and %@</source>
<target state="translated">%@ e %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ and %@ connected" xml:space="preserve" approved="no">
<source>%@ and %@ connected</source>
<target state="translated">%@ e %@ conectado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve" approved="no">
<source>%1$@ at %2$@:</source>
<target state="translated">%1$@ em %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ connected" xml:space="preserve" approved="no">
<source>%@ connected</source>
<target state="translated">%@ conectado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@, %@ and %lld members" xml:space="preserve" approved="no">
<source>%@, %@ and %lld members</source>
<target state="translated">%@, %@ e %lld membros</target>
<note>No comment provided by engineer.</note>
</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">%@, %@ e %lld outros membros conectados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld group events" xml:space="preserve" approved="no">
<source>%lld group events</source>
<target state="translated">%lld eventos de grupo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld messages marked deleted" xml:space="preserve" approved="no">
<source>%lld messages marked deleted</source>
<target state="translated">%lld mensagens marcadas como excluídas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld messages blocked" xml:space="preserve" approved="no">
<source>%lld messages blocked</source>
<target state="translated">%lld mensagens bloqueadas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld messages moderated by %@" xml:space="preserve" approved="no">
<source>%lld messages moderated by %@</source>
<target state="translated">%lld mensagens moderadas por %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(this device v%@)" xml:space="preserve" approved="no">
<source>(this device v%@)</source>
<target state="translated">(este dispositivo v%@)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All data is erased when it is entered." xml:space="preserve" approved="no">
<source>All data is erased when it is entered.</source>
<target state="translated">Todos os dados são apagados quando são inseridos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve" approved="no">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target state="translated">Permita a exclusão irreversível de mensagens somente se o seu contato permitir. (24 horas)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Apply" xml:space="preserve" approved="no">
<source>Apply</source>
<target state="translated">Aplicar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve" approved="no">
<source>Archive and upload</source>
<target state="translated">Arquivar e fazer envio</target>
<note>No comment provided by engineer.</note>
</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 %@ ficarão ocultas!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Already connecting!" xml:space="preserve" approved="no">
<source>Already connecting!</source>
<target state="translated">Já conectando!</target>
<note>No comment provided by engineer.</note>
</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">O aplicativo criptografa novos arquivos locais (exceto vídeos).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App passcode is replaced with self-destruct passcode." xml:space="preserve" approved="no">
<source>App passcode is replaced with self-destruct passcode.</source>
<target state="translated">A senha do Aplicativo é substituída pela senha de autodestruição.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All your contacts will remain connected." xml:space="preserve" approved="no">
<source>All your contacts will remain connected.</source>
<target state="translated">Todos os seus contatos permanecerão conectados.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All your contacts will remain connected. Profile update will be sent to your contacts." xml:space="preserve" approved="no">
<source>All your contacts will remain connected. Profile update will be sent to your contacts.</source>
<target state="translated">Todos os seus contatos permanecerão conectados. A atualização do perfil será enviada para seus contatos.</target>
<note>No comment provided by engineer.</note>
</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>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve" approved="no">
<source>App data migration</source>
<target state="translated">Migração de dados de aplicativos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve" approved="no">
<source>Archiving database</source>
<target state="translated">Arquivando banco de dados</target>
<note>No comment provided by engineer.</note>
</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 apagadas isso não pode ser desfeito!</target>
<note>No comment provided by engineer.</note>
</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 criptografados com segurança e enviados em partes para retransmissões XFTP configuradas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow message reactions only if your contact allows them." xml:space="preserve" approved="no">
<source>Allow message reactions only if your contact allows them.</source>
<target state="translated">Permita reações às mensagens somente se o seu contato permitir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow message reactions." xml:space="preserve" approved="no">
<source>Allow message reactions.</source>
<target state="translated">Permitir reações às mensagens.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
<target state="translated">Permita que seus contatos apaguem irreversivelmente as mensagens enviadas. (24 horas)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve" approved="no">
<source>Already joining the group!</source>
<target state="translated">Entrando no grupo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="An empty chat profile with the provided name is created, and the app opens as usual." xml:space="preserve" approved="no">
<source>An empty chat profile with the provided name is created, and the app opens as usual.</source>
<target state="translated">Um perfil de conversa vazio com o nome fornecido é criado e o aplicativo abre normalmente.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept" xml:space="preserve" approved="no">
<source>Auto-accept</source>
<target state="translated">Aceitar automaticamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts adding message reactions." xml:space="preserve" approved="no">
<source>Allow your contacts adding message reactions.</source>
<target state="translated">Permita que seus contatos adicionem reações às mensagens.</target>
<note>No comment provided by engineer.</note>
</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 apagar irreversivelmente as mensagens enviadas. (24 horas)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pt" datatype="plaintext">
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ загружено</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ загружено</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Обратите внимание**: использование одной и той же базы данных на двух устройствах нарушит расшифровку сообщений от ваших контактов, как свойство защиты соединений.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Внимание**: архив будет удален.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Админы могут заблокировать члена группы.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Все ваши контакты, разговоры и файлы будут надежно зашифрованы и загружены на выбранные XFTP серверы.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Разрешить необратимо удалять отправленные сообщения. (24 часа)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Разрешить посылать файлы и медиа.</target>
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Миграция данных</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Применить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Архивировать и загрузить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Подготовка архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Отменить миграцию</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>Невозможно получить файл</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Поменять</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Чат мигрирован!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Выберите _Мигрировать с другого устройства_ на новом устройстве и сосканируйте QR код.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Подтвердите настройки сети</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</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>Подтвердите, что Вы помните пароль базы данных для ее миграции.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Подтвердить загрузку</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Создание ссылки на архив</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Удалить базу данных с этого устройства</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ This cannot be undone!</source>
<target>Откатить версию и открыть чат</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Ошибка загрузки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Загрузка архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Загрузка ссылки архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Включите для контактов (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ This cannot be undone!</source>
<target>Включить код самоуничтожения</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Зашифровать</target>
@@ -2253,6 +2291,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Введите пароль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>Ошибка разрешения квантово-устойчивого шифрования</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Ошибка загрузки архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Ошибка сохранения настроек</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Ошибка загрузки архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Ошибка подтверждения пароля:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Экспортированный файл не существует</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ This cannot be undone!</source>
<target>Файлы и медиа запрещены в этой группе.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Файлы и медиа запрещены!</target>
@@ -2696,10 +2745,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Завершить миграцию</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Завершите миграцию на другом устройстве.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ This cannot be undone!</source>
<target>Для консоли</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Компьютер найден</target>
@@ -2857,6 +2920,10 @@ This cannot be undone!</source>
<target>Члены группы могут необратимо удалять отправленные сообщения. (24 часа)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Члены группы могут посылать прямые сообщения.</target>
@@ -2994,6 +3061,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Венгерский интерфейс</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>Ошибка импорта</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Импорт архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="In order to continue, chat should be stopped." xml:space="preserve">
<source>In order to continue, chat should be stopped.</source>
<target>Чтобы продолжить, чат должен быть остановлен.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Ошибка подтверждения миграции</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Сообщение слишком большое</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Сообщения, файлы и звонки защищены **end-to-end шифрованием** с прямой секретностью (PFS), правдоподобным отрицанием и восстановлением от взлома.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Сообщения, файлы и звонки защищены **квантово-устойчивым end-to-end шифрованием** с прямой секретностью (PFS), правдоподобным отрицанием и восстановлением от взлома.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Мигрировать устройство</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Миграция с другого устройства</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Мигрировать сюда</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Мигрировать на другое устройство</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>Мигрируйте на другое устройство через QR код.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Миграция</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Миграция завершена</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ This is your link for group %@!</source>
<target>Сеть &amp; серверы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Настройки сети</target>
@@ -3817,6 +3903,10 @@ This is your link for group %@!</source>
<target>Нет истории</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Нет разрешения для записи голосового сообщения</target>
@@ -3993,6 +4083,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Открытие миграции на другое устройство</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>Или вставьте ссылку архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Или передайте эту ссылку</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ This is your link for group %@!</source>
<target>Или покажите этот код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Количество PING</target>
@@ -4110,6 +4207,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Звонки с картинкой-в-картинке</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">
@@ -4134,6 +4232,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Пожалуйста, подтвердите, что настройки сети верны для этого устройства.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>Квантово-устойчивое E2EE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Error: %@</source>
<target>Запретить реакции на сообщения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Запретить посылать прямые сообщения членам группы.</target>
@@ -4334,10 +4438,12 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Сервер уведомлений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Квантово-устойчивое шифрование</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Error: %@</source>
<target>Адрес получения сообщений будет перемещён на другой сервер. Изменение адреса завершится после того как отправитель будет онлайн.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Приём файла будет прекращён.</target>
@@ -4430,6 +4540,10 @@ Error: %@</source>
<target>История сообщений и улучшенный [каталог групп](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Получатели видят их в то время как Вы их набираете.</target>
@@ -4527,10 +4641,12 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Повторить загрузку</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>Повторить импорт</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Повторить загрузку</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Более безопасные группы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Error: %@</source>
<target>Сохранить приветственное сообщение?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Сохраненные WebRTC ICE серверы будут удалены</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Сохраненное сообщение</target>
@@ -5013,6 +5139,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Установить пароль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>Показать QR код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Error: %@</source>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX ссылки</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Остановить чат</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Остановка чата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5511,10 +5649,12 @@ It can happen because of some bug or when the connection is compromised.</source
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Чат защищен end-to-end шифрованием.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Чат защищен квантово-устойчивым end-to-end шифрованием.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5813,6 +5953,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Ошибка загрузки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5822,6 +5963,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Загрузка архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5876,6 +6018,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Используйте приложение во время звонка.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5915,10 +6058,12 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Проверка пароля базы данных</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Проверить пароль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5981,6 +6126,10 @@ To connect, please ask your contact to create another connection link and check
<target>Голосовые сообщения запрещены в этой группе.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Голосовые сообщения запрещены!</target>
@@ -6013,6 +6162,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6037,6 +6187,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Приветственное сообщение слишком длинное</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6059,6 +6210,14 @@ To connect, please ask your contact to create another connection link and check
<target>Когда Вы соединены с контактом инкогнито, тот же самый инкогнито профиль будет использоваться для групп с этим контактом.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>С зашифрованными файлами и медиа.</target>
@@ -6096,6 +6255,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>Вы **не должны** использовать одну и ту же базу данных на двух устройствах.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6187,6 +6347,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Вы можете попробовать еще раз.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6540,6 +6701,10 @@ SimpleX серверы не могут получить доступ к Ваше
<target>админ</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>шифрование согласовывается для %@…</target>
@@ -6550,6 +6715,10 @@ SimpleX серверы не могут получить доступ к Ваше
<target>шифрование согласовывается…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>всегда</target>
@@ -6880,6 +7049,10 @@ SimpleX серверы не могут получить доступ к Ваше
<target>событие произошло</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>группа удалена</target>
@@ -7087,6 +7260,10 @@ SimpleX серверы не могут получить доступ к Ваше
<target>владелец</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>peer-to-peer</target>
@@ -7094,6 +7271,7 @@ SimpleX серверы не могут получить доступ к Ваше
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>квантово-устойчивое e2e шифрование</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7136,6 +7314,14 @@ SimpleX серверы не могут получить доступ к Ваше
<target>удалил(а) Вас из группы</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>сек</target>
@@ -7173,6 +7359,7 @@ SimpleX серверы не могут получить доступ к Ваше
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>стандартное end-to-end шифрование</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7275,6 +7462,10 @@ SimpleX серверы не могут получить доступ к Ваше
<target>да</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>Вы приглашены в группу</target>
@@ -707,6 +707,10 @@
<target>อนุญาตให้ลบข้อความที่ส่งไปแล้วอย่างถาวร</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>อนุญาตให้ส่งไฟล์และสื่อ</target>
@@ -1028,6 +1032,10 @@
<target>ไม่สามารถรับไฟล์ได้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>เปลี่ยน</target>
@@ -1979,6 +1987,10 @@ This cannot be undone!</source>
<target>ปรับลดรุ่นและเปิดแชท</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<note>No comment provided by engineer.</note>
@@ -2084,6 +2096,10 @@ This cannot be undone!</source>
<target>เปิดใช้งานรหัสผ่านแบบทําลายตัวเอง</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Encrypt</target>
@@ -2586,6 +2602,10 @@ This cannot be undone!</source>
<target>ไฟล์และสื่อเป็นสิ่งต้องห้ามในกลุ่มนี้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>ไฟล์และสื่อต้องห้าม!</target>
@@ -2649,6 +2669,18 @@ This cannot be undone!</source>
<target>สำหรับคอนโซล</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -2755,6 +2787,10 @@ This cannot be undone!</source>
<target>สมาชิกกลุ่มสามารถลบข้อความที่ส่งแล้วอย่างถาวร</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>สมาชิกกลุ่มสามารถส่งข้อความโดยตรงได้</target>
@@ -3581,6 +3617,10 @@ This is your link for group %@!</source>
<target>เครือข่ายและเซิร์ฟเวอร์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>การตั้งค่าเครือข่าย</target>
@@ -3688,6 +3728,10 @@ This is your link for group %@!</source>
<target>ไม่มีประวัติ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>ไม่อนุญาตให้บันทึกข้อความเสียง</target>
@@ -3892,6 +3936,10 @@ This is your link for group %@!</source>
<source>Or show this code</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>จํานวน PING</target>
@@ -4142,6 +4190,10 @@ Error: %@</source>
<target>ห้ามแสดงปฏิกิริยาต่อข้อความ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>ห้ามส่งข้อความโดยตรงถึงสมาชิก</target>
@@ -4268,6 +4320,10 @@ Error: %@</source>
<target>ที่อยู่ผู้รับจะถูกเปลี่ยนเป็นเซิร์ฟเวอร์อื่น การเปลี่ยนแปลงที่อยู่จะเสร็จสมบูรณ์หลังจากที่ผู้ส่งออนไลน์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>การรับไฟล์จะหยุดลง</target>
@@ -4282,6 +4338,10 @@ Error: %@</source>
<source>Recent history and improved [directory bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>ผู้รับจะเห็นการอัปเดตเมื่อคุณพิมพ์</target>
@@ -4574,11 +4634,19 @@ Error: %@</source>
<target>บันทึกข้อความต้อนรับ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>เซิร์ฟเวอร์ WebRTC ICE ที่บันทึกไว้จะถูกลบออก</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<note>message info title</note>
@@ -4989,6 +5057,14 @@ Error: %@</source>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>ลิงก์ SimpleX</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5785,6 +5861,10 @@ To connect, please ask your contact to create another connection link and check
<target>ข้อความเสียงเป็นสิ่งต้องห้ามในกลุ่มนี้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>ห้ามข้อความเสียง!</target>
@@ -5862,6 +5942,14 @@ To connect, please ask your contact to create another connection link and check
<target>เมื่อคุณแชร์โปรไฟล์ที่ไม่ระบุตัวตนกับใครสักคน โปรไฟล์นี้จะใช้สำหรับกลุ่มที่พวกเขาเชิญคุณ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<note>No comment provided by engineer.</note>
@@ -6323,6 +6411,10 @@ SimpleX servers cannot see your profile.</source>
<target>ผู้ดูแลระบบ</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>ยอมรับ encryption สำหรับ %@…</target>
@@ -6333,6 +6425,10 @@ SimpleX servers cannot see your profile.</source>
<target>เห็นด้วยกับการ encryption…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>เสมอ</target>
@@ -6653,6 +6749,10 @@ SimpleX servers cannot see your profile.</source>
<source>event happened</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>ลบกลุ่มแล้ว</target>
@@ -6859,6 +6959,10 @@ SimpleX servers cannot see your profile.</source>
<target>เจ้าของ</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>เพื่อนต่อเพื่อน</target>
@@ -6906,6 +7010,14 @@ SimpleX servers cannot see your profile.</source>
<target>ลบคุณออกแล้ว</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>วินาที</target>
@@ -7038,6 +7150,10 @@ SimpleX servers cannot see your profile.</source>
<target>ใช่</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>คุณได้รับเชิญให้เข้าร่วมกลุ่ม</target>
@@ -99,7 +99,7 @@
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@, %2$@ de</target>
<target>1$@, %2$@'de:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ connected" xml:space="preserve">
@@ -109,6 +109,7 @@
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve">
<source>%@ downloaded</source>
<target>%@ indirildi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
@@ -133,6 +134,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ yüklendi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@@ -302,7 +304,7 @@
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve">
<source>%u messages skipped.</source>
<target>%u mesaj atlandı</target>
<target>%u mesajlar atlandı.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
@@ -352,6 +354,7 @@
</trans-unit>
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve">
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
<target>**Lütfen dikkat**: Aynı veritabanını iki cihazda kullanmak, güvenlik koruması olarak bağlantılarınızdaki mesajların şifresinin çözülmesini engelleyecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
@@ -371,6 +374,7 @@
</trans-unit>
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve">
<source>**Warning**: the archive will be removed.</source>
<target>**Uyarı**: arşiv silinecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
@@ -631,6 +635,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>Yöneticiler bir üyeyi tamamen engelleyebilirler.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -690,6 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Tüm kişileriniz, sohbetleriniz ve dosyalarınız güvenli bir şekilde şifrelenecek ve parçalar halinde yapılandırılmış XFTP rölelerine yüklenecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -737,6 +743,10 @@
<target>Gönderilen mesajların kalıcı olarak silinmesine izin ver. (24 saat içinde)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Dosya ve medya göndermeye izin ver.</target>
@@ -799,7 +809,7 @@
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Her zaman yönlendirici kulan</target>
<target>Her zaman yönlendirici kullan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="An empty chat profile with the provided name is created, and the app opens as usual." xml:space="preserve">
@@ -819,6 +829,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>Uygulama verisi taşıma</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -858,14 +869,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>Uygula</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>Arşivle ve yükle</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>Veritabanı arşivleniyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1060,6 +1074,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>Taşımayı iptal et</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1072,6 +1087,10 @@
<target>Dosya alınamıyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>Değiştir</target>
@@ -1165,6 +1184,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>Sohbet taşındı!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1189,6 +1209,7 @@
</trans-unit>
<trans-unit id="Choose _Migrate from another device_ on the new device and scan QR code." xml:space="preserve">
<source>Choose _Migrate from another device_ on the new device and scan QR code.</source>
<target>Yeni cihazda _Başka bir cihazdan taşı_ seçeneğini seçin ve QR kodunu tarayın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Choose file" xml:space="preserve">
@@ -1263,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>Ağ ayarlarını onaylayın</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1277,10 +1299,12 @@
</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>Taşımak için veritabanı parolasını hatırladığınızı doğrulayın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>Yüklemeyi onayla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1544,6 +1568,7 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Arşiv bağlantısı oluşturuluyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1768,6 +1793,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>Veritabanını bu cihazdan sil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -2060,8 +2086,13 @@ Bu geri alınamaz!</target>
<target>Sürüm düşür ve sohbeti aç</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>Yükleme başarısız oldu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2071,10 +2102,12 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>Arşiv indiriliyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>Bağlantı detayları indiriliyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2134,6 +2167,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>Doğrudan sohbetlerde etkinleştirin (BETA)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2166,6 +2200,10 @@ Bu geri alınamaz!</target>
<target>Kendini imha şifresini etkinleştir</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>Şifreleme</target>
@@ -2253,6 +2291,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>Parolayı girin</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2317,6 +2356,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
<source>Error allowing contact PQ encryption</source>
<target>İletişim PQ şifrelemesine izin verirken hata oluştu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2411,6 +2451,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>Arşiv indirilirken hata oluştu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2490,6 +2531,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>Ayarlar kaydedilirken hata oluştu</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2564,10 +2606,12 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>Arşiv yüklenirken hata oluştu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Parola doğrulanırken hata oluştu:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2622,6 +2666,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>Dışa aktarılan dosya mevcut değil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2684,6 +2729,10 @@ Bu geri alınamaz!</target>
<target>Dosyalar ve medya bu grupta yasaklandı.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Dosyalar ve medya yasaklandı!</target>
@@ -2696,10 +2745,12 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>Taşıma işlemini sonlandır</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>Taşıma işlemini başka bir cihazda sonlandırın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2747,6 +2798,18 @@ Bu geri alınamaz!</target>
<target>Konsol için</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Bilgisayar bulundu</target>
@@ -2857,6 +2920,10 @@ Bu geri alınamaz!</target>
<target>Grup üyeleri, gönderilen mesajları kalıcı olarak silebilir. (24 saat içinde)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>Grup üyeleri doğrudan mesajlar gönderebilir.</target>
@@ -2994,6 +3061,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Hungarian interface" xml:space="preserve">
<source>Hungarian interface</source>
<target>Macarca arayüz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
@@ -3063,10 +3131,12 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>İçe aktarma başarısız oldu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>Arşiv içe aktarılıyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3086,6 +3156,7 @@ Bu geri alınamaz!</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>Devam etmek için sohbetin durdurulması gerekiyor.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3202,6 +3273,7 @@ Bu geri alınamaz!</target>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>Geçersiz taşıma onayı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3574,6 +3646,7 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>Mesaj çok büyük</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3593,34 +3666,42 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Mesajlar, dosyalar ve aramalar **uçtan uca şifreleme** ile mükemmel ileri gizlilik, inkar ve izinsiz giriş kurtarma ile korunur.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
<target>Mesajlar, dosyalar ve aramalar **kuantum dirençli e2e şifreleme** ile mükemmel ileri gizlilik, inkar ve zorla girme kurtarma ile korunur.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>Cihazı taşıma</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>Başka bir cihazdan geçiş yapın</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>Buraya göç edin</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>Başka bir cihaza taşıma</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>QR kodu aracılığıyla başka bir cihaza geçiş yapın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>Göçmenlik</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3630,6 +3711,7 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>Geçiş tamamlandı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3707,6 +3789,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Ağ &amp; sunucular</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>Ağ ayarları</target>
@@ -3817,6 +3903,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Geçmiş yok</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Sesli mesaj kaydetmek için izin yok</target>
@@ -3993,6 +4083,7 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
<source>Open migration to another device</source>
<target>Başka bir cihaza açık geçiş</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Open user profiles" xml:space="preserve">
@@ -4012,6 +4103,7 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>Veya arşiv bağlantısını yapıştırın</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4021,6 +4113,7 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Veya bu dosya bağlantısını güvenli bir şekilde paylaşın</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4028,6 +4121,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Veya bu kodu göster</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING sayısı</target>
@@ -4110,6 +4207,7 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>Resim içinde resim aramaları</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">
@@ -4134,6 +4232,7 @@ Bu senin grup için bağlantın %@!</target>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>Lütfen bu cihaz için ağ ayarlarının doğru olduğunu onaylayın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4195,6 +4294,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
<source>Post-quantum E2EE</source>
<target>Kuantum sonrası E2EE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -4287,6 +4387,10 @@ Hata: %@</target>
<target>Mesajlarda tepkileri yasakla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Geri dönülmez mesaj silme işlemini yasakla.</target>
@@ -4334,10 +4438,12 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Push server" xml:space="preserve">
<source>Push server</source>
<target>Push sunucu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>Kuantum dirençli şifreleme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4387,7 +4493,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Receipts are disabled" xml:space="preserve">
<source>Receipts are disabled</source>
<target>Görüldü devre dışı bırakıldı</target>
<target>Makbuzlar devre dışı bırakıldı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Received at" xml:space="preserve">
@@ -4415,6 +4521,10 @@ Hata: %@</target>
<target>Alıcı adresi farklı bir sunucuya değiştirilecektir. Gönderici çevrimiçi olduktan sonra adres değişikliği tamamlanacaktır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Dosya alımı durdurulacaktır.</target>
@@ -4430,6 +4540,10 @@ Hata: %@</target>
<target>Yakın geçmiş ve geliştirilmiş [dizin botu](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex. im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Alıcılar yazdığına göre güncellemeleri görecektir.</target>
@@ -4527,10 +4641,12 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Tekrar indir</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>İthalatı tekrarla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4540,6 +4656,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Yüklemeyi tekrarla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4644,6 +4761,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>Daha güvenli gruplar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4726,11 +4844,19 @@ Hata: %@</target>
<target>Hoşgeldin mesajı kaydedilsin mi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>Kaydedilmiş WebRTC ICE sunucuları silinecek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>Kaydedilmiş mesaj</target>
@@ -4903,7 +5029,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>Görüldü bilgisi n kişileri için etkinleştirilecektir.</target>
<target>Teslimat makbuzlarının gönderilmesi tüm kişiler için etkinleştirilecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
@@ -5013,6 +5139,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>Parolayı ayarla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5072,6 +5199,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>QR kodunu göster</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5152,6 +5280,14 @@ Hata: %@</target>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX bağlantıları</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5216,6 +5352,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>Sohbeti kes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5260,6 +5397,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>Sohbeti durdurma</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5289,7 +5427,7 @@ Hata: %@</target>
</trans-unit>
<trans-unit id="TCP_KEEPCNT" xml:space="preserve">
<source>TCP_KEEPCNT</source>
<target>TCP_CNTYİTUT</target>
<target>TCP_KEEPCNT</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP_KEEPIDLE" xml:space="preserve">
@@ -5511,10 +5649,12 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>Bu sohbet uçtan uca şifreleme ile korunmaktadır.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>Bu sohbet kuantum dirençli uçtan uca şifreleme ile korunmaktadır.</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5524,8 +5664,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
</trans-unit>
<trans-unit id="This display name is invalid. Please choose another name." xml:space="preserve">
<source>This display name is invalid. Please choose another name.</source>
<target>Görünen ad geçerli değil.
Lütfen başka bir ad seç.</target>
<target>Bu görünen ad geçersiz. Lütfen başka bir isim seçin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
@@ -5814,6 +5953,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>Yükleme başarısız</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5823,6 +5963,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>Arşiv yükleme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5877,6 +6018,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>Görüşme sırasında uygulamayı kullanın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5916,10 +6058,12 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Veritabanı parolasını doğrulayın</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Parolayı doğrula</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -5982,6 +6126,10 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<target>Bu grupta sesli mesajlar yasaktır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>Sesli mesajlar yasaktır!</target>
@@ -6014,6 +6162,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Uyarı: birden fazla cihazda sohbet başlatmak desteklenmez ve mesaj teslim hatalarına neden olur</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6038,6 +6187,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>Hoş geldiniz mesajı çok uzun</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6060,6 +6210,14 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<target>Biriyle gizli bir profil paylaştığınızda, bu profil sizi davet ettikleri gruplar için kullanılacaktır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>Şifrelenmiş dosyalar ve medya ile birlikte.</target>
@@ -6097,6 +6255,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
</trans-unit>
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
<source>You **must not** use the same database on two devices.</source>
<target>Aynı veritabanını iki cihazda **kullanmamalısınız**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
@@ -6188,6 +6347,7 @@ Katılma isteği tekrarlansın mı?</target>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>Bir kez daha deneyebilirsiniz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6309,7 +6469,7 @@ Bağlantı isteği tekrarlansın mı?</target>
</trans-unit>
<trans-unit id="You rejected group invitation" xml:space="preserve">
<source>You rejected group invitation</source>
<target>Grup davetini reddettiniz.</target>
<target>Grup davetini reddettiniz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You sent group invitation" xml:space="preserve">
@@ -6541,6 +6701,10 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>yönetici</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>%@ için şifreleme kabul ediliyor…</target>
@@ -6551,6 +6715,10 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>şifreleme kabul ediliyor…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>her zaman</target>
@@ -6881,6 +7049,10 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>etkinlik yaşandı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>grup silindi</target>
@@ -7088,6 +7260,10 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>sahip</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>eşler arası</target>
@@ -7095,6 +7271,7 @@ SimpleX sunucuları profilinizi göremez.</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>kuantuma dayanıklı e2e şifreleme</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7137,6 +7314,14 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>sen kaldırıldın</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>sn</target>
@@ -7174,6 +7359,7 @@ SimpleX sunucuları profilinizi göremez.</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>standart uçtan uca şifreleme</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7276,6 +7462,10 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>evet</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>gruba davet edildiniz</target>
File diff suppressed because it is too large Load Diff
@@ -728,6 +728,10 @@
<target>允许不可撤回地删除已发送消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>允许发送文件和媒体。</target>
@@ -1063,6 +1067,10 @@
<target>无法接收文件</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<source>Change</source>
<target>更改</target>
@@ -2039,6 +2047,10 @@ This cannot be undone!</source>
<target>降级并打开聊天</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<note>No comment provided by engineer.</note>
@@ -2145,6 +2157,10 @@ This cannot be undone!</source>
<target>启用自毁密码</target>
<note>set passcode view</note>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
<source>Encrypt</source>
<target>加密</target>
@@ -2658,6 +2674,10 @@ This cannot be undone!</source>
<target>此群组中禁止文件和媒体。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>禁止文件和媒体!</target>
@@ -2721,6 +2741,18 @@ This cannot be undone!</source>
<target>用于控制台</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>找到了桌面</target>
@@ -2830,6 +2862,10 @@ This cannot be undone!</source>
<target>群组成员可以不可撤回地删除已发送的消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
<source>Group members can send direct messages.</source>
<target>群组成员可以私信。</target>
@@ -3673,6 +3709,10 @@ This is your link for group %@!</source>
<target>网络和服务器</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
<source>Network settings</source>
<target>网络设置</target>
@@ -3783,6 +3823,10 @@ This is your link for group %@!</source>
<target>无历史记录</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>没有录制语音消息的权限</target>
@@ -3993,6 +4037,10 @@ This is your link for group %@!</source>
<target>或者显示此码</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING 次数</target>
@@ -4248,6 +4296,10 @@ Error: %@</source>
<target>禁止消息回应。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
<source>Prohibit sending SimpleX links.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>禁止向成员发送私信。</target>
@@ -4376,6 +4428,10 @@ Error: %@</source>
<target>接收地址将变更到不同的服务器。地址更改将在发件人上线后完成。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>即将停止接收文件。</target>
@@ -4390,6 +4446,10 @@ Error: %@</source>
<source>Recent history and improved [directory bot](simplex:/contact#/?v=1-4&amp;smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>对方会在您键入时看到更新。</target>
@@ -4686,11 +4746,19 @@ Error: %@</source>
<target>保存欢迎信息?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
<source>Saved WebRTC ICE servers will be removed</source>
<target>已保存的WebRTC ICE服务器将被删除</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
<source>Saved message</source>
<target>已保存的消息</target>
@@ -5112,6 +5180,14 @@ Error: %@</source>
<trans-unit id="SimpleX links" xml:space="preserve">
<source>SimpleX links</source>
<target>SimpleX 链接</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5939,6 +6015,10 @@ To connect, please ask your contact to create another connection link and check
<target>语音信息在该群组中被禁用。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
<source>Voice messages prohibited!</source>
<target>语音消息禁止发送!</target>
@@ -6016,6 +6096,14 @@ To connect, please ask your contact to create another connection link and check
<target>当您与某人共享隐身聊天资料时,该资料将用于他们邀请您加入的群组。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
<source>With encrypted files and media.</source>
<target>加密的文件和媒体。</target>
@@ -6487,6 +6575,10 @@ SimpleX 服务器无法看到您的资料。</target>
<target>管理员</target>
<note>member role</note>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>正在协商将加密应用于 %@…</target>
@@ -6497,6 +6589,10 @@ SimpleX 服务器无法看到您的资料。</target>
<target>同意加密…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>始终</target>
@@ -6825,6 +6921,10 @@ SimpleX 服务器无法看到您的资料。</target>
<target>发生的事</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
<source>group deleted</source>
<target>群组已删除</target>
@@ -7031,6 +7131,10 @@ SimpleX 服务器无法看到您的资料。</target>
<target>群主</target>
<note>member role</note>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
<source>peer-to-peer</source>
<target>点对点</target>
@@ -7080,6 +7184,14 @@ SimpleX 服务器无法看到您的资料。</target>
<target>已将您移除</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
<source>saved from %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="sec" xml:space="preserve">
<source>sec</source>
<target>秒</target>
@@ -7217,6 +7329,10 @@ SimpleX 服务器无法看到您的资料。</target>
<target>是</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>您被邀请加入群组</target>
@@ -1,64 +0,0 @@
//
// ConcurrentQueue.swift
// SimpleX NSE
//
// Created by Evgeny on 08/12/2023.
// Copyright © 2023 SimpleX Chat. All rights reserved.
//
import Foundation
struct DequeueElement<T> {
var elementId: UUID?
var task: Task<T?, Never>
}
class ConcurrentQueue<T> {
private var queue: [T] = []
private var queueLock = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.concurrent-queue.lock.\(UUID())")
private var continuations = [(elementId: UUID, continuation: CheckedContinuation<T?, Never>)]()
func enqueue(_ el: T) {
resumeContinuation(el) { self.queue.append(el) }
}
func frontEnqueue(_ el: T) {
resumeContinuation(el) { self.queue.insert(el, at: 0) }
}
private func resumeContinuation(_ el: T, add: @escaping () -> Void) {
queueLock.sync {
if let (_, cont) = continuations.first {
continuations.remove(at: 0)
cont.resume(returning: el)
} else {
add()
}
}
}
func dequeue() -> DequeueElement<T> {
queueLock.sync {
if queue.isEmpty {
let elementId = UUID()
let task = Task {
await withCheckedContinuation { cont in
continuations.append((elementId, cont))
}
}
return DequeueElement(elementId: elementId, task: task)
} else {
let el = queue.remove(at: 0)
return DequeueElement(task: Task { el })
}
}
}
func cancelDequeue(_ elementId: UUID) {
queueLock.sync {
let cancelled = continuations.filter { $0.elementId == elementId }
continuations.removeAll { $0.elementId == elementId }
cancelled.forEach { $0.continuation.resume(returning: nil) }
}
}
}
+73 -134
View File
@@ -22,110 +22,6 @@ let nseSuspendSchedule: SuspendSchedule = (2, 4)
let fastNSESuspendSchedule: SuspendSchedule = (1, 1)
typealias NtfStream = ConcurrentQueue<NSENotification>
// Notifications are delivered via concurrent queues, as they are all received from chat controller in a single loop that
// writes to ConcurrentQueue and when notification is processed, the instance of Notification service extension reads from the queue.
// One queue per connection (entity) is used.
// The concurrent queues allow read cancellation, to ensure that notifications are not lost in case the current thread completes
// before expected notification is read (multiple notifications can be expected, because one notification can be delivered for several messages).
actor PendingNtfs {
static let shared = PendingNtfs()
private var ntfStreams: [String: NtfStream] = [:]
func createStream(_ id: String) async {
logger.debug("NotificationService PendingNtfs.createStream: \(id)")
if ntfStreams[id] == nil {
ntfStreams[id] = ConcurrentQueue()
logger.debug("NotificationService PendingNtfs.createStream: created ConcurrentQueue")
}
}
func readStream(_ id: String, for nse: NotificationService, ntfInfo: NtfMessages) async {
logger.debug("NotificationService PendingNtfs.readStream: \(id) \(ntfInfo.ntfMessages.count)")
if !ntfInfo.user.showNotifications {
nse.setBestAttemptNtf(.empty)
}
if let s = ntfStreams[id] {
logger.debug("NotificationService PendingNtfs.readStream: has stream")
var expected = Set(ntfInfo.ntfMessages.map { $0.msgId })
logger.debug("NotificationService PendingNtfs.readStream: expecting: \(expected)")
var readCancelled = false
var dequeued: DequeueElement<NSENotification>?
nse.cancelRead = {
readCancelled = true
if let elementId = dequeued?.elementId {
s.cancelDequeue(elementId)
}
}
while !readCancelled {
dequeued = s.dequeue()
if let ntf = await dequeued?.task.value {
if readCancelled {
logger.debug("NotificationService PendingNtfs.readStream: read cancelled, put ntf to queue front")
s.frontEnqueue(ntf)
break
} else if case let .msgInfo(info) = ntf {
let found = expected.remove(info.msgId)
if found != nil {
logger.debug("NotificationService PendingNtfs.readStream: msgInfo, last: \(expected.isEmpty)")
if expected.isEmpty { break }
} else if let msgTs = ntfInfo.msgTs, info.msgTs > msgTs {
logger.debug("NotificationService PendingNtfs.readStream: unexpected msgInfo")
s.frontEnqueue(ntf)
break
}
} else if ntfInfo.user.showNotifications {
logger.debug("NotificationService PendingNtfs.readStream: setting best attempt")
nse.setBestAttemptNtf(ntf)
if ntf.isCallInvitation { break }
}
} else {
break
}
}
nse.cancelRead = nil
logger.debug("NotificationService PendingNtfs.readStream: exiting")
}
}
func writeStream(_ id: String, _ ntf: NSENotification) async {
logger.debug("NotificationService PendingNtfs.writeStream: \(id)")
if let s = ntfStreams[id] {
logger.debug("NotificationService PendingNtfs.writeStream: writing ntf")
s.enqueue(ntf)
}
}
}
// The current implementation assumes concurrent notification delivery and uses semaphores
// to process only one notification per connection (entity) at a time.
class NtfStreamSemaphores {
static let shared = NtfStreamSemaphores()
private static let queue = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.notification-semaphores.lock")
private var semaphores: [String: DispatchSemaphore] = [:]
func waitForStream(_ id: String) {
streamSemaphore(id, value: 0)?.wait()
}
func signalStreamReady(_ id: String) {
streamSemaphore(id, value: 1)?.signal()
}
// this function returns nil if semaphore is just created, so passed value shoud be coordinated with the desired end value of the semaphore
private func streamSemaphore(_ id: String, value: Int) -> DispatchSemaphore? {
NtfStreamSemaphores.queue.sync {
if let s = semaphores[id] {
return s
} else {
semaphores[id] = DispatchSemaphore(value: value)
return nil
}
}
}
}
enum NSENotification {
case nse(UNMutableNotificationContent)
case callkit(RcvCallInvitation)
@@ -149,7 +45,7 @@ class NSEThreads {
static let shared = NSEThreads()
private static let queue = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.notification-threads.lock")
private var allThreads: Set<UUID> = []
private var activeThreads: Set<UUID> = []
private var activeThreads: [(UUID, NotificationService)] = []
func newThread() -> UUID {
NSEThreads.queue.sync {
@@ -158,19 +54,42 @@ class NSEThreads {
}
}
func startThread(_ t: UUID) {
func startThread(_ t: UUID, _ service: NotificationService) {
NSEThreads.queue.sync {
if allThreads.contains(t) {
_ = activeThreads.insert(t)
activeThreads.append((t, service))
} else {
logger.warning("NotificationService startThread: thread \(t) was removed before it started")
}
}
}
func processNotification(_ id: ChatId, _ ntf: NSENotification) async -> Void {
var waitTime: Int64 = 5_000_000000
while waitTime > 0 {
if let (_, nse) = rcvEntityThread(id),
nse.shouldProcessNtf && nse.processReceivedNtf(ntf) {
break
} else {
try? await Task.sleep(nanoseconds: 10_000000)
waitTime -= 10_000000
}
}
}
private func rcvEntityThread(_ id: ChatId) -> (UUID, NotificationService)? {
NSEThreads.queue.sync {
activeThreads.first(where: { (_, nse) in nse.receiveEntityId == id })
}
}
func endThread(_ t: UUID) -> Bool {
NSEThreads.queue.sync {
let tActive = activeThreads.remove(t)
let tActive: UUID? = if let index = activeThreads.firstIndex(where: { $0.0 == t }) {
activeThreads.remove(at: index).0
} else {
nil
}
let t = allThreads.remove(t)
if tActive != nil && activeThreads.isEmpty {
return true
@@ -198,8 +117,11 @@ class NotificationService: UNNotificationServiceExtension {
// thread is added to allThreads here - if thread did not start chat,
// chat does not need to be suspended but NSE state still needs to be set to "suspended".
var threadId: UUID? = NSEThreads.shared.newThread()
var notificationInfo: NtfMessages?
var receiveEntityId: String?
var cancelRead: (() -> Void)?
var expectedMessages: Set<String> = []
// return true if the message is taken - it prevents sending it to another NotificationService instance for processing
var shouldProcessNtf = false
var appSubscriber: AppSubscriber?
var returnedSuspension = false
@@ -265,7 +187,7 @@ class NotificationService: UNNotificationServiceExtension {
// check it here again
appStateGroupDefault.get().inactive {
// thread is added to activeThreads tracking set here - if thread started chat it needs to be suspended
if let t = threadId { NSEThreads.shared.startThread(t) }
if let t = threadId { NSEThreads.shared.startThread(t, self) }
let dbStatus = startChat()
if case .ok = dbStatus,
let ntfInfo = apiGetNtfMessage(nonce: nonce, encNtfInfo: encNtfInfo) {
@@ -276,17 +198,11 @@ class NotificationService: UNNotificationServiceExtension {
? .nse(createConnectionEventNtf(ntfInfo.user, connEntity))
: .empty
)
if let id = connEntity.id {
if let id = connEntity.id, ntfInfo.msgTs != nil {
notificationInfo = ntfInfo
receiveEntityId = id
NtfStreamSemaphores.shared.waitForStream(id)
if receiveEntityId != nil {
Task {
logger.debug("NotificationService: receiveNtfMessages: in Task, connEntity id \(id)")
await PendingNtfs.shared.createStream(id)
await PendingNtfs.shared.readStream(id, for: self, ntfInfo: ntfInfo)
deliverBestAttemptNtf()
}
}
expectedMessages = Set(ntfInfo.ntfMessages.map { $0.msgId })
shouldProcessNtf = true
return
}
}
@@ -302,6 +218,38 @@ class NotificationService: UNNotificationServiceExtension {
deliverBestAttemptNtf(urgent: true)
}
func processReceivedNtf(_ ntf: NSENotification) -> Bool {
guard let ntfInfo = notificationInfo, let msgTs = ntfInfo.msgTs else { return false }
if !ntfInfo.user.showNotifications {
self.setBestAttemptNtf(.empty)
}
if case let .msgInfo(info) = ntf {
let found = expectedMessages.remove(info.msgId)
if found != nil {
logger.debug("NotificationService processNtf: msgInfo, last: \(self.expectedMessages.isEmpty)")
if expectedMessages.isEmpty {
self.deliverBestAttemptNtf()
}
return true
} else if info.msgTs > msgTs {
logger.debug("NotificationService processNtf: unexpected msgInfo, let other instance to process it, stopping this one")
self.deliverBestAttemptNtf()
return false
} else {
logger.debug("NotificationService processNtf: unknown message, let other instance to process it")
return false
}
} else if ntfInfo.user.showNotifications {
logger.debug("NotificationService processNtf: setting best attempt")
self.setBestAttemptNtf(ntf)
if ntf.isCallInvitation {
self.deliverBestAttemptNtf()
}
return true
}
return false
}
func setBadgeCount() {
badgeCount = ntfBadgeCountGroupDefault.get() + 1
ntfBadgeCountGroupDefault.set(badgeCount)
@@ -323,14 +271,9 @@ class NotificationService: UNNotificationServiceExtension {
private func deliverBestAttemptNtf(urgent: Bool = false) {
logger.debug("NotificationService.deliverBestAttemptNtf")
if let cancel = cancelRead {
cancelRead = nil
cancel()
}
if let id = receiveEntityId {
receiveEntityId = nil
NtfStreamSemaphores.shared.signalStreamReady(id)
}
// stop processing other messages
shouldProcessNtf = false
let suspend: Bool
if let t = threadId {
threadId = nil
@@ -572,7 +515,7 @@ func chatSuspended() {
}
// A single loop is used per Notification service extension process to receive and process all messages depending on the NSE state
// If the extension is not active yet, or suspended/suspending, or the app is running, the notifications will no be received.
// If the extension is not active yet, or suspended/suspending, or the app is running, the notifications will not be received.
func receiveMessages() async {
logger.debug("NotificationService receiveMessages")
while true {
@@ -591,8 +534,7 @@ func receiveMessages() async {
logger.debug("NotificationService receiveMsg: message")
if let (id, ntf) = await receivedMsgNtf(msg) {
logger.debug("NotificationService receiveMsg: notification")
await PendingNtfs.shared.createStream(id)
await PendingNtfs.shared.writeStream(id, ntf)
await NSEThreads.shared.processNotification(id, ntf)
}
}
}
@@ -644,9 +586,6 @@ func receivedMsgNtf(_ res: ChatResponse) async -> (String, NSENotification)? {
cleanupDirectFile(aChatItem)
}
return nil
case let .sndFileCompleteXFTP(_, aChatItem, _):
cleanupFile(aChatItem)
return nil
case let .callInvitation(invitation):
// Do not post it without CallKit support, iOS will stop launching the app without showing CallKit
return (
+74 -37
View File
@@ -29,6 +29,11 @@
5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; };
5C13730B28156D2700F43030 /* ContactConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C13730A28156D2700F43030 /* ContactConnectionView.swift */; };
5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; };
5C2217842BD4465500A8B0E7 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C22177F2BD4465500A8B0E7 /* libgmpxx.a */; };
5C2217852BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217802BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a */; };
5C2217862BD4465500A8B0E7 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217812BD4465500A8B0E7 /* libgmp.a */; };
5C2217872BD4465500A8B0E7 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217822BD4465500A8B0E7 /* libffi.a */; };
5C2217882BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2217832BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a */; };
5C2E260727A2941F00F70299 /* SimpleXAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260627A2941F00F70299 /* SimpleXAPI.swift */; };
5C2E260B27A30CFA00F70299 /* ChatListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260A27A30CFA00F70299 /* ChatListView.swift */; };
5C2E260F27A30FDC00F70299 /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260E27A30FDC00F70299 /* ChatView.swift */; };
@@ -36,11 +41,6 @@
5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFC727B2782E00FB6C6D /* BGManager.swift */; };
5C35CFCB27B2E91D00FB6C6D /* NtfManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */; };
5C36027327F47AD5009F19D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C36027227F47AD5009F19D9 /* AppDelegate.swift */; };
5C371E6A2BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E652BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH.a */; };
5C371E6B2BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E662BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH-ghc9.6.3.a */; };
5C371E6C2BA9FDFA00100AD3 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E672BA9FDFA00100AD3 /* libgmpxx.a */; };
5C371E6D2BA9FDFA00100AD3 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E682BA9FDFA00100AD3 /* libffi.a */; };
5C371E6E2BA9FDFA00100AD3 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E692BA9FDFA00100AD3 /* libgmp.a */; };
5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */; };
5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; };
5C3CCFCC2AE6BD3100C3F0C3 /* ConnectDesktopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */; };
@@ -144,7 +144,6 @@
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 */; };
5CF9371E2B23429500E1D781 /* ConcurrentQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */; };
5CF937202B24DE8C00E1D781 /* SharedFileSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */; };
5CF937232B2503D000E1D781 /* NSESubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF937212B25034A00E1D781 /* NSESubscriber.swift */; };
5CFA59C42860BC6200863A68 /* MigrateToAppGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */; };
@@ -173,6 +172,7 @@
646BB38E283FDB6D001CE359 /* LocalAuthenticationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 646BB38D283FDB6D001CE359 /* LocalAuthenticationUtils.swift */; };
647F090E288EA27B00644C40 /* GroupMemberInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647F090D288EA27B00644C40 /* GroupMemberInfoView.swift */; };
648010AB281ADD15009009B9 /* CIFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648010AA281ADD15009009B9 /* CIFileView.swift */; };
648679AB2BC96A74006456E7 /* ChatItemForwardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648679AA2BC96A74006456E7 /* ChatItemForwardingView.swift */; };
649BCDA0280460FD00C3A862 /* ComposeImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649BCD9F280460FD00C3A862 /* ComposeImageView.swift */; };
649BCDA22805D6EF00C3A862 /* CIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649BCDA12805D6EF00C3A862 /* CIImageView.swift */; };
64AA1C6927EE10C800AC7277 /* ContextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6827EE10C800AC7277 /* ContextItemView.swift */; };
@@ -188,6 +188,7 @@
8C69FE7D2B8C7D2700267E38 /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C69FE7C2B8C7D2700267E38 /* AppSettings.swift */; };
8C7D949A2B88952700B7B9E1 /* MigrateToDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7D94992B88952700B7B9E1 /* MigrateToDevice.swift */; };
8C7DF3202B7CDB0A00C886D0 /* MigrateFromDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7DF31F2B7CDB0A00C886D0 /* MigrateFromDevice.swift */; };
8CC956EE2BC0041000412A11 /* NetworkObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC956ED2BC0041000412A11 /* NetworkObserver.swift */; };
D7197A1829AE89660055C05A /* WebRTC in Frameworks */ = {isa = PBXBuildFile; productRef = D7197A1729AE89660055C05A /* WebRTC */; };
D72A9088294BD7A70047C86D /* NativeTextEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72A9087294BD7A70047C86D /* NativeTextEditor.swift */; };
D741547829AF89AF0022400A /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D741547729AF89AF0022400A /* StoreKit.framework */; };
@@ -278,6 +279,11 @@
5C13730A28156D2700F43030 /* ContactConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactConnectionView.swift; sourceTree = "<group>"; };
5C13730C2815740A00F43030 /* DebugJSON.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DebugJSON.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemView.swift; sourceTree = "<group>"; };
5C22177F2BD4465500A8B0E7 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C2217802BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a"; sourceTree = "<group>"; };
5C2217812BD4465500A8B0E7 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C2217822BD4465500A8B0E7 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C2217832BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a"; sourceTree = "<group>"; };
5C245F3C2B501E98001CC39F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
5C245F3D2B501F13001CC39F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = "tr.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
5C245F3E2B501F13001CC39F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -291,11 +297,6 @@
5C371E4E2BA9AAA200100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = "<group>"; };
5C371E4F2BA9AB6400100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
5C371E502BA9AB6400100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = "<group>"; };
5C371E652BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH.a"; sourceTree = "<group>"; };
5C371E662BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH-ghc9.6.3.a"; sourceTree = "<group>"; };
5C371E672BA9FDFA00100AD3 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C371E682BA9FDFA00100AD3 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C371E692BA9FDFA00100AD3 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetermineWidth.swift; sourceTree = "<group>"; };
5C3A88D027DF57800060F1C2 /* FramedItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramedItemView.swift; sourceTree = "<group>"; };
5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectDesktopView.swift; sourceTree = "<group>"; };
@@ -437,7 +438,6 @@
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>"; };
5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrentQueue.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>"; };
5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateToAppGroupView.swift; sourceTree = "<group>"; };
@@ -465,6 +465,7 @@
646BB38D283FDB6D001CE359 /* LocalAuthenticationUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAuthenticationUtils.swift; sourceTree = "<group>"; };
647F090D288EA27B00644C40 /* GroupMemberInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupMemberInfoView.swift; sourceTree = "<group>"; };
648010AA281ADD15009009B9 /* CIFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIFileView.swift; sourceTree = "<group>"; };
648679AA2BC96A74006456E7 /* ChatItemForwardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemForwardingView.swift; sourceTree = "<group>"; };
6493D667280ED77F007A76FB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
649BCD9F280460FD00C3A862 /* ComposeImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeImageView.swift; sourceTree = "<group>"; };
649BCDA12805D6EF00C3A862 /* CIImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIImageView.swift; sourceTree = "<group>"; };
@@ -482,6 +483,7 @@
8C69FE7C2B8C7D2700267E38 /* AppSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettings.swift; sourceTree = "<group>"; };
8C7D94992B88952700B7B9E1 /* MigrateToDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateToDevice.swift; sourceTree = "<group>"; };
8C7DF31F2B7CDB0A00C886D0 /* MigrateFromDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateFromDevice.swift; sourceTree = "<group>"; };
8CC956ED2BC0041000412A11 /* NetworkObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkObserver.swift; sourceTree = "<group>"; };
D72A9087294BD7A70047C86D /* NativeTextEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeTextEditor.swift; sourceTree = "<group>"; };
D741547729AF89AF0022400A /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; };
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; };
@@ -523,13 +525,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5C371E6A2BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH.a in Frameworks */,
5C371E6E2BA9FDFA00100AD3 /* libgmp.a in Frameworks */,
5C371E6D2BA9FDFA00100AD3 /* libffi.a in Frameworks */,
5C371E6C2BA9FDFA00100AD3 /* libgmpxx.a in Frameworks */,
5C371E6B2BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH-ghc9.6.3.a in Frameworks */,
5C2217842BD4465500A8B0E7 /* libgmpxx.a in Frameworks */,
5C2217872BD4465500A8B0E7 /* libffi.a in Frameworks */,
5C2217862BD4465500A8B0E7 /* libgmp.a in Frameworks */,
5C2217882BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
5C2217852BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -585,6 +587,7 @@
5CBE6C11294487F7002D9531 /* VerifyCodeView.swift */,
5CBE6C132944CC12002D9531 /* ScanCodeView.swift */,
64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */,
648679AA2BC96A74006456E7 /* ChatItemForwardingView.swift */,
);
path = Chat;
sourceTree = "<group>";
@@ -592,11 +595,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
5C371E682BA9FDFA00100AD3 /* libffi.a */,
5C371E692BA9FDFA00100AD3 /* libgmp.a */,
5C371E672BA9FDFA00100AD3 /* libgmpxx.a */,
5C371E662BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH-ghc9.6.3.a */,
5C371E652BA9FDFA00100AD3 /* libHSsimplex-chat-5.6.0.3-4nskXXUBgQ3Bvo5v4RfruH.a */,
5C2217822BD4465500A8B0E7 /* libffi.a */,
5C2217812BD4465500A8B0E7 /* libgmp.a */,
5C22177F2BD4465500A8B0E7 /* libgmpxx.a */,
5C2217802BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy-ghc9.6.3.a */,
5C2217832BD4465500A8B0E7 /* libHSsimplex-chat-5.7.0.1-4ZWOoOvQtRR3xwBSWKICWy.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -625,6 +628,7 @@
5CB346E82869E8BA001FD2EF /* PushEnvironment.swift */,
5C93293E2928E0FD0090FFF9 /* AudioRecPlay.swift */,
5CBD2859295711D700EC2CF4 /* ImageUtils.swift */,
8CC956ED2BC0041000412A11 /* NetworkObserver.swift */,
);
path = Model;
sourceTree = "<group>";
@@ -800,7 +804,6 @@
isa = PBXGroup;
children = (
5CDCAD5128186DE400503DA2 /* SimpleX NSE.entitlements */,
5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */,
5CDCAD472818589900503DA2 /* NotificationService.swift */,
5CDCAD492818589900503DA2 /* Info.plist */,
5CB0BA862826CB3A00B3292C /* InfoPlist.strings */,
@@ -1161,6 +1164,7 @@
5C10D88828EED12E00E58BF0 /* ContactConnectionInfo.swift in Sources */,
5CBE6C12294487F7002D9531 /* VerifyCodeView.swift in Sources */,
3CDBCF4227FAE51000354CDD /* ComposeLinkView.swift in Sources */,
648679AB2BC96A74006456E7 /* ChatItemForwardingView.swift in Sources */,
64466DC829FC2B3B00E3D48D /* CreateSimpleXAddress.swift in Sources */,
3CDBCF4827FF621E00354CDD /* CILinkView.swift in Sources */,
5C7505A827B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */,
@@ -1179,6 +1183,7 @@
5C9A5BDB2871E05400A5B906 /* SetNotificationsMode.swift in Sources */,
5CB0BA8E2827126500B3292C /* OnboardingView.swift in Sources */,
6442E0BE2880182D00CEC0F9 /* GroupChatInfoView.swift in Sources */,
8CC956EE2BC0041000412A11 /* NetworkObserver.swift in Sources */,
5C2E261227A30FEA00F70299 /* TerminalView.swift in Sources */,
5C9FD96E27A5D6ED0075386C /* SendMessageView.swift in Sources */,
5CA7DFC329302AF000F7FDDE /* AppSheet.swift in Sources */,
@@ -1285,7 +1290,6 @@
files = (
5CDCAD482818589900503DA2 /* NotificationService.swift in Sources */,
5CFE0922282EEAF60002594B /* ZoomableScrollView.swift in Sources */,
5CF9371E2B23429500E1D781 /* ConcurrentQueue.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1445,6 +1449,7 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
@@ -1506,6 +1511,7 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -1534,12 +1540,16 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_ENABLE_MODULES = YES;
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 203;
CURRENT_PROJECT_VERSION = 208;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
GCC_OPTIMIZATION_LEVEL = s;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
@@ -1558,11 +1568,13 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 5.6;
LLVM_LTO = YES_THIN;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
};
@@ -1577,12 +1589,16 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_ENABLE_MODULES = YES;
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 203;
CURRENT_PROJECT_VERSION = 208;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
ENABLE_CODE_COVERAGE = NO;
ENABLE_PREVIEWS = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
@@ -1601,7 +1617,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 5.6;
LLVM_LTO = YES;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1657,12 +1674,15 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 203;
CURRENT_PROJECT_VERSION = 208;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "SimpleX NSE/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "SimpleX NSE";
@@ -1673,13 +1693,15 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6;
LLVM_LTO = YES;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Osize";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
};
@@ -1689,12 +1711,15 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 203;
CURRENT_PROJECT_VERSION = 208;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "SimpleX NSE/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "SimpleX NSE";
@@ -1705,13 +1730,15 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.6;
LLVM_LTO = YES;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Osize";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VALIDATE_PRODUCT = YES;
@@ -1723,14 +1750,17 @@
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 203;
CURRENT_PROJECT_VERSION = 208;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 SimpleX Chat. All rights reserved.";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -1748,7 +1778,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Libraries/sim",
);
MARKETING_VERSION = 5.6;
LLVM_LTO = YES;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -1757,6 +1788,7 @@
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_INCLUDE_PATHS = "";
SWIFT_OBJC_BRIDGING_HEADER = ./SimpleXChat/SimpleX.h;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
@@ -1769,14 +1801,17 @@
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 203;
CURRENT_PROJECT_VERSION = 208;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 SimpleX Chat. All rights reserved.";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -1794,7 +1829,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Libraries/sim",
);
MARKETING_VERSION = 5.6;
LLVM_LTO = YES;
MARKETING_VERSION = 5.7;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -1803,6 +1839,7 @@
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_INCLUDE_PATHS = "";
SWIFT_OBJC_BRIDGING_HEADER = ./SimpleXChat/SimpleX.h;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
+5
View File
@@ -87,6 +87,11 @@ public func chatInitControllerRemovingDatabases() {
public func chatCloseStore() {
// Prevent crash when exiting the app with already closed store (for example, after changing a database passpharase)
guard hasChatCtrl() else {
logger.error("chatCloseStore: already closed, chatCtrl is nil")
return
}
let err = fromCString(chat_close_store(getChatCtrl()))
if err != "" {
logger.error("chatCloseStore error: \(err)")
+54 -16
View File
@@ -50,6 +50,7 @@ public enum ChatCommand {
case apiDeleteChatItem(type: ChatType, id: Int64, itemId: Int64, mode: CIDeleteMode)
case apiDeleteMemberChatItem(groupId: Int64, groupMemberId: Int64, itemId: Int64)
case apiChatItemReaction(type: ChatType, id: Int64, itemId: Int64, add: Bool, reaction: MsgReaction)
case apiForwardChatItem(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemId: Int64)
case apiGetNtfToken
case apiRegisterToken(token: DeviceToken, notificationMode: NotificationsMode)
case apiVerifyToken(token: DeviceToken, nonce: String, code: String)
@@ -77,6 +78,7 @@ public enum ChatCommand {
case apiGetChatItemTTL(userId: Int64)
case apiSetNetworkConfig(networkConfig: NetCfg)
case apiGetNetworkConfig
case apiSetNetworkInfo(networkInfo: UserNetworkInfo)
case reconnectAllServers
case apiSetChatSettings(type: ChatType, id: Int64, chatSettings: ChatSettings)
case apiSetMemberSettings(groupId: Int64, groupMemberId: Int64, memberSettings: GroupMemberSettings)
@@ -194,6 +196,7 @@ public enum ChatCommand {
case let .apiDeleteChatItem(type, id, itemId, mode): return "/_delete item \(ref(type, id)) \(itemId) \(mode.rawValue)"
case let .apiDeleteMemberChatItem(groupId, groupMemberId, itemId): return "/_delete member item #\(groupId) \(groupMemberId) \(itemId)"
case let .apiChatItemReaction(type, id, itemId, add, reaction): return "/_reaction \(ref(type, id)) \(itemId) \(onOff(add)) \(encodeJSON(reaction))"
case let .apiForwardChatItem(toChatType, toChatId, fromChatType, fromChatId, itemId): return "/_forward \(ref(toChatType, toChatId)) \(ref(fromChatType, fromChatId)) \(itemId)"
case .apiGetNtfToken: return "/_ntf get "
case let .apiRegisterToken(token, notificationMode): return "/_ntf register \(token.cmdString) \(notificationMode.rawValue)"
case let .apiVerifyToken(token, nonce, code): return "/_ntf verify \(token.cmdString) \(nonce) \(code)"
@@ -221,6 +224,7 @@ public enum ChatCommand {
case let .apiGetChatItemTTL(userId): return "/_ttl \(userId)"
case let .apiSetNetworkConfig(networkConfig): return "/_network \(encodeJSON(networkConfig))"
case .apiGetNetworkConfig: return "/network"
case let .apiSetNetworkInfo(networkInfo): return "/_network info \(encodeJSON(networkInfo))"
case .reconnectAllServers: return "/reconnect"
case let .apiSetChatSettings(type, id, chatSettings): return "/_settings \(ref(type, id)) \(encodeJSON(chatSettings))"
case let .apiSetMemberSettings(groupId, groupMemberId, memberSettings): return "/_member settings #\(groupId) \(groupMemberId) \(encodeJSON(memberSettings))"
@@ -341,6 +345,7 @@ public enum ChatCommand {
case .apiConnectContactViaAddress: return "apiConnectContactViaAddress"
case .apiDeleteMemberChatItem: return "apiDeleteMemberChatItem"
case .apiChatItemReaction: return "apiChatItemReaction"
case .apiForwardChatItem: return "apiForwardChatItem"
case .apiGetNtfToken: return "apiGetNtfToken"
case .apiRegisterToken: return "apiRegisterToken"
case .apiVerifyToken: return "apiVerifyToken"
@@ -368,6 +373,7 @@ public enum ChatCommand {
case .apiGetChatItemTTL: return "apiGetChatItemTTL"
case .apiSetNetworkConfig: return "apiSetNetworkConfig"
case .apiGetNetworkConfig: return "apiGetNetworkConfig"
case .apiSetNetworkInfo: return "apiSetNetworkInfo"
case .reconnectAllServers: return "reconnectAllServers"
case .apiSetChatSettings: return "apiSetChatSettings"
case .apiSetMemberSettings: return "apiSetMemberSettings"
@@ -557,11 +563,6 @@ public enum ChatResponse: Decodable, Error {
case contactRequestRejected(user: UserRef)
case contactUpdated(user: UserRef, toContact: Contact)
case groupMemberUpdated(user: UserRef, groupInfo: GroupInfo, fromMember: GroupMember, toMember: GroupMember)
// TODO remove events below
case contactsSubscribed(server: String, contactRefs: [ContactRef])
case contactsDisconnected(server: String, contactRefs: [ContactRef])
case contactSubSummary(user: UserRef, contactSubscriptions: [ContactSubStatus])
// TODO remove events above
case networkStatus(networkStatus: NetworkStatus, connections: [String])
case networkStatuses(user_: UserRef?, networkStatuses: [ConnNetworkStatus])
case groupSubscribed(user: UserRef, groupInfo: GroupRef)
@@ -724,9 +725,6 @@ public enum ChatResponse: Decodable, Error {
case .contactRequestRejected: return "contactRequestRejected"
case .contactUpdated: return "contactUpdated"
case .groupMemberUpdated: return "groupMemberUpdated"
case .contactsSubscribed: return "contactsSubscribed"
case .contactsDisconnected: return "contactsDisconnected"
case .contactSubSummary: return "contactSubSummary"
case .networkStatus: return "networkStatus"
case .networkStatuses: return "networkStatuses"
case .groupSubscribed: return "groupSubscribed"
@@ -885,9 +883,6 @@ public enum ChatResponse: Decodable, Error {
case .contactRequestRejected: return noDetails
case let .contactUpdated(u, toContact): return withUser(u, String(describing: toContact))
case let .groupMemberUpdated(u, groupInfo, fromMember, toMember): return withUser(u, "groupInfo: \(groupInfo)\nfromMember: \(fromMember)\ntoMember: \(toMember)")
case let .contactsSubscribed(server, contactRefs): return "server: \(server)\ncontacts:\n\(String(describing: contactRefs))"
case let .contactsDisconnected(server, contactRefs): return "server: \(server)\ncontacts:\n\(String(describing: contactRefs))"
case let .contactSubSummary(u, contactSubscriptions): return withUser(u, String(describing: contactSubscriptions))
case let .networkStatus(status, conns): return "networkStatus: \(String(describing: status))\nconnections: \(String(describing: conns))"
case let .networkStatuses(u, statuses): return withUser(u, String(describing: statuses))
case let .groupSubscribed(u, groupInfo): return withUser(u, String(describing: groupInfo))
@@ -1262,6 +1257,7 @@ public struct NetCfg: Codable, Equatable {
public var tcpConnectTimeout: Int // microseconds
public var tcpTimeout: Int // microseconds
public var tcpTimeoutPerKb: Int // microseconds
public var rcvConcurrency: Int // pool size
public var tcpKeepAlive: KeepAliveOpts?
public var smpPingInterval: Int // microseconds
public var smpPingCount: Int // times
@@ -1270,9 +1266,10 @@ public struct NetCfg: Codable, Equatable {
public static let defaults: NetCfg = NetCfg(
socksProxy: nil,
sessionMode: TransportSessionMode.user,
tcpConnectTimeout: 20_000_000,
tcpConnectTimeout: 10_000_000,
tcpTimeout: 15_000_000,
tcpTimeoutPerKb: 45_000,
tcpTimeoutPerKb: 10_000,
rcvConcurrency: 12,
tcpKeepAlive: KeepAliveOpts.defaults,
smpPingInterval: 1200_000_000,
smpPingCount: 3,
@@ -1282,9 +1279,10 @@ public struct NetCfg: Codable, Equatable {
public static let proxyDefaults: NetCfg = NetCfg(
socksProxy: nil,
sessionMode: TransportSessionMode.user,
tcpConnectTimeout: 30_000_000,
tcpConnectTimeout: 20_000_000,
tcpTimeout: 20_000_000,
tcpTimeoutPerKb: 60_000,
tcpTimeoutPerKb: 15_000,
rcvConcurrency: 8,
tcpKeepAlive: KeepAliveOpts.defaults,
smpPingInterval: 1200_000_000,
smpPingCount: 3,
@@ -1725,6 +1723,8 @@ public enum ChatErrorType: Decodable {
case fallbackToSMPProhibited(fileId: Int64)
case inlineFileProhibited(fileId: Int64)
case invalidQuote
case invalidForward
case forwardNoFile
case invalidChatItemUpdate
case invalidChatItemDelete
case hasCurrentCall
@@ -1827,6 +1827,7 @@ public enum AgentErrorType: Decodable {
case BROKER(brokerAddress: String, brokerErr: BrokerErrorType)
case AGENT(agentErr: SMPAgentError)
case INTERNAL(internalErr: String)
case CRITICAL(offerRestart: Bool, criticalErr: String)
case INACTIVE
}
@@ -1878,6 +1879,8 @@ public enum XFTPErrorType: Decodable {
case NO_FILE
case HAS_FILE
case FILE_IO
case TIMEOUT
case REDIRECT(redirectError: String)
case INTERNAL
}
@@ -1885,6 +1888,8 @@ public enum RCErrorType: Decodable {
case `internal`(internalErr: String)
case identity
case noLocalAddress
case newController
case notDiscovered
case tlsStartFailed
case exception(exception: String)
case ctrlAuth
@@ -1910,6 +1915,7 @@ public enum ProtocolTransportError: Decodable {
case badBlock
case largeMsg
case badSession
case noServerAuth
case handshake(handshakeErr: SMPHandshakeError)
}
@@ -1917,6 +1923,7 @@ public enum SMPHandshakeError: Decodable {
case PARSE
case VERSION
case IDENTITY
case BAD_AUTH
}
public enum SMPAgentError: Decodable {
@@ -1938,10 +1945,13 @@ public enum RemoteCtrlError: Decodable {
case badState
case busy
case timeout
case noKnownControllers
case badController
case disconnected(remoteCtrlId: Int64, reason: String)
case badInvitation
case badVersion(appVersion: String)
// case protocolError(protocolError: RemoteProtocolError)
case hTTP2Error(http2Error: String)
case protocolError
}
public struct MigrationFileLinkData: Codable {
@@ -2087,3 +2097,31 @@ public enum AppSettingsLockScreenCalls: String, Codable {
case show
case accept
}
public struct UserNetworkInfo: Codable, Equatable {
public let networkType: UserNetworkType
public let online: Bool
public init(networkType: UserNetworkType, online: Bool) {
self.networkType = networkType
self.online = online
}
}
public enum UserNetworkType: String, Codable {
case none
case cellular
case wifi
case ethernet
case other
public var text: LocalizedStringKey {
switch self {
case .none: "No network connection"
case .cellular: "Cellular"
case .wifi: "WiFi"
case .ethernet: "Wired ethernet"
case .other: "Other"
}
}
}
+6 -1
View File
@@ -29,6 +29,7 @@ let GROUP_DEFAULT_NETWORK_SESSION_MODE = "networkSessionMode"
let GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT = "networkTCPConnectTimeout"
let GROUP_DEFAULT_NETWORK_TCP_TIMEOUT = "networkTCPTimeout"
let GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB = "networkTCPTimeoutPerKb"
let GROUP_DEFAULT_NETWORK_RCV_CONCURRENCY = "networkRcvConcurrency"
let GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL = "networkSMPPingInterval"
let GROUP_DEFAULT_NETWORK_SMP_PING_COUNT = "networkSMPPingCount"
let GROUP_DEFAULT_NETWORK_ENABLE_KEEP_ALIVE = "networkEnableKeepAlive"
@@ -55,6 +56,7 @@ public func registerGroupDefaults() {
GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT: NetCfg.defaults.tcpConnectTimeout,
GROUP_DEFAULT_NETWORK_TCP_TIMEOUT: NetCfg.defaults.tcpTimeout,
GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB: NetCfg.defaults.tcpTimeoutPerKb,
GROUP_DEFAULT_NETWORK_RCV_CONCURRENCY: NetCfg.defaults.rcvConcurrency,
GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL: NetCfg.defaults.smpPingInterval,
GROUP_DEFAULT_NETWORK_SMP_PING_COUNT: NetCfg.defaults.smpPingCount,
GROUP_DEFAULT_NETWORK_ENABLE_KEEP_ALIVE: NetCfg.defaults.enableKeepAlive,
@@ -197,7 +199,7 @@ public let confirmDBUpgradesGroupDefault = BoolDefault(defaults: groupDefaults,
public let callKitEnabledGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_CALL_KIT_ENABLED)
public let pqExperimentalEnabledDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES)
public let pqExperimentalEnabledDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED)
public class DateDefault {
var defaults: UserDefaults
@@ -278,6 +280,7 @@ public func getNetCfg() -> NetCfg {
let tcpConnectTimeout = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT)
let tcpTimeout = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT)
let tcpTimeoutPerKb = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB)
let rcvConcurrency = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_RCV_CONCURRENCY)
let smpPingInterval = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL)
let smpPingCount = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_SMP_PING_COUNT)
let enableKeepAlive = groupDefaults.bool(forKey: GROUP_DEFAULT_NETWORK_ENABLE_KEEP_ALIVE)
@@ -297,6 +300,7 @@ public func getNetCfg() -> NetCfg {
tcpConnectTimeout: tcpConnectTimeout,
tcpTimeout: tcpTimeout,
tcpTimeoutPerKb: tcpTimeoutPerKb,
rcvConcurrency: rcvConcurrency,
tcpKeepAlive: tcpKeepAlive,
smpPingInterval: smpPingInterval,
smpPingCount: smpPingCount,
@@ -310,6 +314,7 @@ public func setNetCfg(_ cfg: NetCfg) {
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)
groupDefaults.set(cfg.rcvConcurrency, forKey: GROUP_DEFAULT_NETWORK_RCV_CONCURRENCY)
groupDefaults.set(cfg.smpPingInterval, forKey: GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL)
groupDefaults.set(cfg.smpPingCount, forKey: GROUP_DEFAULT_NETWORK_SMP_PING_COUNT)
if let tcpKeepAlive = cfg.tcpKeepAlive {
+153 -33
View File
@@ -543,6 +543,7 @@ public protocol Feature {
var iconFilled: String { get }
var iconScale: CGFloat { get }
var hasParam: Bool { get }
var hasRole: Bool { get }
var text: String { get }
}
@@ -569,6 +570,8 @@ public enum ChatFeature: String, Decodable, Feature {
}
}
public var hasRole: Bool { false }
public var text: String {
switch self {
case .timedMessages: return NSLocalizedString("Disappearing messages", comment: "chat feature")
@@ -694,6 +697,7 @@ public enum GroupFeature: String, Decodable, Feature {
case reactions
case voice
case files
case simplexLinks
case history
public var id: Self { self }
@@ -705,6 +709,19 @@ public enum GroupFeature: String, Decodable, Feature {
}
}
public var hasRole: Bool {
switch self {
case .timedMessages: false
case .directMessages: true
case .fullDelete: false
case .reactions: false
case .voice: true
case .files: true
case .simplexLinks: true
case .history: false
}
}
public var text: String {
switch self {
case .timedMessages: return NSLocalizedString("Disappearing messages", comment: "chat feature")
@@ -713,6 +730,7 @@ public enum GroupFeature: String, Decodable, Feature {
case .reactions: return NSLocalizedString("Message reactions", comment: "chat feature")
case .voice: return NSLocalizedString("Voice messages", comment: "chat feature")
case .files: return NSLocalizedString("Files and media", comment: "chat feature")
case .simplexLinks: return NSLocalizedString("SimpleX links", comment: "chat feature")
case .history: return NSLocalizedString("Visible history", comment: "chat feature")
}
}
@@ -725,6 +743,7 @@ public enum GroupFeature: String, Decodable, Feature {
case .reactions: return "face.smiling"
case .voice: return "mic"
case .files: return "doc"
case .simplexLinks: return "link.circle"
case .history: return "clock"
}
}
@@ -737,6 +756,7 @@ public enum GroupFeature: String, Decodable, Feature {
case .reactions: return "face.smiling.fill"
case .voice: return "mic.fill"
case .files: return "doc.fill"
case .simplexLinks: return "link.circle.fill"
case .history: return "clock.fill"
}
}
@@ -781,6 +801,11 @@ public enum GroupFeature: String, Decodable, Feature {
case .on: return "Allow to send files and media."
case .off: return "Prohibit sending files and media."
}
case .simplexLinks:
switch enabled {
case .on: return "Allow to send SimpleX links."
case .off: return "Prohibit sending SimpleX links."
}
case .history:
switch enabled {
case .on: return "Send up to 100 last messages to new members."
@@ -819,6 +844,11 @@ public enum GroupFeature: String, Decodable, Feature {
case .on: return "Group members can send files and media."
case .off: return "Files and media are prohibited in this group."
}
case .simplexLinks:
switch enabled {
case .on: return "Group members can send SimpleX links."
case .off: return "SimpleX links are prohibited in this group."
}
case .history:
switch enabled {
case .on: return "Up to 100 last messages are sent to new members."
@@ -958,20 +988,22 @@ public enum FeatureAllowed: String, Codable, Identifiable {
public struct FullGroupPreferences: Decodable, Equatable {
public var timedMessages: TimedMessagesGroupPreference
public var directMessages: GroupPreference
public var directMessages: RoleGroupPreference
public var fullDelete: GroupPreference
public var reactions: GroupPreference
public var voice: GroupPreference
public var files: GroupPreference
public var voice: RoleGroupPreference
public var files: RoleGroupPreference
public var simplexLinks: RoleGroupPreference
public var history: GroupPreference
public init(
timedMessages: TimedMessagesGroupPreference,
directMessages: GroupPreference,
directMessages: RoleGroupPreference,
fullDelete: GroupPreference,
reactions: GroupPreference,
voice: GroupPreference,
files: GroupPreference,
voice: RoleGroupPreference,
files: RoleGroupPreference,
simplexLinks: RoleGroupPreference,
history: GroupPreference
) {
self.timedMessages = timedMessages
@@ -980,36 +1012,40 @@ public struct FullGroupPreferences: Decodable, Equatable {
self.reactions = reactions
self.voice = voice
self.files = files
self.simplexLinks = simplexLinks
self.history = history
}
public static let sampleData = FullGroupPreferences(
timedMessages: TimedMessagesGroupPreference(enable: .off),
directMessages: GroupPreference(enable: .off),
directMessages: RoleGroupPreference(enable: .off, role: nil),
fullDelete: GroupPreference(enable: .off),
reactions: GroupPreference(enable: .on),
voice: GroupPreference(enable: .on),
files: GroupPreference(enable: .on),
voice: RoleGroupPreference(enable: .on, role: nil),
files: RoleGroupPreference(enable: .on, role: nil),
simplexLinks: RoleGroupPreference(enable: .on, role: nil),
history: GroupPreference(enable: .on)
)
}
public struct GroupPreferences: Codable {
public var timedMessages: TimedMessagesGroupPreference?
public var directMessages: GroupPreference?
public var directMessages: RoleGroupPreference?
public var fullDelete: GroupPreference?
public var reactions: GroupPreference?
public var voice: GroupPreference?
public var files: GroupPreference?
public var voice: RoleGroupPreference?
public var files: RoleGroupPreference?
public var simplexLinks: RoleGroupPreference?
public var history: GroupPreference?
public init(
timedMessages: TimedMessagesGroupPreference? = nil,
directMessages: GroupPreference? = nil,
directMessages: RoleGroupPreference? = nil,
fullDelete: GroupPreference? = nil,
reactions: GroupPreference? = nil,
voice: GroupPreference? = nil,
files: GroupPreference? = nil,
voice: RoleGroupPreference? = nil,
files: RoleGroupPreference? = nil,
simplexLinks: RoleGroupPreference? = nil,
history: GroupPreference? = nil
) {
self.timedMessages = timedMessages
@@ -1018,16 +1054,18 @@ public struct GroupPreferences: Codable {
self.reactions = reactions
self.voice = voice
self.files = files
self.simplexLinks = simplexLinks
self.history = history
}
public static let sampleData = GroupPreferences(
timedMessages: TimedMessagesGroupPreference(enable: .off),
directMessages: GroupPreference(enable: .off),
directMessages: RoleGroupPreference(enable: .off, role: nil),
fullDelete: GroupPreference(enable: .off),
reactions: GroupPreference(enable: .on),
voice: GroupPreference(enable: .on),
files: GroupPreference(enable: .on),
voice: RoleGroupPreference(enable: .on, role: nil),
files: RoleGroupPreference(enable: .on, role: nil),
simplexLinks: RoleGroupPreference(enable: .on, role: nil),
history: GroupPreference(enable: .on)
)
}
@@ -1040,6 +1078,7 @@ public func toGroupPreferences(_ fullPreferences: FullGroupPreferences) -> Group
reactions: fullPreferences.reactions,
voice: fullPreferences.voice,
files: fullPreferences.files,
simplexLinks: fullPreferences.simplexLinks,
history: fullPreferences.history
)
}
@@ -1051,11 +1090,37 @@ public struct GroupPreference: Codable, Equatable {
enable == .on
}
public func enabled(_ role: GroupMemberRole?, for m: GroupMember?) -> GroupFeatureEnabled {
switch enable {
case .off: .off
case .on:
if let role, let m {
m.memberRole >= role ? .on : .off
} else {
.on
}
}
}
public init(enable: GroupFeatureEnabled) {
self.enable = enable
}
}
public struct RoleGroupPreference: Codable, Equatable {
public var enable: GroupFeatureEnabled
public var role: GroupMemberRole?
public func on(for m: GroupMember) -> Bool {
enable == .on && m.memberRole >= (role ?? .observer)
}
public init(enable: GroupFeatureEnabled, role: GroupMemberRole?) {
self.enable = enable
self.role = role
}
}
public struct TimedMessagesGroupPreference: Codable, Equatable {
public var enable: GroupFeatureEnabled
public var ttl: Int?
@@ -1280,7 +1345,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat {
case .timedMessages: return prefs.timedMessages.on
case .fullDelete: return prefs.fullDelete.on
case .reactions: return prefs.reactions.on
case .voice: return prefs.voice.on
case .voice: return prefs.voice.on(for: groupInfo.membership)
case .calls: return false
}
case .local:
@@ -1323,7 +1388,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat {
return .other
}
case let .group(groupInfo):
if !groupInfo.fullGroupPreferences.voice.on {
if !groupInfo.fullGroupPreferences.voice.on(for: groupInfo.membership) {
return .groupOwnerCan
} else {
return .other
@@ -1975,7 +2040,7 @@ public struct GroupMemberIds: Decodable {
var groupId: Int64
}
public enum GroupMemberRole: String, Identifiable, CaseIterable, Comparable, Decodable {
public enum GroupMemberRole: String, Identifiable, CaseIterable, Comparable, Codable {
case observer = "observer"
case author = "author"
case member = "member"
@@ -2120,7 +2185,7 @@ public enum ConnectionEntity: Decodable {
public var id: String? {
switch self {
case let .rcvDirectMsgConnection(contact):
return contact?.id ?? nil
return contact?.id
case let .rcvGroupMsgConnection(_, groupMember):
return groupMember.id
case let .userContactConnection(userContact):
@@ -2372,10 +2437,10 @@ public struct ChatItem: Identifiable, Decodable {
}
}
public static func getSample (_ id: Int64, _ dir: CIDirection, _ ts: Date, _ text: String, _ status: CIStatus = .sndNew, quotedItem: CIQuote? = nil, file: CIFile? = nil, itemDeleted: CIDeleted? = nil, itemEdited: Bool = false, itemLive: Bool = false, editable: Bool = true) -> ChatItem {
public static func getSample (_ id: Int64, _ dir: CIDirection, _ ts: Date, _ text: String, _ status: CIStatus = .sndNew, quotedItem: CIQuote? = nil, file: CIFile? = nil, itemDeleted: CIDeleted? = nil, itemEdited: Bool = false, itemLive: Bool = false, deletable: Bool = true, editable: Bool = true) -> ChatItem {
ChatItem(
chatDir: dir,
meta: CIMeta.getSample(id, ts, text, status, itemDeleted: itemDeleted, itemEdited: itemEdited, itemLive: itemLive, editable: editable),
meta: CIMeta.getSample(id, ts, text, status, itemDeleted: itemDeleted, itemEdited: itemEdited, itemLive: itemLive, deletable: deletable, editable: editable),
content: .sndMsgContent(msgContent: .text(text)),
quotedItem: quotedItem,
file: file
@@ -2466,6 +2531,7 @@ public struct ChatItem: Identifiable, Decodable {
itemDeleted: nil,
itemEdited: false,
itemLive: false,
deletable: false,
editable: false
),
content: .rcvDeleted(deleteMode: .cidmBroadcast),
@@ -2487,6 +2553,7 @@ public struct ChatItem: Identifiable, Decodable {
itemDeleted: nil,
itemEdited: false,
itemLive: true,
deletable: false,
editable: false
),
content: .sndMsgContent(msgContent: .text("")),
@@ -2546,10 +2613,12 @@ public struct CIMeta: Decodable {
public var itemStatus: CIStatus
public var createdAt: Date
public var updatedAt: Date
public var itemForwarded: CIForwardedFrom?
public var itemDeleted: CIDeleted?
public var itemEdited: Bool
public var itemTimed: CITimed?
public var itemLive: Bool?
public var deletable: Bool
public var editable: Bool
public var timestampText: Text { get { formatTimestampText(itemTs) } }
@@ -2566,7 +2635,7 @@ public struct CIMeta: Decodable {
itemStatus.statusIcon(metaColor)
}
public static func getSample(_ id: Int64, _ ts: Date, _ text: String, _ status: CIStatus = .sndNew, itemDeleted: CIDeleted? = nil, itemEdited: Bool = false, itemLive: Bool = false, editable: Bool = true) -> CIMeta {
public static func getSample(_ id: Int64, _ ts: Date, _ text: String, _ status: CIStatus = .sndNew, itemDeleted: CIDeleted? = nil, itemEdited: Bool = false, itemLive: Bool = false, deletable: Bool = true, editable: Bool = true) -> CIMeta {
CIMeta(
itemId: id,
itemTs: ts,
@@ -2577,6 +2646,7 @@ public struct CIMeta: Decodable {
itemDeleted: itemDeleted,
itemEdited: itemEdited,
itemLive: itemLive,
deletable: deletable,
editable: editable
)
}
@@ -2592,6 +2662,7 @@ public struct CIMeta: Decodable {
itemDeleted: nil,
itemEdited: false,
itemLive: false,
deletable: false,
editable: false
)
}
@@ -2713,6 +2784,31 @@ public enum CIDeleted: Decodable {
}
}
public enum MsgDirection: String, Decodable {
case rcv = "rcv"
case snd = "snd"
}
public enum CIForwardedFrom: Decodable {
case unknown
case contact(chatName: String, msgDir: MsgDirection, contactId: Int64?, chatItemId: Int64?)
case group(chatName: String, msgDir: MsgDirection, groupId: Int64?, chatItemId: Int64?)
var chatName: String {
switch self {
case .unknown: ""
case let .contact(chatName, _, _, _): chatName
case let .group(chatName, _, _, _): chatName
}
}
public func text(_ chatType: ChatType) -> LocalizedStringKey {
chatType == .local
? (chatName == "" ? "saved" : "saved from \(chatName)")
: "forwarded"
}
}
public enum CIDeleteMode: String, Decodable {
case cidmBroadcast = "broadcast"
case cidmInternal = "internal"
@@ -2742,8 +2838,8 @@ public enum CIContent: Decodable, ItemContent {
case sndChatFeature(feature: ChatFeature, enabled: FeatureEnabled, param: Int?)
case rcvChatPreference(feature: ChatFeature, allowed: FeatureAllowed, param: Int?)
case sndChatPreference(feature: ChatFeature, allowed: FeatureAllowed, param: Int?)
case rcvGroupFeature(groupFeature: GroupFeature, preference: GroupPreference, param: Int?)
case sndGroupFeature(groupFeature: GroupFeature, preference: GroupPreference, param: Int?)
case rcvGroupFeature(groupFeature: GroupFeature, preference: GroupPreference, param: Int?, memberRole_: GroupMemberRole?)
case sndGroupFeature(groupFeature: GroupFeature, preference: GroupPreference, param: Int?, memberRole_: GroupMemberRole?)
case rcvChatFeatureRejected(feature: ChatFeature)
case rcvGroupFeatureRejected(groupFeature: GroupFeature)
case sndModerated
@@ -2777,8 +2873,8 @@ public enum CIContent: Decodable, ItemContent {
case let .sndChatFeature(feature, enabled, param): return CIContent.featureText(feature, enabled.text, param)
case let .rcvChatPreference(feature, allowed, param): return CIContent.preferenceText(feature, allowed, param)
case let .sndChatPreference(feature, allowed, param): return CIContent.preferenceText(feature, allowed, param)
case let .rcvGroupFeature(feature, preference, param): return CIContent.featureText(feature, preference.enable.text, param)
case let .sndGroupFeature(feature, preference, param): return CIContent.featureText(feature, preference.enable.text, param)
case let .rcvGroupFeature(feature, preference, param, role): return CIContent.featureText(feature, preference.enable.text, param, role)
case let .sndGroupFeature(feature, preference, param, role): return CIContent.featureText(feature, preference.enable.text, param, role)
case let .rcvChatFeatureRejected(feature): return String.localizedStringWithFormat("%@: received, prohibited", feature.text)
case let .rcvGroupFeatureRejected(groupFeature): return String.localizedStringWithFormat("%@: received, prohibited", groupFeature.text)
case .sndModerated: return NSLocalizedString("moderated", comment: "moderated chat item")
@@ -2803,10 +2899,25 @@ public enum CIContent: Decodable, ItemContent {
NSLocalizedString("This chat is protected by end-to-end encryption.", comment: "E2EE info chat item")
}
static func featureText(_ feature: Feature, _ enabled: String, _ param: Int?) -> String {
feature.hasParam
? "\(feature.text): \(timeText(param))"
: "\(feature.text): \(enabled)"
static func featureText(_ feature: Feature, _ enabled: String, _ param: Int?, _ role: GroupMemberRole? = nil) -> String {
(
feature.hasParam
? "\(feature.text): \(timeText(param))"
: "\(feature.text): \(enabled)"
) +
(
feature.hasRole && role != nil
? " (\(roleText(role)))"
: ""
)
}
private static func roleText(_ role: GroupMemberRole?) -> String {
switch role {
case .owner: NSLocalizedString("owners", comment: "feature role")
case .admin: NSLocalizedString("admins", comment: "feature role")
default: NSLocalizedString("all members", comment: "feature role")
}
}
public static func preferenceText(_ feature: Feature, _ allowed: FeatureAllowed, _ param: Int?) -> String {
@@ -3209,6 +3320,14 @@ public enum MsgContent: Equatable {
}
}
public var isImageOrVideo: Bool {
switch self {
case .image: true
case .video: true
default: false
}
}
var cmdString: String {
"json \(encodeJSON(self))"
}
@@ -3743,6 +3862,7 @@ public enum ChatItemTTL: Hashable, Identifiable, Comparable {
public struct ChatItemInfo: Decodable {
public var itemVersions: [ChatItemVersion]
public var memberDeliveryStatuses: [MemberDeliveryStatus]?
public var forwardedFromChatItem: AChatItem?
}
public struct ChatItemVersion: Decodable {
+201
View File
@@ -377,6 +377,9 @@
/* member role */
"admin" = "админ";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Администраторите могат да блокират член за всички.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Админите могат да създадат линкове за присъединяване към групи.";
@@ -416,6 +419,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Всички ваши контакти ще останат свързани. Актуализацията на профила ще бъде изпратена до вашите контакти.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Всички ваши контакти, разговори и файлове ще бъдат сигурно криптирани и качени на парчета в конфигурираните XFTP релета.";
/* No comment provided by engineer. */
"Allow" = "Позволи";
@@ -497,6 +503,9 @@
/* No comment provided by engineer. */
"App build: %@" = "Компилация на приложението: %@";
/* No comment provided by engineer. */
"App data migration" = "Миграция на данните от приложението";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Приложението криптира нови локални файлове (с изключение на видеоклипове).";
@@ -518,6 +527,15 @@
/* No comment provided by engineer. */
"Appearance" = "Изглед";
/* No comment provided by engineer. */
"Apply" = "Приложи";
/* No comment provided by engineer. */
"Archive and upload" = "Архивиране и качване";
/* No comment provided by engineer. */
"Archiving database" = "Архивиране на база данни";
/* No comment provided by engineer. */
"Attach" = "Прикачи";
@@ -665,6 +683,9 @@
/* No comment provided by engineer. */
"Cancel" = "Отказ";
/* No comment provided by engineer. */
"Cancel migration" = "Отмени миграцията";
/* feature offered item */
"cancelled %@" = "отменен %@";
@@ -744,6 +765,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Чатът е спрян. Ако вече сте използвали тази база данни на друго устройство, трябва да я прехвърлите обратно, преди да стартирате чата отново.";
/* No comment provided by engineer. */
"Chat migrated!" = "Чатът е мигриран!";
/* No comment provided by engineer. */
"Chat preferences" = "Чат настройки";
@@ -801,6 +825,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Потвърди актуализаациите на базата данни";
/* No comment provided by engineer. */
"Confirm network settings" = "Потвърди мрежовите настройки";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Потвърди новата парола…";
@@ -810,6 +837,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Потвърди парола";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Потвърдете, че помните паролата на базата данни, преди да я мигрирате.";
/* No comment provided by engineer. */
"Confirm upload" = "Потвърди качването";
/* server test step */
"Connect" = "Свързване";
@@ -1008,6 +1041,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Създаден на %@";
/* No comment provided by engineer. */
"Creating archive link" = "Създаване на архивен линк";
/* No comment provided by engineer. */
"Creating link…" = "Линкът се създава…";
@@ -1155,6 +1191,9 @@
/* No comment provided by engineer. */
"Delete database" = "Изтрий базата данни";
/* No comment provided by engineer. */
"Delete database from this device" = "Изтриване на базата данни от това устройство";
/* server test step */
"Delete file" = "Изтрий файл";
@@ -1347,9 +1386,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Понижи версията и отвори чата";
/* No comment provided by engineer. */
"Download failed" = "Неуспешно изтегляне";
/* server test step */
"Download file" = "Свали файл";
/* No comment provided by engineer. */
"Downloading archive" = "Архива се изтегля";
/* No comment provided by engineer. */
"Downloading link details" = "Подробности за линка се изтеглят";
/* No comment provided by engineer. */
"Duplicate display name!" = "Дублирано име!";
@@ -1383,6 +1431,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Активиране за всички";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Активиране в личните чатове (БЕТА)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Активирай незабавни известия?";
@@ -1497,6 +1548,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Въведете kодa за достъп";
/* No comment provided by engineer. */
"Enter passphrase" = "Въведи парола";
/* No comment provided by engineer. */
"Enter passphrase…" = "Въведи парола…";
@@ -1536,6 +1590,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Грешка при добавяне на член(ове)";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Грешка при разрешаване на PQ криптиране за контакт";
/* No comment provided by engineer. */
"Error changing address" = "Грешка при промяна на адреса";
@@ -1590,6 +1647,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Грешка при изтриване на потребителския профил";
/* No comment provided by engineer. */
"Error downloading the archive" = "Грешка при изтеглянето на архива";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Грешка при активирането на потвърждениeто за доставка!";
@@ -1635,6 +1695,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Грешка при запазване на парола в Кeychain";
/* when migrating */
"Error saving settings" = "Грешка при запазване на настройките";
/* No comment provided by engineer. */
"Error saving user password" = "Грешка при запазване на потребителска парола";
@@ -1677,6 +1740,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Грешка при актуализиране на поверителността на потребителя";
/* No comment provided by engineer. */
"Error uploading the archive" = "Грешка при качването на архива";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Грешка при проверката на паролата:";
/* No comment provided by engineer. */
"Error: " = "Грешка: ";
@@ -1710,6 +1779,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Експортиран архив на базата данни.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Експортираният файл не съществува";
/* No comment provided by engineer. */
"Exporting database archive…" = "Експортиране на архив на базата данни…";
@@ -1752,6 +1824,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Филтрирайте непрочетените и любимите чатове.";
/* No comment provided by engineer. */
"Finalize migration" = "Завърши миграцията";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Завършете миграцията на другото устройство.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Най-накрая ги имаме! 🚀";
@@ -1935,6 +2013,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Как да използвате вашите сървъри";
/* No comment provided by engineer. */
"Hungarian interface" = "Унгарски интерфейс";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "ICE сървъри (по един на ред)";
@@ -1974,6 +2055,12 @@
/* No comment provided by engineer. */
"Import database" = "Импортиране на база данни";
/* No comment provided by engineer. */
"Import failed" = "Неуспешно импортиране";
/* No comment provided by engineer. */
"Importing archive" = "Импортиране на архив";
/* No comment provided by engineer. */
"Improved message delivery" = "Подобрена доставка на съобщения";
@@ -1983,6 +2070,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Подобрена конфигурация на сървъра";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "За да продължите, чатът трябва да бъде спрян.";
/* No comment provided by engineer. */
"In reply to" = "В отговор на";
@@ -2067,6 +2157,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Невалиден линк";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Невалидно потвърждение за мигриране";
/* No comment provided by engineer. */
"Invalid name!" = "Невалидно име!";
@@ -2331,6 +2424,9 @@
/* No comment provided by engineer. */
"Message text" = "Текст на съобщението";
/* No comment provided by engineer. */
"Message too large" = "Съобщението е твърде голямо";
/* No comment provided by engineer. */
"Messages" = "Съобщения";
@@ -2340,9 +2436,30 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "Съобщенията от %@ ще бъдат показани!";
/* No comment provided by engineer. */
"Migrate device" = "Мигрирай устройството";
/* No comment provided by engineer. */
"Migrate from another device" = "Мигриране от друго устройство";
/* No comment provided by engineer. */
"Migrate here" = "Мигрирай тук";
/* No comment provided by engineer. */
"Migrate to another device" = "Миграция към друго устройство";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Мигрирайте към друго устройство чрез QR код.";
/* No comment provided by engineer. */
"Migrating" = "Мигриране";
/* No comment provided by engineer. */
"Migrating database archive…" = "Архивът на базата данни се мигрира…";
/* No comment provided by engineer. */
"Migration complete" = "Миграцията е завършена";
/* No comment provided by engineer. */
"Migration error:" = "Грешка при мигриране:";
@@ -2600,6 +2717,9 @@
/* No comment provided by engineer. */
"Open group" = "Отвори група";
/* authentication reason */
"Open migration to another device" = "Отвори миграцията към друго устройство";
/* No comment provided by engineer. */
"Open Settings" = "Отвори настройки";
@@ -2612,9 +2732,15 @@
/* No comment provided by engineer. */
"Opening app…" = "Приложението се отваря…";
/* No comment provided by engineer. */
"Or paste archive link" = "Или постави архивен линк";
/* No comment provided by engineer. */
"Or scan QR code" = "Или сканирай QR код";
/* No comment provided by engineer. */
"Or securely share this file link" = "Или сигурно споделете този линк към файла";
/* No comment provided by engineer. */
"Or show this code" = "Или покажи този код";
@@ -2666,6 +2792,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Постоянна грешка при декриптиране";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Обаждания \"картина в картина\"";
/* No comment provided by engineer. */
"PING count" = "PING бройка";
@@ -2684,6 +2813,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Моля, проверете вашите настройки и тези вашия за контакт.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Моля, потвърдете, че мрежовите настройки са правилни за това устройство.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Моля, свържете се с разработчиците.\nГрешка: %@";
@@ -2717,6 +2849,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Въжможно е пръстовият отпечатък на сертификата в адреса на сървъра да е неправилен";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "Постквантово E2EE";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Запазете последната чернова на съобщението с прикачени файлове.";
@@ -2798,6 +2933,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Push известия";
/* No comment provided by engineer. */
"Push server" = "Push сървър";
/* chat item text */
"quantum resistant e2e encryption" = "квантово устойчиво e2e криптиране";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Квантово устойчиво криптиране";
/* No comment provided by engineer. */
"Rate the app" = "Оценете приложението";
@@ -2933,9 +3077,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Изпрати отново заявката за свързване?";
/* No comment provided by engineer. */
"Repeat download" = "Повтори изтеглянето";
/* No comment provided by engineer. */
"Repeat import" = "Повтори импортирането";
/* No comment provided by engineer. */
"Repeat join request?" = "Изпрати отново заявката за присъединяване?";
/* No comment provided by engineer. */
"Repeat upload" = "Повтори качването";
/* chat item action */
"Reply" = "Отговори";
@@ -2993,6 +3146,9 @@
/* No comment provided by engineer. */
"Run chat" = "Стартиране на чат";
/* No comment provided by engineer. */
"Safer groups" = "По-безопасни групи";
/* chat item action */
"Save" = "Запази";
@@ -3233,6 +3389,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Задай kод за достъп";
/* No comment provided by engineer. */
"Set passphrase" = "Задаване на парола";
/* No comment provided by engineer. */
"Set passphrase to export" = "Задай парола за експортиране";
@@ -3278,6 +3437,9 @@
/* No comment provided by engineer. */
"Show preview" = "Показване на визуализация";
/* No comment provided by engineer. */
"Show QR code" = "Покажи QR код";
/* No comment provided by engineer. */
"Show:" = "Покажи:";
@@ -3338,6 +3500,9 @@
/* notification title */
"Somebody" = "Някой";
/* chat item text */
"standard end-to-end encryption" = "стандартно криптиране от край до край";
/* No comment provided by engineer. */
"Start chat" = "Започни чат";
@@ -3353,6 +3518,9 @@
/* No comment provided by engineer. */
"Stop" = "Спри";
/* No comment provided by engineer. */
"Stop chat" = "Спри чата";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Спрете чата, за да активирате действията с базата данни";
@@ -3380,6 +3548,9 @@
/* authentication reason */
"Stop SimpleX" = "Спри SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Спиране на чата";
/* No comment provided by engineer. */
"strike" = "зачеркнат";
@@ -3530,6 +3701,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Това действие не може да бъде отменено - вашият профил, контакти, съобщения и файлове ще бъдат безвъзвратно загубени.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Този чат е защитен чрез криптиране от край до край.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Този чат е защитен от квантово устойчиво криптиране от край до край.";
/* notification title */
"this contact" = "този контакт";
@@ -3722,9 +3899,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Актуализирай и отвори чата";
/* No comment provided by engineer. */
"Upload failed" = "Неуспешно качване";
/* server test step */
"Upload file" = "Качи файл";
/* No comment provided by engineer. */
"Uploading archive" = "Архивът се качва";
/* No comment provided by engineer. */
"Use .onion hosts" = "Използвай .onion хостове";
@@ -3755,6 +3938,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Използвай сървърите на SimpleX Chat?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Използвайте приложението по време на разговора.";
/* No comment provided by engineer. */
"User profile" = "Потребителски профил";
@@ -3782,6 +3968,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Потвърждение за свързване";
/* No comment provided by engineer. */
"Verify database passphrase" = "Проверете паролата на базата данни";
/* No comment provided by engineer. */
"Verify passphrase" = "Провери паролата";
/* No comment provided by engineer. */
"Verify security code" = "Потвърди кода за сигурност";
@@ -3860,6 +4052,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "иска да се свърже с вас!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: стартирането на чата на множество устройства не се поддържа и ще доведе до неуспешно изпращане на съобщения";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Предупреждение: Може да загубите някои данни!";
@@ -3875,6 +4070,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Съобщение при посрещане";
/* No comment provided by engineer. */
"Welcome message is too long" = "Съобщението при посрещане е твърде дълго";
/* No comment provided by engineer. */
"What's new" = "Какво е новото";
@@ -3971,6 +4169,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Можете да ги активирате по-късно през настройките за \"Поверителност и сигурност\" на приложението.";
/* No comment provided by engineer. */
"You can give another try." = "Можете да опитате още веднъж.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Можете да скриете или заглушите известията за потребителски профил - плъзнете надясно.";
+227 -2
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Beste Privatsphäre**: Es wird kein SimpleX-Chat-Benachrichtigungs-Server genutzt, Nachrichten werden in periodischen Abständen im Hintergrund geprüft (dies hängt davon ab, wie häufig Sie die App nutzen).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Bitte beachten Sie**: Aus Sicherheitsgründen wird die Nachrichtenentschlüsselung Ihrer Verbindungen abgebrochen, wenn Sie die gleiche Datenbank auf zwei Geräten nutzen.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Bitte beachten Sie**: Das Passwort kann NICHT wiederhergestellt oder geändert werden, wenn Sie es vergessen haben oder verlieren.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Warnung**: Sofortige Push-Benachrichtigungen erfordern die Eingabe eines Passworts, welches in Ihrem Schlüsselbund gespeichert ist.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Warnung**: Das Archiv wird gelöscht.";
/* No comment provided by engineer. */
"*bold*" = "\\*fett*";
@@ -136,6 +142,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ wurde mit Ihnen verbunden";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ heruntergeladen";
/* notification title */
"%@ is connected!" = "%@ ist mit Ihnen verbunden!";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "%@-Server";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ hochgeladen";
/* notification title */
"%@ wants to connect!" = "%@ will sich mit Ihnen verbinden!";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "Admin";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Administratoren können ein Gruppenmitglied für Alle blockieren.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Administratoren können Links für den Beitritt zu Gruppen erzeugen.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Alle Ihre Kontakte bleiben verbunden. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Server hochgeladen.";
/* No comment provided by engineer. */
"Allow" = "Erlauben";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "App Build: %@";
/* No comment provided by engineer. */
"App data migration" = "App-Daten-Migration";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Neue lokale Dateien (außer Video-Dateien) werden von der App verschlüsselt.";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Erscheinungsbild";
/* No comment provided by engineer. */
"Apply" = "Anwenden";
/* No comment provided by engineer. */
"Archive and upload" = "Archivieren und Hochladen";
/* No comment provided by engineer. */
"Archiving database" = "Datenbank wird archiviert";
/* No comment provided by engineer. */
"Attach" = "Anhängen";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "Abbrechen";
/* No comment provided by engineer. */
"Cancel migration" = "Migration abbrechen";
/* feature offered item */
"cancelled %@" = "abgebrochen %@";
@@ -744,6 +777,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 migrated!" = "Chat wurde migriert!";
/* No comment provided by engineer. */
"Chat preferences" = "Chat-Präferenzen";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Chinesische und spanische Bedienoberfläche";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Wählen Sie auf dem neuen Gerät _Von einem anderen Gerät migrieren_ und scannen Sie den QR-Code.";
/* No comment provided by engineer. */
"Choose file" = "Datei auswählen";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Datenbank-Aktualisierungen bestätigen";
/* No comment provided by engineer. */
"Confirm network settings" = "Bestätigen Sie die Netzwerkeinstellungen";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Neues Passwort bestätigen…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Passwort bestätigen";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Bitte bestätigen Sie für die Migration, dass Sie sich an Ihr Datenbank-Passwort erinnern.";
/* No comment provided by engineer. */
"Confirm upload" = "Hochladen bestätigen";
/* server test step */
"Connect" = "Verbinden";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Erstellt am %@";
/* No comment provided by engineer. */
"Creating archive link" = "Archiv-Link erzeugen";
/* No comment provided by engineer. */
"Creating link…" = "Link wird erstellt…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Datenbank löschen";
/* No comment provided by engineer. */
"Delete database from this device" = "Datenbank auf diesem Gerät löschen";
/* server test step */
"Delete file" = "Datei löschen";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Datenbank herabstufen und den Chat öffnen";
/* No comment provided by engineer. */
"Download failed" = "Herunterladen fehlgeschlagen";
/* server test step */
"Download file" = "Datei herunterladen";
/* No comment provided by engineer. */
"Downloading archive" = "Archiv wird heruntergeladen";
/* No comment provided by engineer. */
"Downloading link details" = "Link-Details werden heruntergeladen";
/* No comment provided by engineer. */
"Duplicate display name!" = "Doppelter Anzeigename!";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Für Alle aktivieren";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Kann in direkten Chats aktiviert werden (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Sofortige Benachrichtigungen aktivieren?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Zugangscode eingeben";
/* No comment provided by engineer. */
"Enter passphrase" = "Passwort eingeben";
/* No comment provided by engineer. */
"Enter passphrase…" = "Passwort eingeben…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Fehler beim Hinzufügen von Mitgliedern";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Fehler beim Zulassen der Kontakt-PQ-Verschlüsselung";
/* No comment provided by engineer. */
"Error changing address" = "Fehler beim Wechseln der Empfängeradresse";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Fehler beim Löschen des Benutzerprofils";
/* No comment provided by engineer. */
"Error downloading the archive" = "Fehler beim Herunterladen des Archivs";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Fehler beim Aktivieren von Empfangsbestätigungen!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Fehler beim Speichern des Passworts in den Schlüsselbund";
/* when migrating */
"Error saving settings" = "Fehler beim Abspeichern der Einstellungen";
/* No comment provided by engineer. */
"Error saving user password" = "Fehler beim Speichern des Benutzer-Passworts";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Fehler beim Aktualisieren der Benutzer-Privatsphäre";
/* No comment provided by engineer. */
"Error uploading the archive" = "Fehler beim Hochladen des Archivs";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Fehler bei der Überprüfung des Passworts:";
/* No comment provided by engineer. */
"Error: " = "Fehler: ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Exportiertes Datenbankarchiv.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Die exportierte Datei ist nicht vorhanden";
/* No comment provided by engineer. */
"Exporting database archive…" = "Exportieren des Datenbank-Archivs…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Nach ungelesenen und favorisierten Chats filtern.";
/* No comment provided by engineer. */
"Finalize migration" = "Die Migration wird abgeschlossen";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Die Migration auf dem anderen Gerät wird abgeschlossen.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Endlich haben wir sie! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Wie Sie Ihre Server nutzen";
/* No comment provided by engineer. */
"Hungarian interface" = "Ungarische Bedienoberfläche";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "ICE-Server (einer pro Zeile)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Datenbank importieren";
/* No comment provided by engineer. */
"Import failed" = "Import ist fehlgeschlagen";
/* No comment provided by engineer. */
"Importing archive" = "Archiv wird importiert";
/* No comment provided by engineer. */
"Improved message delivery" = "Verbesserte Zustellung von Nachrichten";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Verbesserte Serverkonfiguration";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Um fortzufahren, sollte der Chat beendet werden.";
/* No comment provided by engineer. */
"In reply to" = "Als Antwort auf";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Ungültiger Link";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Migrations-Bestätigung ungültig";
/* No comment provided by engineer. */
"Invalid name!" = "Ungültiger Name!";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Nachrichtentext";
/* No comment provided by engineer. */
"Message too large" = "Die Nachricht ist zu lang";
/* No comment provided by engineer. */
"Messages" = "Nachrichten";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "Die Nachrichten von %@ werden angezeigt!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Nachrichten, Dateien und Anrufe sind durch **Ende-zu-Ende-Verschlüsselung** mit Perfect Forward Secrecy, Ablehnung und Einbruchs-Wiederherstellung geschützt.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Nachrichten, Dateien und Anrufe sind durch **Quantum-resistente E2E-Verschlüsselung** mit Perfect Forward Secrecy, Ablehnung und Einbruchs-Wiederherstellung geschützt.";
/* No comment provided by engineer. */
"Migrate device" = "Gerät migrieren";
/* No comment provided by engineer. */
"Migrate from another device" = "Von einem anderen Gerät migrieren";
/* No comment provided by engineer. */
"Migrate here" = "Hierher migrieren";
/* No comment provided by engineer. */
"Migrate to another device" = "Auf ein anderes Gerät migrieren";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Daten können über einen QR-Code auf ein anderes Gerät migriert werden.";
/* No comment provided by engineer. */
"Migrating" = "Migrieren";
/* No comment provided by engineer. */
"Migrating database archive…" = "Datenbank-Archiv wird migriert…";
/* No comment provided by engineer. */
"Migration complete" = "Migration abgeschlossen";
/* No comment provided by engineer. */
"Migration error:" = "Fehler bei der Migration:";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Gruppe öffnen";
/* authentication reason */
"Open migration to another device" = "Migration auf ein anderes Gerät öffnen";
/* No comment provided by engineer. */
"Open Settings" = "Geräte-Einstellungen öffnen";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "App wird geöffnet…";
/* No comment provided by engineer. */
"Or paste archive link" = "Oder fügen Sie den Archiv-Link ein";
/* No comment provided by engineer. */
"Or scan QR code" = "Oder den QR-Code scannen";
/* No comment provided by engineer. */
"Or securely share this file link" = "Oder teilen Sie diesen Datei-Link sicher";
/* No comment provided by engineer. */
"Or show this code" = "Oder diesen QR-Code anzeigen";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Entschlüsselungsfehler";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Bild-in-Bild-Anrufe";
/* No comment provided by engineer. */
"PING count" = "PING-Zähler";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Bitte überprüfen sie sowohl Ihre, als auch die Präferenzen Ihres Kontakts.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Bitte bestätigen Sie, dass die Netzwerkeinstellungen auf diesem Gerät richtig sind.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Bitte nehmen Sie Kontakt mit den Entwicklern auf.\nFehler: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Der Fingerabdruck des Zertifikats in der Serveradresse ist wahrscheinlich ungültig";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "Post-Quantum E2E-Verschlüsselung";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Den letzten Nachrichtenentwurf, auch mit seinen Anhängen, aufbewahren.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Push-Benachrichtigungen";
/* No comment provided by engineer. */
"Push server" = "Push-Server";
/* chat item text */
"quantum resistant e2e encryption" = "Quantum-resistente E2E-Verschlüsselung";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Quantum-resistente Verschlüsselung";
/* No comment provided by engineer. */
"Rate the app" = "Bewerten Sie die App";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Verbindungsanfrage wiederholen?";
/* No comment provided by engineer. */
"Repeat download" = "Herunterladen wiederholen";
/* No comment provided by engineer. */
"Repeat import" = "Import wiederholen";
/* No comment provided by engineer. */
"Repeat join request?" = "Verbindungsanfrage wiederholen?";
/* No comment provided by engineer. */
"Repeat upload" = "Hochladen wiederholen";
/* chat item action */
"Reply" = "Antwort";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Chat starten";
/* No comment provided by engineer. */
"Safer groups" = "Sicherere Gruppen";
/* chat item action */
"Save" = "Speichern";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Zugangscode einstellen";
/* No comment provided by engineer. */
"Set passphrase" = "Passwort festlegen";
/* No comment provided by engineer. */
"Set passphrase to export" = "Passwort für den Export festlegen";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Vorschau anzeigen";
/* No comment provided by engineer. */
"Show QR code" = "QR-Code anzeigen";
/* No comment provided by engineer. */
"Show:" = "Anzeigen:";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Jemand";
/* chat item text */
"standard end-to-end encryption" = "Standard-Ende-zu-Ende-Verschlüsselung";
/* No comment provided by engineer. */
"Start chat" = "Starten Sie den Chat";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Beenden";
/* No comment provided by engineer. */
"Stop chat" = "Chat beenden";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Chat beenden, um Datenbankaktionen zu erlauben";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "Stoppen Sie SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Chat wird beendet";
/* No comment provided by engineer. */
"strike" = "durchstreichen";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Diese Aktion kann nicht rückgängig gemacht werden! Ihr Profil und Ihre Kontakte, Nachrichten und Dateien gehen unwiderruflich verloren.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Dieser Chat ist durch Ende-zu-Ende-Verschlüsselung geschützt.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Dieser Chat ist durch Quantum-resistente Ende-zu-Ende-Verschlüsselung geschützt.";
/* notification title */
"this contact" = "Dieser Kontakt";
@@ -3555,7 +3753,7 @@
"This setting applies to messages in your current chat profile **%@**." = "Diese Einstellung gilt für Nachrichten in Ihrem aktuellen Chat-Profil **%@**.";
/* No comment provided by engineer. */
"To ask any questions and to receive updates:" = "Um Fragen zu stellen und Aktualisierungen zu erhalten:";
"To ask any questions and to receive updates:" = "Um Fragen zu stellen und aktuelle Informationen zu erhalten:";
/* No comment provided by engineer. */
"To connect, your contact can scan QR code or use the link in the app." = "Um eine Verbindung herzustellen, kann Ihr Kontakt den QR-Code scannen oder den Link in der App verwenden.";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Aktualisieren und den Chat öffnen";
/* No comment provided by engineer. */
"Upload failed" = "Hochladen fehlgeschlagen";
/* server test step */
"Upload file" = "Datei hochladen";
/* No comment provided by engineer. */
"Uploading archive" = "Archiv wird hochgeladen";
/* No comment provided by engineer. */
"Use .onion hosts" = "Verwende .onion-Hosts";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Verwenden Sie SimpleX-Chat-Server?";
/* 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. */
"User profile" = "Benutzerprofil";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Verbindungen überprüfen";
/* No comment provided by engineer. */
"Verify database passphrase" = "Überprüfen Sie das Datenbank-Passwort";
/* No comment provided by engineer. */
"Verify passphrase" = "Überprüfen Sie das Passwort";
/* No comment provided by engineer. */
"Verify security code" = "Sicherheitscode überprüfen";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "möchte sich mit Ihnen verbinden!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Warnung: Das Starten des Chats auf mehreren Geräten wird nicht unterstützt und wird zu Fehlern bei der Nachrichtenübermittlung führen";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Warnung: Sie könnten einige Daten verlieren!";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Begrüßungsmeldung";
/* No comment provided by engineer. */
"Welcome message is too long" = "Die Begrüßungsmeldung ist zu lang";
/* No comment provided by engineer. */
"What's new" = "Was ist neu";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Profil";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "Sie dürfen die selbe Datenbank **nicht** auf zwei Geräten nutzen.";
/* No comment provided by engineer. */
"You accepted connection" = "Sie haben die Verbindung akzeptiert";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Sie können diese später in den Datenschutz & Sicherheits-Einstellungen der App aktivieren.";
/* No comment provided by engineer. */
"You can give another try." = "Sie können es nochmal probieren.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Sie können ein Benutzerprofil verbergen oder stummschalten - wischen Sie es nach rechts.";
@@ -4134,7 +4359,7 @@
"Your contacts can allow full message deletion." = "Ihre Kontakte können die unwiederbringliche Löschung von Nachrichten erlauben.";
/* No comment provided by engineer. */
"Your contacts will remain connected." = "Ihre Kontakte bleiben verbunden.";
"Your contacts will remain connected." = "Ihre Kontakte bleiben weiterhin verbunden.";
/* No comment provided by engineer. */
"Your current chat database will be DELETED and REPLACED with the imported one." = "Ihre aktuelle Chat-Datenbank wird GELÖSCHT und durch die Importierte ERSETZT.";
+225
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Más privado**: no se usa el servidor de notificaciones de SimpleX Chat, los mensajes se comprueban periódicamente en segundo plano (dependiendo de la frecuencia con la que utilices la aplicación).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Tenga en cuenta**: usar la misma base de datos en dos dispositivos interrumpirá el descifrado de mensajes de sus conexiones, como protección de seguridad.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Atención**: NO podrás recuperar o cambiar la contraseña si la pierdes.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Advertencia**: Las notificaciones automáticas instantáneas requieren una contraseña guardada en Keychain.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Atención**: el archivo será eliminado.";
/* No comment provided by engineer. */
"*bold*" = "\\*bold*";
@@ -136,6 +142,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ conectado";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ downloaded";
/* notification title */
"%@ is connected!" = "%@ ¡está conectado!";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "Servidores %@";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ cargado";
/* notification title */
"%@ wants to connect!" = "¡ %@ quiere contactar!";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "administrador";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Los admins pueden bloquear un miembro por todos.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Los administradores pueden crear enlaces para unirse a grupos.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Todos tus contactos permanecerán conectados. La actualización del perfil se enviará a tus contactos.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Todos sus contactos, conversaciones y archivos se cifrarán de forma segura y se subirán en fragmentos hacia puntos XFTP configurados.";
/* No comment provided by engineer. */
"Allow" = "Se permite";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "Compilación app: %@";
/* No comment provided by engineer. */
"App data migration" = "Migración de datos de la aplicación";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Cifrado de los nuevos archivos locales (excepto vídeos).";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Apariencia";
/* No comment provided by engineer. */
"Apply" = "Aplicar";
/* No comment provided by engineer. */
"Archive and upload" = "Archivar y transferir";
/* No comment provided by engineer. */
"Archiving database" = "Archivando base de datos";
/* No comment provided by engineer. */
"Attach" = "Adjuntar";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "Cancelar";
/* No comment provided by engineer. */
"Cancel migration" = "Cancelar migración";
/* feature offered item */
"cancelled %@" = "cancelado %@";
@@ -744,6 +777,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 está detenido. Si estás usando esta base de datos en otro dispositivo, deberías transferirla de vuelta antes de iniciarlo.";
/* No comment provided by engineer. */
"Chat migrated!" = "Chat transferido !";
/* No comment provided by engineer. */
"Chat preferences" = "Preferencias de Chat";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Interfaz en chino y español";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Elija _Migrar desde otro dispositivo_ en el nuevo dispositivo y escanee el código QR.";
/* No comment provided by engineer. */
"Choose file" = "Elije archivo";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Confirmar actualizaciones de la bases de datos";
/* No comment provided by engineer. */
"Confirm network settings" = "Confirmar los ajustes de red";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Confirme nueva contraseña…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Confirmar contraseña";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Confirme que recuerda la frase secreta de la base de datos para migrarla.";
/* No comment provided by engineer. */
"Confirm upload" = "Confirmar subida";
/* server test step */
"Connect" = "Conectar";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Creado en %@";
/* No comment provided by engineer. */
"Creating archive link" = "Creando enlace de archivo";
/* No comment provided by engineer. */
"Creating link…" = "Creando enlace…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Eliminar base de datos";
/* No comment provided by engineer. */
"Delete database from this device" = "Eliminar base de datos de este dispositivo";
/* server test step */
"Delete file" = "Eliminar archivo";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Degradar y abrir Chat";
/* No comment provided by engineer. */
"Download failed" = "Error en la descarga";
/* server test step */
"Download file" = "Descargar archivo";
/* No comment provided by engineer. */
"Downloading archive" = "Descargando archivo";
/* No comment provided by engineer. */
"Downloading link details" = "Descargando detalles del enlace";
/* No comment provided by engineer. */
"Duplicate display name!" = "¡Nombre mostrado duplicado!";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Activar para todos";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Activar en chats directos (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "¿Activar notificación instantánea?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Introduce Código";
/* No comment provided by engineer. */
"Enter passphrase" = "Introducir frase de contraseña";
/* No comment provided by engineer. */
"Enter passphrase…" = "Introduce la contraseña…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Error al añadir miembro(s)";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Error al permitir cifrado PQ al contacto";
/* No comment provided by engineer. */
"Error changing address" = "Error al cambiar servidor";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Error al eliminar perfil";
/* No comment provided by engineer. */
"Error downloading the archive" = "Error al descargar el archivo";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "¡Error al activar confirmaciones de entrega!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Error al guardar contraseña en Keychain";
/* when migrating */
"Error saving settings" = "Error al guardar ajustes";
/* No comment provided by engineer. */
"Error saving user password" = "Error al guardar contraseña de usuario";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Error al actualizar privacidad de usuario";
/* No comment provided by engineer. */
"Error uploading the archive" = "Error al subir el archivo";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Error al verificar la frase de contraseña:";
/* No comment provided by engineer. */
"Error: " = "Error: ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Archivo de base de datos exportado.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "El archivo exportado no existe";
/* No comment provided by engineer. */
"Exporting database archive…" = "Exportando base de datos…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtra chats no leídos y favoritos.";
/* No comment provided by engineer. */
"Finalize migration" = "Finalizar la migración";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Finalizar la migración en otro dispositivo.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "¡Por fin los tenemos! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Cómo usar los servidores";
/* No comment provided by engineer. */
"Hungarian interface" = "Interfaz húngara";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "Servidores ICE (uno por línea)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Importar base de datos";
/* No comment provided by engineer. */
"Import failed" = "Error de importación";
/* No comment provided by engineer. */
"Importing archive" = "Importando archivo";
/* No comment provided by engineer. */
"Improved message delivery" = "Entrega de mensajes mejorada";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Configuración del servidor mejorada";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Para continuar, el chat debe ser interrumpido.";
/* No comment provided by engineer. */
"In reply to" = "En respuesta a";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Enlace no válido";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Confirmación de migración inválida";
/* No comment provided by engineer. */
"Invalid name!" = "¡Nombre no válido!";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Contacto y texto";
/* No comment provided by engineer. */
"Message too large" = "Mensaje demasiado grande";
/* No comment provided by engineer. */
"Messages" = "Mensajes";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "¡Los mensajes de %@ serán mostrados!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques.";
/* No comment provided by engineer. */
"Migrate device" = "Migrar dispositivo";
/* No comment provided by engineer. */
"Migrate from another device" = "Migrar desde otro dispositivo";
/* No comment provided by engineer. */
"Migrate here" = "Migrar aquí";
/* No comment provided by engineer. */
"Migrate to another device" = "Migrar hacia otro dispositivo";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Migrar hacia otro dispositivo mediante código QR.";
/* No comment provided by engineer. */
"Migrating" = "Migrando";
/* No comment provided by engineer. */
"Migrating database archive…" = "Migrando base de datos…";
/* No comment provided by engineer. */
"Migration complete" = "Migración completada";
/* No comment provided by engineer. */
"Migration error:" = "Error de migración:";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Grupo abierto";
/* authentication reason */
"Open migration to another device" = "Abrir la migración hacia otro dispositivo";
/* No comment provided by engineer. */
"Open Settings" = "Abrir Configuración";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "Iniciando aplicación…";
/* No comment provided by engineer. */
"Or paste archive link" = "O pegar enlace del archivo";
/* No comment provided by engineer. */
"Or scan QR code" = "O escanear código QR";
/* No comment provided by engineer. */
"Or securely share this file link" = "O comparta de forma segura el enlace de este archivo";
/* No comment provided by engineer. */
"Or show this code" = "O mostrar este código";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Error permanente descifrado";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Llamadas picture-in-picture";
/* No comment provided by engineer. */
"PING count" = "Contador PING";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Comprueba tus preferencias y las de tu contacto.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Por favor confirme que la configuración de red es correcta para este dispositivo.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Por favor, contacta con los desarrolladores.\nError: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "E2EE postcuántica";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Conserva el último borrador del mensaje con los datos adjuntos.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Notificaciones automáticas";
/* No comment provided by engineer. */
"Push server" = "Servidor push";
/* chat item text */
"quantum resistant e2e encryption" = "cifrado e2e resistente a la cuántica";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Cifrado resistente a la tecnología cuántica";
/* No comment provided by engineer. */
"Rate the app" = "Valora la aplicación";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "¿Repetir solicitud de conexión?";
/* No comment provided by engineer. */
"Repeat download" = "Repetir descarga";
/* No comment provided by engineer. */
"Repeat import" = "Repetir importación";
/* No comment provided by engineer. */
"Repeat join request?" = "¿Repetir solicitud de admisión?";
/* No comment provided by engineer. */
"Repeat upload" = "Repetir la carga";
/* chat item action */
"Reply" = "Responder";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Ejecutar chat";
/* No comment provided by engineer. */
"Safer groups" = "Grupos más seguros";
/* chat item action */
"Save" = "Guardar";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Código autodestrucción";
/* No comment provided by engineer. */
"Set passphrase" = "Definir frase de contraseña";
/* No comment provided by engineer. */
"Set passphrase to export" = "Escribe la contraseña para exportar";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Mostrar vista previa";
/* No comment provided by engineer. */
"Show QR code" = "Mostrar código QR";
/* No comment provided by engineer. */
"Show:" = "Mostrar:";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Alguien";
/* chat item text */
"standard end-to-end encryption" = "cifrado estándar de extremo a extremo";
/* No comment provided by engineer. */
"Start chat" = "Iniciar chat";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Detener";
/* No comment provided by engineer. */
"Stop chat" = "Detener el chat";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Detén SimpleX para habilitar las acciones sobre la base de datos";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "Detener SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Detención del chat";
/* No comment provided by engineer. */
"strike" = "tachado";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Esta acción es irreversible. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Este chat está protegido por cifrado de extremo a extremo.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas.";
/* notification title */
"this contact" = "este contacto";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Actualizar y abrir Chat";
/* No comment provided by engineer. */
"Upload failed" = "Error de carga";
/* server test step */
"Upload file" = "Subir archivo";
/* No comment provided by engineer. */
"Uploading archive" = "Subiendo el archivo";
/* No comment provided by engineer. */
"Use .onion hosts" = "Usar hosts .onion";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "¿Usar servidores SimpleX Chat?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Usar la app durante la llamada.";
/* No comment provided by engineer. */
"User profile" = "Perfil de usuario";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Verificar conexiones";
/* No comment provided by engineer. */
"Verify database passphrase" = "Verificar la contraseña de la base de datos";
/* No comment provided by engineer. */
"Verify passphrase" = "Verificar frase de contraseña";
/* No comment provided by engineer. */
"Verify security code" = "Comprobar código de seguridad";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "¡quiere contactar contigo!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Atención: ¡puedes perder algunos datos!";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Mensaje de bienvenida";
/* No comment provided by engineer. */
"Welcome message is too long" = "El mensaje de bienvenida es demasiado largo";
/* No comment provided by engineer. */
"What's new" = "Novedades";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Tú";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "**No debe** usar la misma base de datos en dos dispositivos.";
/* No comment provided by engineer. */
"You accepted connection" = "Has aceptado la conexión";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Puedes activarlos más tarde en la configuración de Privacidad y Seguridad.";
/* No comment provided by engineer. */
"You can give another try." = "Puede intentarlo de nuevo.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Puedes ocultar o silenciar un perfil deslizándolo a la derecha.";
+225
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Confidentiel** : ne pas utiliser le serveur de notifications SimpleX, vérification de nouveaux messages periodiquement en arrière plan (dépend de l'utilisation de l'app).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Remarque**: l'utilisation de la même base de données sur deux appareils interrompt le déchiffrement des messages provenant de vos connexions, par mesure de sécurité.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Veuillez noter** : vous NE pourrez PAS récupérer ou modifier votre phrase secrète si vous la perdez.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Avertissement** : les notifications push instantanées nécessitent une phrase secrète enregistrée dans la keychain.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Avertissement**: l'archive sera supprimée.";
/* No comment provided by engineer. */
"*bold*" = "\\*gras*";
@@ -136,6 +142,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ connecté(e)";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ téléchargé";
/* notification title */
"%@ is connected!" = "%@ est connecté·e !";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "Serveurs %@";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ envoyé";
/* notification title */
"%@ wants to connect!" = "%@ veut se connecter !";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "admin";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Les admins peuvent bloquer un membre pour tous.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Les admins peuvent créer les liens qui permettent de rejoindre les groupes.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Tous vos contacts resteront connectés. La mise à jour du profil sera envoyée à vos contacts.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Tous vos contacts, conversations et fichiers seront chiffrés en toute sécurité et transférés par morceaux vers les relais XFTP configurés.";
/* No comment provided by engineer. */
"Allow" = "Autoriser";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "Build de l'app : %@";
/* No comment provided by engineer. */
"App data migration" = "Transfert des données de l'application";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "L'application chiffre les nouveaux fichiers locaux (sauf les vidéos).";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Apparence";
/* No comment provided by engineer. */
"Apply" = "Appliquer";
/* No comment provided by engineer. */
"Archive and upload" = "Archiver et transférer";
/* No comment provided by engineer. */
"Archiving database" = "Archivage de la base de données";
/* No comment provided by engineer. */
"Attach" = "Attacher";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "Annuler";
/* No comment provided by engineer. */
"Cancel migration" = "Annuler le transfert";
/* feature offered item */
"cancelled %@" = "annulé %@";
@@ -744,6 +777,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 migrated!" = "Messagerie transférée!";
/* No comment provided by engineer. */
"Chat preferences" = "Préférences de chat";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Interface en chinois et en espagnol";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Choisissez _Transferer depuis un autre appareil_ sur le nouvel appareil et scannez le code QR.";
/* No comment provided by engineer. */
"Choose file" = "Choisir le fichier";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Confirmer la mise à niveau de la base de données";
/* No comment provided by engineer. */
"Confirm network settings" = "Confirmer les paramètres réseau";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Confirmer la nouvelle phrase secrète…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Confirmer le mot de passe";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Confirmer que vous vous souvenez de la phrase secrète de la base de données pour la transférer.";
/* No comment provided by engineer. */
"Confirm upload" = "Confirmer la transmission";
/* server test step */
"Connect" = "Se connecter";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Créé le %@";
/* No comment provided by engineer. */
"Creating archive link" = "Création d'un lien d'archive";
/* No comment provided by engineer. */
"Creating link…" = "Création d'un lien…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Supprimer la base de données";
/* No comment provided by engineer. */
"Delete database from this device" = "Supprimer la base de données de cet appareil";
/* server test step */
"Delete file" = "Supprimer le fichier";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Rétrograder et ouvrir le chat";
/* No comment provided by engineer. */
"Download failed" = "Échec du téléchargement";
/* server test step */
"Download file" = "Télécharger le fichier";
/* No comment provided by engineer. */
"Downloading archive" = "Téléchargement de l'archive";
/* No comment provided by engineer. */
"Downloading link details" = "Téléchargement des détails du lien";
/* No comment provided by engineer. */
"Duplicate display name!" = "Nom d'affichage en double !";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Activer pour tous";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Activer dans les conversations directes (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Activer les notifications instantanées?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Entrer le code d'accès";
/* No comment provided by engineer. */
"Enter passphrase" = "Entrer la phrase secrète";
/* No comment provided by engineer. */
"Enter passphrase…" = "Entrez la phrase secrète…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Erreur lors de l'ajout de membre·s";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Erreur lors de la négociation du chiffrement PQ";
/* No comment provided by engineer. */
"Error changing address" = "Erreur de changement d'adresse";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Erreur lors de la suppression du profil utilisateur";
/* No comment provided by engineer. */
"Error downloading the archive" = "Erreur lors du téléchargement de l'archive";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Erreur lors de l'activation des accusés de réception!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Erreur lors de l'enregistrement de la phrase de passe dans la keychain";
/* when migrating */
"Error saving settings" = "Erreur lors de l'enregistrement des paramètres";
/* No comment provided by engineer. */
"Error saving user password" = "Erreur d'enregistrement du mot de passe de l'utilisateur";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Erreur de mise à jour de la confidentialité de l'utilisateur";
/* No comment provided by engineer. */
"Error uploading the archive" = "Erreur lors de l'envoi de l'archive";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Erreur lors de la vérification de la phrase secrète:";
/* No comment provided by engineer. */
"Error: " = "Erreur : ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Archive de la base de données exportée.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Le fichier exporté n'existe pas";
/* No comment provided by engineer. */
"Exporting database archive…" = "Exportation de l'archive de la base de données…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtrer les messages non lus et favoris.";
/* No comment provided by engineer. */
"Finalize migration" = "Finaliser le transfert";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Finalisez le transfert sur l'autre appareil.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Enfin, les voilà ! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Comment utiliser vos serveurs";
/* No comment provided by engineer. */
"Hungarian interface" = "Interface en hongrois";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "Serveurs ICE (un par ligne)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Importer la base de données";
/* No comment provided by engineer. */
"Import failed" = "Échec de l'importation";
/* No comment provided by engineer. */
"Importing archive" = "Importation de l'archive";
/* No comment provided by engineer. */
"Improved message delivery" = "Amélioration de la transmission des messages";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Configuration de serveur améliorée";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Pour continuer, le chat doit être interrompu.";
/* No comment provided by engineer. */
"In reply to" = "En réponse à";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Lien invalide";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Confirmation de migration invalide";
/* No comment provided by engineer. */
"Invalid name!" = "Nom invalide !";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Texte du message";
/* No comment provided by engineer. */
"Message too large" = "Message trop volumineux";
/* No comment provided by engineer. */
"Messages" = "Messages";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "Les messages de %@ seront affichés !";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **de bout en bout** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **e2e résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.";
/* No comment provided by engineer. */
"Migrate device" = "Transférer l'appareil";
/* No comment provided by engineer. */
"Migrate from another device" = "Transférer depuis un autre appareil";
/* No comment provided by engineer. */
"Migrate here" = "Transférer ici";
/* No comment provided by engineer. */
"Migrate to another device" = "Transférer vers un autre appareil";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Transférer vers un autre appareil via un code QR.";
/* No comment provided by engineer. */
"Migrating" = "Transfert";
/* No comment provided by engineer. */
"Migrating database archive…" = "Migration de l'archive de la base de données…";
/* No comment provided by engineer. */
"Migration complete" = "Transfert terminé";
/* No comment provided by engineer. */
"Migration error:" = "Erreur de migration:";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Ouvrir le groupe";
/* authentication reason */
"Open migration to another device" = "Ouvrir le transfert vers un autre appareil";
/* No comment provided by engineer. */
"Open Settings" = "Ouvrir les Paramètres";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "Ouverture de l'app…";
/* No comment provided by engineer. */
"Or paste archive link" = "Ou coller le lien de l'archive";
/* No comment provided by engineer. */
"Or scan QR code" = "Ou scanner le code QR";
/* No comment provided by engineer. */
"Or securely share this file link" = "Ou partagez en toute sécurité le lien de ce fichier";
/* No comment provided by engineer. */
"Or show this code" = "Ou présenter ce code";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Erreur de déchiffrement";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Appels picture-in-picture";
/* No comment provided by engineer. */
"PING count" = "Nombre de PING";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Veuillez vérifier vos préférences ainsi que celles de votre contact.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Veuillez confirmer que les paramètres réseau de cet appareil sont corrects.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Veuillez contacter les développeurs.\nErreur: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Il est possible que l'empreinte du certificat dans l'adresse du serveur soit incorrecte";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "E2EE post-quantique";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Conserver le brouillon du dernier message, avec les pièces jointes.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Notifications push";
/* No comment provided by engineer. */
"Push server" = "Serveur Push";
/* chat item text */
"quantum resistant e2e encryption" = "chiffrement e2e résistant post-quantique";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Chiffrement résistant post-quantique";
/* No comment provided by engineer. */
"Rate the app" = "Évaluer l'app";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Répéter la demande de connexion ?";
/* No comment provided by engineer. */
"Repeat download" = "Répéter le téléchargement";
/* No comment provided by engineer. */
"Repeat import" = "Répéter l'importation";
/* No comment provided by engineer. */
"Repeat join request?" = "Répéter la requête d'adhésion ?";
/* No comment provided by engineer. */
"Repeat upload" = "Répéter l'envoi";
/* chat item action */
"Reply" = "Répondre";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Exécuter le chat";
/* No comment provided by engineer. */
"Safer groups" = "Groupes plus sûrs";
/* chat item action */
"Save" = "Enregistrer";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Définir le code d'accès";
/* No comment provided by engineer. */
"Set passphrase" = "Définir une phrase secrète";
/* No comment provided by engineer. */
"Set passphrase to export" = "Définir la phrase secrète pour l'export";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Afficher l'aperçu";
/* No comment provided by engineer. */
"Show QR code" = "Afficher le code QR";
/* No comment provided by engineer. */
"Show:" = "Afficher :";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Quelqu'un";
/* chat item text */
"standard end-to-end encryption" = "chiffrement de bout en bout standard";
/* No comment provided by engineer. */
"Start chat" = "Démarrer le chat";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Arrêter";
/* No comment provided by engineer. */
"Stop chat" = "Arrêter le chat";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Arrêter le chat pour permettre des actions sur la base de données";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "Arrêter SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Arrêt du chat";
/* No comment provided by engineer. */
"strike" = "barré";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Cette action ne peut être annulée - votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout résistant aux technologies quantiques.";
/* notification title */
"this contact" = "ce contact";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Mettre à niveau et ouvrir le chat";
/* No comment provided by engineer. */
"Upload failed" = "Échec de l'envoi";
/* server test step */
"Upload file" = "Transférer le fichier";
/* No comment provided by engineer. */
"Uploading archive" = "Envoi de l'archive";
/* No comment provided by engineer. */
"Use .onion hosts" = "Utiliser les hôtes .onions";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Utiliser les serveurs SimpleX Chat?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Utiliser l'application pendant l'appel.";
/* No comment provided by engineer. */
"User profile" = "Profil d'utilisateur";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Vérifier les connexions";
/* No comment provided by engineer. */
"Verify database passphrase" = "Vérifier la phrase secrète de la base de données";
/* No comment provided by engineer. */
"Verify passphrase" = "Vérifier la phrase secrète";
/* No comment provided by engineer. */
"Verify security code" = "Vérifier le code de sécurité";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "veut établir une connexion !";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Attention : vous risquez de perdre des données !";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Message de bienvenue";
/* No comment provided by engineer. */
"Welcome message is too long" = "Le message de bienvenue est trop long";
/* No comment provided by engineer. */
"What's new" = "Quoi de neuf ?";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Vous";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "Vous **ne devez pas** utiliser la même base de données sur deux appareils.";
/* No comment provided by engineer. */
"You accepted connection" = "Vous avez accepté la connexion";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Vous pouvez les activer ultérieurement via les paramètres de Confidentialité et Sécurité de l'application.";
/* No comment provided by engineer. */
"You can give another try." = "Vous pouvez faire un nouvel essai.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Vous pouvez masquer ou mettre en sourdine un profil d'utilisateur - faites-le glisser vers la droite.";
+225
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Il più privato**: non usare il server di notifica di SimpleX Chat, controlla i messaggi periodicamente in secondo piano (dipende da quanto spesso usi l'app).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Nota bene**: usare lo stesso database su due dispositivi bloccherà la decifrazione dei messaggi dalle tue connessioni, come misura di sicurezza.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Nota bene**: NON potrai recuperare o cambiare la password se la perdi.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Attenzione**: le notifiche push istantanee richiedono una password salvata nel portachiavi.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Attenzione**: l'archivio verrà rimosso.";
/* No comment provided by engineer. */
"*bold*" = "\\*grassetto*";
@@ -136,6 +142,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ si è connesso/a";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ scaricati";
/* notification title */
"%@ is connected!" = "%@ è connesso/a!";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "Server %@";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ caricati";
/* notification title */
"%@ wants to connect!" = "%@ si vuole connettere!";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "amministratore";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Gli amministratori possono bloccare un membro per tutti.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Gli amministratori possono creare i link per entrare nei gruppi.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Tutti i tuoi contatti resteranno connessi. L'aggiornamento del profilo verrà inviato ai tuoi contatti.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Tutti i tuoi contatti, le conversazioni e i file verranno criptati in modo sicuro e caricati in blocchi sui relay XFTP configurati.";
/* No comment provided by engineer. */
"Allow" = "Consenti";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "Build dell'app: %@";
/* No comment provided by engineer. */
"App data migration" = "Migrazione dati dell'app";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "L'app cripta i nuovi file locali (eccetto i video).";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Aspetto";
/* No comment provided by engineer. */
"Apply" = "Applica";
/* No comment provided by engineer. */
"Archive and upload" = "Archivia e carica";
/* No comment provided by engineer. */
"Archiving database" = "Archiviazione del database";
/* No comment provided by engineer. */
"Attach" = "Allega";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "Annulla";
/* No comment provided by engineer. */
"Cancel migration" = "Annulla migrazione";
/* feature offered item */
"cancelled %@" = "annullato %@";
@@ -744,6 +777,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 migrated!" = "Chat migrata!";
/* No comment provided by engineer. */
"Chat preferences" = "Preferenze della chat";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Interfaccia cinese e spagnola";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Scegli _Migra da un altro dispositivo_ sul nuovo dispositivo e scansione il codice QR.";
/* No comment provided by engineer. */
"Choose file" = "Scegli file";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Conferma aggiornamenti database";
/* No comment provided by engineer. */
"Confirm network settings" = "Conferma le impostazioni di rete";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Conferma nuova password…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Conferma password";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Conferma che ricordi la password del database da migrare.";
/* No comment provided by engineer. */
"Confirm upload" = "Conferma caricamento";
/* server test step */
"Connect" = "Connetti";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Creato il %@";
/* No comment provided by engineer. */
"Creating archive link" = "Creazione link dell'archivio";
/* No comment provided by engineer. */
"Creating link…" = "Creazione link…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Elimina database";
/* No comment provided by engineer. */
"Delete database from this device" = "Elimina il database da questo dispositivo";
/* server test step */
"Delete file" = "Elimina file";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Esegui downgrade e apri chat";
/* No comment provided by engineer. */
"Download failed" = "Scaricamento fallito";
/* server test step */
"Download file" = "Scarica file";
/* No comment provided by engineer. */
"Downloading archive" = "Scaricamento archivio";
/* No comment provided by engineer. */
"Downloading link details" = "Scaricamento dettagli del link";
/* No comment provided by engineer. */
"Duplicate display name!" = "Nome da mostrare doppio!";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Attiva per tutti";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Attivala nelle chat dirette (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Attivare le notifiche istantanee?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Inserisci il codice di accesso";
/* No comment provided by engineer. */
"Enter passphrase" = "Inserisci password";
/* No comment provided by engineer. */
"Enter passphrase…" = "Inserisci la password…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Errore di aggiunta membro/i";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Errore nel consentire la crittografia PQ al contatto";
/* No comment provided by engineer. */
"Error changing address" = "Errore nella modifica dell'indirizzo";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Errore nell'eliminazione del profilo utente";
/* No comment provided by engineer. */
"Error downloading the archive" = "Errore di scaricamento dell'archivio";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Errore nell'attivazione delle ricevute di consegna!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Errore nel salvataggio della password nel portachiavi";
/* when migrating */
"Error saving settings" = "Errore di salvataggio delle impostazioni";
/* No comment provided by engineer. */
"Error saving user password" = "Errore nel salvataggio della password utente";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Errore nell'aggiornamento della privacy dell'utente";
/* No comment provided by engineer. */
"Error uploading the archive" = "Errore di invio dell'archivio";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Errore di verifica della password:";
/* No comment provided by engineer. */
"Error: " = "Errore: ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Archivio database esportato.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Il file esportato non esiste";
/* No comment provided by engineer. */
"Exporting database archive…" = "Esportazione archivio database…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtra le chat non lette e preferite.";
/* No comment provided by engineer. */
"Finalize migration" = "Finalizza la migrazione";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Finalizza la migrazione su un altro dispositivo.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Finalmente le abbiamo! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Come usare i tuoi server";
/* No comment provided by engineer. */
"Hungarian interface" = "Interfaccia in ungherese";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "Server ICE (uno per riga)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Importa database";
/* No comment provided by engineer. */
"Import failed" = "Importazione fallita";
/* No comment provided by engineer. */
"Importing archive" = "Importazione archivio";
/* No comment provided by engineer. */
"Improved message delivery" = "Consegna dei messaggi migliorata";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Configurazione del server migliorata";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Per continuare, la chat deve essere fermata.";
/* No comment provided by engineer. */
"In reply to" = "In risposta a";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Link non valido";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Conferma di migrazione non valida";
/* No comment provided by engineer. */
"Invalid name!" = "Nome non valido!";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Testo del messaggio";
/* No comment provided by engineer. */
"Message too large" = "Messaggio troppo grande";
/* No comment provided by engineer. */
"Messages" = "Messaggi";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "I messaggi da %@ verranno mostrati!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia end-to-end** con perfect forward secrecy, ripudio e recupero da intrusione.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente alla quantistica** con perfect forward secrecy, ripudio e recupero da intrusione.";
/* No comment provided by engineer. */
"Migrate device" = "Migra dispositivo";
/* No comment provided by engineer. */
"Migrate from another device" = "Migra da un altro dispositivo";
/* No comment provided by engineer. */
"Migrate here" = "Migra qui";
/* No comment provided by engineer. */
"Migrate to another device" = "Migra ad un altro dispositivo";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Migra ad un altro dispositivo via codice QR.";
/* No comment provided by engineer. */
"Migrating" = "Migrazione";
/* No comment provided by engineer. */
"Migrating database archive…" = "Migrazione archivio del database…";
/* No comment provided by engineer. */
"Migration complete" = "Migrazione completata";
/* No comment provided by engineer. */
"Migration error:" = "Errore di migrazione:";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Apri gruppo";
/* authentication reason */
"Open migration to another device" = "Apri migrazione ad un altro dispositivo";
/* No comment provided by engineer. */
"Open Settings" = "Apri le impostazioni";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "Apertura dell'app…";
/* No comment provided by engineer. */
"Or paste archive link" = "O incolla il link dell'archivio";
/* No comment provided by engineer. */
"Or scan QR code" = "O scansiona il codice QR";
/* No comment provided by engineer. */
"Or securely share this file link" = "O condividi in modo sicuro questo link del file";
/* No comment provided by engineer. */
"Or show this code" = "O mostra questo codice";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Errore di decifrazione";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Chiamate picture-in-picture";
/* No comment provided by engineer. */
"PING count" = "Conteggio PING";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Controlla le preferenze tue e del tuo contatto.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Conferma che le impostazioni di rete sono corrette per questo dispositivo.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Contatta gli sviluppatori.\nErrore: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Probabilmente l'impronta del certificato nell'indirizzo del server è sbagliata";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "E2EE post-quantistica";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Conserva la bozza dell'ultimo messaggio, con gli allegati.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Notifiche push";
/* No comment provided by engineer. */
"Push server" = "Server push";
/* chat item text */
"quantum resistant e2e encryption" = "crittografia e2e resistente alla quantistica";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Crittografia resistente alla quantistica";
/* No comment provided by engineer. */
"Rate the app" = "Valuta l'app";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Ripetere la richiesta di connessione?";
/* No comment provided by engineer. */
"Repeat download" = "Ripeti scaricamento";
/* No comment provided by engineer. */
"Repeat import" = "Ripeti importazione";
/* No comment provided by engineer. */
"Repeat join request?" = "Ripetere la richiesta di ingresso?";
/* No comment provided by engineer. */
"Repeat upload" = "Ripeti caricamento";
/* chat item action */
"Reply" = "Rispondi";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Avvia chat";
/* No comment provided by engineer. */
"Safer groups" = "Gruppi più sicuri";
/* chat item action */
"Save" = "Salva";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Imposta codice";
/* No comment provided by engineer. */
"Set passphrase" = "Imposta password";
/* No comment provided by engineer. */
"Set passphrase to export" = "Imposta la password per esportare";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Mostra anteprima";
/* No comment provided by engineer. */
"Show QR code" = "Mostra codice QR";
/* No comment provided by engineer. */
"Show:" = "Mostra:";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Qualcuno";
/* chat item text */
"standard end-to-end encryption" = "crittografia end-to-end standard";
/* No comment provided by engineer. */
"Start chat" = "Avvia chat";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Ferma";
/* No comment provided by engineer. */
"Stop chat" = "Ferma la chat";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Ferma la chat per attivare le azioni del database";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "Ferma SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Arresto della chat";
/* No comment provided by engineer. */
"strike" = "barrato";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Questa azione non può essere annullata: il tuo profilo, i contatti, i messaggi e i file andranno persi in modo irreversibile.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end resistente alla quantistica.";
/* notification title */
"this contact" = "questo contatto";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Aggiorna e apri chat";
/* No comment provided by engineer. */
"Upload failed" = "Invio fallito";
/* server test step */
"Upload file" = "Invia file";
/* No comment provided by engineer. */
"Uploading archive" = "Invio dell'archivio";
/* No comment provided by engineer. */
"Use .onion hosts" = "Usa gli host .onion";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Usare i server di SimpleX Chat?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Usa l'app mentre sei in chiamata.";
/* No comment provided by engineer. */
"User profile" = "Profilo utente";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Verifica le connessioni";
/* No comment provided by engineer. */
"Verify database passphrase" = "Verifica password del database";
/* No comment provided by engineer. */
"Verify passphrase" = "Verifica password";
/* No comment provided by engineer. */
"Verify security code" = "Verifica codice di sicurezza";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "vuole connettersi con te!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attenzione: avviare la chat su più dispositivi non è supportato e provocherà problemi di recapito dei messaggi";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Attenzione: potresti perdere alcuni dati!";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Messaggio di benvenuto";
/* No comment provided by engineer. */
"Welcome message is too long" = "Il messaggio di benvenuto è troppo lungo";
/* No comment provided by engineer. */
"What's new" = "Novità";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Tu";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "**Non devi** usare lo stesso database su due dispositivi.";
/* No comment provided by engineer. */
"You accepted connection" = "Hai accettato la connessione";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Puoi attivarle più tardi nelle impostazioni di privacy e sicurezza dell'app.";
/* No comment provided by engineer. */
"You can give another try." = "Puoi fare un altro tentativo.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Puoi nascondere o silenziare un profilo utente - scorrilo verso destra.";
+226 -1
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Meest privé**: gebruik geen SimpleX Chat-notificatie server, controleer berichten regelmatig op de achtergrond (afhankelijk van hoe vaak u de app gebruikt).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Let op**: als u dezelfde database op twee apparaten gebruikt, wordt de decodering van berichten van uw verbindingen verbroken, als veiligheidsmaatregel.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Let op**: u kunt het wachtwoord NIET herstellen of wijzigen als u het kwijtraakt.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Waarschuwing**: voor directe push meldingen is een wachtwoord vereist dat is opgeslagen in de Keychain.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Waarschuwing**: het archief wordt verwijderd.";
/* No comment provided by engineer. */
"*bold*" = "\\*vetgedrukt*";
@@ -136,6 +142,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ verbonden";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ gedownload";
/* notification title */
"%@ is connected!" = "%@ is verbonden!";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "%@ servers";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ geüpload";
/* notification title */
"%@ wants to connect!" = "%@ wil verbinding maken!";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "Beheerder";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Beheerders kunnen een lid voor iedereen blokkeren.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Beheerders kunnen de uitnodiging links naar groepen aanmaken.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Al uw contacten blijven verbonden. Profiel update wordt naar uw contacten verzonden.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Al uw contacten, gesprekken en bestanden worden veilig gecodeerd en in delen geüpload naar geconfigureerde XFTP-relays.";
/* No comment provided by engineer. */
"Allow" = "Toestaan";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "App build: %@";
/* No comment provided by engineer. */
"App data migration" = "Migratie van app-gegevens";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "App versleutelt nieuwe lokale bestanden (behalve video's).";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Uiterlijk";
/* No comment provided by engineer. */
"Apply" = "Toepassen";
/* No comment provided by engineer. */
"Archive and upload" = "Archiveren en uploaden";
/* No comment provided by engineer. */
"Archiving database" = "Database archiveren";
/* No comment provided by engineer. */
"Attach" = "Bijvoegen";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "Annuleren";
/* No comment provided by engineer. */
"Cancel migration" = "Migratie annuleren";
/* feature offered item */
"cancelled %@" = "geannuleerd %@";
@@ -744,6 +777,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 migrated!" = "Chat gemigreerd!";
/* No comment provided by engineer. */
"Chat preferences" = "Gesprek voorkeuren";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Chinese en Spaanse interface";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Kies _Migreren vanaf een ander apparaat_ op het nieuwe apparaat en scan de QR-code.";
/* No comment provided by engineer. */
"Choose file" = "Kies bestand";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Bevestig database upgrades";
/* No comment provided by engineer. */
"Confirm network settings" = "Bevestig netwerk instellingen";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Bevestig nieuw wachtwoord…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Bevestig wachtwoord";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Bevestig dat u het wachtwoord voor de database onthoudt om deze te migreren.";
/* No comment provided by engineer. */
"Confirm upload" = "Bevestig het uploaden";
/* server test step */
"Connect" = "Verbind";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Gemaakt op %@";
/* No comment provided by engineer. */
"Creating archive link" = "Archief link maken";
/* No comment provided by engineer. */
"Creating link…" = "Link maken…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Database verwijderen";
/* No comment provided by engineer. */
"Delete database from this device" = "Verwijder de database van dit apparaat";
/* server test step */
"Delete file" = "Verwijder bestand";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Downgraden en chat openen";
/* No comment provided by engineer. */
"Download failed" = "Download mislukt";
/* server test step */
"Download file" = "Download bestand";
/* No comment provided by engineer. */
"Downloading archive" = "Archief downloaden";
/* No comment provided by engineer. */
"Downloading link details" = "Link gegevens downloaden";
/* No comment provided by engineer. */
"Duplicate display name!" = "Dubbele weergavenaam!";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Inschakelen voor iedereen";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Activeer in directe chats (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Onmiddellijke meldingen inschakelen?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Voer toegangscode in";
/* No comment provided by engineer. */
"Enter passphrase" = "Voer het wachtwoord in";
/* No comment provided by engineer. */
"Enter passphrase…" = "Voer wachtwoord in…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Fout bij het toevoegen van leden";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Fout bij het toestaan van contact PQ-versleuteling";
/* No comment provided by engineer. */
"Error changing address" = "Fout bij wijzigen van adres";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Fout bij het verwijderen van gebruikers profiel";
/* No comment provided by engineer. */
"Error downloading the archive" = "Fout bij het downloaden van het archief";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Fout bij het inschakelen van ontvangst bevestiging!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Fout bij opslaan van wachtwoord in de keychain";
/* when migrating */
"Error saving settings" = "Fout bij opslaan van instellingen";
/* No comment provided by engineer. */
"Error saving user password" = "Fout bij opslaan gebruikers wachtwoord";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Fout bij updaten van gebruikers privacy";
/* No comment provided by engineer. */
"Error uploading the archive" = "Fout bij het uploaden van het archief";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Fout bij het verifiëren van het wachtwoord:";
/* No comment provided by engineer. */
"Error: " = "Fout: ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Geëxporteerd database archief.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Geëxporteerd bestand bestaat niet";
/* No comment provided by engineer. */
"Exporting database archive…" = "Database archief exporteren…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filter ongelezen en favoriete chats.";
/* No comment provided by engineer. */
"Finalize migration" = "Voltooi de migratie";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Voltooi de migratie op een ander apparaat.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Eindelijk, we hebben ze! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Hoe u uw servers gebruikt";
/* No comment provided by engineer. */
"Hungarian interface" = "Hongaarse interface";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "ICE servers (één per lijn)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Database importeren";
/* No comment provided by engineer. */
"Import failed" = "Importeren is mislukt";
/* No comment provided by engineer. */
"Importing archive" = "Archief importeren";
/* No comment provided by engineer. */
"Improved message delivery" = "Verbeterde berichtbezorging";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Verbeterde serverconfiguratie";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Om verder te kunnen gaan, moet de chat worden gestopt.";
/* No comment provided by engineer. */
"In reply to" = "In antwoord op";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Ongeldige link";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Ongeldige migratie bevestiging";
/* No comment provided by engineer. */
"Invalid name!" = "Ongeldige naam!";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Bericht tekst";
/* No comment provided by engineer. */
"Message too large" = "Bericht te groot";
/* No comment provided by engineer. */
"Messages" = "Berichten";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "Berichten van %@ worden getoond!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Berichten, bestanden en oproepen worden beschermd door **end-to-end codering** met perfecte voorwaartse geheimhouding, afwijzing en inbraakherstel.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Berichten, bestanden en oproepen worden beschermd door **kwantumbestendige e2e encryptie** met perfecte voorwaartse geheimhouding, afwijzing en inbraakherstel.";
/* No comment provided by engineer. */
"Migrate device" = "Apparaat migreren";
/* No comment provided by engineer. */
"Migrate from another device" = "Migreer vanaf een ander apparaat";
/* No comment provided by engineer. */
"Migrate here" = "Migreer hierheen";
/* No comment provided by engineer. */
"Migrate to another device" = "Migreer naar een ander apparaat";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Migreer naar een ander apparaat via QR-code.";
/* No comment provided by engineer. */
"Migrating" = "Migreren";
/* No comment provided by engineer. */
"Migrating database archive…" = "Database archief migreren…";
/* No comment provided by engineer. */
"Migration complete" = "Migratie voltooid";
/* No comment provided by engineer. */
"Migration error:" = "Migratiefout:";
@@ -2592,7 +2730,7 @@
"Open" = "Open";
/* No comment provided by engineer. */
"Open chat" = "Gesprekken openen";
"Open chat" = "Chat openen";
/* authentication reason */
"Open chat console" = "Chat console openen";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Open groep";
/* authentication reason */
"Open migration to another device" = "Open de migratie naar een ander apparaat";
/* No comment provided by engineer. */
"Open Settings" = "Open instellingen";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "App openen…";
/* No comment provided by engineer. */
"Or paste archive link" = "Of plak de archief link";
/* No comment provided by engineer. */
"Or scan QR code" = "Of scan de QR-code";
/* No comment provided by engineer. */
"Or securely share this file link" = "Of deel deze bestands link veilig";
/* No comment provided by engineer. */
"Or show this code" = "Of laat deze code zien";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Decodering fout";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Beeld-in-beeld oproepen";
/* No comment provided by engineer. */
"PING count" = "PING count";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Controleer de uwe en uw contact voorkeuren.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Controleer of de netwerk instellingen correct zijn voor dit apparaat.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Neem contact op met ontwikkelaars.\nFout: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Mogelijk is de certificaat vingerafdruk in het server adres onjuist";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "Post-quantum E2EE";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Bewaar het laatste berichtconcept, met bijlagen.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Push meldingen";
/* No comment provided by engineer. */
"Push server" = "Push server";
/* chat item text */
"quantum resistant e2e encryption" = "quantum bestendige e2e-codering";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "quantum bestendige encryptie";
/* No comment provided by engineer. */
"Rate the app" = "Beoordeel de app";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Verbindingsverzoek herhalen?";
/* No comment provided by engineer. */
"Repeat download" = "Herhaal het downloaden";
/* No comment provided by engineer. */
"Repeat import" = "Herhaal import";
/* No comment provided by engineer. */
"Repeat join request?" = "Deelnameverzoek herhalen?";
/* No comment provided by engineer. */
"Repeat upload" = "Herhaal het uploaden";
/* chat item action */
"Reply" = "Antwoord";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Chat uitvoeren";
/* No comment provided by engineer. */
"Safer groups" = "Veiligere groepen";
/* chat item action */
"Save" = "Opslaan";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Toegangscode instellen";
/* No comment provided by engineer. */
"Set passphrase" = "Wachtwoord instellen";
/* No comment provided by engineer. */
"Set passphrase to export" = "Wachtwoord instellen om te exporteren";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Toon voorbeeld";
/* No comment provided by engineer. */
"Show QR code" = "Toon QR-code";
/* No comment provided by engineer. */
"Show:" = "Toon:";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Iemand";
/* chat item text */
"standard end-to-end encryption" = "standaard end-to-end encryptie";
/* No comment provided by engineer. */
"Start chat" = "Begin gesprek";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Stop";
/* No comment provided by engineer. */
"Stop chat" = "Stop chat";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Stop de chat om database acties mogelijk te maken";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "Stop SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Chat stoppen";
/* No comment provided by engineer. */
"strike" = "staking";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Deze actie kan niet ongedaan worden gemaakt. Uw profiel, contacten, berichten en bestanden gaan onomkeerbaar verloren.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Deze chat is beveiligd met end-to-end codering.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Deze chat wordt beschermd door quantum bestendige end-to-end codering.";
/* notification title */
"this contact" = "dit contact";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Upgrade en open chat";
/* No comment provided by engineer. */
"Upload failed" = "Upload mislukt";
/* server test step */
"Upload file" = "Upload bestand";
/* No comment provided by engineer. */
"Uploading archive" = "Archief uploaden";
/* No comment provided by engineer. */
"Use .onion hosts" = "Gebruik .onion-hosts";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "SimpleX Chat servers gebruiken?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Gebruik de app tijdens het gesprek.";
/* No comment provided by engineer. */
"User profile" = "Gebruikers profiel";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Controleer verbindingen";
/* No comment provided by engineer. */
"Verify database passphrase" = "Controleer het wachtwoord van de database";
/* No comment provided by engineer. */
"Verify passphrase" = "Controleer het wachtwoord";
/* No comment provided by engineer. */
"Verify security code" = "Controleer de beveiligingscode";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "wil met je in contact komen!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Waarschuwing: het starten van de chat op meerdere apparaten wordt niet ondersteund en zal leiden tot mislukte bezorging van berichten";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Waarschuwing: u kunt sommige gegevens verliezen!";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Welkomst bericht";
/* No comment provided by engineer. */
"Welcome message is too long" = "Welkomstbericht is te lang";
/* No comment provided by engineer. */
"What's new" = "Wat is er nieuw";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Jij";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "U **mag** niet dezelfde database op twee apparaten gebruiken.";
/* No comment provided by engineer. */
"You accepted connection" = "Je hebt de verbinding geaccepteerd";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "U kunt ze later inschakelen via de privacy- en beveiligingsinstellingen van de app.";
/* No comment provided by engineer. */
"You can give another try." = "Je kunt het nog een keer proberen.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "U kunt een gebruikers profiel verbergen of dempen - veeg het naar rechts.";
+225
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Najbardziej prywatny**: nie korzystaj z serwera powiadomień SimpleX Chat, sprawdzaj wiadomości okresowo w tle (zależy jak często korzystasz z aplikacji).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "*Uwaga*: używanie tej samej bazy danych na dwóch urządzeniach zepsuje odszyfrowywanie wiadomości twoich połączeń, jako zabezpieczenie.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Uwaga**: NIE będziesz w stanie odzyskać lub zmienić hasła, jeśli je stracisz.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Uwaga**: Natychmiastowe powiadomienia push wymagają hasła zapisanego w Keychain.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Ostrzeżenie**: archiwum zostanie usunięte.";
/* No comment provided by engineer. */
"*bold*" = "\\*pogrubiony*";
@@ -136,6 +142,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ połączony";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ pobrane";
/* notification title */
"%@ is connected!" = "%@ jest połączony!";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "%@ serwery";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ wgrane";
/* notification title */
"%@ wants to connect!" = "%@ chce się połączyć!";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "administrator";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Administratorzy mogą blokować członka dla wszystkich.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Administratorzy mogą tworzyć linki do dołączania do grup.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Wszystkie Twoje kontakty pozostaną połączone. Aktualizacja profilu zostanie wysłana do Twoich kontaktów.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Wszystkie twoje kontakty, konwersacje i pliki będą bezpiecznie szyfrowane i wgrywane w kawałkach do skonfigurowanych przekaźników XFTP.";
/* No comment provided by engineer. */
"Allow" = "Pozwól";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "Kompilacja aplikacji: %@";
/* No comment provided by engineer. */
"App data migration" = "Migracja danych aplikacji";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Aplikacja szyfruje nowe lokalne pliki (bez filmów).";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Wygląd";
/* No comment provided by engineer. */
"Apply" = "Zastosuj";
/* No comment provided by engineer. */
"Archive and upload" = "Archiwizuj i prześlij";
/* No comment provided by engineer. */
"Archiving database" = "Archiwizowanie bazy danych";
/* No comment provided by engineer. */
"Attach" = "Dołącz";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "Anuluj";
/* No comment provided by engineer. */
"Cancel migration" = "Anuluj migrację";
/* feature offered item */
"cancelled %@" = "anulowany %@";
@@ -744,6 +777,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 migrated!" = "Czat zmigrowany!";
/* No comment provided by engineer. */
"Chat preferences" = "Preferencje czatu";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Chiński i hiszpański interfejs";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Wybierz _Zmigruj z innego urządzenia_ na nowym urządzeniu i zeskanuj kod QR.";
/* No comment provided by engineer. */
"Choose file" = "Wybierz plik";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Potwierdź aktualizacje bazy danych";
/* No comment provided by engineer. */
"Confirm network settings" = "Potwierdź ustawienia sieciowe";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Potwierdź nowe hasło…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Potwierdź hasło";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Potwierdź, że pamiętasz hasło do bazy danych, aby ją zmigrować.";
/* No comment provided by engineer. */
"Confirm upload" = "Potwierdź wgranie";
/* server test step */
"Connect" = "Połącz";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Utworzony w dniu %@";
/* No comment provided by engineer. */
"Creating archive link" = "Tworzenie linku archiwum";
/* No comment provided by engineer. */
"Creating link…" = "Tworzenie linku…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Usuń bazę danych";
/* No comment provided by engineer. */
"Delete database from this device" = "Usuń bazę danych z tego urządzenia";
/* server test step */
"Delete file" = "Usuń plik";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Obniż wersję i otwórz czat";
/* No comment provided by engineer. */
"Download failed" = "Pobieranie nie udane";
/* server test step */
"Download file" = "Pobierz plik";
/* No comment provided by engineer. */
"Downloading archive" = "Pobieranie archiwum";
/* No comment provided by engineer. */
"Downloading link details" = "Pobieranie szczegółów linku";
/* No comment provided by engineer. */
"Duplicate display name!" = "Zduplikowana wyświetlana nazwa!";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Włącz dla wszystkich";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Włącz w czatach bezpośrednich (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Włączyć natychmiastowe powiadomienia?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Wprowadź Pin";
/* No comment provided by engineer. */
"Enter passphrase" = "Wprowadź hasło";
/* No comment provided by engineer. */
"Enter passphrase…" = "Wprowadź hasło…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Błąd dodawania członka(ów)";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Błąd pozwalania kontaktowi na szyfrowanie PQ";
/* No comment provided by engineer. */
"Error changing address" = "Błąd zmiany adresu";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Błąd usuwania profilu użytkownika";
/* No comment provided by engineer. */
"Error downloading the archive" = "Błąd pobierania archiwum";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Błąd włączania potwierdzeń dostawy!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Błąd zapisu hasła do pęku kluczy";
/* when migrating */
"Error saving settings" = "Błąd zapisywania ustawień";
/* No comment provided by engineer. */
"Error saving user password" = "Błąd zapisu hasła użytkownika";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Błąd aktualizacji prywatności użytkownika";
/* No comment provided by engineer. */
"Error uploading the archive" = "Błąd wgrywania archiwum";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Błąd weryfikowania hasła:";
/* No comment provided by engineer. */
"Error: " = "Błąd: ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Wyeksportowane archiwum bazy danych.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Wyeksportowany plik nie istnieje";
/* No comment provided by engineer. */
"Exporting database archive…" = "Eksportowanie archiwum bazy danych…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtruj nieprzeczytane i ulubione czaty.";
/* No comment provided by engineer. */
"Finalize migration" = "Dokończ migrację";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Dokończ migrację na innym urządzeniu.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "W końcu je mamy! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Jak korzystać z Twoich serwerów";
/* No comment provided by engineer. */
"Hungarian interface" = "Węgierski interfejs";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "Serwery ICE (po jednym na linię)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Importuj bazę danych";
/* No comment provided by engineer. */
"Import failed" = "Import nie udał się";
/* No comment provided by engineer. */
"Importing archive" = "Importowanie archiwum";
/* No comment provided by engineer. */
"Improved message delivery" = "Ulepszona dostawa wiadomości";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Ulepszona konfiguracja serwera";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Aby konturować, czat musi zostać zatrzymany.";
/* No comment provided by engineer. */
"In reply to" = "W odpowiedzi na";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Nieprawidłowy link";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Nieprawidłowe potwierdzenie migracji";
/* No comment provided by engineer. */
"Invalid name!" = "Nieprawidłowa nazwa!";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Tekst wiadomości";
/* No comment provided by engineer. */
"Message too large" = "Wiadomość jest zbyt duża";
/* No comment provided by engineer. */
"Messages" = "Wiadomości";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "Wiadomości od %@ zostaną pokazane!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Wiadomości, pliki i połączenia są chronione przez **szyfrowanie end-to-end** z doskonałym utajnianiem z wyprzedzeniem i odzyskiem po złamaniu.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Wiadomości, pliki i połączenia są chronione przez **kwantowo odporne szyfrowanie end-to-end** z doskonałym utajnianiem z wyprzedzeniem i odzyskiem po złamaniu.";
/* No comment provided by engineer. */
"Migrate device" = "Zmigruj urządzenie";
/* No comment provided by engineer. */
"Migrate from another device" = "Zmigruj z innego urządzenia";
/* No comment provided by engineer. */
"Migrate here" = "Zmigruj tutaj";
/* No comment provided by engineer. */
"Migrate to another device" = "Zmigruj do innego urządzenia";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Zmigruj do innego urządzenia przez kod QR.";
/* No comment provided by engineer. */
"Migrating" = "Migrowanie";
/* No comment provided by engineer. */
"Migrating database archive…" = "Migrowanie archiwum bazy danych…";
/* No comment provided by engineer. */
"Migration complete" = "Migracja zakończona";
/* No comment provided by engineer. */
"Migration error:" = "Błąd migracji:";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Grupa otwarta";
/* authentication reason */
"Open migration to another device" = "Otwórz migrację na innym urządzeniu";
/* No comment provided by engineer. */
"Open Settings" = "Otwórz Ustawienia";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "Otwieranie aplikacji…";
/* No comment provided by engineer. */
"Or paste archive link" = "Lub wklej link archiwum";
/* No comment provided by engineer. */
"Or scan QR code" = "Lub zeskanuj kod QR";
/* No comment provided by engineer. */
"Or securely share this file link" = "Lub bezpiecznie udostępnij ten link pliku";
/* No comment provided by engineer. */
"Or show this code" = "Lub pokaż ten kod";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Stały błąd odszyfrowania";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Połączenia obraz-w-obrazie";
/* No comment provided by engineer. */
"PING count" = "Liczba PINGÓW";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Proszę sprawdzić preferencje Twoje i Twojego kontaktu.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Proszę potwierdzić, że ustawienia sieciowe są prawidłowe dla tego urządzenia.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Proszę skontaktować się z deweloperami.\nBłąd: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Możliwe, że odcisk palca certyfikatu w adresie serwera jest nieprawidłowy";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "Postkwantowe E2EE";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Zachowaj ostatnią wersję roboczą wiadomości wraz z załącznikami.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Powiadomienia push";
/* No comment provided by engineer. */
"Push server" = "Serwer Push";
/* chat item text */
"quantum resistant e2e encryption" = "kwantowo odporne szyfrowanie e2e";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Kwantowo odporne szyfrowanie";
/* No comment provided by engineer. */
"Rate the app" = "Oceń aplikację";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Powtórzyć prośbę połączenia?";
/* No comment provided by engineer. */
"Repeat download" = "Powtórz pobieranie";
/* No comment provided by engineer. */
"Repeat import" = "Powtórz importowanie";
/* No comment provided by engineer. */
"Repeat join request?" = "Powtórzyć prośbę dołączenia?";
/* No comment provided by engineer. */
"Repeat upload" = "Powtórz wgrywanie";
/* chat item action */
"Reply" = "Odpowiedz";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Uruchom czat";
/* No comment provided by engineer. */
"Safer groups" = "Bezpieczniejsze grupy";
/* chat item action */
"Save" = "Zapisz";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Ustaw pin";
/* No comment provided by engineer. */
"Set passphrase" = "Ustaw hasło";
/* No comment provided by engineer. */
"Set passphrase to export" = "Ustaw hasło do eksportu";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Pokaż podgląd";
/* No comment provided by engineer. */
"Show QR code" = "Pokaż kod QR";
/* No comment provided by engineer. */
"Show:" = "Pokaż:";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Ktoś";
/* chat item text */
"standard end-to-end encryption" = "standardowe szyfrowanie end-to-end";
/* No comment provided by engineer. */
"Start chat" = "Rozpocznij czat";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Zatrzymaj";
/* No comment provided by engineer. */
"Stop chat" = "Zatrzymaj czat";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Zatrzymaj czat, aby umożliwić działania na bazie danych";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "Zatrzymaj SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Zatrzymywanie czatu";
/* No comment provided by engineer. */
"strike" = "strajk";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Tego działania nie można cofnąć - Twój profil, kontakty, wiadomości i pliki zostaną nieodwracalnie utracone.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Ten czat jest chroniony przez szyfrowanie end-to-end.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Ten czat jest chroniony przez kwantowo odporne szyfrowanie end-to-end.";
/* notification title */
"this contact" = "ten kontakt";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Zaktualizuj i otwórz czat";
/* No comment provided by engineer. */
"Upload failed" = "Wgrywanie nie udane";
/* server test step */
"Upload file" = "Prześlij plik";
/* No comment provided by engineer. */
"Uploading archive" = "Wgrywanie archiwum";
/* No comment provided by engineer. */
"Use .onion hosts" = "Użyj hostów .onion";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Użyć serwerów SimpleX Chat?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Używaj aplikacji podczas połączenia.";
/* No comment provided by engineer. */
"User profile" = "Profil użytkownika";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Zweryfikuj połączenia";
/* No comment provided by engineer. */
"Verify database passphrase" = "Zweryfikuj hasło bazy danych";
/* No comment provided by engineer. */
"Verify passphrase" = "Zweryfikuj hasło";
/* No comment provided by engineer. */
"Verify security code" = "Weryfikuj kod bezpieczeństwa";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "chce się z Tobą połączyć!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Ostrzeżenie: rozpoczęcie czatu na wielu urządzeniach nie jest wspierane i spowoduje niepowodzenia dostarczania wiadomości";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Uwaga: możesz stracić niektóre dane!";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Wiadomość powitalna";
/* No comment provided by engineer. */
"Welcome message is too long" = "Wiadomość powitalna jest zbyt długa";
/* No comment provided by engineer. */
"What's new" = "Co nowego";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Ty";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "**Nie możesz** używać tej samej bazy na dwóch urządzeniach.";
/* No comment provided by engineer. */
"You accepted connection" = "Zaakceptowałeś połączenie";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Możesz je włączyć później w ustawieniach Prywatności i Bezpieczeństwa aplikacji.";
/* No comment provided by engineer. */
"You can give another try." = "Możesz spróbować ponownie.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Możesz ukryć lub wyciszyć profil użytkownika - przesuń palcem w prawo.";
+225
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Самый конфиденциальный**: не использовать сервер уведомлений SimpleX Chat, проверять сообщения периодически в фоновом режиме (зависит от того насколько часто Вы используете приложение).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Обратите внимание**: использование одной и той же базы данных на двух устройствах нарушит расшифровку сообщений от ваших контактов, как свойство защиты соединений.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Внимание**: Вы не сможете восстановить или поменять пароль, если Вы его потеряете.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Внимание**: для работы мгновенных уведомлений пароль должен быть сохранен в Keychain.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Внимание**: архив будет удален.";
/* No comment provided by engineer. */
"*bold*" = "\\*жирный*";
@@ -136,6 +142,9 @@
/* No comment provided by engineer. */
"%@ connected" = "%@ соединен(а)";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ загружено";
/* notification title */
"%@ is connected!" = "Установлено соединение с %@!";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "%@ серверы";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ загружено";
/* notification title */
"%@ wants to connect!" = "%@ хочет соединиться!";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "админ";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Админы могут заблокировать члена группы.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Админы могут создать ссылки для вступления в группу.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Все Ваши контакты сохранятся. Обновленный профиль будет отправлен Вашим контактам.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Все ваши контакты, разговоры и файлы будут надежно зашифрованы и загружены на выбранные XFTP серверы.";
/* No comment provided by engineer. */
"Allow" = "Разрешить";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "Сборка приложения: %@";
/* No comment provided by engineer. */
"App data migration" = "Миграция данных";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Приложение шифрует новые локальные файлы (кроме видео).";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Интерфейс";
/* No comment provided by engineer. */
"Apply" = "Применить";
/* No comment provided by engineer. */
"Archive and upload" = "Архивировать и загрузить";
/* No comment provided by engineer. */
"Archiving database" = "Подготовка архива";
/* No comment provided by engineer. */
"Attach" = "Прикрепить";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "Отменить";
/* No comment provided by engineer. */
"Cancel migration" = "Отменить миграцию";
/* feature offered item */
"cancelled %@" = "отменил(a) %@";
@@ -744,6 +777,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Чат остановлен. Если вы уже использовали эту базу данных на другом устройстве, перенесите ее обратно до запуска чата.";
/* No comment provided by engineer. */
"Chat migrated!" = "Чат мигрирован!";
/* No comment provided by engineer. */
"Chat preferences" = "Предпочтения";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Китайский и Испанский интерфейс";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Выберите _Мигрировать с другого устройства_ на новом устройстве и сосканируйте QR код.";
/* No comment provided by engineer. */
"Choose file" = "Выбрать файл";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Подтвердить обновление базы данных";
/* No comment provided by engineer. */
"Confirm network settings" = "Подтвердите настройки сети";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Подтвердите новый пароль…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Подтвердить пароль";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Подтвердите, что Вы помните пароль базы данных для ее миграции.";
/* No comment provided by engineer. */
"Confirm upload" = "Подтвердить загрузку";
/* server test step */
"Connect" = "Соединиться";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "Дата создания %@";
/* No comment provided by engineer. */
"Creating archive link" = "Создание ссылки на архив";
/* No comment provided by engineer. */
"Creating link…" = "Создаётся ссылка…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Удалить данные чата";
/* No comment provided by engineer. */
"Delete database from this device" = "Удалить базу данных с этого устройства";
/* server test step */
"Delete file" = "Удалить файл";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Откатить версию и открыть чат";
/* No comment provided by engineer. */
"Download failed" = "Ошибка загрузки";
/* server test step */
"Download file" = "Загрузка файла";
/* No comment provided by engineer. */
"Downloading archive" = "Загрузка архива";
/* No comment provided by engineer. */
"Downloading link details" = "Загрузка ссылки архива";
/* No comment provided by engineer. */
"Duplicate display name!" = "Имя профиля уже используется!";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Включить для всех";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Включите для контактов (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Включить мгновенные уведомления?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Введите Код";
/* No comment provided by engineer. */
"Enter passphrase" = "Введите пароль";
/* No comment provided by engineer. */
"Enter passphrase…" = "Введите пароль…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Ошибка при добавлении членов группы";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "Ошибка разрешения квантово-устойчивого шифрования";
/* No comment provided by engineer. */
"Error changing address" = "Ошибка при изменении адреса";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Ошибка удаления профиля пользователя";
/* No comment provided by engineer. */
"Error downloading the archive" = "Ошибка загрузки архива";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Ошибка при включении отчётов о доставке!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Ошибка сохранения пароля в Keychain";
/* when migrating */
"Error saving settings" = "Ошибка сохранения настроек";
/* No comment provided by engineer. */
"Error saving user password" = "Ошибка при сохранении пароля пользователя";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Ошибка при обновлении конфиденциальности";
/* No comment provided by engineer. */
"Error uploading the archive" = "Ошибка загрузки архива";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Ошибка подтверждения пароля:";
/* No comment provided by engineer. */
"Error: " = "Ошибка: ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Архив чата экспортирован.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Экспортированный файл не существует";
/* No comment provided by engineer. */
"Exporting database archive…" = "Архив чата экспортируется…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Фильтровать непрочитанные и избранные чаты.";
/* No comment provided by engineer. */
"Finalize migration" = "Завершить миграцию";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Завершите миграцию на другом устройстве.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Наконец-то, мы их добавили! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Как использовать серверы";
/* No comment provided by engineer. */
"Hungarian interface" = "Венгерский интерфейс";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "ICE серверы (один на строке)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Импорт архива чата";
/* No comment provided by engineer. */
"Import failed" = "Ошибка импорта";
/* No comment provided by engineer. */
"Importing archive" = "Импорт архива";
/* No comment provided by engineer. */
"Improved message delivery" = "Улучшенная доставка сообщений";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Улучшенная конфигурация серверов";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Чтобы продолжить, чат должен быть остановлен.";
/* No comment provided by engineer. */
"In reply to" = "В ответ на";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Ошибка ссылки";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Ошибка подтверждения миграции";
/* No comment provided by engineer. */
"Invalid name!" = "Неверное имя!";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Текст сообщения";
/* No comment provided by engineer. */
"Message too large" = "Сообщение слишком большое";
/* No comment provided by engineer. */
"Messages" = "Сообщения";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "Сообщения от %@ будут показаны!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Сообщения, файлы и звонки защищены **end-to-end шифрованием** с прямой секретностью (PFS), правдоподобным отрицанием и восстановлением от взлома.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Сообщения, файлы и звонки защищены **квантово-устойчивым end-to-end шифрованием** с прямой секретностью (PFS), правдоподобным отрицанием и восстановлением от взлома.";
/* No comment provided by engineer. */
"Migrate device" = "Мигрировать устройство";
/* No comment provided by engineer. */
"Migrate from another device" = "Миграция с другого устройства";
/* No comment provided by engineer. */
"Migrate here" = "Мигрировать сюда";
/* No comment provided by engineer. */
"Migrate to another device" = "Мигрировать на другое устройство";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "Мигрируйте на другое устройство через QR код.";
/* No comment provided by engineer. */
"Migrating" = "Миграция";
/* No comment provided by engineer. */
"Migrating database archive…" = "Данные чата перемещаются…";
/* No comment provided by engineer. */
"Migration complete" = "Миграция завершена";
/* No comment provided by engineer. */
"Migration error:" = "Ошибка при перемещении данных:";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Открыть группу";
/* authentication reason */
"Open migration to another device" = "Открытие миграции на другое устройство";
/* No comment provided by engineer. */
"Open Settings" = "Открыть Настройки";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "Приложение отрывается…";
/* No comment provided by engineer. */
"Or paste archive link" = "Или вставьте ссылку архива";
/* No comment provided by engineer. */
"Or scan QR code" = "Или отсканируйте QR код";
/* No comment provided by engineer. */
"Or securely share this file link" = "Или передайте эту ссылку";
/* No comment provided by engineer. */
"Or show this code" = "Или покажите этот код";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Ошибка расшифровки";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Звонки с картинкой-в-картинке";
/* No comment provided by engineer. */
"PING count" = "Количество PING";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Проверьте предпочтения Вашего контакта.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Пожалуйста, подтвердите, что настройки сети верны для этого устройства.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Пожалуйста, сообщите разработчикам.\nОшибка: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Возможно, хэш сертификата в адресе сервера неверный";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "Квантово-устойчивое E2EE";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Сохранить последний черновик, вместе с вложениями.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Доставка уведомлений";
/* No comment provided by engineer. */
"Push server" = "Сервер уведомлений";
/* chat item text */
"quantum resistant e2e encryption" = "квантово-устойчивое e2e шифрование";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Квантово-устойчивое шифрование";
/* No comment provided by engineer. */
"Rate the app" = "Оценить приложение";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Повторить запрос на соединение?";
/* No comment provided by engineer. */
"Repeat download" = "Повторить загрузку";
/* No comment provided by engineer. */
"Repeat import" = "Повторить импорт";
/* No comment provided by engineer. */
"Repeat join request?" = "Повторить запрос на вступление?";
/* No comment provided by engineer. */
"Repeat upload" = "Повторить загрузку";
/* chat item action */
"Reply" = "Ответить";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Запустить chat";
/* No comment provided by engineer. */
"Safer groups" = "Более безопасные группы";
/* chat item action */
"Save" = "Сохранить";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Установить код доступа";
/* No comment provided by engineer. */
"Set passphrase" = "Установить пароль";
/* No comment provided by engineer. */
"Set passphrase to export" = "Установите пароль";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Показывать уведомления";
/* No comment provided by engineer. */
"Show QR code" = "Показать QR код";
/* No comment provided by engineer. */
"Show:" = "Показать:";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Контакт";
/* chat item text */
"standard end-to-end encryption" = "стандартное end-to-end шифрование";
/* No comment provided by engineer. */
"Start chat" = "Запустить чат";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Остановить";
/* No comment provided by engineer. */
"Stop chat" = "Остановить чат";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Остановите чат, чтобы разблокировать операции с архивом чата";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "Остановить SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "Остановка чата";
/* No comment provided by engineer. */
"strike" = "зачеркнуть";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Это действие нельзя отменить — Ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Чат защищен end-to-end шифрованием.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Чат защищен квантово-устойчивым end-to-end шифрованием.";
/* notification title */
"this contact" = "этот контакт";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Обновить и открыть чат";
/* No comment provided by engineer. */
"Upload failed" = "Ошибка загрузки";
/* server test step */
"Upload file" = "Загрузка файла";
/* No comment provided by engineer. */
"Uploading archive" = "Загрузка архива";
/* No comment provided by engineer. */
"Use .onion hosts" = "Использовать .onion хосты";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Использовать серверы предосталенные SimpleX Chat?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Используйте приложение во время звонка.";
/* No comment provided by engineer. */
"User profile" = "Профиль чата";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Проверять соединения";
/* No comment provided by engineer. */
"Verify database passphrase" = "Проверка пароля базы данных";
/* No comment provided by engineer. */
"Verify passphrase" = "Проверить пароль";
/* No comment provided by engineer. */
"Verify security code" = "Подтвердить код безопасности";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "хочет соединиться с Вами!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Предупреждение: Вы можете потерять какие то данные!";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Приветственное сообщение";
/* No comment provided by engineer. */
"Welcome message is too long" = "Приветственное сообщение слишком длинное";
/* No comment provided by engineer. */
"What's new" = "Новые функции";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Вы";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "Вы **не должны** использовать одну и ту же базу данных на двух устройствах.";
/* No comment provided by engineer. */
"You accepted connection" = "Вы приняли приглашение соединиться";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Вы можете включить их позже в настройках Конфиденциальности.";
/* No comment provided by engineer. */
"You can give another try." = "Вы можете попробовать еще раз.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Вы можете скрыть профиль или выключить уведомления - потяните его вправо.";
Binary file not shown.
Binary file not shown.
+233 -8
View File
@@ -85,6 +85,9 @@
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**En gizli**: SimpleX Chat bildirim sunucusunu kullanma, arkaplanda mesajları periyodik olarak kontrol edin (uygulamayı ne sıklıkta kullandığınıza bağlıdır).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Lütfen dikkat**: Aynı veritabanını iki cihazda kullanmak, güvenlik koruması olarak bağlantılarınızdaki mesajların şifresinin çözülmesini engelleyecektir.";
/* No comment provided by engineer. */
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Lütfen aklınızda bulunsun**: eğer parolanızı kaybederseniz parolanızı değiştirme veya geri kurtarma ihtimaliniz YOKTUR.";
@@ -94,6 +97,9 @@
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Dikkat**: Anında iletilen bildirimlere Anahtar Zinciri'nde kaydedilmiş parola gereklidir.";
/* No comment provided by engineer. */
"**Warning**: the archive will be removed." = "**Uyarı**: arşiv silinecektir.";
/* No comment provided by engineer. */
"*bold*" = "\\*kalın*";
@@ -131,11 +137,14 @@
"%@ and %@ connected" = "%@ ve %@ bağlandı";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@, %2$@ de";
"%@ at %@:" = "1$@, %2$@'de:";
/* No comment provided by engineer. */
"%@ connected" = "%@ bağlandı";
/* No comment provided by engineer. */
"%@ downloaded" = "%@ indirildi";
/* notification title */
"%@ is connected!" = "%@ bağlandı!";
@@ -148,6 +157,9 @@
/* No comment provided by engineer. */
"%@ servers" = "%@ sunucuları";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ yüklendi";
/* notification title */
"%@ wants to connect!" = "%@ bağlanmak istiyor!";
@@ -248,7 +260,7 @@
"%u messages failed to decrypt." = "%u mesajın şifreleme çözümü başarısız oldu.";
/* No comment provided by engineer. */
"%u messages skipped." = "%u mesaj atlandı";
"%u messages skipped." = "%u mesajlar atlandı.";
/* No comment provided by engineer. */
"`a + b`" = "\\`a + b`";
@@ -377,6 +389,9 @@
/* member role */
"admin" = "yönetici";
/* No comment provided by engineer. */
"Admins can block a member for all." = "Yöneticiler bir üyeyi tamamen engelleyebilirler.";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "Yöneticiler gruplara katılmak için bağlantılar oluşturabilir.";
@@ -416,6 +431,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Tüm kişileriniz bağlı kalacaktır. Profil güncellemesi kişilerinize gönderilecektir.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Tüm kişileriniz, sohbetleriniz ve dosyalarınız güvenli bir şekilde şifrelenecek ve parçalar halinde yapılandırılmış XFTP rölelerine yüklenecektir.";
/* No comment provided by engineer. */
"Allow" = "İzin ver";
@@ -483,7 +501,7 @@
"always" = "her zaman";
/* No comment provided by engineer. */
"Always use relay" = "Her zaman yönlendirici kulan";
"Always use relay" = "Her zaman yönlendirici kullan";
/* No comment provided by engineer. */
"An empty chat profile with the provided name is created, and the app opens as usual." = "Verilen adla boş bir sohbet profili oluşturulur ve uygulama her zamanki gibi açılır.";
@@ -497,6 +515,9 @@
/* No comment provided by engineer. */
"App build: %@" = "Uygulama sürümü: %@";
/* No comment provided by engineer. */
"App data migration" = "Uygulama verisi taşıma";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Uygulama yerel dosyaları şifreler (videolar dışında).";
@@ -518,6 +539,15 @@
/* No comment provided by engineer. */
"Appearance" = "Görünüş";
/* No comment provided by engineer. */
"Apply" = "Uygula";
/* No comment provided by engineer. */
"Archive and upload" = "Arşivle ve yükle";
/* No comment provided by engineer. */
"Archiving database" = "Veritabanı arşivleniyor";
/* No comment provided by engineer. */
"Attach" = "Ekle";
@@ -665,6 +695,9 @@
/* No comment provided by engineer. */
"Cancel" = "İptal et";
/* No comment provided by engineer. */
"Cancel migration" = "Taşımayı iptal et";
/* feature offered item */
"cancelled %@" = "%@ iptal edildi";
@@ -744,6 +777,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." = "Sohbet durduruldu. Bu veritabanını zaten başka bir cihazda kullandıysanız, sohbete başlamadan önce onu geri aktarmalısınız.";
/* No comment provided by engineer. */
"Chat migrated!" = "Sohbet taşındı!";
/* No comment provided by engineer. */
"Chat preferences" = "Sohbet tercihleri";
@@ -756,6 +792,9 @@
/* No comment provided by engineer. */
"Chinese and Spanish interface" = "Çince ve İspanyolca arayüz";
/* No comment provided by engineer. */
"Choose _Migrate from another device_ on the new device and scan QR code." = "Yeni cihazda _Başka bir cihazdan taşı_ seçeneğini seçin ve QR kodunu tarayın.";
/* No comment provided by engineer. */
"Choose file" = "Dosya seç";
@@ -801,6 +840,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "Veritabanı geliştirmelerini onayla";
/* No comment provided by engineer. */
"Confirm network settings" = "Ağ ayarlarını onaylayın";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "Yeni parolayı onayla…";
@@ -810,6 +852,12 @@
/* No comment provided by engineer. */
"Confirm password" = "Şifreyi onayla";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Taşımak için veritabanı parolasını hatırladığınızı doğrulayın.";
/* No comment provided by engineer. */
"Confirm upload" = "Yüklemeyi onayla";
/* server test step */
"Connect" = "Bağlan";
@@ -1008,6 +1056,9 @@
/* No comment provided by engineer. */
"Created on %@" = "%@ de oluşturuldu";
/* No comment provided by engineer. */
"Creating archive link" = "Arşiv bağlantısı oluşturuluyor";
/* No comment provided by engineer. */
"Creating link…" = "Link oluşturuluyor…";
@@ -1155,6 +1206,9 @@
/* No comment provided by engineer. */
"Delete database" = "Veritabanını sil";
/* No comment provided by engineer. */
"Delete database from this device" = "Veritabanını bu cihazdan sil";
/* server test step */
"Delete file" = "Dosyayı sil";
@@ -1347,9 +1401,18 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "Sürüm düşür ve sohbeti aç";
/* No comment provided by engineer. */
"Download failed" = "Yükleme başarısız oldu";
/* server test step */
"Download file" = "Dosya indir";
/* No comment provided by engineer. */
"Downloading archive" = "Arşiv indiriliyor";
/* No comment provided by engineer. */
"Downloading link details" = "Bağlantı detayları indiriliyor";
/* No comment provided by engineer. */
"Duplicate display name!" = "Yinelenen görünen ad!";
@@ -1383,6 +1446,9 @@
/* No comment provided by engineer. */
"Enable for all" = "Herkes için etkinleştir";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "Doğrudan sohbetlerde etkinleştirin (BETA)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Anlık bildirimler etkinleştirilsin mi?";
@@ -1497,6 +1563,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "Şifre gir";
/* No comment provided by engineer. */
"Enter passphrase" = "Parolayı girin";
/* No comment provided by engineer. */
"Enter passphrase…" = "Parola gir…";
@@ -1536,6 +1605,9 @@
/* No comment provided by engineer. */
"Error adding member(s)" = "Üye(ler) eklenirken hata oluştu";
/* No comment provided by engineer. */
"Error allowing contact PQ encryption" = "İletişim PQ şifrelemesine izin verirken hata oluştu";
/* No comment provided by engineer. */
"Error changing address" = "Adres değiştirilirken hata oluştu";
@@ -1590,6 +1662,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Kullanıcı profili silinirken hata oluştu";
/* No comment provided by engineer. */
"Error downloading the archive" = "Arşiv indirilirken hata oluştu";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Görüldü bilgisi etkinleştirilirken hata oluştu!";
@@ -1635,6 +1710,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Parolayı Anahtar Zincirine kaydederken hata oluştu";
/* when migrating */
"Error saving settings" = "Ayarlar kaydedilirken hata oluştu";
/* No comment provided by engineer. */
"Error saving user password" = "Kullanıcı şifresi kaydedilirken hata oluştu";
@@ -1677,6 +1755,12 @@
/* No comment provided by engineer. */
"Error updating user privacy" = "Kullanıcı gizliliği güncellenirken hata oluştu";
/* No comment provided by engineer. */
"Error uploading the archive" = "Arşiv yüklenirken hata oluştu";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Parola doğrulanırken hata oluştu:";
/* No comment provided by engineer. */
"Error: " = "Hata: ";
@@ -1710,6 +1794,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "Dışarı çıkarılmış veritabanı arşivi.";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "Dışa aktarılan dosya mevcut değil";
/* No comment provided by engineer. */
"Exporting database archive…" = "Dışarı çıkarılmış veritabanı arşivi…";
@@ -1752,6 +1839,12 @@
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Favori ve okunmamış sohbetleri filtrele.";
/* No comment provided by engineer. */
"Finalize migration" = "Taşıma işlemini sonlandır";
/* No comment provided by engineer. */
"Finalize migration on another device." = "Taşıma işlemini başka bir cihazda sonlandırın.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Sonunda, onlara sahibiz! 🚀";
@@ -1935,6 +2028,9 @@
/* No comment provided by engineer. */
"How to use your servers" = "Sunucularını nasıl kullanabilirsin";
/* No comment provided by engineer. */
"Hungarian interface" = "Macarca arayüz";
/* No comment provided by engineer. */
"ICE servers (one per line)" = "ICE sunucuları (her satıra bir tane)";
@@ -1974,6 +2070,12 @@
/* No comment provided by engineer. */
"Import database" = "Veritabanını içe aktar";
/* No comment provided by engineer. */
"Import failed" = "İçe aktarma başarısız oldu";
/* No comment provided by engineer. */
"Importing archive" = "Arşiv içe aktarılıyor";
/* No comment provided by engineer. */
"Improved message delivery" = "İyileştirilmiş mesaj iletimi";
@@ -1983,6 +2085,9 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Geliştirilmiş sunucu yapılandırması";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "Devam etmek için sohbetin durdurulması gerekiyor.";
/* No comment provided by engineer. */
"In reply to" = "Cevap olarak";
@@ -2067,6 +2172,9 @@
/* No comment provided by engineer. */
"Invalid link" = "Geçersiz bağlantı";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Geçersiz taşıma onayı";
/* No comment provided by engineer. */
"Invalid name!" = "Geçersiz isim!";
@@ -2331,6 +2439,9 @@
/* No comment provided by engineer. */
"Message text" = "Mesaj yazısı";
/* No comment provided by engineer. */
"Message too large" = "Mesaj çok büyük";
/* No comment provided by engineer. */
"Messages" = "Mesajlar";
@@ -2340,9 +2451,36 @@
/* No comment provided by engineer. */
"Messages from %@ will be shown!" = "%@ den gelen mesajlar gösterilecektir!";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Mesajlar, dosyalar ve aramalar **uçtan uca şifreleme** ile mükemmel ileri gizlilik, inkar ve izinsiz giriş kurtarma ile korunur.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Mesajlar, dosyalar ve aramalar **kuantum dirençli e2e şifreleme** ile mükemmel ileri gizlilik, inkar ve zorla girme kurtarma ile korunur.";
/* No comment provided by engineer. */
"Migrate device" = "Cihazı taşıma";
/* No comment provided by engineer. */
"Migrate from another device" = "Başka bir cihazdan geçiş yapın";
/* No comment provided by engineer. */
"Migrate here" = "Buraya göç edin";
/* No comment provided by engineer. */
"Migrate to another device" = "Başka bir cihaza taşıma";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "QR kodu aracılığıyla başka bir cihaza geçiş yapın.";
/* No comment provided by engineer. */
"Migrating" = "Göçmenlik";
/* No comment provided by engineer. */
"Migrating database archive…" = "Veritabanı arşivine geçiliyor…";
/* No comment provided by engineer. */
"Migration complete" = "Geçiş tamamlandı";
/* No comment provided by engineer. */
"Migration error:" = "Geçiş hatası:";
@@ -2600,6 +2738,9 @@
/* No comment provided by engineer. */
"Open group" = "Grubu aç";
/* authentication reason */
"Open migration to another device" = "Başka bir cihaza açık geçiş";
/* No comment provided by engineer. */
"Open Settings" = "Ayarları aç";
@@ -2612,9 +2753,15 @@
/* No comment provided by engineer. */
"Opening app…" = "Uygulama açılıyor…";
/* No comment provided by engineer. */
"Or paste archive link" = "Veya arşiv bağlantısını yapıştırın";
/* No comment provided by engineer. */
"Or scan QR code" = "Veya QR kodu okut";
/* No comment provided by engineer. */
"Or securely share this file link" = "Veya bu dosya bağlantısını güvenli bir şekilde paylaşın";
/* No comment provided by engineer. */
"Or show this code" = "Veya bu kodu göster";
@@ -2666,6 +2813,9 @@
/* message decrypt error item */
"Permanent decryption error" = "Kalıcı şifre çözümü hatası";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "Resim içinde resim aramaları";
/* No comment provided by engineer. */
"PING count" = "PING sayısı";
@@ -2684,6 +2834,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "Lütfen sizinkini ve iletişim tercihlerinizi kontrol edin.";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "Lütfen bu cihaz için ağ ayarlarının doğru olduğunu onaylayın.";
/* No comment provided by engineer. */
"Please contact developers.\nError: %@" = "Lütfen geliştiricilerle irtibata geçin.\nHata: %@";
@@ -2717,6 +2870,9 @@
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Muhtemelen, sunucu adresindeki parmakizi sertifikası doğru değil";
/* No comment provided by engineer. */
"Post-quantum E2EE" = "Kuantum sonrası E2EE";
/* No comment provided by engineer. */
"Preserve the last message draft, with attachments." = "Son mesaj taslağını ekleriyle birlikte koru.";
@@ -2798,6 +2954,15 @@
/* No comment provided by engineer. */
"Push notifications" = "Anında bildirimler";
/* No comment provided by engineer. */
"Push server" = "Push sunucu";
/* chat item text */
"quantum resistant e2e encryption" = "kuantuma dayanıklı e2e şifreleme";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "Kuantum dirençli şifreleme";
/* No comment provided by engineer. */
"Rate the app" = "Uygulamayı değerlendir";
@@ -2826,7 +2991,7 @@
"Read more in our GitHub repository." = "Daha fazlasını GitHub depomuzdan oku.";
/* No comment provided by engineer. */
"Receipts are disabled" = "Görüldü devre dışı bırakıldı";
"Receipts are disabled" = "Makbuzlar devre dışı bırakıldı";
/* No comment provided by engineer. */
"received answer…" = "alınan cevap…";
@@ -2933,9 +3098,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "Bağlantı isteği tekrarlansın mı?";
/* No comment provided by engineer. */
"Repeat download" = "Tekrar indir";
/* No comment provided by engineer. */
"Repeat import" = "İthalatı tekrarla";
/* No comment provided by engineer. */
"Repeat join request?" = "Katılma isteği tekrarlansın mı?";
/* No comment provided by engineer. */
"Repeat upload" = "Yüklemeyi tekrarla";
/* chat item action */
"Reply" = "Yanıtla";
@@ -2993,6 +3167,9 @@
/* No comment provided by engineer. */
"Run chat" = "Sohbeti çalıştır";
/* No comment provided by engineer. */
"Safer groups" = "Daha güvenli gruplar";
/* chat item action */
"Save" = "Kaydet";
@@ -3162,7 +3339,7 @@
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Görüldü bilgisi, tüm görünür sohbet profillerindeki tüm kişiler için etkinleştirilecektir.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "Görüldü bilgisi n kişileri için etkinleştirilecektir.";
"Sending delivery receipts will be enabled for all contacts." = "Teslimat makbuzlarının gönderilmesi tüm kişiler için etkinleştirilecektir.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Dosya gönderimi durdurulacaktır.";
@@ -3233,6 +3410,9 @@
/* No comment provided by engineer. */
"Set passcode" = "Şifre ayarla";
/* No comment provided by engineer. */
"Set passphrase" = "Parolayı ayarla";
/* No comment provided by engineer. */
"Set passphrase to export" = "Dışa aktarmak için parola ayarla";
@@ -3278,6 +3458,9 @@
/* No comment provided by engineer. */
"Show preview" = "Ön gösterimi göser";
/* No comment provided by engineer. */
"Show QR code" = "QR kodunu göster";
/* No comment provided by engineer. */
"Show:" = "Göster:";
@@ -3338,6 +3521,9 @@
/* notification title */
"Somebody" = "Biri";
/* chat item text */
"standard end-to-end encryption" = "standart uçtan uca şifreleme";
/* No comment provided by engineer. */
"Start chat" = "Sohbeti başlat";
@@ -3353,6 +3539,9 @@
/* No comment provided by engineer. */
"Stop" = "Dur";
/* No comment provided by engineer. */
"Stop chat" = "Sohbeti kes";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "Veritabanı eylemlerini etkinleştirmek için sohbeti durdur";
@@ -3380,6 +3569,9 @@
/* authentication reason */
"Stop SimpleX" = "SimpleX'i durdur";
/* No comment provided by engineer. */
"Stopping chat" = "Sohbeti durdurma";
/* No comment provided by engineer. */
"strike" = "çizik";
@@ -3426,7 +3618,7 @@
"TCP connection timeout" = "TCP bağlantı zaman aşımı";
/* No comment provided by engineer. */
"TCP_KEEPCNT" = "TCP_CNTYİTUT";
"TCP_KEEPCNT" = "TCP_KEEPCNT";
/* No comment provided by engineer. */
"TCP_KEEPIDLE" = "TCP_BOŞTAKAL";
@@ -3530,6 +3722,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Bu işlem geri alınamaz - profiliniz, kişileriniz, mesajlarınız ve dosyalarınız geri döndürülemez şekilde kaybolacaktır.";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "Bu sohbet uçtan uca şifreleme ile korunmaktadır.";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "Bu sohbet kuantum dirençli uçtan uca şifreleme ile korunmaktadır.";
/* notification title */
"this contact" = "Bu kişi";
@@ -3537,7 +3735,7 @@
"This device name" = "Bu cihazın ismi";
/* No comment provided by engineer. */
"This display name is invalid. Please choose another name." = "Görünen ad geçerli değil.\n Lütfen başka bir ad seç.";
"This display name is invalid. Please choose another name." = "Bu görünen ad geçersiz. Lütfen başka bir isim seçin.";
/* No comment provided by engineer. */
"This group has over %lld members, delivery receipts are not sent." = "Bu grubun %lld den fazla üyesi var,görüldü bilgisi gönderilmedi.";
@@ -3722,9 +3920,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "Yükselt ve sohbeti aç";
/* No comment provided by engineer. */
"Upload failed" = "Yükleme başarısız";
/* server test step */
"Upload file" = "Dosya yükle";
/* No comment provided by engineer. */
"Uploading archive" = "Arşiv yükleme";
/* No comment provided by engineer. */
"Use .onion hosts" = ".onion ana bilgisayarlarını kullan";
@@ -3755,6 +3959,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "SimpleX Chat sunucuları kullanılsın mı?";
/* No comment provided by engineer. */
"Use the app while in the call." = "Görüşme sırasında uygulamayı kullanın.";
/* No comment provided by engineer. */
"User profile" = "Kullanıcı profili";
@@ -3782,6 +3989,12 @@
/* No comment provided by engineer. */
"Verify connections" = "Bağlantıları doğrula";
/* No comment provided by engineer. */
"Verify database passphrase" = "Veritabanı parolasını doğrulayın";
/* No comment provided by engineer. */
"Verify passphrase" = "Parolayı doğrula";
/* No comment provided by engineer. */
"Verify security code" = "Güvenlik kodunu doğrula";
@@ -3860,6 +4073,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "bağlanmak istiyor!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Uyarı: birden fazla cihazda sohbet başlatmak desteklenmez ve mesaj teslim hatalarına neden olur";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Uyarı: Bazı verileri kaybedebilirsin!";
@@ -3875,6 +4091,9 @@
/* No comment provided by engineer. */
"Welcome message" = "Karşılama mesajı";
/* No comment provided by engineer. */
"Welcome message is too long" = "Hoş geldiniz mesajı çok uzun";
/* No comment provided by engineer. */
"What's new" = "Neler yeni";
@@ -3911,6 +4130,9 @@
/* No comment provided by engineer. */
"You" = "Sen";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "Aynı veritabanını iki cihazda **kullanmamalısınız**.";
/* No comment provided by engineer. */
"You accepted connection" = "Bağlantıyı onayladın";
@@ -3971,6 +4193,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Daha sonra uygulamanın Gizlilik ve Güvenlik ayarlarından etkinleştirebilirsiniz.";
/* No comment provided by engineer. */
"You can give another try." = "Bir kez daha deneyebilirsiniz.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Bir kullanıcı profilini gizleyebilir veya sessize alabilirsiniz - sağa kaydırın.";
@@ -4056,7 +4281,7 @@
"You need to allow your contact to send voice messages to be able to send them." = "Sesli mesaj gönderebilmeniz için kişinizin de sesli mesaj göndermesine izin vermeniz gerekir.";
/* No comment provided by engineer. */
"You rejected group invitation" = "Grup davetini reddettiniz.";
"You rejected group invitation" = "Grup davetini reddettiniz";
/* snd group event chat item */
"you removed %@" = "%@'yi çıkarttınız";
File diff suppressed because it is too large Load Diff
@@ -7,6 +7,9 @@
/* Privacy - Face ID Usage Description */
"NSFaceIDUsageDescription" = "SimpleX використовує Face ID для локальної автентифікації";
/* Privacy - Local Network Usage Description */
"NSLocalNetworkUsageDescription" = "SimpleX використовує доступ до локальної мережі, щоб дозволити користувачеві користуватися профілем чату через десктопну програму в тій же мережі.";
/* Privacy - Microphone Usage Description */
"NSMicrophoneUsageDescription" = "SimpleX потребує доступу до мікрофона для аудіо та відео дзвінків, а також для запису голосових повідомлень.";
+39 -37
View File
@@ -8,12 +8,14 @@ plugins {
}
android {
compileSdkVersion(34)
compileSdk = 34
defaultConfig {
applicationId = "chat.simplex.app"
minSdkVersion(28)
targetSdkVersion(33)
namespace = "chat.simplex.app"
minSdk = 28
//noinspection OldTargetApi
targetSdk = 33
// !!!
// skip version code after release to F-Droid, as it uses two version codes
versionCode = (extra["android.version_code"] as String).toInt()
@@ -46,12 +48,7 @@ android {
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs += "-opt-in=kotlinx.coroutines.DelicateCoroutinesApi"
freeCompilerArgs += "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi"
freeCompilerArgs += "-opt-in=androidx.compose.ui.text.ExperimentalTextApi"
@@ -71,18 +68,20 @@ android {
isMinifyEnabled = false
}
}
packagingOptions {
buildFeatures {
buildConfig = true
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
jniLibs.useLegacyPackaging = rootProject.extra["compression.level"] as Int != 0
}
android.sourceSets["main"].assets.setSrcDirs(listOf("../common/src/commonMain/resources/assets"))
val isRelease = gradle.startParameter.taskNames.find { it.toLowerCase().contains("release") } != null
val isBundle = gradle.startParameter.taskNames.find { it.toLowerCase().contains("bundle") } != null
// if (isRelease) {
val isRelease = gradle.startParameter.taskNames.find { it.lowercase().contains("release") } != null
val isBundle = gradle.startParameter.taskNames.find { it.lowercase().contains("bundle") } != null
// Comma separated list of languages that will be included in the apk
android.defaultConfig.resConfigs(
android.defaultConfig.resourceConfigurations += listOf(
"en",
"ar",
"bg",
@@ -104,7 +103,7 @@ android {
"uk",
"zh-rCN"
)
// }
ndkVersion = "23.1.7779620"
if (isBundle) {
defaultConfig.ndk.abiFilters("arm64-v8a", "armeabi-v7a")
} else {
@@ -125,41 +124,44 @@ android {
dependencies {
implementation(project(":common"))
implementation("androidx.core:core-ktx:1.7.0")
implementation("androidx.core:core-ktx:1.12.0")
//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.5.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.1")
implementation("androidx.lifecycle:lifecycle-process:2.4.1")
implementation("androidx.activity:activity-compose:1.5.0")
val work_version = "2.7.1"
implementation("androidx.work:work-runtime-ktx:$work_version")
implementation("androidx.work:work-multiprocess:$work_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.work:work-runtime-ktx:$workVersion")
implementation("androidx.work:work-multiprocess:$workVersion")
implementation("com.jakewharton:process-phoenix:2.1.2")
implementation("com.jakewharton:process-phoenix:2.2.0")
//Camera Permission
implementation("com.google.accompanist:accompanist-permissions:0.23.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.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
//androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version")
debugImplementation("androidx.compose.ui:ui-tooling:1.4.3")
debugImplementation("androidx.compose.ui:ui-tooling:1.6.4")
}
tasks {
val compressApk by creating {
doLast {
val isRelease = gradle.startParameter.taskNames.find { it.toLowerCase().contains("release") } != null
val isRelease = gradle.startParameter.taskNames.find { it.lowercase().contains("release") } != null
val buildType: String = if (isRelease) "release" else "debug"
val javaHome = System.getProperties()["java.home"] ?: org.gradle.internal.jvm.Jvm.current().javaHome
val sdkDir = android.sdkDirectory.absolutePath
var keyAlias = ""
var keyPassword = ""
var storeFile = ""
var storePassword = ""
val keyAlias: String
val keyPassword: String
val storeFile: String
val storePassword: String
if (project.properties["android.injected.signing.key.alias"] != null) {
keyAlias = project.properties["android.injected.signing.key.alias"] as String
keyPassword = project.properties["android.injected.signing.key.password"] as String
@@ -184,16 +186,16 @@ tasks {
}
exec {
workingDir("../../../scripts/android")
setEnvironment(mapOf("JAVA_HOME" to "$javaHome"))
environment = mapOf("JAVA_HOME" to "$javaHome")
commandLine = listOf(
"./compress-and-sign-apk.sh",
"${rootProject.extra["compression.level"]}",
"$outputDir",
"$sdkDir",
"$storeFile",
"$storePassword",
"$keyAlias",
"$keyPassword"
sdkDir,
storeFile,
storePassword,
keyAlias,
keyPassword
)
}
@@ -89,11 +89,12 @@ class MainActivity: FragmentActivity() {
}
override fun onBackPressed() {
if (
onBackPressedDispatcher.hasEnabledCallbacks() // Has something to do in a backstack
|| Build.VERSION.SDK_INT >= Build.VERSION_CODES.R // Android 11 or above
|| isTaskRoot // there are still other tasks after we reach the main (home) activity
) {
val canFinishActivity = (
onBackPressedDispatcher.hasEnabledCallbacks() // Has something to do in a backstack
|| Build.VERSION.SDK_INT >= Build.VERSION_CODES.R // Android 11 or above
|| isTaskRoot // there are still other tasks after we reach the main (home) activity
) && SimplexApp.context.chatModel.sharedContent.value !is SharedContent.Forward
if (canFinishActivity) {
// https://medium.com/mobile-app-development-publication/the-risk-of-android-strandhogg-security-issue-and-how-it-can-be-mitigated-80d2ddb4af06
super.onBackPressed()
}
@@ -104,9 +105,15 @@ class MainActivity: FragmentActivity() {
AppLock.laFailed.value = true
}
if (!onBackPressedDispatcher.hasEnabledCallbacks()) {
val sharedContent = chatModel.sharedContent.value
// Drop shared content
SimplexApp.context.chatModel.sharedContent.value = null
finish()
chatModel.sharedContent.value = null
if (sharedContent is SharedContent.Forward) {
chatModel.chatId.value = sharedContent.fromChatInfo.id
}
if (canFinishActivity) {
finish()
}
}
}
}
@@ -16,8 +16,7 @@ import androidx.work.*
import chat.simplex.app.model.NtfManager
import chat.simplex.app.model.NtfManager.AcceptCallAction
import chat.simplex.app.views.call.CallActivity
import chat.simplex.common.helpers.APPLICATION_ID
import chat.simplex.common.helpers.requiresIgnoringBattery
import chat.simplex.common.helpers.*
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatModel.updatingChatsMutex
@@ -291,6 +290,10 @@ class SimplexApp: Application(), LifecycleEventObserver {
activeCallDestroyWebView()
}
override fun androidRestartNetworkObserver() {
NetworkObserver.shared.restartNetworkObserver()
}
@SuppressLint("SourceLockedOrientationActivity")
@Composable
override fun androidLockPortraitOrientation() {
@@ -6,6 +6,7 @@ import android.content.*
import android.content.pm.PackageManager
import android.net.Uri
import android.os.*
import android.os.SystemClock
import android.provider.Settings
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
@@ -4,6 +4,7 @@ import android.app.*
import android.app.TaskStackBuilder
import android.content.*
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.hardware.display.DisplayManager
import android.media.AudioAttributes
@@ -218,7 +219,7 @@ object NtfManager {
.setGroup(MessageGroup)
.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN)
.setSmallIcon(R.drawable.ntf_icon)
.setLargeIcon(null)
.setLargeIcon(null as Bitmap?)
.setColor(0x88FFFF)
.setAutoCancel(true)
.setVibrate(null)
@@ -1,7 +1,9 @@
package chat.simplex.app.views.call
import android.Manifest
import android.app.*
import android.content.*
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.graphics.Rect
import android.os.*
@@ -28,6 +30,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.ContextCompat
import androidx.lifecycle.Lifecycle
import chat.simplex.app.*
import chat.simplex.app.R
@@ -36,10 +39,12 @@ import chat.simplex.app.model.NtfManager
import chat.simplex.app.model.NtfManager.AcceptCallAction
import chat.simplex.common.model.*
import chat.simplex.common.platform.*
import chat.simplex.common.platform.chatModel
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.call.*
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
import com.google.accompanist.permissions.rememberMultiplePermissionsState
import dev.icerock.moko.resources.compose.stringResource
import kotlinx.coroutines.launch
import kotlinx.datetime.Clock
@@ -109,9 +114,20 @@ class CallActivity: ComponentActivity(), ServiceConnection {
m.callCommand.add(WCallCommand.Layout(layoutType))
}
private fun hasGrantedPermissions(): Boolean {
val grantedAudio = ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
val grantedCamera = !callSupportsVideo() || ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
return grantedAudio && grantedCamera
}
override fun onBackPressed() {
if (isOnLockScreenNow()) {
super.onBackPressed()
} else if (!hasGrantedPermissions() && !callSupportsVideo()) {
val call = m.activeCall.value
if (call != null) {
withBGApi { chatModel.callManager.endCall(call) }
}
} else {
m.activeCallViewIsCollapsed.value = true
}
@@ -223,8 +239,21 @@ fun CallActivityView() {
}
Box(Modifier.background(Color.Black)) {
if (call != null) {
val permissionsState = rememberMultiplePermissionsState(
permissions = if (callSupportsVideo()) {
listOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
} else {
listOf(Manifest.permission.RECORD_AUDIO)
}
)
if (permissionsState.allPermissionsGranted) {
ActiveCallView()
} else {
CallPermissionsView(remember { m.activeCallViewIsCollapsed }.value, callSupportsVideo()) {
withBGApi { chatModel.callManager.endCall(call) }
}
}
val view = LocalView.current
ActiveCallView()
if (callSupportsVideo()) {
val scope = rememberCoroutineScope()
LaunchedEffect(Unit) {
@@ -252,6 +281,9 @@ fun CallActivityView() {
}
}
}
if (!m.activeCallViewIsCollapsed.value) {
AlertManager.shared.showInView()
}
}
LaunchedEffect(call == null) {
if (call != null) {
+27
View File
@@ -47,6 +47,9 @@ buildscript {
classpath(kotlin("gradle-plugin", version = rootProject.extra["kotlin.version"] as String))
classpath("dev.icerock.moko:resources-generator:0.23.0")
// Workaround gradle sync issue: https://github.com/gmazzo/gradle-buildconfig-plugin/issues/137#issuecomment-1935739759
classpath("com.squareup:kotlinpoet:1.16.0")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
@@ -80,6 +83,30 @@ plugins {
id("org.jetbrains.kotlin.plugin.serialization") apply false
}
// https://raymondctc.medium.com/configuring-your-sourcecompatibility-targetcompatibility-and-kotlinoptions-jvmtarget-all-at-once-66bf2198145f
val jvmVersion: Provider<String> = providers.gradleProperty("kotlin.jvm.target")
configure(subprojects) {
// Apply compileOptions to subprojects
plugins.withType<com.android.build.gradle.BasePlugin>().configureEach {
extensions.findByType<com.android.build.gradle.BaseExtension>()?.apply {
jvmVersion.map { JavaVersion.toVersion(it) }.orNull?.let {
compileOptions {
sourceCompatibility = it
targetCompatibility = it
}
}
}
}
// Apply kotlinOptions.jvmTarget to subprojects
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
kotlinOptions {
if (jvmVersion.isPresent) jvmTarget = jvmVersion.get()
}
}
}
tasks.register("clean", Delete::class) {
delete(rootProject.buildDir)
}
+44 -44
View File
@@ -4,17 +4,16 @@ plugins {
id("com.android.library")
id("org.jetbrains.kotlin.plugin.serialization")
id("dev.icerock.mobile.multiplatform-resources")
id("com.github.gmazzo.buildconfig") version "4.0.4"
id("com.github.gmazzo.buildconfig") version "5.3.5"
}
group = "chat.simplex"
version = extra["android.version_name"] as String
kotlin {
android()
jvm("desktop") {
jvmToolchain(11)
}
androidTarget()
jvm("desktop")
applyDefaultHierarchyTemplate()
sourceSets {
all {
languageSettings {
@@ -35,20 +34,20 @@ kotlin {
api(compose.runtime)
api(compose.foundation)
api(compose.material)
api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
api("org.jetbrains.kotlinx:kotlinx-datetime:0.3.2")
api("com.russhwolf:multiplatform-settings:1.0.0")
api("com.charleskorn.kaml:kaml:0.43.0")
api("dev.icerock.moko:resources-compose:0.23.0")
api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
api("org.jetbrains.kotlinx:kotlinx-datetime:0.5.0")
api("com.russhwolf:multiplatform-settings:1.1.1")
api("com.charleskorn.kaml:kaml:0.58.0")
api("org.jetbrains.compose.ui:ui-text:${rootProject.extra["compose.version"] as String}")
implementation("org.jetbrains.compose.components:components-animatedimage:${rootProject.extra["compose.version"] as String}")
//Barcode
api("org.boofcv:boofcv-core:0.40.1")
api("org.boofcv:boofcv-core:1.1.3")
implementation("com.godaddy.android.colorpicker:compose-color-picker-jvm:0.7.0")
// Link Previews
implementation("org.jsoup:jsoup:1.13.1")
implementation("org.jsoup:jsoup:1.17.2")
// Resources
implementation("dev.icerock.moko:resources:0.23.0")
api("dev.icerock.moko:resources:0.23.0")
api("dev.icerock.moko:resources-compose:0.23.0")
}
}
val commonTest by getting {
@@ -57,47 +56,50 @@ kotlin {
}
}
val androidMain by getting {
kotlin.srcDir("build/generated/moko/androidMain/src")
dependencies {
implementation("androidx.activity:activity-compose:1.5.0")
val work_version = "2.7.1"
implementation("androidx.work:work-runtime-ktx:$work_version")
implementation("com.google.accompanist:accompanist-insets:0.23.0")
implementation("dev.icerock.moko:resources:0.23.0")
implementation("androidx.activity:activity-compose:1.8.2")
val workVersion = "2.9.0"
implementation("androidx.work:work-runtime-ktx:$workVersion")
implementation("com.google.accompanist:accompanist-insets:0.30.1")
// Video support
implementation("com.google.android.exoplayer:exoplayer:2.17.1")
implementation("com.google.android.exoplayer:exoplayer:2.19.1")
// Biometric authentication
implementation("androidx.biometric:biometric:1.2.0-alpha04")
implementation("androidx.biometric:biometric:1.2.0-alpha05")
//Barcode
implementation("org.boofcv:boofcv-android:0.40.1")
implementation("org.boofcv:boofcv-android:1.1.3")
//Camera Permission
implementation("com.google.accompanist:accompanist-permissions:0.23.0")
implementation("com.google.accompanist:accompanist-permissions:0.34.0")
implementation("androidx.webkit:webkit:1.4.0")
implementation("androidx.webkit:webkit:1.10.0")
// GIFs support
implementation("io.coil-kt:coil-compose:2.1.0")
implementation("io.coil-kt:coil-gif:2.1.0")
implementation("io.coil-kt:coil-compose:2.6.0")
implementation("io.coil-kt:coil-gif:2.6.0")
implementation("com.jakewharton:process-phoenix:2.1.2")
implementation("com.jakewharton:process-phoenix:2.2.0")
val camerax_version = "1.1.0-beta01"
implementation("androidx.camera:camera-core:${camerax_version}")
implementation("androidx.camera:camera-camera2:${camerax_version}")
implementation("androidx.camera:camera-lifecycle:${camerax_version}")
implementation("androidx.camera:camera-view:${camerax_version}")
val cameraXVersion = "1.3.2"
implementation("androidx.camera:camera-core:${cameraXVersion}")
implementation("androidx.camera:camera-camera2:${cameraXVersion}")
implementation("androidx.camera:camera-lifecycle:${cameraXVersion}")
implementation("androidx.camera:camera-view:${cameraXVersion}")
// Calls lifecycle listener
implementation("androidx.lifecycle:lifecycle-process:2.4.1")
}
}
val desktopMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.7.1")
implementation("com.github.Dansoftowner:jSystemThemeDetector:3.6")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.8.0")
implementation("com.github.Dansoftowner:jSystemThemeDetector:3.8")
implementation("com.sshtools:two-slices:0.9.0-SNAPSHOT")
implementation("org.slf4j:slf4j-simple:2.0.7")
implementation("uk.co.caprica:vlcj:4.7.3")
implementation("org.slf4j:slf4j-simple:2.0.12")
implementation("uk.co.caprica:vlcj:4.8.2")
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd:efb2ebf85a")
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd-websocket:efb2ebf85a")
}
@@ -107,23 +109,21 @@ kotlin {
}
android {
compileSdkVersion(34)
namespace = "chat.simplex.common"
compileSdk = 34
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdkVersion(28)
targetSdkVersion(33)
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
minSdk = 28
}
testOptions.targetSdk = 33
lint.targetSdk = 33
val isAndroid = gradle.startParameter.taskNames.find {
val lower = it.toLowerCase()
val lower = it.lowercase()
lower.contains("release") || lower.startsWith("assemble") || lower.startsWith("install")
} != null
if (isAndroid) {
// This is not needed on Android but can't be moved to desktopMain because MR lib don't support this.
// No other ways to exclude a file work but it's large and should be excluded
// No other ways to exclude a file work, but it's large and should be excluded
kotlin.sourceSets["commonMain"].resources.exclude("/MR/fonts/NotoColorEmoji-Regular.ttf")
}
}
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="chat.simplex.common">
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
@@ -0,0 +1,104 @@
package chat.simplex.common.helpers
import android.net.*
import android.util.Log
import androidx.core.content.getSystemService
import chat.simplex.common.model.ChatModel.controller
import chat.simplex.common.model.UserNetworkInfo
import chat.simplex.common.model.UserNetworkType
import chat.simplex.common.platform.*
import chat.simplex.common.views.helpers.withBGApi
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
class NetworkObserver {
private var prevInfo: UserNetworkInfo? = null
// When having both mobile and Wi-Fi networks enabled with Wi-Fi being active, then disabling Wi-Fi, network reports its offline (which is true)
// but since it will be online after switching to mobile, there is no need to inform backend about such temporary change.
// But if it will not be online after some seconds, report it and apply required measures
private var noNetworkJob = Job() as Job
private val networkCallback = object: ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) = networkCapabilitiesChanged(networkCapabilities)
override fun onLost(network: Network) = networkLost()
}
private val connectivityManager: ConnectivityManager? = androidAppContext.getSystemService()
fun restartNetworkObserver() {
if (connectivityManager == null) {
Log.e(TAG, "Connectivity manager is unavailable, network observer is disabled")
val info = UserNetworkInfo(
networkType = UserNetworkType.OTHER,
online = true,
)
prevInfo = info
setNetworkInfo(info)
return
}
try {
connectivityManager.unregisterNetworkCallback(networkCallback)
} catch (e: Exception) {
// do nothing
}
val initialCapabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
if (initialCapabilities != null) {
networkCapabilitiesChanged(initialCapabilities)
} else {
networkLost()
}
try {
connectivityManager.registerDefaultNetworkCallback(networkCallback)
} catch (e: Exception) {
Log.e(TAG, "Error registering network callback: ${e.stackTraceToString()}")
}
}
private fun networkCapabilitiesChanged(capabilities: NetworkCapabilities) {
connectivityManager ?: return
val info = UserNetworkInfo(
networkType = networkTypeFromCapabilities(capabilities),
online = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED),
)
if (prevInfo != info) {
prevInfo = info
setNetworkInfo(info)
}
}
private fun networkLost() {
Log.d(TAG, "Network changed: lost")
val none = UserNetworkInfo(networkType = UserNetworkType.NONE, false)
prevInfo = none
setNetworkInfo(none)
}
private fun setNetworkInfo(info: UserNetworkInfo) {
Log.d(TAG, "Network changed: $info")
noNetworkJob.cancel()
if (info.online) {
withBGApi {
if (controller.hasChatCtrl() && controller.apiSetNetworkInfo(info)) {
chatModel.networkInfo.value = info
}
}
} else {
noNetworkJob = withBGApi {
delay(3000)
if (controller.hasChatCtrl() && controller.apiSetNetworkInfo(info)) {
chatModel.networkInfo.value = info
}
}
}
}
private fun networkTypeFromCapabilities(capabilities: NetworkCapabilities): UserNetworkType = when {
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> UserNetworkType.ETHERNET
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> UserNetworkType.WIFI
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> UserNetworkType.CELLULAR
else -> UserNetworkType.OTHER
}
companion object {
val shared = NetworkObserver()
}
}
@@ -0,0 +1,30 @@
package chat.simplex.common.helpers
import android.content.*
import android.net.Uri
import android.provider.Settings
import chat.simplex.common.platform.*
import chat.simplex.common.views.helpers.AlertManager
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.res.MR
fun Context.openAppSettingsInSystem() {
Intent().apply {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.parse("package:${androidAppContext.packageName}")
try {
startActivity(this)
} catch (e: ActivityNotFoundException) {
Log.e(TAG, e.stackTraceToString())
}
}
}
fun Context.showAllowPermissionInSettingsAlert(action: () -> Unit = ::openAppSettingsInSystem) {
AlertManager.shared.showAlertMsg(
title = generalGetString(MR.strings.permissions_grant_in_settings),
text = generalGetString(MR.strings.permissions_find_in_settings_and_grant),
confirmText = generalGetString(MR.strings.permissions_open_settings),
onConfirm = action,
)
}
@@ -2,17 +2,16 @@ package chat.simplex.common.helpers
import android.media.*
import android.net.Uri
import android.os.VibrationEffect
import android.os.Vibrator
import android.os.*
import androidx.core.content.ContextCompat
import chat.simplex.common.R
import chat.simplex.common.platform.SoundPlayerInterface
import chat.simplex.common.platform.androidAppContext
import chat.simplex.common.platform.*
import chat.simplex.common.views.helpers.withApi
import kotlinx.coroutines.*
object SoundPlayer: SoundPlayerInterface {
private var player: MediaPlayer? = null
var playing = false
private var playing = false
override fun start(scope: CoroutineScope, sound: Boolean) {
player?.reset()
@@ -32,7 +31,7 @@ object SoundPlayer: SoundPlayerInterface {
scope.launch {
while (playing) {
if (sound) player?.start()
vibrator?.vibrate(effect)
vibrator?.vibrateApiVersionAware(effect)
delay(3500)
}
}
@@ -43,3 +42,82 @@ object SoundPlayer: SoundPlayerInterface {
player?.stop()
}
}
object CallSoundsPlayer: CallSoundsPlayerInterface {
private var player: MediaPlayer? = null
private var playingJob: Job? = null
private fun start(soundPath: String, delay: Long, scope: CoroutineScope) {
playingJob?.cancel()
player?.reset()
player = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING)
.build()
)
setDataSource(androidAppContext, Uri.parse(soundPath))
prepare()
}
if (delay < 1000) {
player?.isLooping = true
player?.start()
return
}
playingJob = scope.launch {
while (isActive) {
player?.start()
delay(delay)
}
}
}
override fun startConnectingCallSound(scope: CoroutineScope) {
// Taken from https://github.com/TelegramOrg/Telegram-Android
// https://github.com/TelegramOrg/Telegram-Android/blob/master/LICENSE
start("android.resource://" + androidAppContext.packageName + "/" + R.raw.connecting_call, 0, scope)
}
override fun startInCallSound(scope: CoroutineScope) {
start("android.resource://" + androidAppContext.packageName + "/" + R.raw.in_call, 2000, scope)
}
override fun vibrate(times: Int) {
val vibrator = ContextCompat.getSystemService(androidAppContext, Vibrator::class.java)
val effect = VibrationEffect.createOneShot(20, VibrationEffect.DEFAULT_AMPLITUDE)
vibrator?.vibrateApiVersionAware(effect)
repeat(times - 1) {
withApi {
delay(50)
vibrator?.vibrateApiVersionAware(effect)
}
}
}
override fun stop() {
playingJob?.cancel()
player?.stop()
}
}
private fun Vibrator.vibrateApiVersionAware(effect: VibrationEffect) {
if (Build.VERSION.SDK_INT >= 33) {
vibrate(
effect,
VibrationAttributes.Builder()
.setUsage(VibrationAttributes.USAGE_ALARM)
.build()
)
} else if (Build.VERSION.SDK_INT >= 29) {
vibrate(
effect,
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
)
} else {
vibrate(effect)
}
}
@@ -296,6 +296,7 @@ actual object AudioPlayer: AudioPlayerInterface {
}
actual typealias SoundPlayer = chat.simplex.common.helpers.SoundPlayer
actual typealias CallSoundsPlayer = chat.simplex.common.helpers.CallSoundsPlayer
class CryptoMediaSource(val data: ByteArray) : MediaDataSource() {
override fun readAt(position: Long, buffer: ByteArray, offset: Int, size: Int): Int {
@@ -0,0 +1,235 @@
package chat.simplex.common.views.call
import android.content.Context
import android.media.*
import android.media.AudioManager.OnCommunicationDeviceChangedListener
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.compose.runtime.*
import chat.simplex.common.platform.*
import dev.icerock.moko.resources.ImageResource
import chat.simplex.res.MR
import dev.icerock.moko.resources.StringResource
import java.util.concurrent.Executors
interface CallAudioDeviceManagerInterface {
val devices: State<List<AudioDeviceInfo>>
val currentDevice: MutableState<AudioDeviceInfo?>
fun start()
fun stop()
// AudioDeviceInfo.AudioDeviceType
fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyNonEarpiece: Boolean)
// AudioDeviceInfo.AudioDeviceType
fun selectDevice(id: Int)
companion object {
fun new(): CallAudioDeviceManagerInterface =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PostSCallAudioDeviceManager()
} else {
PreSCallAudioDeviceManager()
}
}
}
@RequiresApi(Build.VERSION_CODES.S)
class PostSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
private val am = androidAppContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
override val devices: MutableState<List<AudioDeviceInfo>> = mutableStateOf(emptyList())
override val currentDevice: MutableState<AudioDeviceInfo?> = mutableStateOf(null)
private val audioCallback = object: AudioDeviceCallback() {
override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Added audio devices: ${addedDevices.map { it.type }}")
super.onAudioDevicesAdded(addedDevices)
val oldDevices = devices.value
devices.value = am.availableCommunicationDevices
Log.d(TAG, "Added audio devices2: ${devices.value.map { it.type }}")
if (devices.value.size - oldDevices.size > 0) {
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.supportsVideo() == true, false)
}
}
override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Removed audio devices: ${removedDevices.map { it.type }}")
super.onAudioDevicesRemoved(removedDevices)
devices.value = am.availableCommunicationDevices
}
}
private val listener: OnCommunicationDeviceChangedListener = OnCommunicationDeviceChangedListener { device ->
devices.value = am.availableCommunicationDevices
currentDevice.value = device
}
override fun start() {
am.registerAudioDeviceCallback(audioCallback, null)
am.addOnCommunicationDeviceChangedListener(Executors.newSingleThreadExecutor(), listener)
}
override fun stop() {
am.unregisterAudioDeviceCallback(audioCallback)
am.removeOnCommunicationDeviceChangedListener(listener)
}
override fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyNonEarpiece: Boolean) {
Log.d(TAG, "selectLastExternalDeviceOrDefault: set audio mode, speaker enabled: $speaker")
am.mode = AudioManager.MODE_IN_COMMUNICATION
val commDevice = am.communicationDevice
if (keepAnyNonEarpiece && commDevice != null && commDevice.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) {
// some external device or speaker selected already, no need to change it
return
}
val preferredSecondaryDevice = if (speaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val externalDevice = devices.value.lastOrNull { it.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER && it.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE }
// External device already selected
if (externalDevice != null && externalDevice.type == am.communicationDevice?.type) {
return
}
if (externalDevice != null) {
am.setCommunicationDevice(externalDevice)
} else if (am.communicationDevice?.type != preferredSecondaryDevice) {
am.availableCommunicationDevices.firstOrNull { it.type == preferredSecondaryDevice }?.let {
am.setCommunicationDevice(it)
}
}
}
override fun selectDevice(id: Int) {
am.mode = AudioManager.MODE_IN_COMMUNICATION
val device = devices.value.lastOrNull { it.id == id }
if (device != null && am.communicationDevice?.id != id ) {
am.setCommunicationDevice(device)
}
}
}
class PreSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
private val am = androidAppContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
override val devices: MutableState<List<AudioDeviceInfo>> = mutableStateOf(emptyList())
override val currentDevice: MutableState<AudioDeviceInfo?> = mutableStateOf(null)
private val audioCallback = object: AudioDeviceCallback() {
override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Added audio devices: ${addedDevices.map { it.type }}")
super.onAudioDevicesAdded(addedDevices)
val wasSize = devices.value.size
devices.value += addedDevices.filter { it.hasSupportedType() }
val addedCount = devices.value.size - wasSize
//if (addedCount > 0 && chatModel.activeCall.value?.callState == CallState.Connected) {
// Setting params in Connected state makes sure that Bluetooth will NOT be broken on Android < 12
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.supportsVideo() == true, false)
//}
}
override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Removed audio devices: ${removedDevices.map { it.type }}")
super.onAudioDevicesRemoved(removedDevices)
val wasSize = devices.value.size
devices.value = devices.value.filterNot { removedDevices.any { rm -> rm.id == it.id } }
//val removedCount = wasSize - devices.value.size
//if (devices.value.count { it.hasSupportedType() } == 2 && chatModel.activeCall.value?.callState == CallState.Connected) {
// Setting params in Connected state makes sure that Bluetooth will NOT be broken on Android < 12
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.supportsVideo() == true, true)
//}
}
}
override fun start() {
am.registerAudioDeviceCallback(audioCallback, null)
}
override fun stop() {
am.unregisterAudioDeviceCallback(audioCallback)
}
override fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyNonEarpiece: Boolean) {
Log.d(TAG, "selectLastExternalDeviceOrDefault: set audio mode, speaker enabled: $speaker")
val preferredSecondaryDevice = if (speaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
val externalDevice = devices.value.lastOrNull { it.hasSupportedType() && it.isSource && it.isSink && it.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER && it.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE }
if (externalDevice != null) {
selectDevice(externalDevice.id)
} else {
am.stopBluetoothSco()
am.isWiredHeadsetOn = false
am.isSpeakerphoneOn = preferredSecondaryDevice == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
am.isBluetoothScoOn = false
val newCurrentDevice = devices.value.firstOrNull { it.type == preferredSecondaryDevice }
adaptToCurrentlyActiveDevice(newCurrentDevice)
}
}
override fun selectDevice(id: Int) {
val device = devices.value.lastOrNull { it.id == id }
val isExternalDevice = device != null && device.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER && device.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
if (isExternalDevice) {
am.isSpeakerphoneOn = false
if (device?.type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES) {
am.isWiredHeadsetOn = true
am.stopBluetoothSco()
am.isBluetoothScoOn = false
} else {
am.isWiredHeadsetOn = false
am.startBluetoothSco()
am.isBluetoothScoOn = true
}
adaptToCurrentlyActiveDevice(device)
} else {
am.stopBluetoothSco()
am.isWiredHeadsetOn = false
am.isSpeakerphoneOn = device?.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
am.isBluetoothScoOn = false
adaptToCurrentlyActiveDevice(device)
}
}
private fun adaptToCurrentlyActiveDevice(newCurrentDevice: AudioDeviceInfo?) {
currentDevice.value = newCurrentDevice
}
private fun AudioDeviceInfo.hasSupportedType(): Boolean = when (type) {
AudioDeviceInfo.TYPE_BUILTIN_EARPIECE -> true
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER -> true
AudioDeviceInfo.TYPE_BLUETOOTH_SCO -> true
AudioDeviceInfo.TYPE_BLE_HEADSET -> true
AudioDeviceInfo.TYPE_BLE_SPEAKER -> true
AudioDeviceInfo.TYPE_WIRED_HEADPHONES -> true
else -> false
}
}
val AudioDeviceInfo.icon: ImageResource
get() = when (this.type) {
AudioDeviceInfo.TYPE_BUILTIN_EARPIECE -> MR.images.ic_volume_down
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER -> MR.images.ic_volume_up
AudioDeviceInfo.TYPE_BLUETOOTH_SCO,
AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
AudioDeviceInfo.TYPE_BLE_HEADSET,
AudioDeviceInfo.TYPE_BLE_SPEAKER -> MR.images.ic_bluetooth
AudioDeviceInfo.TYPE_WIRED_HEADPHONES -> MR.images.ic_headphones
AudioDeviceInfo.TYPE_USB_HEADSET, AudioDeviceInfo.TYPE_USB_DEVICE -> MR.images.ic_usb
else -> MR.images.ic_brand_awareness_filled
}
val AudioDeviceInfo.name: StringResource?
get() = when (this.type) {
AudioDeviceInfo.TYPE_BUILTIN_EARPIECE -> MR.strings.audio_device_earpiece
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER -> MR.strings.audio_device_speaker
AudioDeviceInfo.TYPE_BLUETOOTH_SCO,
AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
AudioDeviceInfo.TYPE_BLE_HEADSET,
AudioDeviceInfo.TYPE_BLE_SPEAKER -> null // Use product name instead
AudioDeviceInfo.TYPE_WIRED_HEADPHONES -> MR.strings.audio_device_wired_headphones
AudioDeviceInfo.TYPE_USB_HEADSET, AudioDeviceInfo.TYPE_USB_DEVICE -> null // Use product name instead
else -> null // Use product name instead
}
@@ -1,5 +1,7 @@
package chat.simplex.common.views.call
import SectionSpacer
import SectionView
import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
@@ -24,31 +26,30 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.*
import androidx.webkit.WebViewAssetLoader
import androidx.webkit.WebViewClientCompat
import chat.simplex.common.helpers.showAllowPermissionInSettingsAlert
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.model.ChatModel
import chat.simplex.common.model.Contact
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
import com.google.accompanist.permissions.rememberMultiplePermissionsState
import com.google.accompanist.permissions.*
import dev.icerock.moko.resources.StringResource
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.datetime.Clock
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
// Should be destroy()'ed and set as null when call is ended. Otherwise, it will be a leak
@@ -67,7 +68,8 @@ fun activeCallDestroyWebView() = withApi {
@SuppressLint("SourceLockedOrientationActivity")
@Composable
actual fun ActiveCallView() {
val audioViaBluetooth = rememberSaveable { mutableStateOf(false) }
val call = remember { chatModel.activeCall }.value
val scope = rememberCoroutineScope()
val proximityLock = remember {
val pm = (androidAppContext.getSystemService(Context.POWER_SERVICE) as PowerManager)
if (pm.isWakeLockLevelSupported(PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
@@ -76,37 +78,23 @@ actual fun ActiveCallView() {
null
}
}
DisposableEffect(Unit) {
val am = androidAppContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
var btDeviceCount = 0
val audioCallback = object: AudioDeviceCallback() {
override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Added audio devices: ${addedDevices.map { it.type }}")
super.onAudioDevicesAdded(addedDevices)
val addedCount = addedDevices.count { it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO }
btDeviceCount += addedCount
audioViaBluetooth.value = btDeviceCount > 0
if (addedCount > 0 && chatModel.activeCall.value?.callState == CallState.Connected) {
// Setting params in Connected state makes sure that Bluetooth will NOT be broken on Android < 12
setCallSound(chatModel.activeCall.value?.soundSpeaker ?: return, audioViaBluetooth)
}
}
override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Removed audio devices: ${removedDevices.map { it.type }}")
super.onAudioDevicesRemoved(removedDevices)
val removedCount = removedDevices.count { it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO }
btDeviceCount -= removedCount
audioViaBluetooth.value = btDeviceCount > 0
if (btDeviceCount == 0 && chatModel.activeCall.value?.callState == CallState.Connected) {
// Setting params in Connected state makes sure that Bluetooth will NOT be broken on Android < 12
setCallSound(chatModel.activeCall.value?.soundSpeaker ?: return, audioViaBluetooth)
}
}
val wasConnected = rememberSaveable { mutableStateOf(false) }
LaunchedEffect(call) {
if (call?.callState == CallState.Connected && !wasConnected.value) {
CallSoundsPlayer.vibrate(2)
wasConnected.value = true
}
am.registerAudioDeviceCallback(audioCallback, null)
}
val callAudioDeviceManager = remember { CallAudioDeviceManagerInterface.new() }
DisposableEffect(Unit) {
callAudioDeviceManager.start()
onDispose {
CallSoundsPlayer.stop()
if (wasConnected.value) {
CallSoundsPlayer.vibrate()
}
dropAudioManagerOverrides()
am.unregisterAudioDeviceCallback(audioCallback)
callAudioDeviceManager.stop()
if (proximityLock?.isHeld == true) {
proximityLock.release()
}
@@ -120,8 +108,6 @@ actual fun ActiveCallView() {
if (proximityLock?.isHeld == false) proximityLock.acquire()
}
}
val scope = rememberCoroutineScope()
val call = chatModel.activeCall.value
Box(Modifier.fillMaxSize()) {
WebRTCView(chatModel.callCommand) { apiMsg ->
Log.d(TAG, "received from WebRTCView: $apiMsg")
@@ -134,6 +120,9 @@ actual fun ActiveCallView() {
val callType = CallType(call.localMedia, r.capabilities)
chatModel.controller.apiSendCallInvitation(callRh, call.contact, callType)
updateActiveCall(call) { it.copy(callState = CallState.InvitationSent, localCapabilities = r.capabilities) }
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
CallSoundsPlayer.startConnectingCallSound(scope)
activeCallWaitDeliveryReceipt(scope)
}
is WCallResponse.Offer -> withBGApi {
chatModel.controller.apiSendCallOffer(callRh, call.contact, r.offer, r.iceCandidates, call.localMedia, r.capabilities)
@@ -142,6 +131,7 @@ actual fun ActiveCallView() {
is WCallResponse.Answer -> withBGApi {
chatModel.controller.apiSendCallAnswer(callRh, call.contact, r.answer, r.iceCandidates)
updateActiveCall(call) { it.copy(callState = CallState.Negotiated) }
CallSoundsPlayer.stop()
}
is WCallResponse.Ice -> withBGApi {
chatModel.controller.apiSendCallExtraInfo(callRh, call.contact, r.iceCandidates)
@@ -151,16 +141,16 @@ actual fun ActiveCallView() {
val callStatus = json.decodeFromString<WebRTCCallStatus>("\"${r.state.connectionState}\"")
if (callStatus == WebRTCCallStatus.Connected) {
updateActiveCall(call) { it.copy(callState = CallState.Connected, connectedAt = Clock.System.now()) }
setCallSound(call.soundSpeaker, audioViaBluetooth)
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
}
withBGApi { chatModel.controller.apiCallStatus(callRh, call.contact, callStatus) }
} catch (e: Error) {
} catch (e: Throwable) {
Log.d(TAG,"call status ${r.state.connectionState} not used")
}
is WCallResponse.Connected -> {
updateActiveCall(call) { it.copy(callState = CallState.Connected, connectionInfo = r.connectionInfo) }
scope.launch {
setCallSound(call.soundSpeaker, audioViaBluetooth)
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
}
}
is WCallResponse.End -> {
@@ -206,10 +196,9 @@ actual fun ActiveCallView() {
else -> false
}
if (call != null && showOverlay) {
ActiveCallOverlay(call, chatModel, audioViaBluetooth)
ActiveCallOverlay(call, chatModel, callAudioDeviceManager)
}
}
val context = LocalContext.current
DisposableEffect(Unit) {
val activity = context as? Activity ?: return@DisposableEffect onDispose {}
@@ -233,19 +222,21 @@ actual fun ActiveCallView() {
}
@Composable
private fun ActiveCallOverlay(call: Call, chatModel: ChatModel, audioViaBluetooth: MutableState<Boolean>) {
private fun ActiveCallOverlay(call: Call, chatModel: ChatModel, callAudioDeviceManager: CallAudioDeviceManagerInterface) {
ActiveCallOverlayLayout(
call = call,
speakerCanBeEnabled = !audioViaBluetooth.value,
devices = remember { callAudioDeviceManager.devices }.value,
currentDevice = remember { callAudioDeviceManager.currentDevice },
dismiss = { withBGApi { chatModel.callManager.endCall(call) } },
toggleAudio = { chatModel.callCommand.add(WCallCommand.Media(CallMediaType.Audio, enable = !call.audioEnabled)) },
selectDevice = { callAudioDeviceManager.selectDevice(it.id) },
toggleVideo = { chatModel.callCommand.add(WCallCommand.Media(CallMediaType.Video, enable = !call.videoEnabled)) },
toggleSound = {
var call = chatModel.activeCall.value
if (call != null) {
call = call.copy(soundSpeaker = !call.soundSpeaker)
chatModel.activeCall.value = call
setCallSound(call.soundSpeaker, audioViaBluetooth)
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.soundSpeaker, true)
}
},
flipCamera = { chatModel.callCommand.add(WCallCommand.Camera(call.localCamera.flipped)) }
@@ -256,42 +247,18 @@ private fun ActiveCallOverlay(call: Call, chatModel: ChatModel, audioViaBluetoot
fun ActiveCallOverlayDisabled(call: Call) {
ActiveCallOverlayLayout(
call = call,
speakerCanBeEnabled = false,
devices = emptyList(),
currentDevice = remember { mutableStateOf(null) },
enabled = false,
dismiss = {},
toggleAudio = {},
selectDevice = {},
toggleVideo = {},
toggleSound = {},
flipCamera = {}
)
}
private fun setCallSound(speaker: Boolean, audioViaBluetooth: MutableState<Boolean>) {
val am = androidAppContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
Log.d(TAG, "setCallSound: set audio mode, speaker enabled: $speaker")
am.mode = AudioManager.MODE_IN_COMMUNICATION
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val btDevice = am.availableCommunicationDevices.lastOrNull { it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO }
val preferredSecondaryDevice = if (speaker) AudioDeviceInfo.TYPE_BUILTIN_SPEAKER else AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
if (btDevice != null) {
am.setCommunicationDevice(btDevice)
} else if (am.communicationDevice?.type != preferredSecondaryDevice) {
am.availableCommunicationDevices.firstOrNull { it.type == preferredSecondaryDevice }?.let {
am.setCommunicationDevice(it)
}
}
} else {
if (audioViaBluetooth.value) {
am.isSpeakerphoneOn = false
am.startBluetoothSco()
} else {
am.stopBluetoothSco()
am.isSpeakerphoneOn = speaker
}
am.isBluetoothScoOn = am.isBluetoothScoAvailableOffCall && audioViaBluetooth.value
}
}
private fun dropAudioManagerOverrides() {
val am = androidAppContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
am.mode = AudioManager.MODE_NORMAL
@@ -307,10 +274,12 @@ private fun dropAudioManagerOverrides() {
@Composable
private fun ActiveCallOverlayLayout(
call: Call,
speakerCanBeEnabled: Boolean,
devices: List<AudioDeviceInfo>,
currentDevice: State<AudioDeviceInfo?>,
enabled: Boolean = true,
dismiss: () -> Unit,
toggleAudio: () -> Unit,
selectDevice: (AudioDeviceInfo) -> Unit,
toggleVideo: () -> Unit,
toggleSound: () -> Unit,
flipCamera: () -> Unit
@@ -323,6 +292,32 @@ private fun ActiveCallOverlayLayout(
}
}
Column(Modifier.padding(horizontal = DEFAULT_PADDING)) {
@Composable
fun SelectSoundDevice() {
if (devices.size == 2 &&
devices.all { it.type == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE || it.type == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER } ||
currentDevice.value == null ||
devices.none { it.id == currentDevice.value?.id }
) {
ToggleSoundButton(call, enabled, toggleSound)
} else {
ExposedDropDownSettingWithIcon(
devices.map { Triple(it, it.icon, if (it.name != null) generalGetString(it.name!!) else it.productName.toString()) },
currentDevice,
fontSize = 18.sp,
iconSize = 40.dp,
listIconSize = 30.dp,
iconColor = Color(0xFFFFFFD8),
minWidth = 300.dp,
onSelected = {
if (it != null) {
selectDevice(it)
}
}
)
}
}
when (media) {
CallMediaType.Video -> {
VideoCallInfoView(call)
@@ -331,7 +326,7 @@ private fun ActiveCallOverlayLayout(
}
Row(Modifier.fillMaxWidth().padding(horizontal = 6.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) {
ToggleAudioButton(call, enabled, toggleAudio)
Spacer(Modifier.size(40.dp))
SelectSoundDevice()
IconButton(onClick = dismiss, enabled = enabled) {
Icon(painterResource(MR.images.ic_call_end_filled), stringResource(MR.strings.icon_descr_hang_up), tint = if (enabled) Color.Red else MaterialTheme.colors.secondary, modifier = Modifier.size(64.dp))
}
@@ -369,7 +364,7 @@ private fun ActiveCallOverlayLayout(
}
Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.CenterEnd) {
Box(Modifier.padding(end = 32.dp)) {
ToggleSoundButton(call, speakerCanBeEnabled && enabled, toggleSound)
SelectSoundDevice()
}
}
}
@@ -510,34 +505,138 @@ private fun DisabledBackgroundCallsButton() {
// }
//}
@Composable
fun CallPermissionsView(pipActive: Boolean, hasVideo: Boolean, cancel: () -> Unit) {
val audioPermission = rememberPermissionState(Manifest.permission.RECORD_AUDIO)
val cameraPermission = rememberPermissionState(Manifest.permission.CAMERA)
val permissionsState = rememberMultiplePermissionsState(
permissions = if (hasVideo) {
listOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
} else {
listOf(Manifest.permission.RECORD_AUDIO)
}
)
val context = LocalContext.current
val buttonEnabled = remember { mutableStateOf(true) }
LaunchedEffect(Unit) {
if (!pipActive) {
permissionsState.launchMultiplePermissionRequestWithFallback(buttonEnabled, context::showAllowPermissionInSettingsAlert)
}
}
if (pipActive) {
Column(Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.SpaceEvenly) {
if (audioPermission.status is PermissionStatus.Denied) {
Icon(
painterResource(MR.images.ic_call_500),
stringResource(MR.strings.permissions_record_audio),
Modifier.size(24.dp),
tint = Color(0xFFFFFFD8)
)
}
if (hasVideo && cameraPermission.status is PermissionStatus.Denied) {
Icon(
painterResource(MR.images.ic_videocam),
stringResource(MR.strings.permissions_camera),
Modifier.size(24.dp),
tint = Color(0xFFFFFFD8)
)
}
}
} else {
ColumnWithScrollBar(Modifier.fillMaxSize()) {
Spacer(Modifier.height(AppBarHeight))
AppBarTitle(stringResource(MR.strings.permissions_required))
Spacer(Modifier.weight(1f))
val onClick = {
if (permissionsState.shouldShowRationale) {
context.showAllowPermissionInSettingsAlert()
} else {
permissionsState.launchMultiplePermissionRequestWithFallback(buttonEnabled, context::showAllowPermissionInSettingsAlert)
}
}
Text(stringResource(MR.strings.permissions_grant), Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING), textAlign = TextAlign.Center, color = Color(0xFFFFFFD8))
SectionSpacer()
SectionView {
Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
val text = if (hasVideo && audioPermission.status is PermissionStatus.Denied && cameraPermission.status is PermissionStatus.Denied) {
stringResource(MR.strings.permissions_camera_and_record_audio)
} else if (audioPermission.status is PermissionStatus.Denied) {
stringResource(MR.strings.permissions_record_audio)
} else if (hasVideo && cameraPermission.status is PermissionStatus.Denied) {
stringResource(MR.strings.permissions_camera)
} else ""
GrantPermissionButton(text, buttonEnabled.value, onClick)
}
}
Spacer(Modifier.weight(1f))
Box(Modifier.fillMaxWidth().padding(bottom = if (hasVideo) 0.dp else DEFAULT_BOTTOM_PADDING), contentAlignment = Alignment.Center) {
SimpleButtonFrame(cancel, Modifier.height(64.dp)) {
Text(stringResource(MR.strings.call_service_notification_end_call), fontSize = 20.sp, color = Color(0xFFFFFFD8))
}
}
}
}
}
@Composable
private fun GrantPermissionButton(text: String, enabled: Boolean, onClick: () -> Unit) {
Row(
Modifier
.clickable(enabled = enabled, onClick = onClick)
.heightIn(min = 30.dp)
.background(WarningOrange.copy(0.3f), RoundedCornerShape(50)),
verticalAlignment = Alignment.CenterVertically
) {
Text(text, Modifier.padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF), fontSize = 20.sp, color = WarningOrange)
}
}
/**
* The idea of this function is to ask system to show permission dialog and to see if it's really doing it.
* Otherwise, show alert with a button that opens settings for manual permission granting
* */
private fun MultiplePermissionsState.launchMultiplePermissionRequestWithFallback(buttonEnabled: MutableState<Boolean>, fallback: () -> Unit) {
buttonEnabled.value = false
val lifecycleOwner = ProcessLifecycleOwner.get().lifecycle
var useFallback = true
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_PAUSE) {
useFallback = false
buttonEnabled.value = true
}
}
lifecycleOwner.addObserver(observer)
withBGApi {
delay(2000)
if (useFallback && chatModel.activeCall.value != null) {
fallback()
}
buttonEnabled.value = true
}.invokeOnCompletion {
// Main thread only
withApi {
lifecycleOwner.removeObserver(observer)
}
}
launchMultiplePermissionRequest()
}
@Composable
fun WebRTCView(callCommand: SnapshotStateList<WCallCommand>, onResponse: (WVAPIMessage) -> Unit) {
val webView = remember { mutableStateOf<WebView?>(null) }
val permissionsState = rememberMultiplePermissionsState(
permissions = listOf(
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.MODIFY_AUDIO_SETTINGS,
Manifest.permission.INTERNET
)
)
fun processCommand(wv: WebView, cmd: WCallCommand) {
val apiCall = WVAPICall(command = cmd)
wv.evaluateJavascript("processCommand(${json.encodeToString(apiCall)})", null)
}
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME || event == Lifecycle.Event.ON_START) {
permissionsState.launchMultiplePermissionRequest()
}
}
lifecycleOwner.lifecycle.addObserver(observer)
DisposableEffect(Unit) {
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
// val wv = webView.value
// if (wv != null) processCommand(wv, WCallCommand.End)
// webView.value?.destroy()
// val wv = webView.value
// if (wv != null) processCommand(wv, WCallCommand.End)
// webView.value?.destroy()
webView.value = null
}
}
@@ -560,44 +659,42 @@ fun WebRTCView(callCommand: SnapshotStateList<WCallCommand>, onResponse: (WVAPIM
.addPathHandler("/assets/www/", WebViewAssetLoader.AssetsPathHandler(LocalContext.current))
.build()
if (permissionsState.allPermissionsGranted) {
Box(Modifier.fillMaxSize()) {
AndroidView(
factory = { AndroidViewContext ->
(staticWebView ?: WebView(androidAppContext)).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
this.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.origin.toString().startsWith("file:/")) {
request.grant(request.resources)
} else {
Log.d(TAG, "Permission request from webview denied.")
request.deny()
}
Box(Modifier.fillMaxSize()) {
AndroidView(
factory = { AndroidViewContext ->
(staticWebView ?: WebView(androidAppContext)).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
this.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.origin.toString().startsWith("file:/")) {
request.grant(request.resources)
} else {
Log.d(TAG, "Permission request from webview denied.")
request.deny()
}
}
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
this.clearHistory()
this.clearCache(true)
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
val webViewSettings = this.settings
webViewSettings.allowFileAccess = true
webViewSettings.allowContentAccess = true
webViewSettings.javaScriptEnabled = true
webViewSettings.mediaPlaybackRequiresUserGesture = false
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
if (staticWebView == null) {
this.loadUrl("file:android_asset/www/android/call.html")
} else {
webView.value = this
}
}
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
this.clearHistory()
this.clearCache(true)
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
val webViewSettings = this.settings
webViewSettings.allowFileAccess = true
webViewSettings.allowContentAccess = true
webViewSettings.javaScriptEnabled = true
webViewSettings.mediaPlaybackRequiresUserGesture = false
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
if (staticWebView == null) {
this.loadUrl("file:android_asset/www/android/call.html")
} else {
webView.value = this
}
}
) { /* WebView */ }
}
}
) { /* WebView */ }
}
}
@@ -662,9 +759,11 @@ fun PreviewActiveCallOverlayVideo() {
RTCIceCandidate(RTCIceCandidateType.Host, "tcp")
)
),
speakerCanBeEnabled = true,
devices = emptyList(),
currentDevice = remember { mutableStateOf(null) },
dismiss = {},
toggleAudio = {},
selectDevice = {},
toggleVideo = {},
toggleSound = {},
flipCamera = {}
@@ -689,9 +788,11 @@ fun PreviewActiveCallOverlayAudio() {
RTCIceCandidate(RTCIceCandidateType.Host, "udp")
)
),
speakerCanBeEnabled = true,
devices = emptyList(),
currentDevice = remember { mutableStateOf(null) },
dismiss = {},
toggleAudio = {},
selectDevice = {},
toggleVideo = {},
toggleSound = {},
flipCamera = {}
@@ -6,7 +6,6 @@ import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext
import chat.simplex.common.helpers.toUri
import chat.simplex.common.model.CIFile
import chat.simplex.common.platform.*
import chat.simplex.common.views.helpers.ModalManager
@@ -15,7 +14,6 @@ import coil.compose.rememberAsyncImagePainter
import coil.decode.GifDecoder
import coil.decode.ImageDecoderDecoder
import coil.request.ImageRequest
import java.net.URI
@Composable
actual fun SimpleAndAnimatedImageView(
@@ -43,6 +41,7 @@ actual fun SimpleAndAnimatedImageView(
}
private val imageLoader = ImageLoader.Builder(androidAppContext)
.networkObserverEnabled(false)
.components {
if (SDK_INT >= 28) {
add(ImageDecoderDecoder.Factory())
@@ -15,6 +15,7 @@ import chat.simplex.common.platform.FileChooserLauncher
import chat.simplex.common.platform.saveImage
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.rememberPermissionState
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
@@ -30,7 +31,7 @@ actual fun SaveContentItemAction(cItem: ChatItem, saveFileLauncher: FileChooserL
ItemAction(stringResource(MR.strings.save_verb), painterResource(if (cItem.file?.fileSource?.cryptoArgs == null) MR.images.ic_download else MR.images.ic_lock_open_right), onClick = {
when (cItem.content.msgContent) {
is MsgContent.MCImage -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || writePermissionState.hasPermission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || writePermissionState.status == PermissionStatus.Granted) {
saveImage(cItem.file)
} else {
writePermissionState.launchPermissionRequest()
@@ -3,7 +3,7 @@ package chat.simplex.common.views.chat.item
import android.os.Build
import android.view.View
import androidx.compose.foundation.Image
import androidx.compose.runtime.Composable
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.*
import androidx.compose.ui.graphics.painter.BitmapPainter
@@ -11,8 +11,8 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.view.isVisible
import chat.simplex.common.helpers.toUri
import chat.simplex.common.platform.VideoPlayer
import chat.simplex.common.platform.androidAppContext
import chat.simplex.res.MR
import coil.ImageLoader
import coil.compose.rememberAsyncImagePainter
@@ -23,21 +23,11 @@ import coil.size.Size
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout
import com.google.android.exoplayer2.ui.StyledPlayerView
import dev.icerock.moko.resources.compose.stringResource
import java.net.URI
@Composable
actual fun FullScreenImageView(modifier: Modifier, data: ByteArray, imageBitmap: ImageBitmap) {
// I'm making a new instance of imageLoader here because if I use one instance in multiple places
// I'm using a new private instance of imageLoader here because if I use one instance in multiple places
// after end of composition here a GIF from the first instance will be paused automatically which isn't what I want
val imageLoader = ImageLoader.Builder(LocalContext.current)
.components {
if (Build.VERSION.SDK_INT >= 28) {
add(ImageDecoderDecoder.Factory())
} else {
add(GifDecoder.Factory())
}
}
.build()
Image(
rememberAsyncImagePainter(
ImageRequest.Builder(LocalContext.current).data(data = data).size(Size.ORIGINAL).build(),
@@ -73,3 +63,14 @@ actual fun FullScreenVideoView(player: VideoPlayer, modifier: Modifier, close: (
modifier
)
}
private val imageLoader = ImageLoader.Builder(androidAppContext)
.networkObserverEnabled(false)
.components {
if (Build.VERSION.SDK_INT >= 28) {
add(ImageDecoderDecoder.Factory())
} else {
add(GifDecoder.Factory())
}
}
.build()
@@ -11,6 +11,7 @@ import androidx.camera.view.PreviewView
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
@@ -27,6 +28,7 @@ import chat.simplex.common.platform.TAG
import chat.simplex.common.ui.theme.DEFAULT_PADDING_HALF
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.rememberPermissionState
import com.google.common.util.concurrent.ListenableFuture
import dev.icerock.moko.resources.compose.painterResource
@@ -65,7 +67,7 @@ actual fun QRCodeScanner(
.widthIn(max = 400.dp)
.aspectRatio(1f)
val showScanner = remember { showQRCodeScanner }
if (showScanner.value && cameraPermissionState.hasPermission) {
if (showScanner.value && cameraPermissionState.status == PermissionStatus.Granted) {
AndroidView(
factory = { AndroidViewContext ->
PreviewView(AndroidViewContext).apply {
@@ -126,20 +128,22 @@ actual fun QRCodeScanner(
disabledBackgroundColor = MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.9f),
disabledContentColor = MaterialTheme.colors.primary,
)
var permissionRequested by rememberSaveable { mutableStateOf(false) }
when {
!cameraPermissionState.hasPermission && !cameraPermissionState.permissionRequested && showScanner.value -> {
cameraPermissionState.status is PermissionStatus.Denied && !permissionRequested && showScanner.value -> {
LaunchedEffect(Unit) {
permissionRequested = true
cameraPermissionState.launchPermissionRequest()
}
}
!cameraPermissionState.hasPermission -> {
cameraPermissionState.status is PermissionStatus.Denied -> {
Button({ cameraPermissionState.launchPermissionRequest() }, modifier = modifier, colors = buttonColors) {
Icon(painterResource(MR.images.ic_camera_enhance), null)
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
Text(stringResource(MR.strings.enable_camera_access))
}
}
cameraPermissionState.hasPermission -> {
cameraPermissionState.status == PermissionStatus.Granted -> {
Button({ showQRCodeScanner.value = true }, modifier = modifier, colors = buttonColors) {
Icon(painterResource(MR.images.ic_qr_code), null)
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
@@ -5,14 +5,15 @@ import android.os.Build
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import chat.simplex.common.platform.ntfManager
import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.rememberPermissionState
@Composable
actual fun SetNotificationsModeAdditions() {
if (Build.VERSION.SDK_INT >= 33) {
val notificationsPermissionState = rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS)
LaunchedEffect(notificationsPermissionState.hasPermission) {
if (notificationsPermissionState.hasPermission) {
LaunchedEffect(notificationsPermissionState.status == PermissionStatus.Granted) {
if (notificationsPermissionState.status == PermissionStatus.Granted) {
ntfManager.androidCreateNtfChannelsMaybeShowAlert()
} else {
notificationsPermissionState.launchPermissionRequest()
@@ -111,13 +111,14 @@ object ChatModel {
var draft = mutableStateOf(null as ComposeState?)
var draftChatId = mutableStateOf(null as String?)
// working with external intents
// working with external intents or internal forwarding of chat items
val sharedContent = mutableStateOf(null as SharedContent?)
val filesToDelete = mutableSetOf<File>()
val simplexLinkMode by lazy { mutableStateOf(ChatController.appPrefs.simplexLinkMode.get()) }
val clipboardHasText = mutableStateOf(false)
val networkInfo = mutableStateOf(UserNetworkInfo(networkType = UserNetworkType.OTHER, online = true))
val updatingChatsMutex: Mutex = Mutex()
val changingActiveUserMutex: Mutex = Mutex()
@@ -804,6 +805,24 @@ data class Chat(
val id: String get() = chatInfo.id
fun groupFeatureEnabled(feature: GroupFeature): Boolean =
if (chatInfo is ChatInfo.Group) {
val groupInfo = chatInfo.groupInfo
val p = groupInfo.fullGroupPreferences
when (feature) {
GroupFeature.TimedMessages -> p.timedMessages.on
GroupFeature.DirectMessages -> p.directMessages.on(groupInfo.membership)
GroupFeature.FullDelete -> p.fullDelete.on
GroupFeature.Reactions -> p.reactions.on
GroupFeature.Voice -> p.voice.on(groupInfo.membership)
GroupFeature.Files -> p.files.on(groupInfo.membership)
GroupFeature.SimplexLinks -> p.simplexLinks.on(groupInfo.membership)
GroupFeature.History -> p.history.on
}
} else {
true
}
@Serializable
data class ChatStats(val unreadCount: Int = 0, val minUnreadItemId: Long = 0, val unreadChat: Boolean = false)
@@ -1239,7 +1258,7 @@ data class GroupInfo (
ChatFeature.TimedMessages -> fullGroupPreferences.timedMessages.on
ChatFeature.FullDelete -> fullGroupPreferences.fullDelete.on
ChatFeature.Reactions -> fullGroupPreferences.reactions.on
ChatFeature.Voice -> fullGroupPreferences.voice.on
ChatFeature.Voice -> fullGroupPreferences.voice.on(membership)
ChatFeature.Calls -> false
}
override val timedMessagesTTL: Int? get() = with(fullGroupPreferences.timedMessages) { if (on) ttl else null }
@@ -1734,7 +1753,7 @@ data class ChatItem (
val allowAddReaction: Boolean get() =
meta.itemDeleted == null && !isLiveDummy && (reactions.count { it.userReacted } < 3)
private val isLiveDummy: Boolean get() = meta.itemId == TEMP_LIVE_CHAT_ITEM_ID
val isLiveDummy: Boolean get() = meta.itemId == TEMP_LIVE_CHAT_ITEM_ID
val encryptedFile: Boolean? = if (file?.fileSource == null) null else file.fileSource.cryptoArgs != null
@@ -1883,14 +1902,16 @@ data class ChatItem (
status: CIStatus = CIStatus.SndNew(),
quotedItem: CIQuote? = null,
file: CIFile? = null,
itemForwarded: CIForwardedFrom? = null,
itemDeleted: CIDeleted? = null,
itemEdited: Boolean = false,
itemTimed: CITimed? = null,
deletable: Boolean = true,
editable: Boolean = true
) =
ChatItem(
chatDir = dir,
meta = CIMeta.getSample(id, ts, text, status, itemDeleted, itemEdited, itemTimed, editable),
meta = CIMeta.getSample(id, ts, text, status, itemForwarded, itemDeleted, itemEdited, itemTimed, deletable, editable),
content = CIContent.SndMsgContent(msgContent = MsgContent.MCText(text)),
quotedItem = quotedItem,
reactions = listOf(),
@@ -1974,10 +1995,12 @@ data class ChatItem (
itemStatus = CIStatus.RcvRead(),
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
itemForwarded = null,
itemDeleted = null,
itemEdited = false,
itemTimed = null,
itemLive = false,
deletable = false,
editable = false
),
content = CIContent.RcvDeleted(deleteMode = CIDeleteMode.cidmBroadcast),
@@ -1995,10 +2018,12 @@ data class ChatItem (
itemStatus = CIStatus.RcvRead(),
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
itemForwarded = null,
itemDeleted = null,
itemEdited = false,
itemTimed = null,
itemLive = true,
deletable = false,
editable = false
),
content = CIContent.SndMsgContent(MsgContent.MCText("")),
@@ -2095,10 +2120,12 @@ data class CIMeta (
val itemStatus: CIStatus,
val createdAt: Instant,
val updatedAt: Instant,
val itemForwarded: CIForwardedFrom?,
val itemDeleted: CIDeleted?,
val itemEdited: Boolean,
val itemTimed: CITimed?,
val itemLive: Boolean?,
val deletable: Boolean,
val editable: Boolean
) {
val timestampText: String get() = getTimestampText(itemTs)
@@ -2118,7 +2145,8 @@ data class CIMeta (
companion object {
fun getSample(
id: Long, ts: Instant, text: String, status: CIStatus = CIStatus.SndNew(),
itemDeleted: CIDeleted? = null, itemEdited: Boolean = false, itemTimed: CITimed? = null, itemLive: Boolean = false, editable: Boolean = true
itemForwarded: CIForwardedFrom? = null, itemDeleted: CIDeleted? = null, itemEdited: Boolean = false,
itemTimed: CITimed? = null, itemLive: Boolean = false, deletable: Boolean = true, editable: Boolean = true
): CIMeta =
CIMeta(
itemId = id,
@@ -2127,10 +2155,12 @@ data class CIMeta (
itemStatus = status,
createdAt = ts,
updatedAt = ts,
itemForwarded = itemForwarded,
itemDeleted = itemDeleted,
itemEdited = itemEdited,
itemTimed = itemTimed,
itemLive = itemLive,
deletable = deletable,
editable = editable
)
@@ -2143,10 +2173,12 @@ data class CIMeta (
itemStatus = CIStatus.SndNew(),
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
itemForwarded = null,
itemDeleted = null,
itemEdited = false,
itemTimed = null,
itemLive = false,
deletable = false,
editable = false
)
}
@@ -2257,6 +2289,37 @@ sealed class CIDeleted {
@Serializable @SerialName("moderated") class Moderated(val deletedTs: Instant?, val byGroupMember: GroupMember): CIDeleted()
}
@Serializable
enum class MsgDirection {
@SerialName("rcv") Rcv,
@SerialName("snd") Snd;
}
@Serializable
sealed class CIForwardedFrom {
@Serializable @SerialName("unknown") object Unknown: CIForwardedFrom()
@Serializable @SerialName("contact") class Contact(override val chatName: String, val msgDir: MsgDirection, val contactId: Long? = null, val chatItemId: Long? = null): CIForwardedFrom()
@Serializable @SerialName("group") class Group(override val chatName: String, val msgDir: MsgDirection, val groupId: Long? = null, val chatItemId: Long? = null): CIForwardedFrom()
open val chatName: String
get() = when (this) {
Unknown -> ""
is Contact -> chatName
is Group -> chatName
}
fun text(chatType: ChatType): String =
if (chatType == ChatType.Local) {
if (chatName.isEmpty()) {
generalGetString(MR.strings.saved_description)
} else {
generalGetString(MR.strings.saved_from_description).format(chatName)
}
} else {
generalGetString(MR.strings.forwarded_description)
}
}
@Serializable
enum class CIDeleteMode(val deleteMode: String) {
@SerialName("internal") cidmInternal("internal"),
@@ -2292,8 +2355,8 @@ sealed class CIContent: ItemContent {
@Serializable @SerialName("sndChatFeature") class SndChatFeature(val feature: ChatFeature, val enabled: FeatureEnabled, val param: Int? = null): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvChatPreference") class RcvChatPreference(val feature: ChatFeature, val allowed: FeatureAllowed, val param: Int? = null): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("sndChatPreference") class SndChatPreference(val feature: ChatFeature, val allowed: FeatureAllowed, val param: Int? = null): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvGroupFeature") class RcvGroupFeature(val groupFeature: GroupFeature, val preference: GroupPreference, val param: Int? = null): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("sndGroupFeature") class SndGroupFeature(val groupFeature: GroupFeature, val preference: GroupPreference, val param: Int? = null): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvGroupFeature") class RcvGroupFeature(val groupFeature: GroupFeature, val preference: GroupPreference, val param: Int? = null, val memberRole_: GroupMemberRole?): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("sndGroupFeature") class SndGroupFeature(val groupFeature: GroupFeature, val preference: GroupPreference, val param: Int? = null, val memberRole_: GroupMemberRole?): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvChatFeatureRejected") class RcvChatFeatureRejected(val feature: ChatFeature): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvGroupFeatureRejected") class RcvGroupFeatureRejected(val groupFeature: GroupFeature): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("sndModerated") object SndModerated: CIContent() { override val msgContent: MsgContent? get() = null }
@@ -2325,8 +2388,8 @@ sealed class CIContent: ItemContent {
is SndChatFeature -> featureText(feature, enabled.text, param)
is RcvChatPreference -> preferenceText(feature, allowed, param)
is SndChatPreference -> preferenceText(feature, allowed, param)
is RcvGroupFeature -> featureText(groupFeature, preference.enable.text, param)
is SndGroupFeature -> featureText(groupFeature, preference.enable.text, param)
is RcvGroupFeature -> featureText(groupFeature, preference.enable.text, param, memberRole_)
is SndGroupFeature -> featureText(groupFeature, preference.enable.text, param, memberRole_)
is RcvChatFeatureRejected -> "${feature.text}: ${generalGetString(MR.strings.feature_received_prohibited)}"
is RcvGroupFeatureRejected -> "${groupFeature.text}: ${generalGetString(MR.strings.feature_received_prohibited)}"
is SndModerated -> generalGetString(MR.strings.moderated_description)
@@ -2363,11 +2426,23 @@ sealed class CIContent: ItemContent {
private val e2eeInfoNoPQStr: String = generalGetString(MR.strings.e2ee_info_no_pq_short)
fun featureText(feature: Feature, enabled: String, param: Int?): String =
if (feature.hasParam) {
fun featureText(feature: Feature, enabled: String, param: Int?, role: GroupMemberRole? = null): String =
(if (feature.hasParam) {
"${feature.text}: ${timeText(param)}"
} else {
"${feature.text}: $enabled"
}) + (
if (feature.hasRole && role != null)
" (${roleText(role)})"
else
""
)
private fun roleText(role: GroupMemberRole?): String =
when (role) {
GroupMemberRole.Owner -> generalGetString(MR.strings.feature_roles_owners)
GroupMemberRole.Admin -> generalGetString(MR.strings.feature_roles_admins)
else -> generalGetString(MR.strings.feature_roles_all_members)
}
fun preferenceText(feature: Feature, allowed: FeatureAllowed, param: Int?): String = when {
@@ -3251,7 +3326,8 @@ sealed class ChatItemTTL: Comparable<ChatItemTTL?> {
@Serializable
class ChatItemInfo(
val itemVersions: List<ChatItemVersion>,
val memberDeliveryStatuses: List<MemberDeliveryStatus>?
val memberDeliveryStatuses: List<MemberDeliveryStatus>?,
val forwardedFromChatItem: AChatItem?
)
@Serializable
@@ -20,6 +20,7 @@ import com.charleskorn.kaml.YamlConfiguration
import chat.simplex.res.MR
import com.russhwolf.settings.Settings
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.sync.withLock
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
@@ -75,7 +76,7 @@ class AppPreferences {
val value = _callOnLockScreen.get() ?: return CallOnLockScreen.default
return try {
CallOnLockScreen.valueOf(value)
} catch (e: Error) {
} catch (e: Throwable) {
CallOnLockScreen.default
}
},
@@ -95,7 +96,7 @@ class AppPreferences {
val value = _simplexLinkMode.get() ?: return SimplexLinkMode.default
return try {
SimplexLinkMode.valueOf(value)
} catch (e: Error) {
} catch (e: Throwable) {
SimplexLinkMode.default
}
},
@@ -123,7 +124,7 @@ class AppPreferences {
val value = _networkSessionMode.get() ?: return TransportSessionMode.default
return try {
TransportSessionMode.valueOf(value)
} catch (e: Error) {
} catch (e: Throwable) {
TransportSessionMode.default
}
},
@@ -134,6 +135,7 @@ class AppPreferences {
val networkTCPConnectTimeout = mkTimeoutPreference(SHARED_PREFS_NETWORK_TCP_CONNECT_TIMEOUT, NetCfg.defaults.tcpConnectTimeout, NetCfg.proxyDefaults.tcpConnectTimeout)
val networkTCPTimeout = mkTimeoutPreference(SHARED_PREFS_NETWORK_TCP_TIMEOUT, NetCfg.defaults.tcpTimeout, NetCfg.proxyDefaults.tcpTimeout)
val networkTCPTimeoutPerKb = mkTimeoutPreference(SHARED_PREFS_NETWORK_TCP_TIMEOUT_PER_KB, NetCfg.defaults.tcpTimeoutPerKb, NetCfg.proxyDefaults.tcpTimeoutPerKb)
val networkRcvConcurrency = mkIntPreference(SHARED_PREFS_NETWORK_RCV_CONCURRENCY, NetCfg.defaults.rcvConcurrency)
val networkSMPPingInterval = mkLongPreference(SHARED_PREFS_NETWORK_SMP_PING_INTERVAL, NetCfg.defaults.smpPingInterval)
val networkSMPPingCount = mkIntPreference(SHARED_PREFS_NETWORK_SMP_PING_COUNT, NetCfg.defaults.smpPingCount)
val networkEnableKeepAlive = mkBoolPreference(SHARED_PREFS_NETWORK_ENABLE_KEEP_ALIVE, NetCfg.defaults.enableKeepAlive)
@@ -303,6 +305,7 @@ class AppPreferences {
private const val SHARED_PREFS_NETWORK_TCP_CONNECT_TIMEOUT = "NetworkTCPConnectTimeout"
private const val SHARED_PREFS_NETWORK_TCP_TIMEOUT = "NetworkTCPTimeout"
private const val SHARED_PREFS_NETWORK_TCP_TIMEOUT_PER_KB = "networkTCPTimeoutPerKb"
private const val SHARED_PREFS_NETWORK_RCV_CONCURRENCY = "networkRcvConcurrency"
private const val SHARED_PREFS_NETWORK_SMP_PING_INTERVAL = "NetworkSMPPingInterval"
private const val SHARED_PREFS_NETWORK_SMP_PING_COUNT = "NetworkSMPPingCount"
private const val SHARED_PREFS_NETWORK_ENABLE_KEEP_ALIVE = "NetworkEnableKeepAlive"
@@ -350,11 +353,15 @@ object ChatController {
var ctrl: ChatCtrl? = -1
val appPrefs: AppPreferences by lazy { AppPreferences() }
val messagesChannel: Channel<APIResponse> = Channel()
val chatModel = ChatModel
private var receiverStarted = false
var lastMsgReceivedTimestamp: Long = System.currentTimeMillis()
private set
fun hasChatCtrl() = ctrl != -1L && ctrl != null
private suspend fun currentUserId(funcName: String): Long = changingActiveUserMutex.withLock {
val userId = chatModel.currentUser.value?.userId
if (userId == null) {
@@ -393,7 +400,7 @@ object ChatController {
}
Log.d(TAG, "startChat: running")
}
} catch (e: Error) {
} catch (e: Throwable) {
Log.e(TAG, "failed starting chat $e")
throw e
}
@@ -411,7 +418,7 @@ object ChatController {
startReceiver()
setLocalDeviceName(appPrefs.deviceNameForRemoteAccess.get()!!)
Log.d(TAG, "startChat: started without user")
} catch (e: Error) {
} catch (e: Throwable) {
Log.e(TAG, "failed starting chat without user $e")
throw e
}
@@ -481,6 +488,7 @@ object ChatController {
if (msg != null) {
val finishedWithoutTimeout = withTimeoutOrNull(60_000L) {
processReceivedMsg(msg)
messagesChannel.trySend(msg)
}
if (finishedWithoutTimeout == null) {
Log.e(TAG, "Timeout reached while processing received message: " + msg.resp.responseType)
@@ -628,7 +636,7 @@ object ChatController {
when (r) {
is CR.ChatStarted -> return true
is CR.ChatRunning -> return false
else -> throw Error("failed starting chat: ${r.responseType} ${r.details}")
else -> throw Exception("failed starting chat: ${r.responseType} ${r.details}")
}
}
@@ -636,26 +644,26 @@ object ChatController {
val r = sendCmd(null, CC.ApiStopChat())
when (r) {
is CR.ChatStopped -> return true
else -> throw Error("failed stopping chat: ${r.responseType} ${r.details}")
else -> throw Exception("failed stopping chat: ${r.responseType} ${r.details}")
}
}
suspend fun apiSetTempFolder(tempFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.SetTempFolder(tempFolder), ctrl)
if (r is CR.CmdOk) return
throw Error("failed to set temp folder: ${r.responseType} ${r.details}")
throw Exception("failed to set temp folder: ${r.responseType} ${r.details}")
}
suspend fun apiSetFilesFolder(filesFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.SetFilesFolder(filesFolder), ctrl)
if (r is CR.CmdOk) return
throw Error("failed to set files folder: ${r.responseType} ${r.details}")
throw Exception("failed to set files folder: ${r.responseType} ${r.details}")
}
suspend fun apiSetRemoteHostsFolder(remoteHostsFolder: String) {
val r = sendCmd(null, CC.SetRemoteHostsFolder(remoteHostsFolder))
if (r is CR.CmdOk) return
throw Error("failed to set remote hosts folder: ${r.responseType} ${r.details}")
throw Exception("failed to set remote hosts folder: ${r.responseType} ${r.details}")
}
suspend fun apiSetEncryptLocalFiles(enable: Boolean) = sendCommandOkResp(null, CC.ApiSetEncryptLocalFiles(enable))
@@ -663,13 +671,13 @@ object ChatController {
suspend fun apiSaveAppSettings(settings: AppSettings) {
val r = sendCmd(null, CC.ApiSaveSettings(settings))
if (r is CR.CmdOk) return
throw Error("failed to set app settings: ${r.responseType} ${r.details}")
throw Exception("failed to set app settings: ${r.responseType} ${r.details}")
}
suspend fun apiGetAppSettings(settings: AppSettings): AppSettings {
val r = sendCmd(null, CC.ApiGetSettings(settings))
if (r is CR.AppSettingsR) return r.appSettings
throw Error("failed to get app settings: ${r.responseType} ${r.details}")
throw Exception("failed to get app settings: ${r.responseType} ${r.details}")
}
suspend fun apiSetPQEncryption(enable: Boolean) = sendCommandOkResp(null, CC.ApiSetPQEncryption(enable))
@@ -684,19 +692,19 @@ object ChatController {
suspend fun apiExportArchive(config: ArchiveConfig) {
val r = sendCmd(null, CC.ApiExportArchive(config))
if (r is CR.CmdOk) return
throw Error("failed to export archive: ${r.responseType} ${r.details}")
throw Exception("failed to export archive: ${r.responseType} ${r.details}")
}
suspend fun apiImportArchive(config: ArchiveConfig): List<ArchiveError> {
val r = sendCmd(null, CC.ApiImportArchive(config))
if (r is CR.ArchiveImported) return r.archiveErrors
throw Error("failed to import archive: ${r.responseType} ${r.details}")
throw Exception("failed to import archive: ${r.responseType} ${r.details}")
}
suspend fun apiDeleteStorage() {
val r = sendCmd(null, CC.ApiDeleteStorage())
if (r is CR.CmdOk) return
throw Error("failed to delete storage: ${r.responseType} ${r.details}")
throw Exception("failed to delete storage: ${r.responseType} ${r.details}")
}
suspend fun apiStorageEncryption(currentKey: String = "", newKey: String = ""): CR.ChatCmdError? {
@@ -732,12 +740,16 @@ object ChatController {
suspend fun apiSendMessage(rh: Long?, type: ChatType, id: Long, file: CryptoFile? = null, quotedItemId: Long? = null, mc: MsgContent, live: Boolean = false, ttl: Int? = null): AChatItem? {
val cmd = CC.ApiSendMessage(type, id, file, quotedItemId, mc, live, ttl)
return processSendMessageCmd(rh, cmd)
}
private suspend fun processSendMessageCmd(rh: Long?, cmd: CC): AChatItem? {
val r = sendCmd(rh, cmd)
return when (r) {
is CR.NewChatItem -> r.chatItem
else -> {
if (!(networkErrorAlert(r))) {
apiErrorAlert("apiSendMessage", generalGetString(MR.strings.error_sending_message), r)
apiErrorAlert("processSendMessageCmd", generalGetString(MR.strings.error_sending_message), r)
}
null
}
@@ -765,6 +777,13 @@ object ChatController {
}
}
suspend fun apiForwardChatItem(rh: Long?, toChatType: ChatType, toChatId: Long, fromChatType: ChatType, fromChatId: Long, itemId: Long): ChatItem? {
val cmd = CC.ApiForwardChatItem(toChatType, toChatId, fromChatType, fromChatId, itemId)
return processSendMessageCmd(rh, cmd)?.chatItem
}
suspend fun apiUpdateChatItem(rh: Long?, type: ChatType, id: Long, itemId: Long, mc: MsgContent, live: Boolean = false): AChatItem? {
val r = sendCmd(rh, CC.ApiUpdateChatItem(type, id, itemId, mc, live))
if (r is CR.ChatItemUpdated) return r.chatItem
@@ -875,6 +894,9 @@ object ChatController {
}
}
suspend fun apiSetNetworkInfo(networkInfo: UserNetworkInfo): Boolean =
sendCommandOkResp(null, CC.APISetNetworkInfo(networkInfo))
suspend fun apiSetMemberSettings(rh: Long?, groupId: Long, groupMemberId: Long, memberSettings: GroupMemberSettings): Boolean =
sendCommandOkResp(rh, CC.ApiSetMemberSettings(groupId, groupMemberId, memberSettings))
@@ -1753,6 +1775,8 @@ object ChatController {
chatModel.removeChat(rhId, r.mergedContact.id)
}
}
// ContactsSubscribed, ContactsDisconnected and ContactSubSummary are only used in CLI,
// They have to be used here for remote desktop to process these status updates.
is CR.ContactsSubscribed -> updateContactsStatus(r.contactRefs, NetworkStatus.Connected())
is CR.ContactsDisconnected -> updateContactsStatus(r.contactRefs, NetworkStatus.Disconnected())
is CR.ContactSubSummary -> {
@@ -1960,7 +1984,6 @@ object ChatController {
}
is CR.SndFileCompleteXFTP -> {
chatItemSimpleUpdate(rhId, r.user, r.chatItem)
cleanupFile(r.chatItem)
}
is CR.SndFileError -> {
if (r.chatItem_ != null) {
@@ -2117,7 +2140,7 @@ object ChatController {
if (active(r.user)) {
chatModel.updateContact(rhId, r.contact)
}
is CR.ChatCmdError -> when {
is CR.ChatRespError -> when {
r.chatError is ChatError.ChatErrorAgent && r.chatError.agentError is AgentErrorType.CRITICAL -> {
chatModel.processedCriticalError.newError(r.chatError.agentError, r.chatError.agentError.offerRestart)
}
@@ -2284,6 +2307,7 @@ object ChatController {
val tcpConnectTimeout = appPrefs.networkTCPConnectTimeout.get()
val tcpTimeout = appPrefs.networkTCPTimeout.get()
val tcpTimeoutPerKb = appPrefs.networkTCPTimeoutPerKb.get()
val rcvConcurrency = appPrefs.networkRcvConcurrency.get()
val smpPingInterval = appPrefs.networkSMPPingInterval.get()
val smpPingCount = appPrefs.networkSMPPingCount.get()
val enableKeepAlive = appPrefs.networkEnableKeepAlive.get()
@@ -2303,6 +2327,7 @@ object ChatController {
tcpConnectTimeout = tcpConnectTimeout,
tcpTimeout = tcpTimeout,
tcpTimeoutPerKb = tcpTimeoutPerKb,
rcvConcurrency = rcvConcurrency,
tcpKeepAlive = tcpKeepAlive,
smpPingInterval = smpPingInterval,
smpPingCount = smpPingCount
@@ -2320,6 +2345,7 @@ object ChatController {
appPrefs.networkTCPConnectTimeout.set(cfg.tcpConnectTimeout)
appPrefs.networkTCPTimeout.set(cfg.tcpTimeout)
appPrefs.networkTCPTimeoutPerKb.set(cfg.tcpTimeoutPerKb)
appPrefs.networkRcvConcurrency.set(cfg.rcvConcurrency)
appPrefs.networkSMPPingInterval.set(cfg.smpPingInterval)
appPrefs.networkSMPPingCount.set(cfg.smpPingCount)
if (cfg.tcpKeepAlive != null) {
@@ -2385,6 +2411,7 @@ sealed class CC {
class ApiDeleteChatItem(val type: ChatType, val id: Long, val itemId: Long, val mode: CIDeleteMode): CC()
class ApiDeleteMemberChatItem(val groupId: Long, val groupMemberId: Long, val itemId: Long): CC()
class ApiChatItemReaction(val type: ChatType, val id: Long, val itemId: Long, val add: Boolean, val reaction: MsgReaction): CC()
class ApiForwardChatItem(val toChatType: ChatType, val toChatId: Long, val fromChatType: ChatType, val fromChatId: Long, val itemId: Long): CC()
class ApiNewGroup(val userId: Long, val incognito: Boolean, val groupProfile: GroupProfile): CC()
class ApiAddMember(val groupId: Long, val contactId: Long, val memberRole: GroupMemberRole): CC()
class ApiJoinGroup(val groupId: Long): CC()
@@ -2407,6 +2434,7 @@ sealed class CC {
class APIGetChatItemTTL(val userId: Long): CC()
class APISetNetworkConfig(val networkConfig: NetCfg): CC()
class APIGetNetworkConfig: CC()
class APISetNetworkInfo(val networkInfo: UserNetworkInfo): CC()
class APISetChatSettings(val type: ChatType, val id: Long, val chatSettings: ChatSettings): CC()
class ApiSetMemberSettings(val groupId: Long, val groupMemberId: Long, val memberSettings: GroupMemberSettings): CC()
class APIContactInfo(val contactId: Long): CC()
@@ -2527,6 +2555,7 @@ sealed class CC {
is ApiDeleteChatItem -> "/_delete item ${chatRef(type, id)} $itemId ${mode.deleteMode}"
is ApiDeleteMemberChatItem -> "/_delete member item #$groupId $groupMemberId $itemId"
is ApiChatItemReaction -> "/_reaction ${chatRef(type, id)} $itemId ${onOff(add)} ${json.encodeToString(reaction)}"
is ApiForwardChatItem -> "/_forward ${chatRef(toChatType, toChatId)} ${chatRef(fromChatType, fromChatId)} $itemId"
is ApiNewGroup -> "/_group $userId incognito=${onOff(incognito)} ${json.encodeToString(groupProfile)}"
is ApiAddMember -> "/_add #$groupId $contactId ${memberRole.memberRole}"
is ApiJoinGroup -> "/_join #$groupId"
@@ -2549,6 +2578,7 @@ sealed class CC {
is APIGetChatItemTTL -> "/_ttl $userId"
is APISetNetworkConfig -> "/_network ${json.encodeToString(networkConfig)}"
is APIGetNetworkConfig -> "/network"
is APISetNetworkInfo -> "/_network info ${json.encodeToString(networkInfo)}"
is APISetChatSettings -> "/_settings ${chatRef(type, id)} ${json.encodeToString(chatSettings)}"
is ApiSetMemberSettings -> "/_member settings #$groupId $groupMemberId ${json.encodeToString(memberSettings)}"
is APIContactInfo -> "/_info @$contactId"
@@ -2664,6 +2694,7 @@ sealed class CC {
is ApiDeleteChatItem -> "apiDeleteChatItem"
is ApiDeleteMemberChatItem -> "apiDeleteMemberChatItem"
is ApiChatItemReaction -> "apiChatItemReaction"
is ApiForwardChatItem -> "apiForwardChatItem"
is ApiNewGroup -> "apiNewGroup"
is ApiAddMember -> "apiAddMember"
is ApiJoinGroup -> "apiJoinGroup"
@@ -2686,6 +2717,7 @@ sealed class CC {
is APIGetChatItemTTL -> "apiGetChatItemTTL"
is APISetNetworkConfig -> "apiSetNetworkConfig"
is APIGetNetworkConfig -> "apiGetNetworkConfig"
is APISetNetworkInfo -> "apiSetNetworkInfo"
is APISetChatSettings -> "apiSetChatSettings"
is ApiSetMemberSettings -> "apiSetMemberSettings"
is APIContactInfo -> "apiContactInfo"
@@ -3007,6 +3039,7 @@ data class NetCfg(
val tcpConnectTimeout: Long, // microseconds
val tcpTimeout: Long, // microseconds
val tcpTimeoutPerKb: Long, // microseconds
val rcvConcurrency: Int, // pool size
val tcpKeepAlive: KeepAliveOpts?,
val smpPingInterval: Long, // microseconds
val smpPingCount: Int,
@@ -3031,9 +3064,10 @@ data class NetCfg(
hostMode = HostMode.OnionViaSocks,
requiredHostMode = false,
sessionMode = TransportSessionMode.User,
tcpConnectTimeout = 20_000_000,
tcpConnectTimeout = 10_000_000,
tcpTimeout = 15_000_000,
tcpTimeoutPerKb = 45_000,
tcpTimeoutPerKb = 10_000,
rcvConcurrency = 12,
tcpKeepAlive = KeepAliveOpts.defaults,
smpPingInterval = 1200_000_000,
smpPingCount = 3
@@ -3045,9 +3079,10 @@ data class NetCfg(
hostMode = HostMode.OnionViaSocks,
requiredHostMode = false,
sessionMode = TransportSessionMode.User,
tcpConnectTimeout = 30_000_000,
tcpConnectTimeout = 20_000_000,
tcpTimeout = 20_000_000,
tcpTimeoutPerKb = 60_000,
tcpTimeoutPerKb = 15_000,
rcvConcurrency = 8,
tcpKeepAlive = KeepAliveOpts.defaults,
smpPingInterval = 1200_000_000,
smpPingCount = 3
@@ -3416,6 +3451,7 @@ interface Feature {
@Composable
fun iconFilled(): Painter
val hasParam: Boolean
val hasRole: Boolean
}
@Serializable
@@ -3435,6 +3471,7 @@ enum class ChatFeature: Feature {
TimedMessages -> true
else -> false
}
override val hasRole: Boolean = false
override val text: String
get() = when(this) {
@@ -3535,6 +3572,7 @@ enum class GroupFeature: Feature {
@SerialName("reactions") Reactions,
@SerialName("voice") Voice,
@SerialName("files") Files,
@SerialName("simplexLinks") SimplexLinks,
@SerialName("history") History;
override val hasParam: Boolean get() = when(this) {
@@ -3542,6 +3580,18 @@ enum class GroupFeature: Feature {
else -> false
}
override val hasRole: Boolean
get() = when (this) {
TimedMessages -> false
DirectMessages -> true
FullDelete -> false
Reactions -> false
Voice -> true
Files -> true
SimplexLinks -> true
History -> false
}
override val text: String
get() = when(this) {
TimedMessages -> generalGetString(MR.strings.timed_messages)
@@ -3550,6 +3600,7 @@ enum class GroupFeature: Feature {
Reactions -> generalGetString(MR.strings.message_reactions)
Voice -> generalGetString(MR.strings.voice_messages)
Files -> generalGetString(MR.strings.files_and_media)
SimplexLinks -> generalGetString(MR.strings.simplex_links)
History -> generalGetString(MR.strings.recent_history)
}
@@ -3561,6 +3612,7 @@ enum class GroupFeature: Feature {
Reactions -> painterResource(MR.images.ic_add_reaction)
Voice -> painterResource(MR.images.ic_keyboard_voice)
Files -> painterResource(MR.images.ic_draft)
SimplexLinks -> painterResource(MR.images.ic_link)
History -> painterResource(MR.images.ic_schedule)
}
@@ -3572,6 +3624,7 @@ enum class GroupFeature: Feature {
Reactions -> painterResource(MR.images.ic_add_reaction_filled)
Voice -> painterResource(MR.images.ic_keyboard_voice_filled)
Files -> painterResource(MR.images.ic_draft_filled)
SimplexLinks -> painterResource(MR.images.ic_link)
History -> painterResource(MR.images.ic_schedule_filled)
}
@@ -3602,6 +3655,10 @@ enum class GroupFeature: Feature {
GroupFeatureEnabled.ON -> generalGetString(MR.strings.allow_to_send_files)
GroupFeatureEnabled.OFF -> generalGetString(MR.strings.prohibit_sending_files)
}
SimplexLinks -> when(enabled) {
GroupFeatureEnabled.ON -> generalGetString(MR.strings.allow_to_send_simplex_links)
GroupFeatureEnabled.OFF -> generalGetString(MR.strings.prohibit_sending_simplex_links)
}
History -> when(enabled) {
GroupFeatureEnabled.ON -> generalGetString(MR.strings.enable_sending_recent_history)
GroupFeatureEnabled.OFF -> generalGetString(MR.strings.disable_sending_recent_history)
@@ -3633,6 +3690,10 @@ enum class GroupFeature: Feature {
GroupFeatureEnabled.ON -> generalGetString(MR.strings.group_members_can_send_files)
GroupFeatureEnabled.OFF -> generalGetString(MR.strings.files_are_prohibited_in_group)
}
SimplexLinks -> when(enabled) {
GroupFeatureEnabled.ON -> generalGetString(MR.strings.group_members_can_send_simplex_links)
GroupFeatureEnabled.OFF -> generalGetString(MR.strings.simplex_links_are_prohibited_in_group)
}
History -> when(enabled) {
GroupFeatureEnabled.ON -> generalGetString(MR.strings.recent_history_is_sent_to_new_members)
GroupFeatureEnabled.OFF -> generalGetString(MR.strings.recent_history_is_not_sent_to_new_members)
@@ -3746,11 +3807,12 @@ enum class FeatureAllowed {
@Serializable
data class FullGroupPreferences(
val timedMessages: TimedMessagesGroupPreference,
val directMessages: GroupPreference,
val directMessages: RoleGroupPreference,
val fullDelete: GroupPreference,
val reactions: GroupPreference,
val voice: GroupPreference,
val files: GroupPreference,
val voice: RoleGroupPreference,
val files: RoleGroupPreference,
val simplexLinks: RoleGroupPreference,
val history: GroupPreference,
) {
fun toGroupPreferences(): GroupPreferences =
@@ -3761,17 +3823,19 @@ data class FullGroupPreferences(
reactions = reactions,
voice = voice,
files = files,
simplexLinks = simplexLinks,
history = history
)
companion object {
val sampleData = FullGroupPreferences(
timedMessages = TimedMessagesGroupPreference(GroupFeatureEnabled.OFF),
directMessages = GroupPreference(GroupFeatureEnabled.OFF),
directMessages = RoleGroupPreference(GroupFeatureEnabled.OFF, role = null),
fullDelete = GroupPreference(GroupFeatureEnabled.OFF),
reactions = GroupPreference(GroupFeatureEnabled.ON),
voice = GroupPreference(GroupFeatureEnabled.ON),
files = GroupPreference(GroupFeatureEnabled.ON),
voice = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
files = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
simplexLinks = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
history = GroupPreference(GroupFeatureEnabled.ON),
)
}
@@ -3780,21 +3844,23 @@ data class FullGroupPreferences(
@Serializable
data class GroupPreferences(
val timedMessages: TimedMessagesGroupPreference? = null,
val directMessages: GroupPreference? = null,
val directMessages: RoleGroupPreference? = null,
val fullDelete: GroupPreference? = null,
val reactions: GroupPreference? = null,
val voice: GroupPreference? = null,
val files: GroupPreference? = null,
val voice: RoleGroupPreference? = null,
val files: RoleGroupPreference? = null,
val simplexLinks: RoleGroupPreference? = null,
val history: GroupPreference? = null,
) {
companion object {
val sampleData = GroupPreferences(
timedMessages = TimedMessagesGroupPreference(GroupFeatureEnabled.OFF),
directMessages = GroupPreference(GroupFeatureEnabled.OFF),
directMessages = RoleGroupPreference(GroupFeatureEnabled.OFF, role = null),
fullDelete = GroupPreference(GroupFeatureEnabled.OFF),
reactions = GroupPreference(GroupFeatureEnabled.ON),
voice = GroupPreference(GroupFeatureEnabled.ON),
files = GroupPreference(GroupFeatureEnabled.ON),
voice = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
files = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
simplexLinks = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
history = GroupPreference(GroupFeatureEnabled.ON),
)
}
@@ -3805,6 +3871,26 @@ data class GroupPreference(
val enable: GroupFeatureEnabled
) {
val on: Boolean get() = enable == GroupFeatureEnabled.ON
fun enabled(role: GroupMemberRole?, m: GroupMember?): GroupFeatureEnabled =
when (enable) {
GroupFeatureEnabled.OFF -> GroupFeatureEnabled.OFF
GroupFeatureEnabled.ON ->
if (role != null && m != null) {
if (m.memberRole >= role) GroupFeatureEnabled.ON else GroupFeatureEnabled.OFF
} else {
GroupFeatureEnabled.ON
}
}
}
@Serializable
data class RoleGroupPreference(
val enable: GroupFeatureEnabled,
val role: GroupMemberRole? = null,
) {
fun on(m: GroupMember): Boolean =
enable == GroupFeatureEnabled.ON && m.memberRole >= (role ?: GroupMemberRole.Observer)
}
@Serializable
@@ -4758,6 +4844,7 @@ sealed class ChatErrorType {
is FallbackToSMPProhibited -> "fallbackToSMPProhibited"
is InlineFileProhibited -> "inlineFileProhibited"
is InvalidQuote -> "invalidQuote"
is InvalidForward -> "invalidForward"
is InvalidChatItemUpdate -> "invalidChatItemUpdate"
is InvalidChatItemDelete -> "invalidChatItemDelete"
is HasCurrentCall -> "hasCurrentCall"
@@ -4836,6 +4923,7 @@ sealed class ChatErrorType {
@Serializable @SerialName("fallbackToSMPProhibited") class FallbackToSMPProhibited(val fileId: Long): ChatErrorType()
@Serializable @SerialName("inlineFileProhibited") class InlineFileProhibited(val fileId: Long): ChatErrorType()
@Serializable @SerialName("invalidQuote") object InvalidQuote: ChatErrorType()
@Serializable @SerialName("invalidForward") object InvalidForward: ChatErrorType()
@Serializable @SerialName("invalidChatItemUpdate") object InvalidChatItemUpdate: ChatErrorType()
@Serializable @SerialName("invalidChatItemDelete") object InvalidChatItemDelete: ChatErrorType()
@Serializable @SerialName("hasCurrentCall") object HasCurrentCall: ChatErrorType()
@@ -5011,8 +5099,8 @@ sealed class AgentErrorType {
is BROKER -> "BROKER ${brokerErr.string}"
is AGENT -> "AGENT ${agentErr.string}"
is INTERNAL -> "INTERNAL $internalErr"
is INACTIVE -> "INACTIVE"
is CRITICAL -> "CRITICAL $offerRestart $criticalErr"
is INACTIVE -> "INACTIVE"
}
@Serializable @SerialName("CMD") class CMD(val cmdErr: CommandErrorType): AgentErrorType()
@Serializable @SerialName("CONN") class CONN(val connErr: ConnectionErrorType): AgentErrorType()
@@ -5023,8 +5111,8 @@ sealed class AgentErrorType {
@Serializable @SerialName("BROKER") class BROKER(val brokerAddress: String, val brokerErr: BrokerErrorType): AgentErrorType()
@Serializable @SerialName("AGENT") class AGENT(val agentErr: SMPAgentError): AgentErrorType()
@Serializable @SerialName("INTERNAL") class INTERNAL(val internalErr: String): AgentErrorType()
@Serializable @SerialName("INACTIVE") object INACTIVE: AgentErrorType()
@Serializable @SerialName("CRITICAL") data class CRITICAL(val offerRestart: Boolean, val criticalErr: String): AgentErrorType()
@Serializable @SerialName("INACTIVE") object INACTIVE: AgentErrorType()
}
@Serializable
@@ -5123,11 +5211,13 @@ sealed class SMPTransportError {
is BadBlock -> "badBlock"
is LargeMsg -> "largeMsg"
is BadSession -> "badSession"
is NoServerAuth -> "noServerAuth"
is Handshake -> "handshake ${handshakeErr.string}"
}
@Serializable @SerialName("badBlock") class BadBlock: SMPTransportError()
@Serializable @SerialName("largeMsg") class LargeMsg: SMPTransportError()
@Serializable @SerialName("badSession") class BadSession: SMPTransportError()
@Serializable @SerialName("noServerAuth") class NoServerAuth: SMPTransportError()
@Serializable @SerialName("handshake") class Handshake(val handshakeErr: SMPHandshakeError): SMPTransportError()
}
@@ -5137,10 +5227,12 @@ sealed class SMPHandshakeError {
is PARSE -> "PARSE"
is VERSION -> "VERSION"
is IDENTITY -> "IDENTITY"
is BAD_AUTH -> "BAD_AUTH"
}
@Serializable @SerialName("PARSE") class PARSE: SMPHandshakeError()
@Serializable @SerialName("VERSION") class VERSION: SMPHandshakeError()
@Serializable @SerialName("IDENTITY") class IDENTITY: SMPHandshakeError()
@Serializable @SerialName("BAD_AUTH") class BAD_AUTH: SMPHandshakeError()
}
@Serializable
@@ -5175,6 +5267,8 @@ sealed class XFTPErrorType {
is NO_FILE -> "NO_FILE"
is HAS_FILE -> "HAS_FILE"
is FILE_IO -> "FILE_IO"
is TIMEOUT -> "TIMEOUT"
is REDIRECT -> "REDIRECT"
is INTERNAL -> "INTERNAL"
}
@Serializable @SerialName("BLOCK") object BLOCK: XFTPErrorType()
@@ -5188,6 +5282,8 @@ sealed class XFTPErrorType {
@Serializable @SerialName("NO_FILE") object NO_FILE: XFTPErrorType()
@Serializable @SerialName("HAS_FILE") object HAS_FILE: XFTPErrorType()
@Serializable @SerialName("FILE_IO") object FILE_IO: XFTPErrorType()
@Serializable @SerialName("TIMEOUT") object TIMEOUT: XFTPErrorType()
@Serializable @SerialName("REDIRECT") class REDIRECT(val redirectError: String): XFTPErrorType()
@Serializable @SerialName("INTERNAL") object INTERNAL: XFTPErrorType()
}
@@ -5197,6 +5293,8 @@ sealed class RCErrorType {
is INTERNAL -> "INTERNAL $internalErr"
is IDENTITY -> "IDENTITY"
is NO_LOCAL_ADDRESS -> "NO_LOCAL_ADDRESS"
is NEW_CONTROLLER -> "NEW_CONTROLLER"
is NOT_DISCOVERED -> "NOT_DISCOVERED"
is TLS_START_FAILED -> "TLS_START_FAILED"
is EXCEPTION -> "EXCEPTION $EXCEPTION"
is CTRL_AUTH -> "CTRL_AUTH"
@@ -5211,6 +5309,8 @@ sealed class RCErrorType {
@Serializable @SerialName("internal") data class INTERNAL(val internalErr: String): RCErrorType()
@Serializable @SerialName("identity") object IDENTITY: RCErrorType()
@Serializable @SerialName("noLocalAddress") object NO_LOCAL_ADDRESS: RCErrorType()
@Serializable @SerialName("newController") object NEW_CONTROLLER: RCErrorType()
@Serializable @SerialName("notDiscovered") object NOT_DISCOVERED: RCErrorType()
@Serializable @SerialName("tlsStartFailed") object TLS_START_FAILED: RCErrorType()
@Serializable @SerialName("exception") data class EXCEPTION(val exception: String): RCErrorType()
@Serializable @SerialName("ctrlAuth") object CTRL_AUTH: RCErrorType()
@@ -5269,28 +5369,39 @@ sealed class RemoteCtrlError {
is BadState -> "badState"
is Busy -> "busy"
is Timeout -> "timeout"
is NoKnownControllers -> "noKnownControllers"
is BadController -> "badController"
is Disconnected -> "disconnected"
is BadInvitation -> "badInvitation"
is BadVersion -> "badVersion"
is HTTP2Error -> "http2Error"
is ProtocolError -> "protocolError"
}
val localizedString: String get() = when (this) {
is Inactive -> generalGetString(MR.strings.remote_ctrl_error_inactive)
is BadState -> generalGetString(MR.strings.remote_ctrl_error_bad_state)
is Busy -> generalGetString(MR.strings.remote_ctrl_error_busy)
is Timeout -> generalGetString(MR.strings.remote_ctrl_error_timeout)
is NoKnownControllers -> "no known controllers"
is BadController -> "bad controller"
is Disconnected -> generalGetString(MR.strings.remote_ctrl_error_disconnected)
is BadInvitation -> generalGetString(MR.strings.remote_ctrl_error_bad_invitation)
is BadVersion -> generalGetString(MR.strings.remote_ctrl_error_bad_version)
is HTTP2Error -> "HTTP2 error"
is ProtocolError -> "protocol error"
}
@Serializable @SerialName("inactive") object Inactive: RemoteCtrlError()
@Serializable @SerialName("badState") object BadState: RemoteCtrlError()
@Serializable @SerialName("busy") object Busy: RemoteCtrlError()
@Serializable @SerialName("timeout") object Timeout: RemoteCtrlError()
@Serializable @SerialName("noKnownControllers") object NoKnownControllers: RemoteCtrlError()
@Serializable @SerialName("badController") object BadController: RemoteCtrlError()
@Serializable @SerialName("disconnected") class Disconnected(val remoteCtrlId: Long, val reason: String): RemoteCtrlError()
@Serializable @SerialName("badInvitation") object BadInvitation: RemoteCtrlError()
@Serializable @SerialName("badVersion") data class BadVersion(val appVersion: String): RemoteCtrlError()
//@Serializable @SerialName("protocolError") data class ProtocolError(val protocolError: RemoteProtocolError): RemoteCtrlError()
@Serializable @SerialName("hTTP2Error") data class HTTP2Error(val http2Error: String): RemoteCtrlError()
@Serializable @SerialName("protocolError") object ProtocolError: RemoteCtrlError()
}
enum class NotificationsMode() {
@@ -5502,3 +5613,26 @@ enum class AppSettingsLockScreenCalls {
}
}
}
@Serializable
data class UserNetworkInfo(
val networkType: UserNetworkType,
val online: Boolean,
)
enum class UserNetworkType {
@SerialName("none") NONE,
@SerialName("cellular") CELLULAR,
@SerialName("wifi") WIFI,
@SerialName("ethernet") ETHERNET,
@SerialName("other") OTHER;
val text: String
get() = when (this) {
NONE -> generalGetString(MR.strings.network_type_no_network_connection)
CELLULAR -> generalGetString(MR.strings.network_type_cellular)
WIFI -> generalGetString(MR.strings.network_type_network_wifi)
ETHERNET -> generalGetString(MR.strings.network_type_ethernet)
OTHER -> generalGetString(MR.strings.network_type_other)
}
}

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