Compare commits

..

106 commits

Author SHA1 Message Date
Evgeny Poberezkin
0634d7ed0f
6.4-beta.3: ios 283, android 297, desktop 107 2025-06-14 23:34:34 +01:00
Evgeny Poberezkin
779b1ffdee
core: 6.4.0.4 (simplexmq 6.4.0.10) 2025-06-14 21:42:03 +01:00
Evgeny Poberezkin
7a3bf890f5
Merge branch 'stable' 2025-06-14 21:12:05 +01:00
sh
5af6a59e65
flatpak: update metainfo (#5986) 2025-06-12 17:08:42 +01:00
Evgeny
ede43bec4f
core: update simplexmq (PQ keys in short links and invitations sent to contact address) (#5982)
* core: update simplexmq (PQ keys in short links and invitations sent to contact address)

* update

* update simplexmq
2025-06-12 11:03:45 +01:00
sh
231d5ac8c2
scripts/reproduce-builds: add desktop (#5976)
* scripts/reproduce-builds: add desktop

* scripts/reproduce-builds: remove whole directory
2025-06-10 13:10:30 +01:00
Evgeny Poberezkin
e67887a70c
6.4-beta.2: ios 281, android 294, desktop 105 2025-06-10 12:15:16 +01:00
Evgeny
f6027dce01
ui: translations (#5972)
* Translated using Weblate (Spanish)

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

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

* Translated using Weblate (Arabic)

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

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

* Translated using Weblate (Turkish)

Currently translated at 88.8% (1858 of 2090 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 94.3% (2267 of 2404 strings)

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

* Translated using Weblate (Hungarian)

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

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

* Translated using Weblate (Catalan)

Currently translated at 100.0% (2404 of 2404 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Catalan)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (2405 of 2405 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 98.5% (2060 of 2090 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Czech)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Czech)

Currently translated at 55.8% (1167 of 2090 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 75.5% (1818 of 2405 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 55.6% (1163 of 2090 strings)

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

* Translated using Weblate (Hungarian)

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

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 77.6% (1867 of 2405 strings)

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

* Translated using Weblate (Arabic)

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

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

* Translated using Weblate (Spanish)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (2090 of 2090 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 81.2% (1955 of 2405 strings)

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

* Translated using Weblate (Hungarian)

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

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 79.8% (1920 of 2405 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2405 of 2405 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 94.1% (1968 of 2090 strings)

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

* Translated using Weblate (Romanian)

Currently translated at 66.1% (1590 of 2405 strings)

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

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Romanian)

Currently translated at 71.3% (1717 of 2405 strings)

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

* Translated using Weblate (Romanian)

Currently translated at 76.2% (1835 of 2405 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Romanian)

Currently translated at 92.1% (2216 of 2405 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 83.7% (2013 of 2405 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 83.9% (2019 of 2405 strings)

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

* Translated using Weblate (Romanian)

Currently translated at 99.9% (2404 of 2405 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 84.4% (2031 of 2405 strings)

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

* Translated using Weblate (German)

Currently translated at 100.0% (2405 of 2405 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 85.2% (2051 of 2405 strings)

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

* Translated using Weblate (Ukrainian)

Currently translated at 95.3% (1993 of 2090 strings)

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

* process localizations

* revert encrypt_database translation

---------

Co-authored-by: No name <CertainBot@users.noreply.hosted.weblate.org>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Kaanito <kaanpeker196@gmail.com>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: fran secs <fransecs@gmail.com>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: zenobit <zenobit@disroot.org>
Co-authored-by: Magorak Magorov <magorakmagorov@gmail.com>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Co-authored-by: Miyu Sakatsuki <miyu-sakatsuki@outlook.jp>
Co-authored-by: ghost <weblate.sabbath805@passmail.net>
Co-authored-by: Alex Vornicu <vornicualex@gmail.com>
Co-authored-by: billy appetie <billy_appetie@users.noreply.hosted.weblate.org>
Co-authored-by: noname <zhuk2@duck.com>
Co-authored-by: Raphael Das Gupta <hosted.weblate.org-account@raphael.dasgupta.ch>
Co-authored-by: Hotripak <hotr1pak@gmail.com>
2025-06-09 22:49:24 +01:00
Narasimha-sc
e27a197ee0
website: fix donation links (#5971)
* Fix donation links

* Update navbar.html

* Update footer.html

* Update join_simplex.html
2025-06-09 20:44:00 +01:00
Evgeny
28fa5ea4cc
website: translations (#5973)
* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Czech)

Currently translated at 99.2% (255 of 257 strings)

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

* Translated using Weblate (Czech)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Dutch)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Japanese)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 78.9% (203 of 257 strings)

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

---------

Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
Co-authored-by: Miyu Sakatsuki <miyu-sakatsuki@outlook.jp>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: zenobit <zenobit@disroot.org>
Co-authored-by: M1K4 <oomikaoo@gmail.com>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
2025-06-09 20:31:10 +01:00
Evgeny Poberezkin
aa50af7739
ios: update library 2025-06-09 19:48:52 +01:00
Evgeny Poberezkin
f80a704857
core: 6.4.0.3 (simplexmq 6.4.0.8) 2025-06-09 19:06:02 +01:00
Evgeny Poberezkin
3c2391dc32
core: update simplexmq 2025-06-09 18:26:57 +01:00
Evgeny Poberezkin
cd47b409c8
Merge branch 'stable' 2025-06-09 13:18:27 +01:00
Evgeny Poberezkin
63968e69cd
Merge branch 'stable' 2025-06-05 21:05:50 +01:00
sh
4da8133faf
ci: add reproducible Linux desktop builds (#5960)
* ci: add reproducible Linux desktop builds

* ci: move commands from ci to script

* scripts: switch appimage tools to simplex-chat forks (stable release)
2025-06-05 08:26:40 +01:00
Evgeny Poberezkin
ee3f9ad08c
core: update simplexmq 2025-06-03 14:00:02 +01:00
Evgeny
6af8d781fa
core: update simplexmq (use static RNG function) (#5957)
* core: update simplexmq (use static RNG function)

* ios: update library

* update simplexmq
2025-06-03 13:36:57 +01:00
spaced4ndy
39de65854c
ios: refactor new chat alerts (#5959) 2025-06-02 11:53:09 +00:00
spaced4ndy
6ff42ad585
core: update simplexmq (AConnShortLink instances) (#5954) 2025-05-29 10:56:23 +00:00
Evgeny
dfe94b6e28
core: update simplexmq (short links API) (#5953)
* core: update simplexmq (short links API)

* simplexmq
2025-05-29 10:52:33 +01:00
Evgeny
686145ba36
ui: smaller QR code for verify code view, change iOS layout (#5948)
* ui: smaller QR code for verify code view, change iOS layout

* ios: fix layout for editing group profile
2025-05-26 16:57:18 +01:00
sh
cbaab06975
scripts/prepare-vlc: switch to using simplex vlc builds (#5939) 2025-05-26 09:10:13 +01:00
Evgeny
b848f735ce
ui: smaller QR code for short links (#5946)
* ui: smaller QR code for short links

* more small

* size

* translations
2025-05-25 11:56:00 +01:00
Evgeny
ee2ea152dc
core: refactor types for DB entity (#5945) 2025-05-24 21:13:10 +01:00
Evgeny
96dcf16cc3
core: update simplexmq (#5941)
* core: update simplexmq

* update types
2025-05-24 16:49:45 +01:00
spaced4ndy
b2bc4d6a5c
core: fix short link type when adding for group link (#5942)
* core: fix short link type when adding for group link

* shorten, rename

* update setContactShortLink

* update

* fix

* plans

* simplexmq

* ui: show error when setting short link

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2025-05-24 14:34:03 +01:00
spaced4ndy
6acd239339
core: allow to add short link to existing contact link (#5940) 2025-05-23 13:16:12 +00:00
Evgeny Poberezkin
e8968653ef
core: add custom chat event 2025-05-23 10:40:04 +01:00
Evgeny Poberezkin
1b75ca5258
6.4-beta.1: ios 279, android 291, desktop 103 2025-05-21 13:33:55 +01:00
Evgeny
dd2dc16fbf
website: translations (#5937)
* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Russian)

Currently translated at 100.0% (257 of 257 strings)

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

---------

Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
2025-05-21 11:49:58 +01:00
Evgeny
cef63f2c87
ui: translations (#5936)
* Translated using Weblate (German)

Currently translated at 100.0% (2404 of 2404 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 98.3% (2365 of 2404 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% (2090 of 2090 strings)

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

* Translated using Weblate (Italian)

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

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

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (2404 of 2404 strings)

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

* Translated using Weblate (Russian)

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

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

* ios: process localizations

* update

---------

Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Vitaly Kanevsky <v.kanevsky@tuta.com>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2025-05-21 11:47:45 +01:00
Evgeny Poberezkin
0e99e8010a
core: 6.4.0.2 (simplexmq 6.4.0.4) 2025-05-21 10:12:53 +01:00
spaced4ndy
e84016e1b9
core, ui: update group scope unread stats on item deletions; create reports as read (reports use a different attention mechanism) (#5930) 2025-05-20 16:18:23 +00:00
Evgeny
f162f96be8
website: translations (#5932)
* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 78.5% (202 of 257 strings)

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

* Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 78.5% (202 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Russian)

Currently translated at 99.6% (256 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (257 of 257 strings)

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

---------

Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: dns <dnstxqet@users.noreply.hosted.weblate.org>
Co-authored-by: 4 Bi 5aYzVk 93FCVjWLWxh44XH3984teVSfjwFYmUGUrbvnHwGirk9 <userfifteen.seventeen@mailfence.com>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: Vitaly Kanevsky <v.kanevsky@tuta.com>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
2025-05-20 15:44:33 +01:00
Evgeny
1ef53d1530
ui: translations (#5931)
* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2404 of 2404 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% (2404 of 2404 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.0% (2071 of 2090 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 99.0% (2071 of 2090 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 99.9% (2089 of 2090 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 99.9% (2089 of 2090 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% (2404 of 2404 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% (2090 of 2090 strings)

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

* ios: import

---------

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: Ghost of Sparta <makesocialfoss32@keemail.me>
2025-05-20 15:38:00 +01:00
Evgeny Poberezkin
a8e7db0b8f
android, desktop: update translation key 2025-05-20 15:27:03 +01:00
Evgeny Poberezkin
22364a28be
ios: export localizations 2025-05-20 14:11:49 +01:00
Evgeny
b441527f7d
ui: translations (#5929)
* Translated using Weblate (German)

Currently translated at 100.0% (2054 of 2054 strings)

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

* Translated using Weblate (Italian)

Currently translated at 100.0% (2054 of 2054 strings)

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

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2356 of 2356 strings)

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

* Translated using Weblate (Hungarian)

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

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

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2356 of 2356 strings)

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

* Translated using Weblate (Hungarian)

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

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

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

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

* Translated using Weblate (Hungarian)

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

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

* Translated using Weblate (German)

Currently translated at 100.0% (2389 of 2389 strings)

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

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (2389 of 2389 strings)

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

* Translated using Weblate (Hungarian)

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

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

* Translated using Weblate (German)

Currently translated at 100.0% (2053 of 2053 strings)

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

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2389 of 2389 strings)

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

* process localizations

---------

Co-authored-by: mlanp <github@lang.xyz>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: summoner001 <summoner@vivaldi.net>
Co-authored-by: Rafi <rafimuhmad90@protonmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2025-05-20 12:46:52 +01:00
spaced4ndy
1a80ecfc29
core, ui: allow to delete member support chat; rename reject action (#5927) 2025-05-20 09:07:44 +00:00
spaced4ndy
ca9f6267e4
ui: check member supports support chat (#5926) 2025-05-19 17:05:07 +00:00
spaced4ndy
b0547cf6f7 Merge branch 'stable' 2025-05-19 20:02:49 +04:00
spaced4ndy
fa81df24ee
core, ui: allow files and links in support scope (#5925) 2025-05-19 11:31:10 +00:00
Evgeny
a2577c3df3
core: support observers send messages to admins, CLI commands (#5921)
* core: allow observers send messages to admins

* improve parser, CLI command to approve members
2025-05-19 11:14:43 +01:00
spaced4ndy
98f35a38e8
core: fix member introduction when inviting admin accepts member; fix order of items for accepted member (#5924) 2025-05-19 09:08:28 +00:00
Evgeny Poberezkin
cc7bc0536d
6.4-beta.0: ios 278, android 290, desktop 102 2025-05-16 21:11:21 +01:00
Evgeny Poberezkin
507feb92a5
core: 6.4.0.1 2025-05-16 19:26:46 +01:00
spaced4ndy
041807c870
core: decrease membersRequireAttention counter when member is deleted or leaves (#5919) 2025-05-16 15:03:15 +00:00
spaced4ndy
5e7f77d1d1
android: go back to chat list after closing support chat when invitee is pending (#5918) 2025-05-16 10:54:13 +00:00
spaced4ndy
a92c74d3e5
android, desktop: better Chat with admins indications for members; unread badges (#5917) 2025-05-16 08:26:28 +00:00
Evgeny Poberezkin
c82919cdab
core: 6.4.0.0 (simplexmq 6.4.0.3) 2025-05-15 21:57:00 +01:00
spaced4ndy
a8da7c1c44
ios: fix auto-closing support chat for invitee when accepted; core: add accepted item to main scope (#5916) 2025-05-15 16:05:18 +00:00
spaced4ndy
409d7e8532
ios: scroll to reported item (#5915) 2025-05-15 15:04:03 +00:00
Evgeny Poberezkin
9225b896b0
Merge branch 'stable' 2025-05-15 15:03:12 +01:00
spaced4ndy
b32c052f13
ios: reports fixes - don't create in main chat, show notice "view in chat with admins" (#5911) 2025-05-15 13:59:12 +00:00
spaced4ndy
775f6f14bf
android, desktop: fix navigation to quoted messages in support chats (#5912) 2025-05-15 13:42:23 +00:00
Evgeny Poberezkin
143aa30c5a
Merge branch 'stable' 2025-05-15 14:27:04 +01:00
spaced4ndy
be28022bc6
ios: open support chat with any member (#5910) 2025-05-14 16:21:01 +00:00
spaced4ndy
b97e1e0f11
ui: show new messages from support scope in main chat preview when invitee is pending (#5909) 2025-05-14 15:14:34 +00:00
spaced4ndy
d3bc22726a
core: fix group being displayed as connecting after join (#5908) 2025-05-14 11:25:24 +00:00
Evgeny
e1ab178fe6
Merge pull request #5797 from simplex-chat/group-knocking
core, ui: group knocking
2025-05-14 10:38:22 +01:00
Evgeny
9478172a82
ios: fix toolbar in member support chat (#5902)
* ios: fix toolbar in member support chat

* refactor

* refactor nav buttons

* ios: unread reports, members requiring attention

* top bar destop (special case for 1 support chat)

* put Navigation view higher in hierarchy

* use nav title for knocking

* refactor loading secondary chat, overlay fake toolbar for knocking chats

* fix member reports toolbar

* unread counter for member's support chat
2025-05-14 10:36:54 +01:00
spaced4ndy
22b022149c
android, desktop: rename chat with member button (#5907) 2025-05-14 06:44:21 +00:00
Evgeny Poberezkin
94eb43eb50
Merge branch 'master' into group-knocking 2025-05-13 18:56:30 +01:00
spaced4ndy
e29a9371b6
core, kotlin: open support chat with any member (#5904) 2025-05-13 16:29:47 +00:00
spaced4ndy
b81e5b13b3
ui: fix messages being sent in wrong scope after receiving an item in support scope (#5903) 2025-05-13 14:01:53 +00:00
spaced4ndy
db1ffb2cf2
core: create "accepted by you" item for moderator (#5901) 2025-05-13 12:35:54 +00:00
spaced4ndy
e9414d713e Merge branch 'master' into group-knocking 2025-05-13 13:05:48 +04:00
spaced4ndy
671dc2537d
core: accepted message to older clients (#5897) 2025-05-12 16:50:30 +00:00
spaced4ndy
9190c2a772
core: reset unanswered counter for support chats with members only if moderator message is newer (#5889) 2025-05-12 12:19:20 +00:00
spaced4ndy
79991e84c9
core: member requires attention counter (#5881) 2025-05-09 15:36:06 +00:00
spaced4ndy
2a9df3e10b
ui: knocking UI improvements (texts, icons, layout, chat view shortcut split toolbar, set admission on creating group) (#5879) 2025-05-08 13:44:55 +00:00
spaced4ndy
f5926e8b84
core, ui: update chat ts and pop chat for group on messages for secondary chat scope (#5878) 2025-05-08 08:22:46 +00:00
spaced4ndy
e3957ba156
core: postgres migration for knocking; fix previous migration (#5877) 2025-05-07 14:50:17 +00:00
Evgeny Poberezkin
ec36930160
Merge branch 'master' into group-knocking 2025-05-07 13:52:12 +01:00
spaced4ndy
6b71cd2ee9
core: add index for reading scoped chats stats (#5876) 2025-05-07 12:50:27 +00:00
spaced4ndy
79dadabf61 Merge branch 'master' into group-knocking 2025-05-07 13:48:55 +04:00
spaced4ndy
1ba863bedc ios: close support chat when accepting/removing pending member 2025-05-07 12:38:24 +04:00
spaced4ndy
d087059153
ios: close support chat for invitee when accepted (#5873) 2025-05-07 07:37:17 +00:00
spaced4ndy
3c36b0c692 ios: fix chat view closing for invitee after being accepted 2025-05-07 11:25:23 +04:00
spaced4ndy
d193658cac
ios: auto-open support chat for invitee in pending status (#5871) 2025-05-06 14:55:54 +00:00
Evgeny Poberezkin
c3bb1e660d
Merge branch 'master' into group-knocking 2025-05-05 12:53:05 +01:00
spaced4ndy
3aa6d6c3b3 ios: fix member support swipe actions 2025-05-05 13:43:00 +04:00
spaced4ndy
28a588628c
ios: correct list of members possible to mention in support scope (#5870) 2025-05-05 09:32:57 +00:00
spaced4ndy
0ea1363a27 ios: dynamically mark items read 2025-05-05 12:32:55 +04:00
Evgeny Poberezkin
92787df8a3
Merge branch 'master' into group-knocking 2025-05-04 23:25:50 +01:00
spaced4ndy
32fb5a5d12
ios: knocking ui (#5851)
* ios: knocking ui types

* update types

* member admission

* remove chatItemStatuses

* member support view

* member support chat view wip

* ios: secondary ItemsModel (#5862)

* toolbar

* more chats

* remove theme

* preview icon

* chat toolbar fast markers

* change icon

* change icon

* remove/accept buttons

* item style

* get item ItemsModel in chat model methods (chat view doesn't work dynamically)

* fix support chat

* fix other chats

* refresh on exit

* refresh button

* dynamic marker in chat list

* prohibit multi select actions

* prohibited send field
2025-05-04 22:27:20 +01:00
spaced4ndy
524daf178b Merge branch 'master' into group-knocking 2025-05-02 17:05:40 +04:00
spaced4ndy
ca2f019249 Merge branch 'master' into group-knocking 2025-04-29 20:28:45 +04:00
spaced4ndy
6abffeb295 core: only introduce to supporting moderators 2025-04-28 15:03:17 +04:00
spaced4ndy
dd01ef5ae8
core: create knocking message for moderators (#5857) 2025-04-28 10:45:42 +00:00
spaced4ndy
60bfd9933a
core: correctly communicate group acceptance state (#5852) 2025-04-28 06:28:40 +00:00
Evgeny Poberezkin
82be7d00fd
Merge branch 'master' into group-knocking 2025-04-25 07:54:13 +01:00
spaced4ndy
18fa5dbf04
core, ui: admission message (#5848) 2025-04-24 16:29:27 +00:00
spaced4ndy
5262b8caca
core: support chat unread stats (#5844) 2025-04-23 14:15:17 +00:00
spaced4ndy
b9adc7b345
android, desktop: member support list updates, refresh button (#5842) 2025-04-23 08:04:54 +00:00
spaced4ndy
ef12bb9a6c
android, desktop: knocking UI improvements and fixes (#5841) 2025-04-22 16:01:37 +00:00
spaced4ndy
4a103c94c1
android, desktop: fix item statuses updates (#5840) 2025-04-22 10:47:17 +00:00
spaced4ndy
805a69da94
android, desktop: group knocking (#5816) 2025-04-21 15:17:21 +00:00
spaced4ndy
3095b980cb Merge branch 'master' into group-knocking 2025-04-15 19:27:36 +04:00
spaced4ndy
c9f398b106
core: group knocking - acceptance to group chat item (#5810) 2025-04-07 07:55:56 +00:00
spaced4ndy
d85ac4af04
core: member support chat stats (#5803)
* core: member support chat stats

* schema

* update counts

* mark read wip

* dec counts on read

* rename

* plans

* test, fixes

* plans

* refactor

* rename

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2025-04-05 12:25:45 +01:00
spaced4ndy
c12817ac81
core: rework knocking protocol (#5802) 2025-04-03 09:36:28 +00:00
spaced4ndy
9654e193af
core: member admission (#5798) 2025-04-03 08:55:32 +00:00
spaced4ndy
4718494329 Merge branch 'master' into group-knocking 2025-04-02 12:02:29 +04:00
spaced4ndy
be1c4018cc
core: group knocking main functionality (#5726)
* docs: knocking rfc

* types, schema wip

* more comments

* rename

* more types

* change types

* wip compiles

* construct snd scope

* fix tests

* hide output

* sending

* fix member filtration

* plans

* conversations store/api model draft

* xgrpmemnew

* rework types wip

* wip

* wip

* remove tag

* wip (compiles)

* fix parsing

* fix query

* fixes, tests

* plans, comments

* fix member filtration

* wip

* protocol wip

* protocol wip

* fix

* fix tests

* fixes, test

* fix (remove NotInHistory)

* fix

* fix tests

* fix

* output

* fix tests

* tests

* gcsi in view

* fix tests

* plans

* refactor, make scopes Maybe

* remove groupChatFilter

* fix test

* change schema

* refactor

* rename

* rename

* rename

* refactor

* rename

* remove scope from item direction

* rework view

* change apis

* make api for cli

* change text

* refactor

* fixes

* comment

* rename

* refactor fmap/mapM

* refactor includeInHistory

* query plans

* knocking: patch scope (#5796)

* knocking: patch scope wip

* more patches

* schema

* remove space

* plans

* fix test

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2025-04-02 07:57:18 +00:00
216 changed files with 17850 additions and 6887 deletions

View file

@ -234,16 +234,14 @@ jobs:
if: startsWith(github.ref, 'refs/tags/v') && matrix.should_run == true
shell: docker exec -t builder sh -eu {0}
run: |
scripts/desktop/build-lib-linux.sh
cd apps/multiplatform
./gradlew packageDeb
scripts/desktop/make-deb-linux.sh
- name: Prepare Desktop
id: linux_desktop_build
if: startsWith(github.ref, 'refs/tags/v') && matrix.should_run == true
shell: bash
run: |
path=$(echo ${{ github.workspace }}/apps/multiplatform/release/main/deb/simplex_*_amd64.deb )
path=$(echo ${{ github.workspace }}/apps/multiplatform/release/main/deb/simplex_amd64.deb )
echo "package_path=$path" >> $GITHUB_OUTPUT
echo "package_hash=$(echo SHA2-256\(${{ matrix.desktop_asset_name }}\)= $(openssl sha256 $path | cut -d' ' -f 2))" >> $GITHUB_OUTPUT

View file

@ -16,6 +16,7 @@ RUN apt-get update && \
apt-get install -y curl \
libpq-dev \
git \
strip-nondeterminism \
sqlite3 \
libsqlite3-dev \
build-essential \

View file

@ -45,21 +45,10 @@ struct ContentView: View {
@State private var showChooseLAMode = false
@State private var showSetPasscode = false
@State private var waitingForOrPassedAuth = true
@State private var chatListActionSheet: ChatListActionSheet? = nil
@State private var chatListUserPickerSheet: UserPickerSheet? = nil
private let callTopPadding: CGFloat = 40
private enum ChatListActionSheet: Identifiable {
case planAndConnectSheet(sheet: PlanAndConnectActionSheet)
var id: String {
switch self {
case let .planAndConnectSheet(sheet): return sheet.id
}
}
}
private var accessAuthenticated: Bool {
chatModel.contentViewAccessAuthenticated || contentAccessAuthenticationExtended
}
@ -181,11 +170,6 @@ struct ContentView: View {
if case .onboardingComplete = step,
chatModel.currentUser != nil {
mainView()
.actionSheet(item: $chatListActionSheet) { sheet in
switch sheet {
case let .planAndConnectSheet(sheet): return planAndConnectActionSheet(sheet, dismiss: false)
}
}
} else {
OnboardingView(onboarding: step)
}
@ -453,10 +437,7 @@ struct ContentView: View {
let link = url.absoluteString.replacingOccurrences(of: "///\(path)", with: "/\(path)")
planAndConnect(
link,
showAlert: showPlanAndConnectAlert,
showActionSheet: { chatListActionSheet = .planAndConnectSheet(sheet: $0) },
dismiss: false,
incognito: nil
dismiss: false
)
} else {
AlertManager.shared.showAlert(Alert(title: Text("Error: URL is invalid")))
@ -479,10 +460,6 @@ struct ContentView: View {
}
}
}
private func showPlanAndConnectAlert(_ alert: PlanAndConnectAlert) {
AlertManager.shared.showAlert(planAndConnectAlert(alert, dismiss: false))
}
}
final class AlertManager: ObservableObject {

View file

@ -39,9 +39,9 @@ enum ChatCommand: ChatCmdProtocol {
case apiGetSettings(settings: AppSettings)
case apiGetChatTags(userId: Int64)
case apiGetChats(userId: Int64)
case apiGetChat(chatId: ChatId, pagination: ChatPagination, search: String)
case apiGetChatItemInfo(type: ChatType, id: Int64, itemId: Int64)
case apiSendMessages(type: ChatType, id: Int64, live: Bool, ttl: Int?, composedMessages: [ComposedMessage])
case apiGetChat(chatId: ChatId, scope: GroupChatScope?, contentTag: MsgContentTag?, pagination: ChatPagination, search: String)
case apiGetChatItemInfo(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64)
case apiSendMessages(type: ChatType, id: Int64, scope: GroupChatScope?, live: Bool, ttl: Int?, composedMessages: [ComposedMessage])
case apiCreateChatTag(tag: ChatTagData)
case apiSetChatTags(type: ChatType, id: Int64, tagIds: [Int64])
case apiDeleteChatTag(tagId: Int64)
@ -49,15 +49,15 @@ enum ChatCommand: ChatCmdProtocol {
case apiReorderChatTags(tagIds: [Int64])
case apiCreateChatItems(noteFolderId: Int64, composedMessages: [ComposedMessage])
case apiReportMessage(groupId: Int64, chatItemId: Int64, reportReason: ReportReason, reportText: String)
case apiUpdateChatItem(type: ChatType, id: Int64, itemId: Int64, updatedMessage: UpdatedMessage, live: Bool)
case apiDeleteChatItem(type: ChatType, id: Int64, itemIds: [Int64], mode: CIDeleteMode)
case apiUpdateChatItem(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64, updatedMessage: UpdatedMessage, live: Bool)
case apiDeleteChatItem(type: ChatType, id: Int64, scope: GroupChatScope?, itemIds: [Int64], mode: CIDeleteMode)
case apiDeleteMemberChatItem(groupId: Int64, itemIds: [Int64])
case apiArchiveReceivedReports(groupId: Int64)
case apiDeleteReceivedReports(groupId: Int64, itemIds: [Int64], mode: CIDeleteMode)
case apiChatItemReaction(type: ChatType, id: Int64, itemId: Int64, add: Bool, reaction: MsgReaction)
case apiChatItemReaction(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64, add: Bool, reaction: MsgReaction)
case apiGetReactionMembers(userId: Int64, groupId: Int64, itemId: Int64, reaction: MsgReaction)
case apiPlanForwardChatItems(toChatType: ChatType, toChatId: Int64, itemIds: [Int64])
case apiForwardChatItems(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemIds: [Int64], ttl: Int?)
case apiPlanForwardChatItems(fromChatType: ChatType, fromChatId: Int64, fromScope: GroupChatScope?, itemIds: [Int64])
case apiForwardChatItems(toChatType: ChatType, toChatId: Int64, toScope: GroupChatScope?, fromChatType: ChatType, fromChatId: Int64, fromScope: GroupChatScope?, itemIds: [Int64], ttl: Int?)
case apiGetNtfToken
case apiRegisterToken(token: DeviceToken, notificationMode: NotificationsMode)
case apiVerifyToken(token: DeviceToken, nonce: String, code: String)
@ -68,6 +68,8 @@ enum ChatCommand: ChatCmdProtocol {
case apiNewGroup(userId: Int64, incognito: Bool, groupProfile: GroupProfile)
case apiAddMember(groupId: Int64, contactId: Int64, memberRole: GroupMemberRole)
case apiJoinGroup(groupId: Int64)
case apiAcceptMember(groupId: Int64, groupMemberId: Int64, memberRole: GroupMemberRole)
case apiDeleteMemberSupportChat(groupId: Int64, groupMemberId: Int64)
case apiMembersRole(groupId: Int64, memberIds: [Int64], memberRole: GroupMemberRole)
case apiBlockMembersForAll(groupId: Int64, memberIds: [Int64], blocked: Bool)
case apiRemoveMembers(groupId: Int64, memberIds: [Int64], withMessages: Bool)
@ -78,6 +80,7 @@ enum ChatCommand: ChatCmdProtocol {
case apiGroupLinkMemberRole(groupId: Int64, memberRole: GroupMemberRole)
case apiDeleteGroupLink(groupId: Int64)
case apiGetGroupLink(groupId: Int64)
case apiAddGroupShortLink(groupId: Int64)
case apiCreateMemberContact(groupId: Int64, groupMemberId: Int64)
case apiSendMemberContactInvitation(contactId: Int64, msg: MsgContent)
case apiTestProtoServer(userId: Int64, server: String)
@ -132,6 +135,7 @@ enum ChatCommand: ChatCmdProtocol {
case apiCreateMyAddress(userId: Int64, short: Bool)
case apiDeleteMyAddress(userId: Int64)
case apiShowMyAddress(userId: Int64)
case apiAddMyAddressShortLink(userId: Int64)
case apiSetProfileAddress(userId: Int64, on: Bool)
case apiAddressAutoAccept(userId: Int64, autoAccept: AutoAccept?)
case apiAcceptContact(incognito: Bool, contactReqId: Int64)
@ -147,8 +151,8 @@ enum ChatCommand: ChatCmdProtocol {
case apiCallStatus(contact: Contact, callStatus: WebRTCCallStatus)
// WebRTC calls /
case apiGetNetworkStatuses
case apiChatRead(type: ChatType, id: Int64)
case apiChatItemsRead(type: ChatType, id: Int64, itemIds: [Int64])
case apiChatRead(type: ChatType, id: Int64, scope: GroupChatScope?)
case apiChatItemsRead(type: ChatType, id: Int64, scope: GroupChatScope?, itemIds: [Int64])
case apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool)
case receiveFile(fileId: Int64, userApprovedRelays: Bool, encrypted: Bool?, inline: Bool?)
case setFileToReceive(fileId: Int64, userApprovedRelays: Bool, encrypted: Bool?)
@ -209,15 +213,16 @@ enum ChatCommand: ChatCmdProtocol {
case let .apiGetSettings(settings): return "/_get app settings \(encodeJSON(settings))"
case let .apiGetChatTags(userId): return "/_get tags \(userId)"
case let .apiGetChats(userId): return "/_get chats \(userId) pcc=on"
case let .apiGetChat(chatId, pagination, search): return "/_get chat \(chatId) \(pagination.cmdString)" +
(search == "" ? "" : " search=\(search)")
case let .apiGetChatItemInfo(type, id, itemId): return "/_get item info \(ref(type, id)) \(itemId)"
case let .apiSendMessages(type, id, live, ttl, composedMessages):
case let .apiGetChat(chatId, scope, contentTag, pagination, search):
let tag = contentTag != nil ? " content=\(contentTag!.rawValue)" : ""
return "/_get chat \(chatId)\(scopeRef(scope: scope))\(tag) \(pagination.cmdString)" + (search == "" ? "" : " search=\(search)")
case let .apiGetChatItemInfo(type, id, scope, itemId): return "/_get item info \(ref(type, id, scope: scope)) \(itemId)"
case let .apiSendMessages(type, id, scope, live, ttl, composedMessages):
let msgs = encodeJSON(composedMessages)
let ttlStr = ttl != nil ? "\(ttl!)" : "default"
return "/_send \(ref(type, id)) live=\(onOff(live)) ttl=\(ttlStr) json \(msgs)"
return "/_send \(ref(type, id, scope: scope)) live=\(onOff(live)) ttl=\(ttlStr) json \(msgs)"
case let .apiCreateChatTag(tag): return "/_create tag \(encodeJSON(tag))"
case let .apiSetChatTags(type, id, tagIds): return "/_tags \(ref(type, id)) \(tagIds.map({ "\($0)" }).joined(separator: ","))"
case let .apiSetChatTags(type, id, tagIds): return "/_tags \(ref(type, id, scope: nil)) \(tagIds.map({ "\($0)" }).joined(separator: ","))"
case let .apiDeleteChatTag(tagId): return "/_delete tag \(tagId)"
case let .apiUpdateChatTag(tagId, tagData): return "/_update tag \(tagId) \(encodeJSON(tagData))"
case let .apiReorderChatTags(tagIds): return "/_reorder tags \(tagIds.map({ "\($0)" }).joined(separator: ","))"
@ -226,17 +231,17 @@ enum ChatCommand: ChatCmdProtocol {
return "/_create *\(noteFolderId) json \(msgs)"
case let .apiReportMessage(groupId, chatItemId, reportReason, reportText):
return "/_report #\(groupId) \(chatItemId) reason=\(reportReason) \(reportText)"
case let .apiUpdateChatItem(type, id, itemId, um, live): return "/_update item \(ref(type, id)) \(itemId) live=\(onOff(live)) \(um.cmdString)"
case let .apiDeleteChatItem(type, id, itemIds, mode): return "/_delete item \(ref(type, id)) \(itemIds.map({ "\($0)" }).joined(separator: ",")) \(mode.rawValue)"
case let .apiUpdateChatItem(type, id, scope, itemId, um, live): return "/_update item \(ref(type, id, scope: scope)) \(itemId) live=\(onOff(live)) \(um.cmdString)"
case let .apiDeleteChatItem(type, id, scope, itemIds, mode): return "/_delete item \(ref(type, id, scope: scope)) \(itemIds.map({ "\($0)" }).joined(separator: ",")) \(mode.rawValue)"
case let .apiDeleteMemberChatItem(groupId, itemIds): return "/_delete member item #\(groupId) \(itemIds.map({ "\($0)" }).joined(separator: ","))"
case let .apiArchiveReceivedReports(groupId): return "/_archive reports #\(groupId)"
case let .apiDeleteReceivedReports(groupId, itemIds, mode): return "/_delete reports #\(groupId) \(itemIds.map({ "\($0)" }).joined(separator: ",")) \(mode.rawValue)"
case let .apiChatItemReaction(type, id, itemId, add, reaction): return "/_reaction \(ref(type, id)) \(itemId) \(onOff(add)) \(encodeJSON(reaction))"
case let .apiChatItemReaction(type, id, scope, itemId, add, reaction): return "/_reaction \(ref(type, id, scope: scope)) \(itemId) \(onOff(add)) \(encodeJSON(reaction))"
case let .apiGetReactionMembers(userId, groupId, itemId, reaction): return "/_reaction members \(userId) #\(groupId) \(itemId) \(encodeJSON(reaction))"
case let .apiPlanForwardChatItems(type, id, itemIds): return "/_forward plan \(ref(type, id)) \(itemIds.map({ "\($0)" }).joined(separator: ","))"
case let .apiForwardChatItems(toChatType, toChatId, fromChatType, fromChatId, itemIds, ttl):
case let .apiPlanForwardChatItems(type, id, scope, itemIds): return "/_forward plan \(ref(type, id, scope: scope)) \(itemIds.map({ "\($0)" }).joined(separator: ","))"
case let .apiForwardChatItems(toChatType, toChatId, toScope, fromChatType, fromChatId, fromScope, itemIds, ttl):
let ttlStr = ttl != nil ? "\(ttl!)" : "default"
return "/_forward \(ref(toChatType, toChatId)) \(ref(fromChatType, fromChatId)) \(itemIds.map({ "\($0)" }).joined(separator: ",")) ttl=\(ttlStr)"
return "/_forward \(ref(toChatType, toChatId, scope: toScope)) \(ref(fromChatType, fromChatId, scope: fromScope)) \(itemIds.map({ "\($0)" }).joined(separator: ",")) ttl=\(ttlStr)"
case .apiGetNtfToken: return "/_ntf get "
case let .apiRegisterToken(token, notificationMode): return "/_ntf register \(token.cmdString) \(notificationMode.rawValue)"
case let .apiVerifyToken(token, nonce, code): return "/_ntf verify \(token.cmdString) \(nonce) \(code)"
@ -247,6 +252,8 @@ enum ChatCommand: ChatCmdProtocol {
case let .apiNewGroup(userId, incognito, groupProfile): return "/_group \(userId) incognito=\(onOff(incognito)) \(encodeJSON(groupProfile))"
case let .apiAddMember(groupId, contactId, memberRole): return "/_add #\(groupId) \(contactId) \(memberRole)"
case let .apiJoinGroup(groupId): return "/_join #\(groupId)"
case let .apiAcceptMember(groupId, groupMemberId, memberRole): return "/_accept member #\(groupId) \(groupMemberId) \(memberRole.rawValue)"
case let .apiDeleteMemberSupportChat(groupId, groupMemberId): return "/_delete member chat #\(groupId) \(groupMemberId)"
case let .apiMembersRole(groupId, memberIds, memberRole): return "/_member role #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) \(memberRole.rawValue)"
case let .apiBlockMembersForAll(groupId, memberIds, blocked): return "/_block #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) blocked=\(onOff(blocked))"
case let .apiRemoveMembers(groupId, memberIds, withMessages): return "/_remove #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) messages=\(onOff(withMessages))"
@ -257,6 +264,7 @@ enum ChatCommand: ChatCmdProtocol {
case let .apiGroupLinkMemberRole(groupId, memberRole): return "/_set link role #\(groupId) \(memberRole)"
case let .apiDeleteGroupLink(groupId): return "/_delete link #\(groupId)"
case let .apiGetGroupLink(groupId): return "/_get link #\(groupId)"
case let .apiAddGroupShortLink(groupId): return "/_short link #\(groupId)"
case let .apiCreateMemberContact(groupId, groupMemberId): return "/_create member contact #\(groupId) \(groupMemberId)"
case let .apiSendMemberContactInvitation(contactId, mc): return "/_invite member contact @\(contactId) \(mc.cmdString)"
case let .apiTestProtoServer(userId, server): return "/_server test \(userId) \(server)"
@ -270,13 +278,13 @@ enum ChatCommand: ChatCmdProtocol {
case let .apiAcceptConditions(conditionsId, operatorIds): return "/_accept_conditions \(conditionsId) \(joinedIds(operatorIds))"
case let .apiSetChatItemTTL(userId, seconds): return "/_ttl \(userId) \(chatItemTTLStr(seconds: seconds))"
case let .apiGetChatItemTTL(userId): return "/_ttl \(userId)"
case let .apiSetChatTTL(userId, type, id, seconds): return "/_ttl \(userId) \(ref(type, id)) \(chatItemTTLStr(seconds: seconds))"
case let .apiSetChatTTL(userId, type, id, seconds): return "/_ttl \(userId) \(ref(type, id, scope: nil)) \(chatItemTTLStr(seconds: seconds))"
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 .reconnectServer(userId, smpServer): return "/reconnect \(userId) \(smpServer)"
case let .apiSetChatSettings(type, id, chatSettings): return "/_settings \(ref(type, id)) \(encodeJSON(chatSettings))"
case let .apiSetChatSettings(type, id, chatSettings): return "/_settings \(ref(type, id, scope: nil)) \(encodeJSON(chatSettings))"
case let .apiSetMemberSettings(groupId, groupMemberId, memberSettings): return "/_member settings #\(groupId) \(groupMemberId) \(encodeJSON(memberSettings))"
case let .apiContactInfo(contactId): return "/_info @\(contactId)"
case let .apiGroupMemberInfo(groupId, groupMemberId): return "/_info #\(groupId) \(groupMemberId)"
@ -308,8 +316,8 @@ enum ChatCommand: ChatCmdProtocol {
case let .apiConnectPlan(userId, connLink): return "/_connect plan \(userId) \(connLink)"
case let .apiConnect(userId, incognito, connLink): return "/_connect \(userId) incognito=\(onOff(incognito)) \(connLink.connFullLink) \(connLink.connShortLink ?? "")"
case let .apiConnectContactViaAddress(userId, incognito, contactId): return "/_connect contact \(userId) incognito=\(onOff(incognito)) \(contactId)"
case let .apiDeleteChat(type, id, chatDeleteMode): return "/_delete \(ref(type, id)) \(chatDeleteMode.cmdString)"
case let .apiClearChat(type, id): return "/_clear chat \(ref(type, id))"
case let .apiDeleteChat(type, id, chatDeleteMode): return "/_delete \(ref(type, id, scope: nil)) \(chatDeleteMode.cmdString)"
case let .apiClearChat(type, id): return "/_clear chat \(ref(type, id, scope: nil))"
case let .apiListContacts(userId): return "/_contacts \(userId)"
case let .apiUpdateProfile(userId, profile): return "/_profile \(userId) \(encodeJSON(profile))"
case let .apiSetContactPrefs(contactId, preferences): return "/_set prefs @\(contactId) \(encodeJSON(preferences))"
@ -321,6 +329,7 @@ enum ChatCommand: ChatCmdProtocol {
case let .apiCreateMyAddress(userId, short): return "/_address \(userId) short=\(onOff(short))"
case let .apiDeleteMyAddress(userId): return "/_delete_address \(userId)"
case let .apiShowMyAddress(userId): return "/_show_address \(userId)"
case let .apiAddMyAddressShortLink(userId): return "/_short_link_address \(userId)"
case let .apiSetProfileAddress(userId, on): return "/_profile_address \(userId) \(onOff(on))"
case let .apiAddressAutoAccept(userId, autoAccept): return "/_auto_accept \(userId) \(AutoAccept.cmdString(autoAccept))"
case let .apiAcceptContact(incognito, contactReqId): return "/_accept incognito=\(onOff(incognito)) \(contactReqId)"
@ -334,9 +343,9 @@ enum ChatCommand: ChatCmdProtocol {
case .apiGetCallInvitations: return "/_call get"
case let .apiCallStatus(contact, callStatus): return "/_call status @\(contact.apiId) \(callStatus.rawValue)"
case .apiGetNetworkStatuses: return "/_network_statuses"
case let .apiChatRead(type, id): return "/_read chat \(ref(type, id))"
case let .apiChatItemsRead(type, id, itemIds): return "/_read chat items \(ref(type, id)) \(joinedIds(itemIds))"
case let .apiChatUnread(type, id, unreadChat): return "/_unread chat \(ref(type, id)) \(onOff(unreadChat))"
case let .apiChatRead(type, id, scope): return "/_read chat \(ref(type, id, scope: scope))"
case let .apiChatItemsRead(type, id, scope, itemIds): return "/_read chat items \(ref(type, id, scope: scope)) \(joinedIds(itemIds))"
case let .apiChatUnread(type, id, unreadChat): return "/_unread chat \(ref(type, id, scope: nil)) \(onOff(unreadChat))"
case let .receiveFile(fileId, userApprovedRelays, encrypt, inline): return "/freceive \(fileId)\(onOffParam("approved_relays", userApprovedRelays))\(onOffParam("encrypt", encrypt))\(onOffParam("inline", inline))"
case let .setFileToReceive(fileId, userApprovedRelays, encrypt): return "/_set_file_to_receive \(fileId)\(onOffParam("approved_relays", userApprovedRelays))\(onOffParam("encrypt", encrypt))"
case let .cancelFile(fileId): return "/fcancel \(fileId)"
@ -421,6 +430,8 @@ enum ChatCommand: ChatCmdProtocol {
case .apiNewGroup: return "apiNewGroup"
case .apiAddMember: return "apiAddMember"
case .apiJoinGroup: return "apiJoinGroup"
case .apiAcceptMember: return "apiAcceptMember"
case .apiDeleteMemberSupportChat: return "apiDeleteMemberSupportChat"
case .apiMembersRole: return "apiMembersRole"
case .apiBlockMembersForAll: return "apiBlockMembersForAll"
case .apiRemoveMembers: return "apiRemoveMembers"
@ -431,6 +442,7 @@ enum ChatCommand: ChatCmdProtocol {
case .apiGroupLinkMemberRole: return "apiGroupLinkMemberRole"
case .apiDeleteGroupLink: return "apiDeleteGroupLink"
case .apiGetGroupLink: return "apiGetGroupLink"
case .apiAddGroupShortLink: return "apiAddGroupShortLink"
case .apiCreateMemberContact: return "apiCreateMemberContact"
case .apiSendMemberContactInvitation: return "apiSendMemberContactInvitation"
case .apiTestProtoServer: return "apiTestProtoServer"
@ -484,6 +496,7 @@ enum ChatCommand: ChatCmdProtocol {
case .apiCreateMyAddress: return "apiCreateMyAddress"
case .apiDeleteMyAddress: return "apiDeleteMyAddress"
case .apiShowMyAddress: return "apiShowMyAddress"
case .apiAddMyAddressShortLink: return "apiAddMyAddressShortLink"
case .apiSetProfileAddress: return "apiSetProfileAddress"
case .apiAddressAutoAccept: return "apiAddressAutoAccept"
case .apiAcceptContact: return "apiAcceptContact"
@ -523,8 +536,20 @@ enum ChatCommand: ChatCmdProtocol {
}
}
func ref(_ type: ChatType, _ id: Int64) -> String {
"\(type.rawValue)\(id)"
func ref(_ type: ChatType, _ id: Int64, scope: GroupChatScope?) -> String {
"\(type.rawValue)\(id)\(scopeRef(scope: scope))"
}
func scopeRef(scope: GroupChatScope?) -> String {
switch (scope) {
case .none: ""
case let .memberSupport(groupMemberId_):
if let groupMemberId = groupMemberId_ {
"(_support:\(groupMemberId))"
} else {
"(_support)"
}
}
}
func joinedIds(_ ids: [Int64]) -> String {
@ -711,6 +736,7 @@ enum ChatResponse1: Decodable, ChatAPIResult {
case contactDeleted(user: UserRef, contact: Contact)
case contactConnectionDeleted(user: UserRef, connection: PendingContactConnection)
case groupDeletedUser(user: UserRef, groupInfo: GroupInfo)
case itemsReadForChat(user: UserRef, chatInfo: ChatInfo)
case chatCleared(user: UserRef, chatInfo: ChatInfo)
case userProfileNoChange(user: User)
case userProfileUpdated(user: User, fromProfile: Profile, toProfile: Profile, updateSummary: UserProfileUpdateSummary)
@ -749,6 +775,7 @@ enum ChatResponse1: Decodable, ChatAPIResult {
case .contactDeleted: "contactDeleted"
case .contactConnectionDeleted: "contactConnectionDeleted"
case .groupDeletedUser: "groupDeletedUser"
case .itemsReadForChat: "itemsReadForChat"
case .chatCleared: "chatCleared"
case .userProfileNoChange: "userProfileNoChange"
case .userProfileUpdated: "userProfileUpdated"
@ -781,6 +808,7 @@ enum ChatResponse1: Decodable, ChatAPIResult {
case let .contactDeleted(u, contact): return withUser(u, String(describing: contact))
case let .contactConnectionDeleted(u, connection): return withUser(u, String(describing: connection))
case let .groupDeletedUser(u, groupInfo): return withUser(u, String(describing: groupInfo))
case let .itemsReadForChat(u, chatInfo): return withUser(u, String(describing: chatInfo))
case let .chatCleared(u, chatInfo): return withUser(u, String(describing: chatInfo))
case .userProfileNoChange: return noDetails
case let .userProfileUpdated(u, _, toProfile, _): return withUser(u, String(describing: toProfile))
@ -831,6 +859,8 @@ enum ChatResponse2: Decodable, ChatAPIResult {
case userDeletedMembers(user: UserRef, groupInfo: GroupInfo, members: [GroupMember], withMessages: Bool)
case leftMemberUser(user: UserRef, groupInfo: GroupInfo)
case groupMembers(user: UserRef, group: SimpleXChat.Group)
case memberAccepted(user: UserRef, groupInfo: GroupInfo, member: GroupMember)
case memberSupportChatDeleted(user: UserRef, groupInfo: GroupInfo, member: GroupMember)
case membersRoleUser(user: UserRef, groupInfo: GroupInfo, members: [GroupMember], toRole: GroupMemberRole)
case membersBlockedForAllUser(user: UserRef, groupInfo: GroupInfo, members: [GroupMember], blocked: Bool)
case groupUpdated(user: UserRef, toGroup: GroupInfo)
@ -879,6 +909,8 @@ enum ChatResponse2: Decodable, ChatAPIResult {
case .userDeletedMembers: "userDeletedMembers"
case .leftMemberUser: "leftMemberUser"
case .groupMembers: "groupMembers"
case .memberAccepted: "memberAccepted"
case .memberSupportChatDeleted: "memberSupportChatDeleted"
case .membersRoleUser: "membersRoleUser"
case .membersBlockedForAllUser: "membersBlockedForAllUser"
case .groupUpdated: "groupUpdated"
@ -923,6 +955,8 @@ enum ChatResponse2: Decodable, ChatAPIResult {
case let .userDeletedMembers(u, groupInfo, members, withMessages): return withUser(u, "groupInfo: \(groupInfo)\nmembers: \(members)\nwithMessages: \(withMessages)")
case let .leftMemberUser(u, groupInfo): return withUser(u, String(describing: groupInfo))
case let .groupMembers(u, group): return withUser(u, String(describing: group))
case let .memberAccepted(u, groupInfo, member): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(member)")
case let .memberSupportChatDeleted(u, groupInfo, member): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(member)")
case let .membersRoleUser(u, groupInfo, members, toRole): return withUser(u, "groupInfo: \(groupInfo)\nmembers: \(members)\ntoRole: \(toRole)")
case let .membersBlockedForAllUser(u, groupInfo, members, blocked): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(members)\nblocked: \(blocked)")
case let .groupUpdated(u, toGroup): return withUser(u, String(describing: toGroup))
@ -988,6 +1022,7 @@ enum ChatEvent: Decodable, ChatAPIResult {
case groupLinkConnecting(user: UserRef, groupInfo: GroupInfo, hostMember: GroupMember)
case businessLinkConnecting(user: UserRef, groupInfo: GroupInfo, hostMember: GroupMember, fromContact: Contact)
case joinedGroupMemberConnecting(user: UserRef, groupInfo: GroupInfo, hostMember: GroupMember, member: GroupMember)
case memberAcceptedByOther(user: UserRef, groupInfo: GroupInfo, acceptingMember: GroupMember, member: GroupMember)
case memberRole(user: UserRef, groupInfo: GroupInfo, byMember: GroupMember, member: GroupMember, fromRole: GroupMemberRole, toRole: GroupMemberRole)
case memberBlockedForAll(user: UserRef, groupInfo: GroupInfo, byMember: GroupMember, member: GroupMember, blocked: Bool)
case deletedMemberUser(user: UserRef, groupInfo: GroupInfo, member: GroupMember, withMessages: Bool)
@ -1064,6 +1099,7 @@ enum ChatEvent: Decodable, ChatAPIResult {
case .groupLinkConnecting: "groupLinkConnecting"
case .businessLinkConnecting: "businessLinkConnecting"
case .joinedGroupMemberConnecting: "joinedGroupMemberConnecting"
case .memberAcceptedByOther: "memberAcceptedByOther"
case .memberRole: "memberRole"
case .memberBlockedForAll: "memberBlockedForAll"
case .deletedMemberUser: "deletedMemberUser"
@ -1144,6 +1180,7 @@ enum ChatEvent: Decodable, ChatAPIResult {
case let .groupLinkConnecting(u, groupInfo, hostMember): return withUser(u, "groupInfo: \(groupInfo)\nhostMember: \(String(describing: hostMember))")
case let .businessLinkConnecting(u, groupInfo, hostMember, fromContact): return withUser(u, "groupInfo: \(groupInfo)\nhostMember: \(String(describing: hostMember))\nfromContact: \(String(describing: fromContact))")
case let .joinedGroupMemberConnecting(u, groupInfo, hostMember, member): return withUser(u, "groupInfo: \(groupInfo)\nhostMember: \(hostMember)\nmember: \(member)")
case let .memberAcceptedByOther(u, groupInfo, acceptingMember, member): return withUser(u, "groupInfo: \(groupInfo)\nacceptingMember: \(acceptingMember)\nmember: \(member)")
case let .memberRole(u, groupInfo, byMember, member, fromRole, toRole): return withUser(u, "groupInfo: \(groupInfo)\nbyMember: \(byMember)\nmember: \(member)\nfromRole: \(fromRole)\ntoRole: \(toRole)")
case let .memberBlockedForAll(u, groupInfo, byMember, member, blocked): return withUser(u, "groupInfo: \(groupInfo)\nbyMember: \(byMember)\nmember: \(member)\nblocked: \(blocked)")
case let .deletedMemberUser(u, groupInfo, member, withMessages): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(member)\nwithMessages: \(withMessages)")

View file

@ -52,8 +52,26 @@ private func addTermItem(_ items: inout [TerminalItem], _ item: TerminalItem) {
items.append(item)
}
// analogue for SecondaryContextFilter in Kotlin
enum SecondaryItemsModelFilter {
case groupChatScopeContext(groupScopeInfo: GroupChatScopeInfo)
case msgContentTagContext(contentTag: MsgContentTag)
func descr() -> String {
switch self {
case let .groupChatScopeContext(groupScopeInfo):
return "groupChatScopeContext \(groupScopeInfo.toChatScope())"
case let .msgContentTagContext(contentTag):
return "msgContentTagContext \(contentTag.rawValue)"
}
}
}
// analogue for ChatsContext in Kotlin
class ItemsModel: ObservableObject {
static let shared = ItemsModel()
static let shared = ItemsModel(secondaryIMFilter: nil)
public var secondaryIMFilter: SecondaryItemsModelFilter?
public var preloadState = PreloadState()
private let publisher = ObservableObjectPublisher()
private var bag = Set<AnyCancellable>()
var reversedChatItems: [ChatItem] = [] {
@ -77,13 +95,20 @@ class ItemsModel: ObservableObject {
chatState.splits.isEmpty || chatState.splits.first != reversedChatItems.first?.id
}
init() {
init(secondaryIMFilter: SecondaryItemsModelFilter? = nil) {
self.secondaryIMFilter = secondaryIMFilter
publisher
.throttle(for: 0.2, scheduler: DispatchQueue.main, latest: true)
.sink { self.objectWillChange.send() }
.store(in: &bag)
}
static func loadSecondaryChat(_ chatId: ChatId, chatFilter: SecondaryItemsModelFilter, willNavigate: @escaping () -> Void = {}) {
let im = ItemsModel(secondaryIMFilter: chatFilter)
ChatModel.shared.secondaryIM = im
im.loadOpenChat(chatId, willNavigate: willNavigate)
}
func loadOpenChat(_ chatId: ChatId, willNavigate: @escaping () -> Void = {}) {
navigationTimeoutTask?.cancel()
loadChatTask?.cancel()
@ -99,7 +124,7 @@ class ItemsModel: ObservableObject {
loadChatTask = Task {
await MainActor.run { self.isLoading = true }
// try? await Task.sleep(nanoseconds: 1000_000000)
await loadChat(chatId: chatId)
await loadChat(chatId: chatId, im: self)
if !Task.isCancelled {
await MainActor.run {
self.isLoading = false
@ -114,7 +139,7 @@ class ItemsModel: ObservableObject {
loadChatTask?.cancel()
loadChatTask = Task {
// try? await Task.sleep(nanoseconds: 1000_000000)
await loadChat(chatId: chatId, openAroundItemId: openAroundItemId, clearItems: openAroundItemId == nil)
await loadChat(chatId: chatId, im: self, openAroundItemId: openAroundItemId, clearItems: openAroundItemId == nil)
if !Task.isCancelled {
await MainActor.run {
if openAroundItemId == nil {
@ -124,6 +149,34 @@ class ItemsModel: ObservableObject {
}
}
}
public var contentTag: MsgContentTag? {
switch secondaryIMFilter {
case nil: nil
case .groupChatScopeContext: nil
case let .msgContentTagContext(contentTag): contentTag
}
}
public var groupScopeInfo: GroupChatScopeInfo? {
switch secondaryIMFilter {
case nil: nil
case let .groupChatScopeContext(scopeInfo): scopeInfo
case .msgContentTagContext: nil
}
}
}
class PreloadState {
var prevFirstVisible: Int64 = Int64.min
var prevItemsCount: Int = 0
var preloading: Bool = false
func clear() {
prevFirstVisible = Int64.min
prevItemsCount = 0
preloading = false
}
}
class ChatTagsModel: ObservableObject {
@ -287,7 +340,6 @@ final class ChatModel: ObservableObject {
// current chat
@Published var chatId: String?
@Published var openAroundItemId: ChatItem.ID? = nil
var chatItemStatuses: Dictionary<Int64, CIStatus> = [:]
@Published var chatToTop: String?
@Published var groupMembers: [GMember] = []
@Published var groupMembersIndexes: Dictionary<Int64, Int> = [:] // groupMemberId to index in groupMembers list
@ -336,6 +388,10 @@ final class ChatModel: ObservableObject {
let im = ItemsModel.shared
// ItemsModel for secondary chat view (such as support scope chat), as opposed to ItemsModel.shared used for primary chat
@Published var secondaryIM: ItemsModel? = nil
@Published var secondaryPendingInviteeChatOpened = false
static var ok: Bool { ChatModel.shared.chatDbStatus == .ok }
let ntfEnableLocal = true
@ -393,7 +449,7 @@ final class ChatModel: ObservableObject {
func getGroupChat(_ groupId: Int64) -> Chat? {
chats.first { chat in
if case let .group(groupInfo) = chat.chatInfo {
if case let .group(groupInfo, _) = chat.chatInfo {
return groupInfo.groupId == groupId
} else {
return false
@ -446,7 +502,11 @@ final class ChatModel: ObservableObject {
func updateChatInfo(_ cInfo: ChatInfo) {
if let i = getChatIndex(cInfo.id) {
chats[i].chatInfo = cInfo
if case let .group(groupInfo, groupChatScope) = cInfo, groupChatScope != nil {
chats[i].chatInfo = .group(groupInfo: groupInfo, groupChatScope: nil)
} else {
chats[i].chatInfo = cInfo
}
chats[i].created = Date.now
}
}
@ -468,7 +528,7 @@ final class ChatModel: ObservableObject {
}
func updateGroup(_ groupInfo: GroupInfo) {
updateChat(.group(groupInfo: groupInfo))
updateChat(.group(groupInfo: groupInfo, groupChatScope: nil))
}
private func updateChat(_ cInfo: ChatInfo, addMissing: Bool = true) {
@ -511,77 +571,112 @@ final class ChatModel: ObservableObject {
// }
func addChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) {
// updates membersRequireAttention
updateChatInfo(cInfo)
// mark chat non deleted
if case let .direct(contact) = cInfo, contact.chatDeleted {
var updatedContact = contact
updatedContact.chatDeleted = false
updateContact(updatedContact)
}
// update previews
// update chat list
if let i = getChatIndex(cInfo.id) {
chats[i].chatItems = switch cInfo {
case .group:
if let currentPreviewItem = chats[i].chatItems.first {
if cItem.meta.itemTs >= currentPreviewItem.meta.itemTs {
[cItem]
// update preview
if cInfo.groupChatScope() == nil || cInfo.groupInfo?.membership.memberPending ?? false {
chats[i].chatItems = switch cInfo {
case .group:
if let currentPreviewItem = chats[i].chatItems.first {
if cItem.meta.itemTs >= currentPreviewItem.meta.itemTs {
[cItem]
} else {
[currentPreviewItem]
}
} else {
[currentPreviewItem]
[cItem]
}
} else {
default:
[cItem]
}
default:
[cItem]
}
if case .rcvNew = cItem.meta.itemStatus {
unreadCollector.changeUnreadCounter(cInfo.id, by: 1, unreadMentions: cItem.meta.userMention ? 1 : 0)
if case .rcvNew = cItem.meta.itemStatus {
unreadCollector.changeUnreadCounter(cInfo.id, by: 1, unreadMentions: cItem.meta.userMention ? 1 : 0)
}
}
// pop chat
popChatCollector.throttlePopChat(cInfo.id, currentPosition: i)
} else {
addChat(Chat(chatInfo: cInfo, chatItems: [cItem]))
if cInfo.groupChatScope() == nil {
addChat(Chat(chatInfo: cInfo, chatItems: [cItem]))
} else {
addChat(Chat(chatInfo: cInfo, chatItems: []))
}
}
// add to current chat
if chatId == cInfo.id {
_ = _upsertChatItem(cInfo, cItem)
// add to current scope
if let ciIM = getCIItemsModel(cInfo, cItem) {
_ = _upsertChatItem(ciIM, cInfo, cItem)
}
}
func getCIItemsModel(_ cInfo: ChatInfo, _ ci: ChatItem) -> ItemsModel? {
let cInfoScope = cInfo.groupChatScope()
if let cInfoScope = cInfoScope {
switch cInfoScope {
case .memberSupport:
switch secondaryIM?.secondaryIMFilter {
case .none:
return nil
case let .groupChatScopeContext(groupScopeInfo):
return (cInfo.id == chatId && sameChatScope(cInfoScope, groupScopeInfo.toChatScope())) ? secondaryIM : nil
case let .msgContentTagContext(contentTag):
return (cInfo.id == chatId && ci.isReport && contentTag == .report) ? secondaryIM : nil
}
}
} else {
return cInfo.id == chatId ? im : nil
}
}
func upsertChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) -> Bool {
// update previews
var res: Bool
if let chat = getChat(cInfo.id) {
if let pItem = chat.chatItems.last {
if pItem.id == cItem.id || (chatId == cInfo.id && im.reversedChatItems.first(where: { $0.id == cItem.id }) == nil) {
// update chat list
var itemAdded: Bool = false
if cInfo.groupChatScope() == nil {
if let chat = getChat(cInfo.id) {
if let pItem = chat.chatItems.last {
if pItem.id == cItem.id || (chatId == cInfo.id && im.reversedChatItems.first(where: { $0.id == cItem.id }) == nil) {
chat.chatItems = [cItem]
}
} else {
chat.chatItems = [cItem]
}
} else {
chat.chatItems = [cItem]
addChat(Chat(chatInfo: cInfo, chatItems: [cItem]))
itemAdded = true
}
if cItem.isDeletedContent || cItem.meta.itemDeleted != nil {
VoiceItemState.stopVoiceInChatView(cInfo, cItem)
}
res = false
} else {
addChat(Chat(chatInfo: cInfo, chatItems: [cItem]))
res = true
}
if cItem.isDeletedContent || cItem.meta.itemDeleted != nil {
VoiceItemState.stopVoiceInChatView(cInfo, cItem)
// update current scope
if let ciIM = getCIItemsModel(cInfo, cItem) {
itemAdded = _upsertChatItem(ciIM, cInfo, cItem)
}
// update current chat
return chatId == cInfo.id ? _upsertChatItem(cInfo, cItem) : res
return itemAdded
}
private func _upsertChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) -> Bool {
if let i = getChatItemIndex(cItem) {
_updateChatItem(at: i, with: cItem)
ChatItemDummyModel.shared.sendUpdate()
private func _upsertChatItem(_ ciIM: ItemsModel, _ cInfo: ChatInfo, _ cItem: ChatItem) -> Bool {
if let i = getChatItemIndex(ciIM, cItem) {
let oldStatus = ciIM.reversedChatItems[i].meta.itemStatus
let newStatus = cItem.meta.itemStatus
var ci = cItem
if shouldKeepOldSndCIStatus(oldStatus: oldStatus, newStatus: newStatus) {
ci.meta.itemStatus = oldStatus
}
_updateChatItem(ciIM: ciIM, at: i, with: ci)
ChatItemDummyModel.shared.sendUpdate() // TODO [knocking] review what's this
return false
} else {
var ci = cItem
if let status = chatItemStatuses.removeValue(forKey: ci.id), case .sndNew = ci.meta.itemStatus {
ci.meta.itemStatus = status
}
im.reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0)
im.chatState.itemAdded((ci.id, ci.isRcvNew), hasLiveDummy ? 1 : 0)
im.itemAdded = true
ciIM.reversedChatItems.insert(cItem, at: hasLiveDummy ? 1 : 0)
ciIM.chatState.itemAdded((cItem.id, cItem.isRcvNew), hasLiveDummy ? 1 : 0)
ciIM.itemAdded = true
ChatItemDummyModel.shared.sendUpdate()
return true
}
@ -595,40 +690,42 @@ final class ChatModel: ObservableObject {
}
func updateChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem, status: CIStatus? = nil) {
if chatId == cInfo.id, let i = getChatItemIndex(cItem) {
if let ciIM = getCIItemsModel(cInfo, cItem),
let i = getChatItemIndex(ciIM, cItem) {
withConditionalAnimation {
_updateChatItem(at: i, with: cItem)
_updateChatItem(ciIM: ciIM, at: i, with: cItem)
}
} else if let status = status {
chatItemStatuses.updateValue(status, forKey: cItem.id)
}
}
private func _updateChatItem(at i: Int, with cItem: ChatItem) {
im.reversedChatItems[i] = cItem
im.reversedChatItems[i].viewTimestamp = .now
private func _updateChatItem(ciIM: ItemsModel, at i: Int, with cItem: ChatItem) {
ciIM.reversedChatItems[i] = cItem
ciIM.reversedChatItems[i].viewTimestamp = .now
}
func getChatItemIndex(_ cItem: ChatItem) -> Int? {
im.reversedChatItems.firstIndex(where: { $0.id == cItem.id })
func getChatItemIndex(_ ciIM: ItemsModel, _ cItem: ChatItem) -> Int? {
ciIM.reversedChatItems.firstIndex(where: { $0.id == cItem.id })
}
func removeChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) {
if cItem.isRcvNew {
unreadCollector.changeUnreadCounter(cInfo.id, by: -1, unreadMentions: cItem.meta.userMention ? -1 : 0)
}
// update previews
if let chat = getChat(cInfo.id) {
if let pItem = chat.chatItems.last, pItem.id == cItem.id {
chat.chatItems = [ChatItem.deletedItemDummy()]
// update chat list
if cInfo.groupChatScope() == nil {
if cItem.isRcvNew {
unreadCollector.changeUnreadCounter(cInfo.id, by: -1, unreadMentions: cItem.meta.userMention ? -1 : 0)
}
// update previews
if let chat = getChat(cInfo.id) {
if let pItem = chat.chatItems.last, pItem.id == cItem.id {
chat.chatItems = [ChatItem.deletedItemDummy()]
}
}
}
// remove from current chat
if chatId == cInfo.id {
if let i = getChatItemIndex(cItem) {
// remove from current scope
if let ciIM = getCIItemsModel(cInfo, cItem) {
if let i = getChatItemIndex(ciIM, cItem) {
withAnimation {
let item = im.reversedChatItems.remove(at: i)
im.chatState.itemsRemoved([(item.id, i, item.isRcvNew)], im.reversedChatItems.reversed())
let item = ciIM.reversedChatItems.remove(at: i)
ciIM.chatState.itemsRemoved([(item.id, i, item.isRcvNew)], im.reversedChatItems.reversed())
}
}
}
@ -644,7 +741,7 @@ final class ChatModel: ObservableObject {
if chatId == groupInfo.id {
for i in 0..<im.reversedChatItems.count {
if let updatedItem = removedUpdatedItem(im.reversedChatItems[i]) {
_updateChatItem(at: i, with: updatedItem)
_updateChatItem(ciIM: im, at: i, with: updatedItem) // TODO [knocking] review: use getCIItemsModel?
}
}
} else if let chat = getChat(groupInfo.id),
@ -736,7 +833,7 @@ final class ChatModel: ObservableObject {
im.reversedChatItems.first?.isLiveDummy == true
}
func markAllChatItemsRead(_ cInfo: ChatInfo) {
func markAllChatItemsRead(_ chatIM: ItemsModel, _ cInfo: ChatInfo) {
// update preview
_updateChat(cInfo.id) { chat in
self.decreaseUnreadCounter(user: self.currentUser!, chat: chat)
@ -747,7 +844,7 @@ final class ChatModel: ObservableObject {
if chatId == cInfo.id {
var i = 0
while i < im.reversedChatItems.count {
markChatItemRead_(i)
markChatItemRead_(chatIM, i)
i += 1
}
im.chatState.itemsRead(nil, im.reversedChatItems.reversed())
@ -772,27 +869,26 @@ final class ChatModel: ObservableObject {
}
// clear current chat
if chatId == cInfo.id {
chatItemStatuses = [:]
im.reversedChatItems = []
im.chatState.clear()
}
}
func markChatItemsRead(_ cInfo: ChatInfo, _ itemIds: [ChatItem.ID], _ mentionsRead: Int) {
func markChatItemsRead(_ chatIM: ItemsModel, _ cInfo: ChatInfo, _ itemIds: [ChatItem.ID], _ mentionsRead: Int) {
if self.chatId == cInfo.id {
var unreadItemIds: Set<ChatItem.ID> = []
var i = 0
var ids = Set(itemIds)
while i < im.reversedChatItems.count && !ids.isEmpty {
let item = im.reversedChatItems[i]
while i < chatIM.reversedChatItems.count && !ids.isEmpty {
let item = chatIM.reversedChatItems[i]
if ids.contains(item.id) && item.isRcvNew {
markChatItemRead_(i)
markChatItemRead_(chatIM, i)
unreadItemIds.insert(item.id)
ids.remove(item.id)
}
i += 1
}
im.chatState.itemsRead(unreadItemIds, im.reversedChatItems.reversed())
chatIM.chatState.itemsRead(unreadItemIds, chatIM.reversedChatItems.reversed())
}
self.unreadCollector.changeUnreadCounter(cInfo.id, by: -itemIds.count, unreadMentions: -mentionsRead)
}
@ -888,13 +984,13 @@ final class ChatModel: ObservableObject {
}
}
private func markChatItemRead_(_ i: Int) {
let meta = im.reversedChatItems[i].meta
private func markChatItemRead_(_ chatIM: ItemsModel, _ i: Int) {
let meta = chatIM.reversedChatItems[i].meta
if case .rcvNew = meta.itemStatus {
im.reversedChatItems[i].meta.itemStatus = .rcvRead
im.reversedChatItems[i].viewTimestamp = .now
chatIM.reversedChatItems[i].meta.itemStatus = .rcvRead
chatIM.reversedChatItems[i].viewTimestamp = .now
if meta.itemLive != true, let ttl = meta.itemTimed?.ttl {
im.reversedChatItems[i].meta.itemTimed?.deleteAt = .now + TimeInterval(ttl)
chatIM.reversedChatItems[i].meta.itemTimed?.deleteAt = .now + TimeInterval(ttl)
}
}
}
@ -973,7 +1069,7 @@ final class ChatModel: ObservableObject {
var count = 0
var ns: [String] = []
if let ciCategory = chatItem.mergeCategory,
var i = getChatItemIndex(chatItem) {
var i = getChatItemIndex(im, chatItem) { // TODO [knocking] review: use getCIItemsModel?
while i < im.reversedChatItems.count {
let ci = im.reversedChatItems[i]
if ci.mergeCategory != ciCategory { break }
@ -989,7 +1085,7 @@ final class ChatModel: ObservableObject {
// returns the index of the passed item and the next item (it has smaller index)
func getNextChatItem(_ ci: ChatItem) -> (Int?, ChatItem?) {
if let i = getChatItemIndex(ci) {
if let i = getChatItemIndex(im, ci) { // TODO [knocking] review: use getCIItemsModel?
(i, i > 0 ? im.reversedChatItems[i - 1] : nil)
} else {
(nil, nil)
@ -1100,7 +1196,7 @@ final class ChatModel: ObservableObject {
func removeWallpaperFilesFromChat(_ chat: Chat) {
if case let .direct(contact) = chat.chatInfo {
removeWallpaperFilesFromTheme(contact.uiThemes)
} else if case let .group(groupInfo) = chat.chatInfo {
} else if case let .group(groupInfo, _) = chat.chatInfo {
removeWallpaperFilesFromTheme(groupInfo.uiThemes)
}
}
@ -1164,6 +1260,18 @@ final class Chat: ObservableObject, Identifiable, ChatLike {
var viewId: String { get { "\(chatInfo.id) \(created.timeIntervalSince1970)" } }
var supportUnreadCount: Int {
switch chatInfo {
case let .group(groupInfo, _):
if groupInfo.canModerate {
return groupInfo.membersRequireAttention
} else {
return groupInfo.membership.supportChat?.unread ?? 0
}
default: return 0
}
}
public static var sampleData: Chat = Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])
}

View file

@ -344,43 +344,54 @@ func apiGetChatTagsAsync() async throws -> [ChatTag] {
let loadItemsPerPage = 50
func apiGetChat(chatId: ChatId, pagination: ChatPagination, search: String = "") async throws -> (Chat, NavigationInfo) {
let r: ChatResponse0 = try await chatSendCmd(.apiGetChat(chatId: chatId, pagination: pagination, search: search))
func apiGetChat(chatId: ChatId, scope: GroupChatScope?, contentTag: MsgContentTag? = nil, pagination: ChatPagination, search: String = "") async throws -> (Chat, NavigationInfo) {
let r: ChatResponse0 = try await chatSendCmd(.apiGetChat(chatId: chatId, scope: scope, contentTag: contentTag, pagination: pagination, search: search))
if case let .apiChat(_, chat, navInfo) = r { return (Chat.init(chat), navInfo ?? NavigationInfo()) }
throw r.unexpected
}
func loadChat(chat: Chat, search: String = "", clearItems: Bool = true) async {
await loadChat(chatId: chat.chatInfo.id, search: search, clearItems: clearItems)
func loadChat(chat: Chat, im: ItemsModel, search: String = "", clearItems: Bool = true) async {
await loadChat(chatId: chat.chatInfo.id, im: im, search: search, clearItems: clearItems)
}
func loadChat(chatId: ChatId, search: String = "", openAroundItemId: ChatItem.ID? = nil, clearItems: Bool = true) async {
let m = ChatModel.shared
let im = ItemsModel.shared
func loadChat(chatId: ChatId, im: ItemsModel, search: String = "", openAroundItemId: ChatItem.ID? = nil, clearItems: Bool = true) async {
await MainActor.run {
m.chatItemStatuses = [:]
if clearItems {
im.reversedChatItems = []
ItemsModel.shared.chatState.clear()
im.chatState.clear()
}
}
await apiLoadMessages(chatId, openAroundItemId != nil ? .around(chatItemId: openAroundItemId!, count: loadItemsPerPage) : (search == "" ? .initial(count: loadItemsPerPage) : .last(count: loadItemsPerPage)), im.chatState, search, openAroundItemId, { 0...0 })
await apiLoadMessages(
chatId,
im,
( // pagination
openAroundItemId != nil
? .around(chatItemId: openAroundItemId!, count: loadItemsPerPage)
: (
search == ""
? .initial(count: loadItemsPerPage) : .last(count: loadItemsPerPage)
)
),
search,
openAroundItemId,
{ 0...0 }
)
}
func apiGetChatItemInfo(type: ChatType, id: Int64, itemId: Int64) async throws -> ChatItemInfo {
let r: ChatResponse0 = try await chatSendCmd(.apiGetChatItemInfo(type: type, id: id, itemId: itemId))
func apiGetChatItemInfo(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64) async throws -> ChatItemInfo {
let r: ChatResponse0 = try await chatSendCmd(.apiGetChatItemInfo(type: type, id: id, scope: scope, itemId: itemId))
if case let .chatItemInfo(_, _, chatItemInfo) = r { return chatItemInfo }
throw r.unexpected
}
func apiPlanForwardChatItems(type: ChatType, id: Int64, itemIds: [Int64]) async throws -> ([Int64], ForwardConfirmation?) {
let r: ChatResponse1 = try await chatSendCmd(.apiPlanForwardChatItems(toChatType: type, toChatId: id, itemIds: itemIds))
func apiPlanForwardChatItems(type: ChatType, id: Int64, scope: GroupChatScope?, itemIds: [Int64]) async throws -> ([Int64], ForwardConfirmation?) {
let r: ChatResponse1 = try await chatSendCmd(.apiPlanForwardChatItems(fromChatType: type, fromChatId: id, fromScope: scope, itemIds: itemIds))
if case let .forwardPlan(_, chatItemIds, forwardConfimation) = r { return (chatItemIds, forwardConfimation) }
throw r.unexpected
}
func apiForwardChatItems(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemIds: [Int64], ttl: Int?) async -> [ChatItem]? {
let cmd: ChatCommand = .apiForwardChatItems(toChatType: toChatType, toChatId: toChatId, fromChatType: fromChatType, fromChatId: fromChatId, itemIds: itemIds, ttl: ttl)
func apiForwardChatItems(toChatType: ChatType, toChatId: Int64, toScope: GroupChatScope?, fromChatType: ChatType, fromChatId: Int64, fromScope: GroupChatScope?, itemIds: [Int64], ttl: Int?) async -> [ChatItem]? {
let cmd: ChatCommand = .apiForwardChatItems(toChatType: toChatType, toChatId: toChatId, toScope: toScope, fromChatType: fromChatType, fromChatId: fromChatId, fromScope: fromScope, itemIds: itemIds, ttl: ttl)
return await processSendMessageCmd(toChatType: toChatType, cmd: cmd)
}
@ -412,8 +423,8 @@ func apiReorderChatTags(tagIds: [Int64]) async throws {
try await sendCommandOkResp(.apiReorderChatTags(tagIds: tagIds))
}
func apiSendMessages(type: ChatType, id: Int64, live: Bool = false, ttl: Int? = nil, composedMessages: [ComposedMessage]) async -> [ChatItem]? {
let cmd: ChatCommand = .apiSendMessages(type: type, id: id, live: live, ttl: ttl, composedMessages: composedMessages)
func apiSendMessages(type: ChatType, id: Int64, scope: GroupChatScope?, live: Bool = false, ttl: Int? = nil, composedMessages: [ComposedMessage]) async -> [ChatItem]? {
let cmd: ChatCommand = .apiSendMessages(type: type, id: id, scope: scope, live: live, ttl: ttl, composedMessages: composedMessages)
return await processSendMessageCmd(toChatType: type, cmd: cmd)
}
@ -490,8 +501,8 @@ private func createChatItemsErrorAlert(_ r: ChatError) {
)
}
func apiUpdateChatItem(type: ChatType, id: Int64, itemId: Int64, updatedMessage: UpdatedMessage, live: Bool = false) async throws -> ChatItem {
let r: ChatResponse1 = try await chatSendCmd(.apiUpdateChatItem(type: type, id: id, itemId: itemId, updatedMessage: updatedMessage, live: live), bgDelay: msgDelay)
func apiUpdateChatItem(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64, updatedMessage: UpdatedMessage, live: Bool = false) async throws -> ChatItem {
let r: ChatResponse1 = try await chatSendCmd(.apiUpdateChatItem(type: type, id: id, scope: scope, itemId: itemId, updatedMessage: updatedMessage, live: live), bgDelay: msgDelay)
switch r {
case let .chatItemUpdated(_, aChatItem): return aChatItem.chatItem
case let .chatItemNotChanged(_, aChatItem): return aChatItem.chatItem
@ -499,8 +510,8 @@ func apiUpdateChatItem(type: ChatType, id: Int64, itemId: Int64, updatedMessage:
}
}
func apiChatItemReaction(type: ChatType, id: Int64, itemId: Int64, add: Bool, reaction: MsgReaction) async throws -> ChatItem {
let r: ChatResponse1 = try await chatSendCmd(.apiChatItemReaction(type: type, id: id, itemId: itemId, add: add, reaction: reaction), bgDelay: msgDelay)
func apiChatItemReaction(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64, add: Bool, reaction: MsgReaction) async throws -> ChatItem {
let r: ChatResponse1 = try await chatSendCmd(.apiChatItemReaction(type: type, id: id, scope: scope, itemId: itemId, add: add, reaction: reaction), bgDelay: msgDelay)
if case let .chatItemReaction(_, _, reaction) = r { return reaction.chatReaction.chatItem }
throw r.unexpected
}
@ -512,8 +523,8 @@ func apiGetReactionMembers(groupId: Int64, itemId: Int64, reaction: MsgReaction)
throw r.unexpected
}
func apiDeleteChatItems(type: ChatType, id: Int64, itemIds: [Int64], mode: CIDeleteMode) async throws -> [ChatItemDeletion] {
let r: ChatResponse1 = try await chatSendCmd(.apiDeleteChatItem(type: type, id: id, itemIds: itemIds, mode: mode), bgDelay: msgDelay)
func apiDeleteChatItems(type: ChatType, id: Int64, scope: GroupChatScope?, itemIds: [Int64], mode: CIDeleteMode) async throws -> [ChatItemDeletion] {
let r: ChatResponse1 = try await chatSendCmd(.apiDeleteChatItem(type: type, id: id, scope: scope, itemIds: itemIds, mode: mode), bgDelay: msgDelay)
if case let .chatItemsDeleted(_, items, _) = r { return items }
throw r.unexpected
}
@ -1199,6 +1210,13 @@ private func userAddressResponse(_ r: APIResult<ChatResponse1>) throws -> UserCo
}
}
func apiAddMyAddressShortLink() async throws -> UserContactLink {
let userId = try currentUserId("apiAddMyAddressShortLink")
let r: ChatResponse1 = try await chatSendCmd(.apiAddMyAddressShortLink(userId: userId))
if case let .userContactLink(_, contactLink) = r { return contactLink }
throw r.unexpected
}
func userAddressAutoAccept(_ autoAccept: AutoAccept?) async throws -> UserContactLink? {
let userId = try currentUserId("userAddressAutoAccept")
let r: APIResult<ChatResponse1> = await chatApiSendCmd(.apiAddressAutoAccept(userId: userId, autoAccept: autoAccept))
@ -1237,12 +1255,14 @@ func apiRejectContactRequest(contactReqId: Int64) async throws {
throw r.unexpected
}
func apiChatRead(type: ChatType, id: Int64) async throws {
try await sendCommandOkResp(.apiChatRead(type: type, id: id))
func apiChatRead(type: ChatType, id: Int64, scope: GroupChatScope?) async throws {
try await sendCommandOkResp(.apiChatRead(type: type, id: id, scope: scope))
}
func apiChatItemsRead(type: ChatType, id: Int64, itemIds: [Int64]) async throws {
try await sendCommandOkResp(.apiChatItemsRead(type: type, id: id, itemIds: itemIds))
func apiChatItemsRead(type: ChatType, id: Int64, scope: GroupChatScope?, itemIds: [Int64]) async throws -> ChatInfo {
let r: ChatResponse1 = try await chatSendCmd(.apiChatItemsRead(type: type, id: id, scope: scope, itemIds: itemIds))
if case let .itemsReadForChat(_, updatedChatInfo) = r { return updatedChatInfo }
throw r.unexpected
}
func apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool) async throws {
@ -1545,13 +1565,13 @@ func apiGetNetworkStatuses() throws -> [ConnNetworkStatus] {
throw r.unexpected
}
func markChatRead(_ chat: Chat) async {
func markChatRead(_ im: ItemsModel, _ chat: Chat) async {
do {
if chat.chatStats.unreadCount > 0 {
let cInfo = chat.chatInfo
try await apiChatRead(type: cInfo.chatType, id: cInfo.apiId)
try await apiChatRead(type: cInfo.chatType, id: cInfo.apiId, scope: cInfo.groupChatScope())
await MainActor.run {
withAnimation { ChatModel.shared.markAllChatItemsRead(cInfo) }
withAnimation { ChatModel.shared.markAllChatItemsRead(im, cInfo) }
}
}
if chat.chatStats.unreadChat {
@ -1574,11 +1594,12 @@ func markChatUnread(_ chat: Chat, unreadChat: Bool = true) async {
}
}
func apiMarkChatItemsRead(_ cInfo: ChatInfo, _ itemIds: [ChatItem.ID], mentionsRead: Int) async {
func apiMarkChatItemsRead(_ im: ItemsModel, _ cInfo: ChatInfo, _ itemIds: [ChatItem.ID], mentionsRead: Int) async {
do {
try await apiChatItemsRead(type: cInfo.chatType, id: cInfo.apiId, itemIds: itemIds)
DispatchQueue.main.async {
ChatModel.shared.markChatItemsRead(cInfo, itemIds, mentionsRead)
let updatedChatInfo = try await apiChatItemsRead(type: cInfo.chatType, id: cInfo.apiId, scope: cInfo.groupChatScope(), itemIds: itemIds)
await MainActor.run {
ChatModel.shared.updateChatInfo(updatedChatInfo)
ChatModel.shared.markChatItemsRead(im, cInfo, itemIds, mentionsRead)
}
} catch {
logger.error("apiChatItemsRead error: \(responseError(error))")
@ -1626,9 +1647,21 @@ func apiJoinGroup(_ groupId: Int64) async throws -> JoinGroupResult {
}
}
func apiRemoveMembers(_ groupId: Int64, _ memberIds: [Int64], _ withMessages: Bool = false) async throws -> [GroupMember] {
func apiAcceptMember(_ groupId: Int64, _ groupMemberId: Int64, _ memberRole: GroupMemberRole) async throws -> (GroupInfo, GroupMember) {
let r: ChatResponse2 = try await chatSendCmd(.apiAcceptMember(groupId: groupId, groupMemberId: groupMemberId, memberRole: memberRole))
if case let .memberAccepted(_, groupInfo, member) = r { return (groupInfo, member) }
throw r.unexpected
}
func apiDeleteMemberSupportChat(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (GroupInfo, GroupMember) {
let r: ChatResponse2 = try await chatSendCmd(.apiDeleteMemberSupportChat(groupId: groupId, groupMemberId: groupMemberId))
if case let .memberSupportChatDeleted(_, groupInfo, member) = r { return (groupInfo, member) }
throw r.unexpected
}
func apiRemoveMembers(_ groupId: Int64, _ memberIds: [Int64], _ withMessages: Bool = false) async throws -> (GroupInfo, [GroupMember]) {
let r: ChatResponse2 = try await chatSendCmd(.apiRemoveMembers(groupId: groupId, memberIds: memberIds, withMessages: withMessages), bgTask: false)
if case let .userDeletedMembers(_, _, members, withMessages) = r { return members }
if case let .userDeletedMembers(_, updatedGroupInfo, members, _withMessages) = r { return (updatedGroupInfo, members) }
throw r.unexpected
}
@ -1669,8 +1702,8 @@ func apiListMembers(_ groupId: Int64) async -> [GroupMember] {
func filterMembersToAdd(_ ms: [GMember]) -> [Contact] {
let memberContactIds = ms.compactMap{ m in m.wrapped.memberCurrent ? m.wrapped.memberContactId : nil }
return ChatModel.shared.chats
.compactMap{ $0.chatInfo.contact }
.filter{ c in c.sendMsgEnabled && !c.nextSendGrpInv && !memberContactIds.contains(c.apiId) }
.compactMap{ c in c.chatInfo.sendMsgEnabled ? c.chatInfo.contact : nil }
.filter{ c in !c.nextSendGrpInv && !memberContactIds.contains(c.apiId) }
.sorted{ $0.displayName.lowercased() < $1.displayName.lowercased() }
}
@ -1710,6 +1743,12 @@ func apiGetGroupLink(_ groupId: Int64) throws -> (CreatedConnLink, GroupMemberRo
}
}
func apiAddGroupShortLink(_ groupId: Int64) async throws -> (CreatedConnLink, GroupMemberRole) {
let r: ChatResponse2 = try await chatSendCmd(.apiAddGroupShortLink(groupId: groupId))
if case let .groupLink(_, _, connLink, memberRole) = r { return (connLink, memberRole) }
throw r.unexpected
}
func apiCreateMemberContact(_ groupId: Int64, _ groupMemberId: Int64) async throws -> Contact {
let r: ChatResponse2 = try await chatSendCmd(.apiCreateMemberContact(groupId: groupId, groupMemberId: groupMemberId))
if case let .newMemberContact(_, contact, _, _) = r { return contact }
@ -2132,7 +2171,7 @@ func processReceivedMsg(_ res: ChatEvent) async {
let cInfo = chatItem.chatInfo
let cItem = chatItem.chatItem
if !cItem.isDeletedContent && active(user) {
await MainActor.run { m.updateChatItem(cInfo, cItem, status: cItem.meta.itemStatus) }
_ = await MainActor.run { m.upsertChatItem(cInfo, cItem) }
}
if let endTask = m.messageDelivery[cItem.id] {
switch cItem.meta.itemStatus {
@ -2180,6 +2219,9 @@ func processReceivedMsg(_ res: ChatEvent) async {
m.decreaseGroupReportsCounter(item.deletedChatItem.chatInfo.id)
}
}
if let updatedChatInfo = items.last?.deletedChatItem.chatInfo {
m.updateChatInfo(updatedChatInfo)
}
}
case let .groupChatItemsDeleted(user, groupInfo, chatItemIDs, _, member_):
await groupChatItemsDeleted(user, groupInfo, chatItemIDs, member_)
@ -2228,6 +2270,13 @@ func processReceivedMsg(_ res: ChatEvent) async {
_ = m.upsertGroupMember(groupInfo, member)
}
}
case let .memberAcceptedByOther(user, groupInfo, _, member):
if active(user) {
await MainActor.run {
_ = m.upsertGroupMember(groupInfo, member)
m.updateGroup(groupInfo)
}
}
case let .deletedMemberUser(user, groupInfo, member, withMessages): // TODO update user member
if active(user) {
await MainActor.run {
@ -2240,6 +2289,7 @@ func processReceivedMsg(_ res: ChatEvent) async {
case let .deletedMember(user, groupInfo, byMember, deletedMember, withMessages):
if active(user) {
await MainActor.run {
m.updateGroup(groupInfo)
_ = m.upsertGroupMember(groupInfo, deletedMember)
if withMessages {
m.removeMemberItems(deletedMember, byMember: byMember, groupInfo)
@ -2249,6 +2299,7 @@ func processReceivedMsg(_ res: ChatEvent) async {
case let .leftMember(user, groupInfo, member):
if active(user) {
await MainActor.run {
m.updateGroup(groupInfo)
_ = m.upsertGroupMember(groupInfo, member)
}
}
@ -2263,6 +2314,12 @@ func processReceivedMsg(_ res: ChatEvent) async {
await MainActor.run {
m.updateGroup(groupInfo)
}
if m.chatId == groupInfo.id,
case .memberSupport(nil) = m.secondaryIM?.groupScopeInfo {
await MainActor.run {
m.secondaryPendingInviteeChatOpened = false
}
}
}
case let .joinedGroupMember(user, groupInfo, member):
if active(user) {
@ -2549,7 +2606,7 @@ func groupChatItemsDeleted(_ user: UserRef, _ groupInfo: GroupInfo, _ chatItemID
return
}
let im = ItemsModel.shared
let cInfo = ChatInfo.group(groupInfo: groupInfo)
let cInfo = ChatInfo.group(groupInfo: groupInfo, groupChatScope: nil)
await MainActor.run {
m.decreaseGroupReportsCounter(cInfo.id, by: chatItemIDs.count)
}

View file

@ -159,7 +159,7 @@ struct SimpleXApp: App {
if let id = chatModel.chatId,
let chat = chatModel.getChat(id),
!NtfManager.shared.navigatingToChat {
Task { await loadChat(chat: chat, clearItems: false) }
Task { await loadChat(chat: chat, im: ItemsModel.shared, clearItems: false) }
}
if let ncr = chatModel.ntfContactRequest {
await MainActor.run { chatModel.ntfContactRequest = nil }

View file

@ -22,11 +22,28 @@ struct ChatInfoToolbar: View {
Image(systemName: "theatermasks").frame(maxWidth: 24, maxHeight: 24, alignment: .center).foregroundColor(.indigo)
Spacer().frame(width: 16)
}
ChatInfoImage(
chat: chat,
size: imageSize,
color: Color(uiColor: .tertiaryLabel)
)
ZStack(alignment: .bottomTrailing) {
ChatInfoImage(
chat: chat,
size: imageSize,
color: Color(uiColor: .tertiaryLabel)
)
if chat.chatStats.reportsCount > 0 {
Image(systemName: "flag.circle.fill")
.resizable()
.scaledToFit()
.frame(width: 14, height: 14)
.symbolRenderingMode(.palette)
.foregroundStyle(.white, .red)
} else if chat.supportUnreadCount > 0 {
Image(systemName: "flag.circle.fill")
.resizable()
.scaledToFit()
.frame(width: 14, height: 14)
.symbolRenderingMode(.palette)
.foregroundStyle(.white, theme.colors.primary)
}
}
.padding(.trailing, 4)
let t = Text(cInfo.displayName).font(.headline)
(cInfo.contact?.verified == true ? contactVerifiedShield + t : t)

View file

@ -687,7 +687,7 @@ struct ChatTTLOption: View {
let m = ChatModel.shared
do {
try await setChatTTL(chatType: chat.chatInfo.chatType, id: chat.chatInfo.apiId, ttl)
await loadChat(chat: chat, clearItems: true)
await loadChat(chat: chat, im: ItemsModel.shared, clearItems: true)
await MainActor.run {
progressIndicator = false
currentChatItemTTL = chatItemTTL
@ -700,7 +700,7 @@ struct ChatTTLOption: View {
}
catch let error {
logger.error("setChatTTL error \(responseError(error))")
await loadChat(chat: chat, clearItems: true)
await loadChat(chat: chat, im: ItemsModel.shared, clearItems: true)
await MainActor.run {
chatItemTTL = currentChatItemTTL
progressIndicator = false
@ -938,7 +938,7 @@ struct ChatWallpaperEditorSheet: View {
self.chat = chat
self.themes = if case let ChatInfo.direct(contact) = chat.chatInfo, let uiThemes = contact.uiThemes {
uiThemes
} else if case let ChatInfo.group(groupInfo) = chat.chatInfo, let uiThemes = groupInfo.uiThemes {
} else if case let ChatInfo.group(groupInfo, _) = chat.chatInfo, let uiThemes = groupInfo.uiThemes {
uiThemes
} else {
ThemeModeOverrides()
@ -974,7 +974,7 @@ struct ChatWallpaperEditorSheet: View {
private func themesFromChat(_ chat: Chat) -> ThemeModeOverrides {
if case let ChatInfo.direct(contact) = chat.chatInfo, let uiThemes = contact.uiThemes {
uiThemes
} else if case let ChatInfo.group(groupInfo) = chat.chatInfo, let uiThemes = groupInfo.uiThemes {
} else if case let ChatInfo.group(groupInfo, _) = chat.chatInfo, let uiThemes = groupInfo.uiThemes {
uiThemes
} else {
ThemeModeOverrides()
@ -1052,12 +1052,12 @@ struct ChatWallpaperEditorSheet: View {
chat.wrappedValue = Chat.init(chatInfo: ChatInfo.direct(contact: contact))
themes = themesFromChat(chat.wrappedValue)
}
} else if case var ChatInfo.group(groupInfo) = chat.wrappedValue.chatInfo {
} else if case var ChatInfo.group(groupInfo, _) = chat.wrappedValue.chatInfo {
groupInfo.uiThemes = changedThemesConstant
await MainActor.run {
ChatModel.shared.updateChatInfo(ChatInfo.group(groupInfo: groupInfo))
chat.wrappedValue = Chat.init(chatInfo: ChatInfo.group(groupInfo: groupInfo))
ChatModel.shared.updateChatInfo(ChatInfo.group(groupInfo: groupInfo, groupChatScope: nil))
chat.wrappedValue = Chat.init(chatInfo: ChatInfo.group(groupInfo: groupInfo, groupChatScope: nil))
themes = themesFromChat(chat.wrappedValue)
}
}

View file

@ -12,8 +12,8 @@ import SimpleXChat
struct CIChatFeatureView: View {
@EnvironmentObject var m: ChatModel
@Environment(\.revealed) var revealed: Bool
@ObservedObject var im = ItemsModel.shared
@ObservedObject var chat: Chat
@ObservedObject var im: ItemsModel
@EnvironmentObject var theme: AppTheme
var chatItem: ChatItem
var feature: Feature
@ -53,7 +53,7 @@ struct CIChatFeatureView: View {
private func mergedFeatures() -> [FeatureInfo]? {
var fs: [FeatureInfo] = []
var icons: Set<String> = []
if var i = m.getChatItemIndex(chatItem) {
if var i = m.getChatItemIndex(im, chatItem) {
while i < im.reversedChatItems.count,
let f = featureInfo(im.reversedChatItems[i]) {
if !icons.contains(f.icon) {
@ -108,6 +108,7 @@ struct CIChatFeatureView_Previews: PreviewProvider {
let enabled = FeatureEnabled(forUser: false, forContact: false)
CIChatFeatureView(
chat: Chat.sampleData,
im: ItemsModel.shared,
chatItem: ChatItem.getChatFeatureSample(.fullDelete, enabled), feature: ChatFeature.fullDelete, iconColor: enabled.iconColor(.secondary)
).environment(\.revealed, true)
}

View file

@ -278,6 +278,7 @@ func showFileErrorAlert(_ err: FileError, temporary: Bool = false) {
struct CIFileView_Previews: PreviewProvider {
static var previews: some View {
let im = ItemsModel.shared
let sentFile: ChatItem = ChatItem(
chatDir: .directSnd,
meta: CIMeta.getSample(1, .now, "", .sndSent(sndProgress: .complete), itemEdited: true),
@ -293,16 +294,16 @@ struct CIFileView_Previews: PreviewProvider {
file: nil
)
Group {
ChatItemView(chat: Chat.sampleData, chatItem: sentFile, scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileName: "some_long_file_name_here", fileStatus: .rcvInvitation), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvAccepted), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvCancelled), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileSize: 1_000_000_000, fileStatus: .rcvInvitation), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(text: "Hello there", fileStatus: .rcvInvitation), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", fileStatus: .rcvInvitation), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: fileChatItemWtFile, scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, im: im, chatItem: sentFile, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(fileName: "some_long_file_name_here", fileStatus: .rcvInvitation), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvAccepted), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvCancelled), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(fileSize: 1_000_000_000, fileStatus: .rcvInvitation), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(text: "Hello there", fileStatus: .rcvInvitation), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getFileMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", fileStatus: .rcvInvitation), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: fileChatItemWtFile, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
}
.environment(\.revealed, false)
.previewLayout(.fixed(width: 360, height: 360))

View file

@ -12,7 +12,7 @@ import SimpleXChat
struct CIImageView: View {
@EnvironmentObject var m: ChatModel
let chatItem: ChatItem
var scrollToItemId: ((ChatItem.ID) -> Void)? = nil
var scrollToItem: ((ChatItem.ID) -> Void)? = nil
var preview: UIImage?
let maxWidth: CGFloat
var imgWidth: CGFloat?
@ -26,7 +26,7 @@ struct CIImageView: View {
if let uiImage = getLoadedImage(file) {
Group { if smallView { smallViewImageView(uiImage) } else { imageView(uiImage) } }
.fullScreenCover(isPresented: $showFullScreenImage) {
FullScreenMediaView(chatItem: chatItem, scrollToItemId: scrollToItemId, image: uiImage, showView: $showFullScreenImage)
FullScreenMediaView(chatItem: chatItem, scrollToItem: scrollToItem, image: uiImage, showView: $showFullScreenImage)
}
.if(!smallView) { view in
view.modifier(PrivacyBlur(blurred: $blurred))

View file

@ -45,7 +45,7 @@ struct CIRcvDecryptionError: View {
viewBody()
.onAppear {
// for direct chat ConnectionStats are populated on opening chat, see ChatView onAppear
if case let .group(groupInfo) = chat.chatInfo,
if case let .group(groupInfo, _) = chat.chatInfo,
case let .groupRcv(groupMember) = chatItem.chatDir {
do {
let (member, stats) = try apiGroupMemberInfoSync(groupInfo.apiId, groupMember.groupMemberId)
@ -83,7 +83,7 @@ struct CIRcvDecryptionError: View {
} else {
basicDecryptionErrorItem()
}
} else if case let .group(groupInfo) = chat.chatInfo,
} else if case let .group(groupInfo, _) = chat.chatInfo,
case let .groupRcv(groupMember) = chatItem.chatDir,
let mem = m.getGroupMember(groupMember.groupMemberId),
let memberStats = mem.wrapped.activeConn?.connectionStats {

View file

@ -435,6 +435,7 @@ class VoiceItemState {
struct CIVoiceView_Previews: PreviewProvider {
static var previews: some View {
let im = ItemsModel.shared
let sentVoiceMessage: ChatItem = ChatItem(
chatDir: .directSnd,
meta: CIMeta.getSample(1, .now, "", .sndSent(sndProgress: .complete), itemEdited: true),
@ -457,10 +458,10 @@ struct CIVoiceView_Previews: PreviewProvider {
duration: 30,
allowMenu: Binding.constant(true)
)
ChatItemView(chat: Chat.sampleData, chatItem: sentVoiceMessage, scrollToItemId: { _ in }, allowMenu: .constant(true))
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(), scrollToItemId: { _ in }, allowMenu: .constant(true))
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), scrollToItemId: { _ in }, allowMenu: .constant(true))
ChatItemView(chat: Chat.sampleData, chatItem: voiceMessageWtFile, scrollToItemId: { _ in }, allowMenu: .constant(true))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: sentVoiceMessage, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil), allowMenu: .constant(true))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getVoiceMsgContentSample(), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil), allowMenu: .constant(true))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getVoiceMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil), allowMenu: .constant(true))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: voiceMessageWtFile, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil), allowMenu: .constant(true))
}
.previewLayout(.fixed(width: 360, height: 360))
}

View file

@ -77,6 +77,7 @@ struct FramedCIVoiceView: View {
struct FramedCIVoiceView_Previews: PreviewProvider {
static var previews: some View {
let im = ItemsModel.shared
let sentVoiceMessage: ChatItem = ChatItem(
chatDir: .directSnd,
meta: CIMeta.getSample(1, .now, "", .sndSent(sndProgress: .complete), itemEdited: true),
@ -92,11 +93,11 @@ struct FramedCIVoiceView_Previews: PreviewProvider {
file: CIFile.getSample(fileStatus: .sndComplete)
)
Group {
ChatItemView(chat: Chat.sampleData, chatItem: sentVoiceMessage, scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there"), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there", fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: voiceMessageWithQuote, scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, im: im, chatItem: sentVoiceMessage, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there"), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there", fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getVoiceMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: voiceMessageWithQuote, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
}
.environment(\.revealed, false)
.previewLayout(.fixed(width: 360, height: 360))

File diff suppressed because one or more lines are too long

View file

@ -14,7 +14,7 @@ import AVKit
struct FullScreenMediaView: View {
@EnvironmentObject var m: ChatModel
@State var chatItem: ChatItem
var scrollToItemId: ((ChatItem.ID) -> Void)?
var scrollToItem: ((ChatItem.ID) -> Void)?
@State var image: UIImage?
@State var player: AVPlayer? = nil
@State var url: URL? = nil
@ -71,7 +71,7 @@ struct FullScreenMediaView: View {
let w = abs(t.width)
if t.height > 60 && t.height > w * 2 {
showView = false
scrollToItemId?(chatItem.id)
scrollToItem?(chatItem.id)
} else if w > 60 && w > abs(t.height) * 2 && !scrolling {
let previous = t.width > 0
scrolling = true

View file

@ -14,6 +14,7 @@ struct MarkedDeletedItemView: View {
@EnvironmentObject var theme: AppTheme
@Environment(\.revealed) var revealed: Bool
@ObservedObject var chat: Chat
@ObservedObject var im: ItemsModel
var chatItem: ChatItem
var body: some View {
@ -29,14 +30,14 @@ struct MarkedDeletedItemView: View {
var mergedMarkedDeletedText: LocalizedStringKey {
if !revealed,
let ciCategory = chatItem.mergeCategory,
var i = m.getChatItemIndex(chatItem) {
var i = m.getChatItemIndex(im, chatItem) {
var moderated = 0
var blocked = 0
var blockedByAdmin = 0
var deleted = 0
var moderatedBy: Set<String> = []
while i < ItemsModel.shared.reversedChatItems.count,
let ci = .some(ItemsModel.shared.reversedChatItems[i]),
while i < im.reversedChatItems.count,
let ci = .some(im.reversedChatItems[i]),
ci.mergeCategory == ciCategory,
let itemDeleted = ci.meta.itemDeleted {
switch itemDeleted {
@ -85,6 +86,7 @@ struct MarkedDeletedItemView_Previews: PreviewProvider {
Group {
MarkedDeletedItemView(
chat: Chat.sampleData,
im: ItemsModel.shared,
chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now))
).environment(\.revealed, true)
}

View file

@ -40,25 +40,31 @@ extension EnvironmentValues {
struct ChatItemView: View {
@ObservedObject var chat: Chat
@ObservedObject var im: ItemsModel
@EnvironmentObject var theme: AppTheme
@Environment(\.showTimestamp) var showTimestamp: Bool
@Environment(\.revealed) var revealed: Bool
var chatItem: ChatItem
var scrollToItemId: (ChatItem.ID) -> Void
var scrollToItem: (ChatItem.ID) -> Void
@Binding var scrollToItemId: ChatItem.ID?
var maxWidth: CGFloat = .infinity
@Binding var allowMenu: Bool
init(
chat: Chat,
im: ItemsModel,
chatItem: ChatItem,
scrollToItemId: @escaping (ChatItem.ID) -> Void,
scrollToItem: @escaping (ChatItem.ID) -> Void,
scrollToItemId: Binding<ChatItem.ID?> = .constant(nil),
showMember: Bool = false,
maxWidth: CGFloat = .infinity,
allowMenu: Binding<Bool> = .constant(false)
) {
self.chat = chat
self.im = im
self.chatItem = chatItem
self.scrollToItemId = scrollToItemId
self.scrollToItem = scrollToItem
_scrollToItemId = scrollToItemId
self.maxWidth = maxWidth
_allowMenu = allowMenu
}
@ -66,14 +72,14 @@ struct ChatItemView: View {
var body: some View {
let ci = chatItem
if chatItem.meta.itemDeleted != nil && (!revealed || chatItem.isDeletedContent) {
MarkedDeletedItemView(chat: chat, chatItem: chatItem)
MarkedDeletedItemView(chat: chat, im: im, chatItem: chatItem)
} 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 {
CIVoiceView(chat: chat, chatItem: ci, recordingFile: ci.file, duration: duration, allowMenu: $allowMenu)
} else if ci.content.msgContent == nil {
ChatItemContentView(chat: chat, chatItem: chatItem, msgContentView: { Text(ci.text) }) // msgContent is unreachable branch in this case
ChatItemContentView(chat: chat, im: im, chatItem: chatItem, msgContentView: { Text(ci.text) }) // msgContent is unreachable branch in this case
} else {
framedItemView()
}
@ -101,8 +107,10 @@ struct ChatItemView: View {
}()
return FramedItemView(
chat: chat,
im: im,
chatItem: chatItem,
scrollToItemId: scrollToItemId,
scrollToItem: scrollToItem,
scrollToItemId: $scrollToItemId,
preview: preview,
maxWidth: maxWidth,
imgWidth: adjustedMaxWidth,
@ -117,6 +125,7 @@ struct ChatItemContentView<Content: View>: View {
@EnvironmentObject var theme: AppTheme
@Environment(\.revealed) var revealed: Bool
@ObservedObject var chat: Chat
@ObservedObject var im: ItemsModel
var chatItem: ChatItem
var msgContentView: () -> Content
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@ -140,7 +149,9 @@ struct ChatItemContentView<Content: View>: View {
case let .sndGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole)
case .rcvDirectEvent: eventItemView()
case .rcvGroupEvent(.memberCreatedContact): CIMemberCreatedContactView(chatItem: chatItem)
case .rcvGroupEvent(.newMemberPendingReview): CIEventView(eventText: pendingReviewEventItemText())
case .rcvGroupEvent: eventItemView()
case .sndGroupEvent(.userPendingReview): CIEventView(eventText: pendingReviewEventItemText())
case .sndGroupEvent: eventItemView()
case .rcvConnEvent: eventItemView()
case .sndConnEvent: eventItemView()
@ -149,7 +160,7 @@ 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(chat: chat, chatItem: chatItem, feature: feature, icon: feature.icon, iconColor: theme.colors.secondary)
CIChatFeatureView(chat: chat, im: im, chatItem: chatItem, feature: feature, icon: feature.icon, iconColor: theme.colors.secondary)
case let .rcvGroupFeature(feature, preference, _, role): chatFeatureView(feature, preference.enabled(role, for: chat.chatInfo.groupInfo?.membership).iconColor(theme.colors.secondary))
case let .sndGroupFeature(feature, preference, _, role): chatFeatureView(feature, preference.enabled(role, for: chat.chatInfo.groupInfo?.membership).iconColor(theme.colors.secondary))
case let .rcvChatFeatureRejected(feature): chatFeatureView(feature, .red)
@ -181,6 +192,13 @@ struct ChatItemContentView<Content: View>: View {
CIEventView(eventText: eventItemViewText(theme.colors.secondary))
}
private func pendingReviewEventItemText() -> Text {
Text(chatItem.content.text)
.font(.caption)
.foregroundColor(theme.colors.secondary)
.fontWeight(.bold)
}
private func eventItemViewText(_ secondaryColor: Color) -> Text {
if !revealed, let t = mergedGroupEventText {
return chatEventText(t + textSpace + chatItem.timestampText, secondaryColor)
@ -196,7 +214,7 @@ struct ChatItemContentView<Content: View>: View {
}
private func chatFeatureView(_ feature: Feature, _ iconColor: Color) -> some View {
CIChatFeatureView(chat: chat, chatItem: chatItem, feature: feature, iconColor: iconColor)
CIChatFeatureView(chat: chat, im: im, chatItem: chatItem, feature: feature, iconColor: iconColor)
}
private var mergedGroupEventText: Text? {
@ -256,16 +274,17 @@ func chatEventText(_ ci: ChatItem, _ secondaryColor: Color) -> Text {
struct ChatItemView_Previews: PreviewProvider {
static var previews: some View {
let im = ItemsModel.shared
Group{
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello"), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too"), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂"), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂"), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂🙂"), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getDeletedContentSample(), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)), scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete), itemLive: true), scrollToItemId: { _ in }).environment(\.revealed, true)
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemLive: true), scrollToItemId: { _ in }).environment(\.revealed, true)
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello"), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too"), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂"), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂"), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂🙂"), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getDeletedContentSample(), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete), itemLive: true), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil)).environment(\.revealed, true)
ChatItemView(chat: Chat.sampleData, im: im, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemLive: true), scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil)).environment(\.revealed, true)
}
.environment(\.revealed, false)
.previewLayout(.fixed(width: 360, height: 70))
@ -275,10 +294,12 @@ struct ChatItemView_Previews: PreviewProvider {
struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
static var previews: some View {
let im = ItemsModel.shared
let ciFeatureContent = CIContent.rcvChatFeature(feature: .fullDelete, enabled: FeatureEnabled(forUser: false, forContact: false), param: nil)
Group{
ChatItemView(
chat: Chat.sampleData,
im: im,
chatItem: ChatItem(
chatDir: .directRcv,
meta: CIMeta.getSample(1, .now, "1 skipped message", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
@ -286,10 +307,12 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
quotedItem: nil,
file: nil
),
scrollToItemId: { _ in }
scrollToItem: { _ in },
scrollToItemId: Binding.constant(nil)
)
ChatItemView(
chat: Chat.sampleData,
im: im,
chatItem: ChatItem(
chatDir: .directRcv,
meta: CIMeta.getSample(1, .now, "1 skipped message", .rcvRead),
@ -297,10 +320,11 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
quotedItem: nil,
file: nil
),
scrollToItemId: { _ in }
scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil)
)
ChatItemView(
chat: Chat.sampleData,
im: im,
chatItem: ChatItem(
chatDir: .directRcv,
meta: CIMeta.getSample(1, .now, "received invitation to join group team as admin", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
@ -308,10 +332,12 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
quotedItem: nil,
file: nil
),
scrollToItemId: { _ in }
scrollToItem: { _ in },
scrollToItemId: Binding.constant(nil)
)
ChatItemView(
chat: Chat.sampleData,
im: im,
chatItem: ChatItem(
chatDir: .directRcv,
meta: CIMeta.getSample(1, .now, "group event text", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
@ -319,10 +345,12 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
quotedItem: nil,
file: nil
),
scrollToItemId: { _ in }
scrollToItem: { _ in },
scrollToItemId: Binding.constant(nil)
)
ChatItemView(
chat: Chat.sampleData,
im: im,
chatItem: ChatItem(
chatDir: .directRcv,
meta: CIMeta.getSample(1, .now, ciFeatureContent.text, .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
@ -330,7 +358,8 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
quotedItem: nil,
file: nil
),
scrollToItemId: { _ in }
scrollToItem: { _ in },
scrollToItemId: Binding.constant(nil)
)
}
.environment(\.revealed, true)

View file

@ -13,8 +13,8 @@ let TRIM_KEEP_COUNT = 200
func apiLoadMessages(
_ chatId: ChatId,
_ im: ItemsModel,
_ pagination: ChatPagination,
_ chatState: ActiveChatState,
_ search: String = "",
_ openAroundItemId: ChatItem.ID? = nil,
_ visibleItemIndexesNonReversed: @MainActor () -> ClosedRange<Int> = { 0 ... 0 }
@ -22,7 +22,7 @@ func apiLoadMessages(
let chat: Chat
let navInfo: NavigationInfo
do {
(chat, navInfo) = try await apiGetChat(chatId: chatId, pagination: pagination, search: search)
(chat, navInfo) = try await apiGetChat(chatId: chatId, scope: im.groupScopeInfo?.toChatScope(), contentTag: im.contentTag, pagination: pagination, search: search)
} catch let error {
logger.error("apiLoadMessages error: \(responseError(error))")
return
@ -38,30 +38,31 @@ func apiLoadMessages(
return
}
let unreadAfterItemId = chatState.unreadAfterItemId
let unreadAfterItemId = im.chatState.unreadAfterItemId
let oldItems = Array(ItemsModel.shared.reversedChatItems.reversed())
let oldItems = Array(im.reversedChatItems.reversed())
var newItems: [ChatItem] = []
switch pagination {
case .initial:
let newSplits: [Int64] = if !chat.chatItems.isEmpty && navInfo.afterTotal > 0 { [chat.chatItems.last!.id] } else { [] }
if chatModel.getChat(chat.id) == nil {
if im.secondaryIMFilter == nil && chatModel.getChat(chat.id) == nil {
chatModel.addChat(chat)
}
await MainActor.run {
chatModel.chatItemStatuses.removeAll()
ItemsModel.shared.reversedChatItems = chat.chatItems.reversed()
chatModel.updateChatInfo(chat.chatInfo)
chatState.splits = newSplits
if !chat.chatItems.isEmpty {
chatState.unreadAfterItemId = chat.chatItems.last!.id
im.reversedChatItems = chat.chatItems.reversed()
if im.secondaryIMFilter == nil {
chatModel.updateChatInfo(chat.chatInfo)
}
chatState.totalAfter = navInfo.afterTotal
chatState.unreadTotal = chat.chatStats.unreadCount
chatState.unreadAfter = navInfo.afterUnread
chatState.unreadAfterNewestLoaded = navInfo.afterUnread
im.chatState.splits = newSplits
if !chat.chatItems.isEmpty {
im.chatState.unreadAfterItemId = chat.chatItems.last!.id
}
im.chatState.totalAfter = navInfo.afterTotal
im.chatState.unreadTotal = chat.chatStats.unreadCount
im.chatState.unreadAfter = navInfo.afterUnread
im.chatState.unreadAfterNewestLoaded = navInfo.afterUnread
PreloadState.shared.clear()
im.preloadState.clear()
}
case let .before(paginationChatItemId, _):
newItems.append(contentsOf: oldItems)
@ -71,15 +72,15 @@ func apiLoadMessages(
let wasSize = newItems.count
let visibleItemIndexes = await MainActor.run { visibleItemIndexesNonReversed() }
let modifiedSplits = removeDuplicatesAndModifySplitsOnBeforePagination(
unreadAfterItemId, &newItems, newIds, chatState.splits, visibleItemIndexes
unreadAfterItemId, &newItems, newIds, im.chatState.splits, visibleItemIndexes
)
let insertAt = max((indexInCurrentItems - (wasSize - newItems.count) + modifiedSplits.trimmedIds.count), 0)
newItems.insert(contentsOf: chat.chatItems, at: insertAt)
let newReversed: [ChatItem] = newItems.reversed()
await MainActor.run {
ItemsModel.shared.reversedChatItems = newReversed
chatState.splits = modifiedSplits.newSplits
chatState.moveUnreadAfterItem(modifiedSplits.oldUnreadSplitIndex, modifiedSplits.newUnreadSplitIndex, oldItems)
im.reversedChatItems = newReversed
im.chatState.splits = modifiedSplits.newSplits
im.chatState.moveUnreadAfterItem(modifiedSplits.oldUnreadSplitIndex, modifiedSplits.newUnreadSplitIndex, oldItems)
}
case let .after(paginationChatItemId, _):
newItems.append(contentsOf: oldItems)
@ -89,7 +90,7 @@ func apiLoadMessages(
let mappedItems = mapItemsToIds(chat.chatItems)
let newIds = mappedItems.0
let (newSplits, unreadInLoaded) = removeDuplicatesAndModifySplitsOnAfterPagination(
mappedItems.1, paginationChatItemId, &newItems, newIds, chat, chatState.splits
mappedItems.1, paginationChatItemId, &newItems, newIds, chat, im.chatState.splits
)
let indexToAdd = min(indexInCurrentItems + 1, newItems.count)
let indexToAddIsLast = indexToAdd == newItems.count
@ -97,19 +98,19 @@ func apiLoadMessages(
let new: [ChatItem] = newItems
let newReversed: [ChatItem] = newItems.reversed()
await MainActor.run {
ItemsModel.shared.reversedChatItems = newReversed
chatState.splits = newSplits
chatState.moveUnreadAfterItem(chatState.splits.first ?? new.last!.id, new)
im.reversedChatItems = newReversed
im.chatState.splits = newSplits
im.chatState.moveUnreadAfterItem(im.chatState.splits.first ?? new.last!.id, new)
// loading clear bottom area, updating number of unread items after the newest loaded item
if indexToAddIsLast {
chatState.unreadAfterNewestLoaded -= unreadInLoaded
im.chatState.unreadAfterNewestLoaded -= unreadInLoaded
}
}
case .around:
var newSplits: [Int64]
if openAroundItemId == nil {
newItems.append(contentsOf: oldItems)
newSplits = await removeDuplicatesAndUpperSplits(&newItems, chat, chatState.splits, visibleItemIndexesNonReversed)
newSplits = await removeDuplicatesAndUpperSplits(&newItems, chat, im.chatState.splits, visibleItemIndexesNonReversed)
} else {
newSplits = []
}
@ -120,33 +121,37 @@ func apiLoadMessages(
let newReversed: [ChatItem] = newItems.reversed()
let orderedSplits = newSplits
await MainActor.run {
ItemsModel.shared.reversedChatItems = newReversed
chatState.splits = orderedSplits
chatState.unreadAfterItemId = chat.chatItems.last!.id
chatState.totalAfter = navInfo.afterTotal
chatState.unreadTotal = chat.chatStats.unreadCount
chatState.unreadAfter = navInfo.afterUnread
im.reversedChatItems = newReversed
im.chatState.splits = orderedSplits
im.chatState.unreadAfterItemId = chat.chatItems.last!.id
im.chatState.totalAfter = navInfo.afterTotal
im.chatState.unreadTotal = chat.chatStats.unreadCount
im.chatState.unreadAfter = navInfo.afterUnread
if let openAroundItemId {
chatState.unreadAfterNewestLoaded = navInfo.afterUnread
ChatModel.shared.openAroundItemId = openAroundItemId
ChatModel.shared.chatId = chatId
im.chatState.unreadAfterNewestLoaded = navInfo.afterUnread
if im.secondaryIMFilter == nil {
ChatModel.shared.openAroundItemId = openAroundItemId // TODO [knocking] move openAroundItemId from ChatModel to ItemsModel?
ChatModel.shared.chatId = chat.id
}
} else {
// no need to set it, count will be wrong
// chatState.unreadAfterNewestLoaded = navInfo.afterUnread
}
PreloadState.shared.clear()
im.preloadState.clear()
}
case .last:
newItems.append(contentsOf: oldItems)
let newSplits = await removeDuplicatesAndUnusedSplits(&newItems, chat, chatState.splits)
let newSplits = await removeDuplicatesAndUnusedSplits(&newItems, chat, im.chatState.splits)
newItems.append(contentsOf: chat.chatItems)
let items = newItems
await MainActor.run {
ItemsModel.shared.reversedChatItems = items.reversed()
chatState.splits = newSplits
chatModel.updateChatInfo(chat.chatInfo)
chatState.unreadAfterNewestLoaded = 0
im.reversedChatItems = items.reversed()
im.chatState.splits = newSplits
if im.secondaryIMFilter == nil {
chatModel.updateChatInfo(chat.chatInfo)
}
im.chatState.unreadAfterNewestLoaded = 0
}
}
}

View file

@ -10,6 +10,7 @@ import SwiftUI
import SimpleXChat
struct MergedItems: Hashable, Equatable {
let im: ItemsModel
let items: [MergedItem]
let splits: [SplitRange]
// chat item id, index in list
@ -23,15 +24,15 @@ struct MergedItems: Hashable, Equatable {
hasher.combine("\(items.hashValue)")
}
static func create(_ items: [ChatItem], _ revealedItems: Set<Int64>, _ chatState: ActiveChatState) -> MergedItems {
if items.isEmpty {
return MergedItems(items: [], splits: [], indexInParentItems: [:])
static func create(_ im: ItemsModel, _ revealedItems: Set<Int64>) -> MergedItems {
if im.reversedChatItems.isEmpty {
return MergedItems(im: im, items: [], splits: [], indexInParentItems: [:])
}
let unreadCount = chatState.unreadTotal
let unreadCount = im.chatState.unreadTotal
let unreadAfterItemId = chatState.unreadAfterItemId
let itemSplits = chatState.splits
let unreadAfterItemId = im.chatState.unreadAfterItemId
let itemSplits = im.chatState.splits
var mergedItems: [MergedItem] = []
// Indexes of splits here will be related to reversedChatItems, not chatModel.chatItems
var splitRanges: [SplitRange] = []
@ -40,19 +41,19 @@ struct MergedItems: Hashable, Equatable {
var unclosedSplitIndex: Int? = nil
var unclosedSplitIndexInParent: Int? = nil
var visibleItemIndexInParent = -1
var unreadBefore = unreadCount - chatState.unreadAfterNewestLoaded
var unreadBefore = unreadCount - im.chatState.unreadAfterNewestLoaded
var lastRevealedIdsInMergedItems: BoxedValue<[Int64]>? = nil
var lastRangeInReversedForMergedItems: BoxedValue<ClosedRange<Int>>? = nil
var recent: MergedItem? = nil
while index < items.count {
let item = items[index]
let prev = index >= 1 ? items[index - 1] : nil
let next = index + 1 < items.count ? items[index + 1] : nil
while index < im.reversedChatItems.count {
let item = im.reversedChatItems[index]
let prev = index >= 1 ? im.reversedChatItems[index - 1] : nil
let next = index + 1 < im.reversedChatItems.count ? im.reversedChatItems[index + 1] : nil
let category = item.mergeCategory
let itemIsSplit = itemSplits.contains(item.id)
if item.id == unreadAfterItemId {
unreadBefore = unreadCount - chatState.unreadAfter
unreadBefore = unreadCount - im.chatState.unreadAfter
}
if item.isRcvNew {
unreadBefore -= 1
@ -106,18 +107,19 @@ struct MergedItems: Hashable, Equatable {
// found item that is considered as a split
if let unclosedSplitIndex, let unclosedSplitIndexInParent {
// it was at least second split in the list
splitRanges.append(SplitRange(itemId: items[unclosedSplitIndex].id, indexRangeInReversed: unclosedSplitIndex ... index - 1, indexRangeInParentItems: unclosedSplitIndexInParent ... visibleItemIndexInParent - 1))
splitRanges.append(SplitRange(itemId: im.reversedChatItems[unclosedSplitIndex].id, indexRangeInReversed: unclosedSplitIndex ... index - 1, indexRangeInParentItems: unclosedSplitIndexInParent ... visibleItemIndexInParent - 1))
}
unclosedSplitIndex = index
unclosedSplitIndexInParent = visibleItemIndexInParent
} else if index + 1 == items.count, let unclosedSplitIndex, let unclosedSplitIndexInParent {
} else if index + 1 == im.reversedChatItems.count, let unclosedSplitIndex, let unclosedSplitIndexInParent {
// just one split for the whole list, there will be no more, it's the end
splitRanges.append(SplitRange(itemId: items[unclosedSplitIndex].id, indexRangeInReversed: unclosedSplitIndex ... index, indexRangeInParentItems: unclosedSplitIndexInParent ... visibleItemIndexInParent))
splitRanges.append(SplitRange(itemId: im.reversedChatItems[unclosedSplitIndex].id, indexRangeInReversed: unclosedSplitIndex ... index, indexRangeInParentItems: unclosedSplitIndexInParent ... visibleItemIndexInParent))
}
indexInParentItems[item.id] = visibleItemIndexInParent
index += 1
}
return MergedItems(
im: im,
items: mergedItems,
splits: splitRanges,
indexInParentItems: indexInParentItems
@ -127,7 +129,6 @@ struct MergedItems: Hashable, Equatable {
// Use this check to ensure that mergedItems state based on currently actual state of global
// splits and reversedChatItems
func isActualState() -> Bool {
let im = ItemsModel.shared
// do not load anything if global splits state is different than in merged items because it
// will produce undefined results in terms of loading and placement of items.
// Same applies to reversedChatItems
@ -434,7 +435,7 @@ class BoxedValue<T: Hashable>: Equatable, Hashable {
}
@MainActor
func visibleItemIndexesNonReversed(_ listState: EndlessScrollView<MergedItem>.ListState, _ mergedItems: MergedItems) -> ClosedRange<Int> {
func visibleItemIndexesNonReversed(_ im: ItemsModel, _ listState: EndlessScrollView<MergedItem>.ListState, _ mergedItems: MergedItems) -> ClosedRange<Int> {
let zero = 0 ... 0
let items = mergedItems.items
if items.isEmpty {
@ -445,12 +446,12 @@ func visibleItemIndexesNonReversed(_ listState: EndlessScrollView<MergedItem>.Li
guard let newest, let oldest else {
return zero
}
let size = ItemsModel.shared.reversedChatItems.count
let size = im.reversedChatItems.count
let range = size - oldest ... size - newest
if range.lowerBound < 0 || range.upperBound < 0 {
return zero
}
// visible items mapped to their underlying data structure which is ItemsModel.shared.reversedChatItems.reversed()
// visible items mapped to their underlying data structure which is im.reversedChatItems.reversed()
return range
}

View file

@ -9,7 +9,7 @@
import SwiftUI
import SimpleXChat
func loadLastItems(_ loadingMoreItems: Binding<Bool>, loadingBottomItems: Binding<Bool>, _ chat: Chat) async {
func loadLastItems(_ loadingMoreItems: Binding<Bool>, loadingBottomItems: Binding<Bool>, _ chat: Chat, _ im: ItemsModel) async {
await MainActor.run {
loadingMoreItems.wrappedValue = true
loadingBottomItems.wrappedValue = true
@ -22,27 +22,15 @@ func loadLastItems(_ loadingMoreItems: Binding<Bool>, loadingBottomItems: Bindin
}
return
}
await apiLoadMessages(chat.chatInfo.id, ChatPagination.last(count: 50), ItemsModel.shared.chatState)
await apiLoadMessages(chat.chatInfo.id, im, ChatPagination.last(count: 50))
await MainActor.run {
loadingMoreItems.wrappedValue = false
loadingBottomItems.wrappedValue = false
}
}
class PreloadState {
static let shared = PreloadState()
var prevFirstVisible: Int64 = Int64.min
var prevItemsCount: Int = 0
var preloading: Bool = false
func clear() {
prevFirstVisible = Int64.min
prevItemsCount = 0
preloading = false
}
}
func preloadIfNeeded(
_ im: ItemsModel,
_ allowLoadMoreItems: Binding<Bool>,
_ ignoreLoadingRequests: Binding<Int64?>,
_ listState: EndlessScrollView<MergedItem>.ListState,
@ -50,7 +38,7 @@ func preloadIfNeeded(
loadItems: @escaping (Bool, ChatPagination) async -> Bool,
loadLastItems: @escaping () async -> Void
) {
let state = PreloadState.shared
let state = im.preloadState
guard !listState.isScrolling && !listState.isAnimatedScrolling,
!state.preloading,
listState.totalItemsCount > 0
@ -63,7 +51,7 @@ func preloadIfNeeded(
Task {
defer { state.preloading = false }
var triedToLoad = true
await preloadItems(mergedItems.boxedValue, allowLoadMore, listState, ignoreLoadingRequests) { pagination in
await preloadItems(im, mergedItems.boxedValue, allowLoadMore, listState, ignoreLoadingRequests) { pagination in
triedToLoad = await loadItems(false, pagination)
return triedToLoad
}
@ -73,11 +61,11 @@ func preloadIfNeeded(
}
// it's important to ask last items when the view is fully covered with items. Otherwise, visible items from one
// split will be merged with last items and position of scroll will change unexpectedly.
if listState.itemsCanCoverScreen && !ItemsModel.shared.lastItemsLoaded {
if listState.itemsCanCoverScreen && !im.lastItemsLoaded {
await loadLastItems()
}
}
} else if listState.itemsCanCoverScreen && !ItemsModel.shared.lastItemsLoaded {
} else if listState.itemsCanCoverScreen && !im.lastItemsLoaded {
state.preloading = true
Task {
defer { state.preloading = false }
@ -87,6 +75,7 @@ func preloadIfNeeded(
}
func preloadItems(
_ im: ItemsModel,
_ mergedItems: MergedItems,
_ allowLoadMoreItems: Bool,
_ listState: EndlessScrollView<MergedItem>.ListState,
@ -105,7 +94,7 @@ async {
let splits = mergedItems.splits
let lastVisibleIndex = listState.lastVisibleItemIndex
var lastIndexToLoadFrom: Int? = findLastIndexToLoadFromInSplits(firstVisibleIndex, lastVisibleIndex, remaining, splits)
let items: [ChatItem] = ItemsModel.shared.reversedChatItems.reversed()
let items: [ChatItem] = im.reversedChatItems.reversed()
if splits.isEmpty && !items.isEmpty && lastVisibleIndex > mergedItems.items.count - remaining {
lastIndexToLoadFrom = items.count - 1
}
@ -122,7 +111,7 @@ async {
let sizeWas = items.count
let firstItemIdWas = items.first?.id
let triedToLoad = await loadItems(ChatPagination.before(chatItemId: loadFromItemId, count: ChatPagination.PRELOAD_COUNT))
if triedToLoad && sizeWas == ItemsModel.shared.reversedChatItems.count && firstItemIdWas == ItemsModel.shared.reversedChatItems.last?.id {
if triedToLoad && sizeWas == im.reversedChatItems.count && firstItemIdWas == im.reversedChatItems.last?.id {
ignoreLoadingRequests.wrappedValue = loadFromItemId
return false
}
@ -133,7 +122,7 @@ async {
let splits = mergedItems.splits
let split = splits.last(where: { $0.indexRangeInParentItems.contains(firstVisibleIndex) })
// we're inside a splitRange (top --- [end of the splitRange --- we're here --- start of the splitRange] --- bottom)
let reversedItems: [ChatItem] = ItemsModel.shared.reversedChatItems
let reversedItems: [ChatItem] = im.reversedChatItems
if let split, split.indexRangeInParentItems.lowerBound + remaining > firstVisibleIndex {
let index = split.indexRangeInReversed.lowerBound
if index >= 0 {

File diff suppressed because it is too large Load diff

View file

@ -323,6 +323,7 @@ struct ComposeView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@ObservedObject var chat: Chat
@ObservedObject var im: ItemsModel
@Binding var composeState: ComposeState
@Binding var keyboardVisible: Bool
@Binding var keyboardHiddenDate: Date
@ -356,6 +357,20 @@ struct ComposeView: View {
var body: some View {
VStack(spacing: 0) {
Divider()
if let groupInfo = chat.chatInfo.groupInfo,
case let .groupChatScopeContext(groupScopeInfo) = im.secondaryIMFilter,
case let .memberSupport(member) = groupScopeInfo,
let member = member,
member.memberPending,
composeState.contextItem == .noContextItem,
composeState.noPreview {
ContextPendingMemberActionsView(
groupInfo: groupInfo,
member: member
)
Divider()
}
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
ContextInvitingContactMemberView()
Divider()
@ -366,8 +381,8 @@ struct ComposeView: View {
Divider()
}
// preference checks should match checks in forwarding list
let simplexLinkProhibited = hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks)
let fileProhibited = composeState.attachmentPreview && !chat.groupFeatureEnabled(.files)
let simplexLinkProhibited = im.secondaryIMFilter == nil && hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks)
let fileProhibited = im.secondaryIMFilter == nil && composeState.attachmentPreview && !chat.groupFeatureEnabled(.files)
let voiceProhibited = composeState.voicePreview && !chat.chatInfo.featureEnabled(.voice)
if simplexLinkProhibited {
msgNotAllowedView("SimpleX links not allowed", icon: "link")
@ -397,7 +412,8 @@ struct ComposeView: View {
.padding(.bottom, 16)
.padding(.leading, 12)
.tint(theme.colors.primary)
if case let .group(g) = chat.chatInfo,
if im.secondaryIMFilter == nil,
case let .group(g, _) = chat.chatInfo,
!g.fullGroupPreferences.files.on(for: g.membership) {
b.disabled(true).onTapGesture {
AlertManager.shared.showAlertMsg(
@ -438,8 +454,8 @@ struct ComposeView: View {
keyboardVisible: $keyboardVisible,
keyboardHiddenDate: $keyboardHiddenDate,
sendButtonColor: chat.chatInfo.incognito
? .indigo.opacity(colorScheme == .dark ? 1 : 0.7)
: theme.colors.primary
? .indigo.opacity(colorScheme == .dark ? 1 : 0.7)
: theme.colors.primary
)
.padding(.trailing, 12)
.disabled(!chat.chatInfo.sendMsgEnabled)
@ -939,6 +955,7 @@ struct ComposeView: View {
let chatItem = try await apiUpdateChatItem(
type: chat.chatInfo.chatType,
id: chat.chatInfo.apiId,
scope: chat.chatInfo.groupChatScope(),
itemId: ei.id,
updatedMessage: UpdatedMessage(msgContent: mc, mentions: composeState.memberMentions),
live: live
@ -1001,9 +1018,9 @@ struct ComposeView: View {
reportReason: reportReason,
reportText: msgText
) {
await MainActor.run {
for chatItem in chatItems {
chatModel.addChatItem(chat.chatInfo, chatItem)
if showReportsInSupportChatAlertDefault.get() {
await MainActor.run {
showReportsInSupportChatAlert()
}
}
return chatItems.first
@ -1011,7 +1028,27 @@ struct ComposeView: View {
return nil
}
func showReportsInSupportChatAlert() {
showAlert(
NSLocalizedString("Report sent to moderators", comment: "alert title"),
message: NSLocalizedString("You can view your reports in Chat with admins.", comment: "alert message"),
actions: {[
UIAlertAction(
title: NSLocalizedString("Don't show again", comment: "alert action"),
style: .default,
handler: { _ in
showReportsInSupportChatAlertDefault.set(false)
}
),
UIAlertAction(
title: NSLocalizedString("Ok", comment: "alert action"),
style: .default
)
]}
)
}
func send(_ mc: MsgContent, quoted: Int64?, file: CryptoFile? = nil, live: Bool = false, ttl: Int?, mentions: [String: Int64]) async -> ChatItem? {
await send(
[ComposedMessage(fileSource: file, quotedItemId: quoted, msgContent: mc, mentions: mentions)],
@ -1026,6 +1063,7 @@ struct ComposeView: View {
: await apiSendMessages(
type: chat.chatInfo.chatType,
id: chat.chatInfo.apiId,
scope: chat.chatInfo.groupChatScope(),
live: live,
ttl: ttl,
composedMessages: msgs
@ -1050,8 +1088,10 @@ struct ComposeView: View {
if let chatItems = await apiForwardChatItems(
toChatType: chat.chatInfo.chatType,
toChatId: chat.chatInfo.apiId,
toScope: chat.chatInfo.groupChatScope(),
fromChatType: fromChatInfo.chatType,
fromChatId: fromChatInfo.apiId,
fromScope: fromChatInfo.groupChatScope(),
itemIds: forwardedItems.map { $0.id },
ttl: ttl
) {
@ -1272,12 +1312,14 @@ struct ComposeView: View {
struct ComposeView_Previews: PreviewProvider {
static var previews: some View {
let chat = Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])
let im = ItemsModel.shared
@State var composeState = ComposeState(message: "hello")
@State var selectedRange = NSRange()
return Group {
ComposeView(
chat: chat,
im: im,
composeState: $composeState,
keyboardVisible: Binding.constant(true),
keyboardHiddenDate: Binding.constant(Date.now),
@ -1286,6 +1328,7 @@ struct ComposeView_Previews: PreviewProvider {
.environmentObject(ChatModel())
ComposeView(
chat: chat,
im: im,
composeState: $composeState,
keyboardVisible: Binding.constant(true),
keyboardHiddenDate: Binding.constant(Date.now),

View file

@ -0,0 +1,108 @@
//
// ContextPendingMemberActionsView.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 02.05.2025.
// Copyright © 2025 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct ContextPendingMemberActionsView: View {
@EnvironmentObject var theme: AppTheme
@Environment(\.dismiss) var dismiss
var groupInfo: GroupInfo
var member: GroupMember
var body: some View {
HStack(spacing: 0) {
ZStack {
Text("Reject")
.foregroundColor(.red)
}
.frame(maxWidth: .infinity)
.contentShape(Rectangle())
.onTapGesture {
showRejectMemberAlert(groupInfo, member, dismiss: dismiss)
}
ZStack {
Text("Accept")
.foregroundColor(theme.colors.primary)
}
.frame(maxWidth: .infinity)
.contentShape(Rectangle())
.onTapGesture {
showAcceptMemberAlert(groupInfo, member, dismiss: dismiss)
}
}
.frame(minHeight: 54)
.frame(maxWidth: .infinity)
.background(.thinMaterial)
}
}
func showRejectMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) {
showAlert(
title: NSLocalizedString("Reject member?", comment: "alert title"),
buttonTitle: "Reject",
buttonAction: { removeMember(groupInfo, member, dismiss: dismiss) },
cancelButton: true
)
}
func showAcceptMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) {
showAlert(
NSLocalizedString("Accept member", comment: "alert title"),
message: NSLocalizedString("Member will join the group, accept member?", comment: "alert message"),
actions: {[
UIAlertAction(
title: NSLocalizedString("Accept as member", comment: "alert action"),
style: .default,
handler: { _ in
acceptMember(groupInfo, member, .member, dismiss: dismiss)
}
),
UIAlertAction(
title: NSLocalizedString("Accept as observer", comment: "alert action"),
style: .default,
handler: { _ in
acceptMember(groupInfo, member, .observer, dismiss: dismiss)
}
),
UIAlertAction(
title: NSLocalizedString("Cancel", comment: "alert action"),
style: .default
)
]}
)
}
func acceptMember(_ groupInfo: GroupInfo, _ member: GroupMember, _ role: GroupMemberRole, dismiss: DismissAction? = nil) {
Task {
do {
let (gInfo, acceptedMember) = try await apiAcceptMember(groupInfo.groupId, member.groupMemberId, role)
await MainActor.run {
_ = ChatModel.shared.upsertGroupMember(gInfo, acceptedMember)
ChatModel.shared.updateGroup(gInfo)
dismiss?()
}
} catch let error {
logger.error("apiAcceptMember error: \(responseError(error))")
await MainActor.run {
showAlert(
NSLocalizedString("Error accepting member", comment: "alert title"),
message: responseError(error)
)
}
}
}
}
#Preview {
ContextPendingMemberActionsView(
groupInfo: GroupInfo.sampleData,
member: GroupMember.sampleData
)
}

View file

@ -78,6 +78,12 @@ struct AddGroupMembersViewCommon: View {
let count = selectedContacts.count
Section {
if creatingGroup {
MemberAdmissionButton(
groupInfo: $groupInfo,
admission: groupInfo.groupProfile.memberAdmission_,
currentAdmission: groupInfo.groupProfile.memberAdmission_,
creatingGroup: true
)
GroupPreferencesButton(
groupInfo: $groupInfo,
preferences: groupInfo.fullGroupPreferences,

View file

@ -17,6 +17,7 @@ struct GroupChatInfoView: View {
@Environment(\.dismiss) var dismiss: DismissAction
@ObservedObject var chat: Chat
@Binding var groupInfo: GroupInfo
@Binding var scrollToItemId: ChatItem.ID?
var onSearch: () -> Void
@State var localAlias: String
@FocusState private var aliasTextFieldFocused: Bool
@ -87,7 +88,25 @@ struct GroupChatInfoView: View {
.listRowBackground(Color.clear)
.listRowSeparator(.hidden)
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
Section {
if groupInfo.canAddMembers && groupInfo.businessChat == nil {
groupLinkButton()
}
if groupInfo.businessChat == nil && groupInfo.membership.memberRole >= .moderator {
memberSupportButton()
}
if groupInfo.canModerate {
GroupReportsChatNavLink(chat: chat, scrollToItemId: $scrollToItemId)
}
if groupInfo.membership.memberActive
&& (groupInfo.membership.memberRole < .moderator || groupInfo.membership.supportChat != nil) {
UserSupportChatNavLink(chat: chat, groupInfo: groupInfo, scrollToItemId: $scrollToItemId)
}
} header: {
Text("")
}
Section {
if groupInfo.isOwner && groupInfo.businessChat == nil {
editGroupButton()
@ -96,19 +115,6 @@ struct GroupChatInfoView: View {
addOrEditWelcomeMessage()
}
GroupPreferencesButton(groupInfo: $groupInfo, preferences: groupInfo.fullGroupPreferences, currentPreferences: groupInfo.fullGroupPreferences)
if members.filter({ $0.wrapped.memberCurrent }).count <= SMALL_GROUPS_RCPS_MEM_LIMIT {
sendReceiptsOption()
} else {
sendReceiptsOptionDisabled()
}
NavigationLink {
ChatWallpaperEditorSheet(chat: chat)
} label: {
Label("Chat theme", systemImage: "photo")
}
} header: {
Text("")
} footer: {
let label: LocalizedStringKey = (
groupInfo.businessChat == nil
@ -120,6 +126,16 @@ struct GroupChatInfoView: View {
}
Section {
if members.filter({ $0.wrapped.memberCurrent }).count <= SMALL_GROUPS_RCPS_MEM_LIMIT {
sendReceiptsOption()
} else {
sendReceiptsOptionDisabled()
}
NavigationLink {
ChatWallpaperEditorSheet(chat: chat)
} label: {
Label("Chat theme", systemImage: "photo")
}
ChatTTLOption(chat: chat, progressIndicator: $progressIndicator)
} footer: {
Text("Delete chat messages from your device.")
@ -127,9 +143,6 @@ struct GroupChatInfoView: View {
Section(header: Text("\(members.count + 1) members").foregroundColor(theme.colors.secondary)) {
if groupInfo.canAddMembers {
if groupInfo.businessChat == nil {
groupLinkButton()
}
if (chat.chatInfo.incognito) {
Label("Invite members", systemImage: "plus")
.foregroundColor(Color(uiColor: .tertiaryLabel))
@ -144,9 +157,16 @@ struct GroupChatInfoView: View {
let filteredMembers = s == ""
? members
: members.filter { $0.wrapped.localAliasAndFullName.localizedLowercase.contains(s) }
MemberRowView(chat: chat, groupInfo: groupInfo, groupMember: GMember(groupInfo.membership), user: true, alert: $alert)
MemberRowView(
chat: chat,
groupInfo: groupInfo,
groupMember: GMember(groupInfo.membership),
scrollToItemId: $scrollToItemId,
user: true,
alert: $alert
)
ForEach(filteredMembers) { member in
MemberRowView(chat: chat, groupInfo: groupInfo, groupMember: member, alert: $alert)
MemberRowView(chat: chat, groupInfo: groupInfo, groupMember: member, scrollToItemId: $scrollToItemId, alert: $alert)
}
}
@ -155,7 +175,7 @@ struct GroupChatInfoView: View {
if groupInfo.canDelete {
deleteGroupButton()
}
if groupInfo.membership.memberCurrent {
if groupInfo.membership.memberCurrentOrPending {
leaveGroupButton()
}
}
@ -353,6 +373,7 @@ struct GroupChatInfoView: View {
var chat: Chat
var groupInfo: GroupInfo
@ObservedObject var groupMember: GMember
@Binding var scrollToItemId: ChatItem.ID?
@EnvironmentObject var theme: AppTheme
var user: Bool = false
@Binding var alert: GroupChatInfoViewAlert?
@ -415,7 +436,7 @@ struct GroupChatInfoView: View {
}
private func memberInfoView() -> some View {
GroupMemberInfoView(groupInfo: groupInfo, chat: chat, groupMember: groupMember)
GroupMemberInfoView(groupInfo: groupInfo, chat: chat, groupMember: groupMember, scrollToItemId: $scrollToItemId)
.navigationBarHidden(false)
}
@ -523,15 +544,95 @@ struct GroupChatInfoView: View {
.navigationBarTitleDisplayMode(.large)
}
struct UserSupportChatNavLink: View {
@ObservedObject var chat: Chat
@EnvironmentObject var theme: AppTheme
var groupInfo: GroupInfo
@EnvironmentObject var chatModel: ChatModel
@Binding var scrollToItemId: ChatItem.ID?
@State private var navLinkActive = false
var body: some View {
let scopeInfo: GroupChatScopeInfo = .memberSupport(groupMember_: nil)
NavigationLink(isActive: $navLinkActive) {
SecondaryChatView(
chat: Chat(chatInfo: .group(groupInfo: groupInfo, groupChatScope: scopeInfo), chatItems: [], chatStats: ChatStats()),
scrollToItemId: $scrollToItemId
)
} label: {
HStack {
Label("Chat with admins", systemImage: chat.supportUnreadCount > 0 ? "flag.fill" : "flag")
Spacer()
if chat.supportUnreadCount > 0 {
UnreadBadge(count: chat.supportUnreadCount, color: theme.colors.primary)
}
}
}
.onChange(of: navLinkActive) { active in
if active {
ItemsModel.loadSecondaryChat(groupInfo.id, chatFilter: .groupChatScopeContext(groupScopeInfo: scopeInfo))
}
}
}
}
private func memberSupportButton() -> some View {
NavigationLink {
MemberSupportView(groupInfo: groupInfo, scrollToItemId: $scrollToItemId)
.navigationBarTitle("Chats with members")
.modifier(ThemedBackground())
.navigationBarTitleDisplayMode(.large)
} label: {
HStack {
Label(
"Chats with members",
systemImage: chat.supportUnreadCount > 0 ? "flag.fill" : "flag"
)
Spacer()
if chat.supportUnreadCount > 0 {
UnreadBadge(count: chat.supportUnreadCount, color: theme.colors.primary)
}
}
}
}
struct GroupReportsChatNavLink: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@State private var navLinkActive = false
@ObservedObject var chat: Chat
@Binding var scrollToItemId: ChatItem.ID?
var body: some View {
NavigationLink(isActive: $navLinkActive) {
SecondaryChatView(chat: chat, scrollToItemId: $scrollToItemId)
} label: {
HStack {
Label {
Text("Member reports")
} icon: {
Image(systemName: chat.chatStats.reportsCount > 0 ? "flag.fill" : "flag").foregroundColor(.red)
}
Spacer()
if chat.chatStats.reportsCount > 0 {
UnreadBadge(count: chat.chatStats.reportsCount, color: .red)
}
}
}
.onChange(of: navLinkActive) { active in
if active {
ItemsModel.loadSecondaryChat(chat.id, chatFilter: .msgContentTagContext(contentTag: .report))
}
}
}
}
private func editGroupButton() -> some View {
NavigationLink {
GroupProfileView(
groupInfo: $groupInfo,
groupProfile: groupInfo.groupProfile
)
.navigationBarTitle("Group profile")
.modifier(ThemedBackground())
.navigationBarTitleDisplayMode(.large)
} label: {
Label("Edit group profile", systemImage: "pencil")
}
@ -683,26 +784,36 @@ struct GroupChatInfoView: View {
title: Text("Remove member?"),
message: Text(messageLabel),
primaryButton: .destructive(Text("Remove")) {
Task {
do {
let updatedMembers = try await apiRemoveMembers(groupInfo.groupId, [mem.groupMemberId])
await MainActor.run {
updatedMembers.forEach { updatedMember in
_ = chatModel.upsertGroupMember(groupInfo, updatedMember)
}
}
} catch let error {
logger.error("apiRemoveMembers error: \(responseError(error))")
let a = getErrorAlert(error, "Error removing member")
alert = .error(title: a.title, error: a.message)
}
}
removeMember(groupInfo, mem)
},
secondaryButton: .cancel()
)
}
}
func removeMember(_ groupInfo: GroupInfo, _ mem: GroupMember, dismiss: DismissAction? = nil) {
Task {
do {
let (updatedGroupInfo, updatedMembers) = try await apiRemoveMembers(groupInfo.groupId, [mem.groupMemberId])
await MainActor.run {
ChatModel.shared.updateGroup(updatedGroupInfo)
updatedMembers.forEach { updatedMember in
_ = ChatModel.shared.upsertGroupMember(updatedGroupInfo, updatedMember)
}
dismiss?()
}
} catch let error {
logger.error("apiRemoveMembers error: \(responseError(error))")
await MainActor.run {
showAlert(
NSLocalizedString("Error removing member", comment: "alert title"),
message: responseError(error)
)
}
}
}
}
func deleteGroupAlertMessage(_ groupInfo: GroupInfo) -> Text {
groupInfo.businessChat == nil ? (
groupInfo.membership.memberCurrent ? Text("Group will be deleted for all members - this cannot be undone!") : Text("Group will be deleted for you - this cannot be undone!")
@ -796,6 +907,7 @@ struct GroupChatInfoView_Previews: PreviewProvider {
GroupChatInfoView(
chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []),
groupInfo: Binding.constant(GroupInfo.sampleData),
scrollToItemId: Binding.constant(nil),
onSearch: {},
localAlias: ""
)

View file

@ -35,16 +35,23 @@ struct GroupLinkView: View {
}
var body: some View {
if creatingGroup {
groupLinkView()
.navigationBarBackButtonHidden()
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button ("Continue") { linkCreatedCb?() }
ZStack {
if creatingGroup {
groupLinkView()
.navigationBarBackButtonHidden()
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button ("Continue") { linkCreatedCb?() }
}
}
}
} else {
groupLinkView()
} else {
groupLinkView()
}
if creatingLink {
ProgressView()
.scaleEffect(2)
.frame(maxWidth: .infinity)
}
}
}
@ -79,6 +86,14 @@ struct GroupLinkView: View {
Label("Share link", systemImage: "square.and.arrow.up")
}
if (groupLink.connShortLink == nil && UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_SHORT_LINKS)) {
Button {
addShortLink()
} label: {
Label("Add short link", systemImage: "plus")
}
}
if !creatingGroup {
Button(role: .destructive) { alert = .deleteLink } label: {
Label("Delete link", systemImage: "trash")
@ -89,11 +104,6 @@ struct GroupLinkView: View {
Label("Create link", systemImage: "link.badge.plus")
}
.disabled(creatingLink)
if creatingLink {
ProgressView()
.scaleEffect(2)
.frame(maxWidth: .infinity)
}
}
} header: {
if let groupLink, groupLink.connShortLink != nil {
@ -160,6 +170,26 @@ struct GroupLinkView: View {
}
}
}
private func addShortLink() {
Task {
do {
creatingLink = true
let link = try await apiAddGroupShortLink(groupId)
await MainActor.run {
creatingLink = false
(groupLink, groupLinkMemberRole) = link
}
} catch let error {
logger.error("apiAddGroupShortLink: \(responseError(error))")
await MainActor.run {
creatingLink = false
let a = getErrorAlert(error, "Error adding short link")
alert = .error(title: a.title, error: a.message)
}
}
}
}
}
struct GroupLinkView_Previews: PreviewProvider {

View file

@ -16,6 +16,7 @@ struct GroupMemberInfoView: View {
@State var groupInfo: GroupInfo
@ObservedObject var chat: Chat
@ObservedObject var groupMember: GMember
@Binding var scrollToItemId: ChatItem.ID?
var navigation: Bool = false
@State private var connectionStats: ConnectionStats? = nil
@State private var connectionCode: String? = nil
@ -25,7 +26,6 @@ struct GroupMemberInfoView: View {
@State private var knownContactConnectionStats: ConnectionStats? = nil
@State private var newRole: GroupMemberRole = .member
@State private var alert: GroupMemberInfoViewAlert?
@State private var sheet: PlanAndConnectActionSheet?
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@State private var justOpened = true
@State private var progressIndicator = false
@ -40,7 +40,6 @@ struct GroupMemberInfoView: View {
case switchAddressAlert
case abortSwitchAddressAlert
case syncConnectionForceAlert
case planAndConnectAlert(alert: PlanAndConnectAlert)
case queueInfo(info: String)
case someAlert(alert: SomeAlert)
case error(title: LocalizedStringKey, error: LocalizedStringKey?)
@ -56,7 +55,6 @@ struct GroupMemberInfoView: View {
case .switchAddressAlert: return "switchAddressAlert"
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
case let .planAndConnectAlert(alert): return "planAndConnectAlert \(alert.id)"
case let .queueInfo(info): return "queueInfo \(info)"
case let .someAlert(alert): return "someAlert \(alert.id)"
case let .error(title, _): return "error \(title)"
@ -103,6 +101,10 @@ struct GroupMemberInfoView: View {
if member.memberActive {
Section {
if groupInfo.membership.memberRole >= .moderator
&& (member.memberRole < .moderator || member.supportChat != nil) {
MemberInfoSupportChatNavLink(groupInfo: groupInfo, member: groupMember, scrollToItemId: $scrollToItemId)
}
if let code = connectionCode { verifyCodeButton(code) }
if let connStats = connectionStats,
connStats.ratchetSyncAllowed {
@ -265,20 +267,18 @@ struct GroupMemberInfoView: View {
case .switchAddressAlert: return switchAddressAlert(switchMemberAddress)
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchMemberAddress)
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncMemberConnection(force: true) })
case let .planAndConnectAlert(alert): return planAndConnectAlert(alert, dismiss: true)
case let .queueInfo(info): return queueInfoAlert(info)
case let .someAlert(a): return a.alert
case let .error(title, error): return mkAlert(title: title, message: error)
}
}
.actionSheet(item: $sheet) { s in planAndConnectActionSheet(s, dismiss: true) }
if progressIndicator {
ProgressView().scaleEffect(2)
}
}
.onChange(of: chat.chatInfo) { c in
if case let .group(gI) = chat.chatInfo {
if case let .group(gI, _) = chat.chatInfo {
groupInfo = gI
}
}
@ -345,10 +345,7 @@ struct GroupMemberInfoView: View {
Button {
planAndConnect(
contactLink,
showAlert: { alert = .planAndConnectAlert(alert: $0) },
showActionSheet: { sheet = $0 },
dismiss: true,
incognito: nil
dismiss: true
)
} label: {
Label("Connect", systemImage: "link")
@ -474,6 +471,31 @@ struct GroupMemberInfoView: View {
.frame(maxWidth: .infinity, alignment: .center)
}
struct MemberInfoSupportChatNavLink: View {
@EnvironmentObject var theme: AppTheme
var groupInfo: GroupInfo
var member: GMember
@Binding var scrollToItemId: ChatItem.ID?
@State private var navLinkActive = false
var body: some View {
let scopeInfo: GroupChatScopeInfo = .memberSupport(groupMember_: member.wrapped)
NavigationLink(isActive: $navLinkActive) {
SecondaryChatView(
chat: Chat(chatInfo: .group(groupInfo: groupInfo, groupChatScope: scopeInfo), chatItems: [], chatStats: ChatStats()),
scrollToItemId: $scrollToItemId
)
} label: {
Label("Chat with member", systemImage: "flag")
}
.onChange(of: navLinkActive) { active in
if active {
ItemsModel.loadSecondaryChat(groupInfo.id, chatFilter: .groupChatScopeContext(groupScopeInfo: scopeInfo))
}
}
}
}
private func verifyCodeButton(_ code: String) -> some View {
let member = groupMember.wrapped
return NavigationLink {
@ -610,10 +632,11 @@ struct GroupMemberInfoView: View {
primaryButton: .destructive(Text("Remove")) {
Task {
do {
let updatedMembers = try await apiRemoveMembers(groupInfo.groupId, [mem.groupMemberId])
let (updatedGroupInfo, updatedMembers) = try await apiRemoveMembers(groupInfo.groupId, [mem.groupMemberId])
await MainActor.run {
chatModel.updateGroup(updatedGroupInfo)
updatedMembers.forEach { updatedMember in
_ = chatModel.upsertGroupMember(groupInfo, updatedMember)
_ = chatModel.upsertGroupMember(updatedGroupInfo, updatedMember)
}
dismiss()
}
@ -821,7 +844,8 @@ struct GroupMemberInfoView_Previews: PreviewProvider {
GroupMemberInfoView(
groupInfo: GroupInfo.sampleData,
chat: Chat.sampleData,
groupMember: GMember.sampleData
groupMember: GMember.sampleData,
scrollToItemId: Binding.constant(nil)
)
}
}

View file

@ -17,6 +17,7 @@ let MAX_VISIBLE_MEMBER_ROWS: CGFloat = 4.8
struct GroupMentionsView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
var im: ItemsModel
var groupInfo: GroupInfo
@Binding var composeState: ComposeState
@Binding var selectedRange: NSRange
@ -93,12 +94,31 @@ struct GroupMentionsView: View {
currentMessage = composeState.message
}
}
func contextMemberFilter(_ member: GroupMember) -> Bool {
switch im.secondaryIMFilter {
case nil:
return true
case let .groupChatScopeContext(groupScopeInfo):
switch (groupScopeInfo) {
case let .memberSupport(groupMember_):
if let scopeMember = groupMember_ {
return member.memberRole >= .moderator || member.groupMemberId == scopeMember.groupMemberId
} else {
return member.memberRole >= .moderator
}
}
case .msgContentTagContext:
return false
}
}
private func filteredMembers() -> [GMember] {
let s = mentionName.lowercased()
return s.isEmpty
? sortedMembers
: sortedMembers.filter { $0.wrapped.localAliasAndFullName.localizedLowercase.contains(s) }
return sortedMembers.filter {
contextMemberFilter($0.wrapped)
&& (s.isEmpty || $0.wrapped.localAliasAndFullName.localizedLowercase.contains(s))
}
}
private func messageChanged(_ msg: String, _ parsedMsg: [FormattedText], _ range: NSRange) {

View file

@ -30,6 +30,14 @@ struct GroupPreferencesView: View {
let saveText: LocalizedStringKey = creatingGroup ? "Save" : "Save and notify group members"
VStack {
List {
Section {
MemberAdmissionButton(
groupInfo: $groupInfo,
admission: groupInfo.groupProfile.memberAdmission_,
currentAdmission: groupInfo.groupProfile.memberAdmission_,
creatingGroup: creatingGroup
)
}
featureSection(.timedMessages, $preferences.timedMessages.enable)
featureSection(.fullDelete, $preferences.fullDelete.enable)
featureSection(.directMessages, $preferences.directMessages.enable, $preferences.directMessages.role)
@ -140,6 +148,66 @@ struct GroupPreferencesView: View {
}
}
struct MemberAdmissionButton: View {
@Binding var groupInfo: GroupInfo
@State var admission: GroupMemberAdmission
@State var currentAdmission: GroupMemberAdmission
var creatingGroup: Bool = false
var body: some View {
NavigationLink {
MemberAdmissionView(
groupInfo: $groupInfo,
admission: $admission,
currentAdmission: currentAdmission,
creatingGroup: creatingGroup,
saveAdmission: saveAdmission
)
.navigationBarTitle("Member admission")
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
.onDisappear {
let saveText = NSLocalizedString(
creatingGroup ? "Save" : "Save and notify group members",
comment: "alert button"
)
if groupInfo.groupProfile.memberAdmission_ != admission {
showAlert(
title: NSLocalizedString("Save admission settings?", comment: "alert title"),
buttonTitle: saveText,
buttonAction: { saveAdmission() },
cancelButton: true
)
}
}
} label: {
if creatingGroup {
Text("Set member admission")
} else {
Label("Member admission", systemImage: "switch.2")
}
}
}
private func saveAdmission() {
Task {
do {
var gp = groupInfo.groupProfile
gp.memberAdmission = admission
let gInfo = try await apiUpdateGroup(groupInfo.groupId, gp)
await MainActor.run {
groupInfo = gInfo
ChatModel.shared.updateGroup(gInfo)
currentAdmission = admission
}
} catch {
logger.error("MemberAdmissionView apiUpdateGroup error: \(responseError(error))")
}
}
}
}
struct GroupPreferencesView_Previews: PreviewProvider {
static var previews: some View {
GroupPreferencesView(

View file

@ -26,6 +26,7 @@ struct GroupProfileView: View {
@Environment(\.dismiss) var dismiss: DismissAction
@Binding var groupInfo: GroupInfo
@State var groupProfile: GroupProfile
@State private var currentProfileHash: Int?
@State private var showChooseSource = false
@State private var showImagePicker = false
@State private var showTakePhoto = false
@ -34,60 +35,40 @@ struct GroupProfileView: View {
@FocusState private var focusDisplayName
var body: some View {
return VStack(alignment: .leading) {
Text("Group profile is stored on members' devices, not on the servers.")
.padding(.vertical)
List {
EditProfileImage(profileImage: $groupProfile.image, showChooseSource: $showChooseSource)
.if(!focusDisplayName) { $0.padding(.top) }
ZStack(alignment: .center) {
ZStack(alignment: .topTrailing) {
profileImageView(groupProfile.image)
if groupProfile.image != nil {
Button {
groupProfile.image = nil
} label: {
Image(systemName: "multiply")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 12)
}
}
}
editImageButton { showChooseSource = true }
}
.frame(maxWidth: .infinity, alignment: .center)
VStack(alignment: .leading) {
ZStack(alignment: .topLeading) {
if !validNewProfileName() {
Section {
HStack {
TextField("Group display name", text: $groupProfile.displayName)
.focused($focusDisplayName)
if !validNewProfileName {
Button {
alert = .invalidName(validName: mkValidName(groupProfile.displayName))
} label: {
Image(systemName: "exclamationmark.circle").foregroundColor(.red)
}
} else {
Image(systemName: "exclamationmark.circle").foregroundColor(.clear)
}
profileNameTextEdit("Group display name", $groupProfile.displayName)
.focused($focusDisplayName)
}
.padding(.bottom)
let fullName = groupInfo.groupProfile.fullName
if fullName != "" && fullName != groupProfile.displayName {
profileNameTextEdit("Group full name (optional)", $groupProfile.fullName)
.padding(.bottom)
}
HStack(spacing: 20) {
Button("Cancel") { dismiss() }
Button("Save group profile") { saveProfile() }
.disabled(!canUpdateProfile())
TextField("Group full name (optional)", text: $groupProfile.fullName)
}
} footer: {
Text("Group profile is stored on members' devices, not on the servers.")
}
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
Section {
Button("Reset") {
groupProfile = groupInfo.groupProfile
currentProfileHash = groupProfile.hashValue
}
.disabled(currentProfileHash == groupProfile.hashValue)
Button("Save group profile", action: saveProfile)
.disabled(!canUpdateProfile)
}
}
.padding()
.frame(maxHeight: .infinity, alignment: .top)
.confirmationDialog("Group image", isPresented: $showChooseSource, titleVisibility: .visible) {
Button("Take picture") {
showTakePhoto = true
@ -95,6 +76,11 @@ struct GroupProfileView: View {
Button("Choose from library") {
showImagePicker = true
}
if UIPasteboard.general.hasImages {
Button("Paste image") {
chosenImage = UIPasteboard.general.image
}
}
}
.fullScreenCover(isPresented: $showTakePhoto) {
ZStack {
@ -120,8 +106,20 @@ struct GroupProfileView: View {
}
}
.onAppear {
currentProfileHash = groupProfile.hashValue
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
focusDisplayName = true
withAnimation { focusDisplayName = true }
}
}
.onDisappear {
if canUpdateProfile {
showAlert(
title: NSLocalizedString("Save group profile?", comment: "alert title"),
message: NSLocalizedString("Group profile was changed. If you save it, the updated profile will be sent to group members.", comment: "alert message"),
buttonTitle: NSLocalizedString("Save (and notify members)", comment: "alert button"),
buttonAction: saveProfile,
cancelButton: true
)
}
}
.alert(item: $alert) { a in
@ -135,30 +133,30 @@ struct GroupProfileView: View {
return createInvalidNameAlert(name, $groupProfile.displayName)
}
}
.contentShape(Rectangle())
.onTapGesture { hideKeyboard() }
.navigationBarTitle("Group profile")
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(focusDisplayName ? .inline : .large)
}
private func canUpdateProfile() -> Bool {
groupProfile.displayName.trimmingCharacters(in: .whitespaces) != "" && validNewProfileName()
private var canUpdateProfile: Bool {
currentProfileHash != groupProfile.hashValue &&
groupProfile.displayName.trimmingCharacters(in: .whitespaces) != "" &&
validNewProfileName
}
private func validNewProfileName() -> Bool {
private var validNewProfileName: Bool {
groupProfile.displayName == groupInfo.groupProfile.displayName
|| validDisplayName(groupProfile.displayName.trimmingCharacters(in: .whitespaces))
}
func profileNameTextEdit(_ label: LocalizedStringKey, _ name: Binding<String>) -> some View {
TextField(label, text: name)
.padding(.leading, 32)
}
func saveProfile() {
Task {
do {
groupProfile.displayName = groupProfile.displayName.trimmingCharacters(in: .whitespaces)
groupProfile.fullName = groupProfile.fullName.trimmingCharacters(in: .whitespaces)
let gInfo = try await apiUpdateGroup(groupInfo.groupId, groupProfile)
await MainActor.run {
currentProfileHash = groupProfile.hashValue
groupInfo = gInfo
chatModel.updateGroup(gInfo)
dismiss()

View file

@ -0,0 +1,93 @@
//
// MemberAdmissionView.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 28.04.2025.
// Copyright © 2025 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
private let memberCriterias: [(criteria: MemberCriteria?, text: LocalizedStringKey)] = [
(nil, "off"),
(.all, "all")
]
struct MemberAdmissionView: View {
@Environment(\.dismiss) var dismiss: DismissAction
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@Binding var groupInfo: GroupInfo
@Binding var admission: GroupMemberAdmission
var currentAdmission: GroupMemberAdmission
let creatingGroup: Bool
let saveAdmission: () -> Void
@State private var showSaveDialogue = false
var body: some View {
let saveText: LocalizedStringKey = creatingGroup ? "Save" : "Save and notify group members"
VStack {
List {
admissionSection(
NSLocalizedString("Review members", comment: "admission stage"),
NSLocalizedString("Review members before admitting (\"knocking\").", comment: "admission stage description"),
$admission.review
)
if groupInfo.isOwner {
Section {
Button("Reset") { admission = currentAdmission }
Button(saveText) { saveAdmission() }
}
.disabled(currentAdmission == admission)
}
}
}
.modifier(BackButton(disabled: Binding.constant(false)) {
if currentAdmission == admission {
dismiss()
} else {
showSaveDialogue = true
}
})
.confirmationDialog("Save admission settings?", isPresented: $showSaveDialogue) {
Button(saveText) {
saveAdmission()
dismiss()
}
Button("Exit without saving") {
admission = currentAdmission
dismiss()
}
}
}
private func admissionSection(_ admissionStageStr: String, _ admissionStageDescrStr: String, _ memberCriteria: Binding<MemberCriteria?>) -> some View {
Section {
if groupInfo.isOwner {
Picker(admissionStageStr, selection: memberCriteria) {
ForEach(memberCriterias, id: \.criteria) { mc in
Text(mc.text)
}
}
.frame(height: 36)
} else {
infoRow(Text(admissionStageStr), memberCriteria.wrappedValue?.text ?? NSLocalizedString("off", comment: "member criteria value"))
}
} footer: {
Text(admissionStageDescrStr)
.foregroundColor(theme.colors.secondary)
}
}
}
#Preview {
MemberAdmissionView(
groupInfo: Binding.constant(GroupInfo.sampleData),
admission: Binding.constant(GroupMemberAdmission.sampleData),
currentAdmission: GroupMemberAdmission.sampleData,
creatingGroup: false,
saveAdmission: {}
)
}

View file

@ -0,0 +1,44 @@
//
// MemberSupportChatToolbar.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 01.05.2025.
// Copyright © 2025 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct MemberSupportChatToolbar: View {
@Environment(\.colorScheme) var colorScheme
@EnvironmentObject var theme: AppTheme
var groupMember: GroupMember
var imageSize: CGFloat = 32
var body: some View {
return HStack {
MemberProfileImage(groupMember, size: imageSize)
.padding(.trailing, 4)
let t = Text(groupMember.chatViewName).font(.headline)
(groupMember.verified ? memberVerifiedShield + t : t)
.lineLimit(1)
}
.foregroundColor(theme.colors.onBackground)
.frame(width: 220)
}
private var memberVerifiedShield: Text {
(Text(Image(systemName: "checkmark.shield")) + textSpace)
.font(.caption)
.foregroundColor(theme.colors.secondary)
.baselineOffset(1)
.kerning(-2)
}
}
#Preview {
MemberSupportChatToolbar(
groupMember: GroupMember.sampleData
)
.environmentObject(CurrentColors.toAppTheme())
}

View file

@ -0,0 +1,287 @@
//
// MemberSupportView.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 28.04.2025.
// Copyright © 2025 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct MemberSupportView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@State private var searchText: String = ""
@FocusState private var searchFocussed
var groupInfo: GroupInfo
@Binding var scrollToItemId: ChatItem.ID?
var body: some View {
viewBody()
.onAppear {
Task {
await chatModel.loadGroupMembers(groupInfo)
}
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
Task {
await chatModel.loadGroupMembers(groupInfo)
}
} label: {
Image(systemName: "arrow.clockwise")
}
}
}
}
@ViewBuilder private func viewBody() -> some View {
let membersWithChats = sortedMembersWithChats()
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
let filteredMembersWithChats = s == ""
? membersWithChats
: membersWithChats.filter { $0.wrapped.localAliasAndFullName.localizedLowercase.contains(s) }
if membersWithChats.isEmpty {
Text("No chats with members")
.foregroundColor(.secondary)
} else {
List {
searchFieldView(text: $searchText, focussed: $searchFocussed, theme.colors.onBackground, theme.colors.secondary)
.padding(.leading, 8)
ForEach(filteredMembersWithChats) { memberWithChat in
MemberSupportChatNavLink(
groupInfo: groupInfo,
memberWithChat: memberWithChat,
scrollToItemId: $scrollToItemId
)
}
}
}
}
struct MemberSupportChatNavLink: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@State private var memberSupportChatNavLinkActive = false
var groupInfo: GroupInfo
var memberWithChat: GMember
@Binding var scrollToItemId: ChatItem.ID?
var body: some View {
ZStack {
let scopeInfo: GroupChatScopeInfo = .memberSupport(groupMember_: memberWithChat.wrapped)
Button {
ItemsModel.loadSecondaryChat(groupInfo.id, chatFilter: .groupChatScopeContext(groupScopeInfo: scopeInfo)) {
memberSupportChatNavLinkActive = true
}
} label: {
SupportChatRowView(groupMember: memberWithChat, groupInfo: groupInfo)
}
NavigationLink(isActive: $memberSupportChatNavLinkActive) {
SecondaryChatView(
chat: Chat(chatInfo: .group(groupInfo: groupInfo, groupChatScope: scopeInfo), chatItems: [], chatStats: ChatStats()),
scrollToItemId: $scrollToItemId
)
} label: {
EmptyView()
}
.frame(width: 1, height: 1)
.hidden()
}
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
if memberWithChat.wrapped.memberPending {
Button {
showAcceptMemberAlert(groupInfo, memberWithChat.wrapped)
} label: {
Label("Accept", systemImage: "checkmark")
}
.tint(theme.colors.primary)
} else {
Button {
showDeleteMemberSupportChatAlert(groupInfo, memberWithChat.wrapped)
} label: {
Label("Delete", systemImage: "trash")
}
.tint(.red)
}
}
}
}
func sortedMembersWithChats() -> [GMember] {
chatModel.groupMembers
.filter {
$0.wrapped.supportChat != nil &&
$0.wrapped.memberStatus != .memLeft &&
$0.wrapped.memberStatus != .memRemoved
}
.sorted { (m0: GMember, m1: GMember) -> Bool in
if m0.wrapped.memberPending != m1.wrapped.memberPending {
return m0.wrapped.memberPending
}
let mentions0 = (m0.wrapped.supportChat?.mentions ?? 0) > 0
let mentions1 = (m1.wrapped.supportChat?.mentions ?? 0) > 0
if mentions0 != mentions1 {
return mentions0
}
let attention0 = (m0.wrapped.supportChat?.memberAttention ?? 0) > 0
let attention1 = (m1.wrapped.supportChat?.memberAttention ?? 0) > 0
if attention0 != attention1 {
return attention0
}
let unread0 = (m0.wrapped.supportChat?.unread ?? 0) > 0
let unread1 = (m1.wrapped.supportChat?.unread ?? 0) > 0
if unread0 != unread1 {
return unread0
}
return (m0.wrapped.supportChat?.chatTs ?? .distantPast) > (m1.wrapped.supportChat?.chatTs ?? .distantPast)
}
}
private struct SupportChatRowView: View {
@EnvironmentObject var chatModel: ChatModel
@ObservedObject var groupMember: GMember
@EnvironmentObject var theme: AppTheme
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
var groupInfo: GroupInfo
var dynamicChatInfoSize: CGFloat { dynamicSize(userFont).chatInfoSize }
var body: some View {
let member = groupMember.wrapped
HStack{
MemberProfileImage(member, size: 38)
.padding(.trailing, 2)
VStack(alignment: .leading) {
let t = Text(member.chatViewName).foregroundColor(theme.colors.onBackground)
(member.verified ? memberVerifiedShield + t : t)
.lineLimit(1)
Text(memberStatus(member))
.lineLimit(1)
.font(.caption)
.foregroundColor(theme.colors.secondary)
}
Spacer()
if member.memberPending {
Image(systemName: "flag.fill")
.resizable()
.scaledToFill()
.frame(width: dynamicChatInfoSize * 0.8, height: dynamicChatInfoSize * 0.8)
.foregroundColor(theme.colors.primary)
}
if let supportChat = member.supportChat {
SupportChatUnreadIndicator(supportChat: supportChat)
}
}
}
private func memberStatus(_ member: GroupMember) -> LocalizedStringKey {
if member.activeConn?.connDisabled ?? false {
return "disabled"
} else if member.activeConn?.connInactive ?? false {
return "inactive"
} else if member.memberPending {
return member.memberStatus.text
} else {
return LocalizedStringKey(member.memberRole.text)
}
}
struct SupportChatUnreadIndicator: View {
@EnvironmentObject var theme: AppTheme
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
var supportChat: GroupSupportChat
var dynamicChatInfoSize: CGFloat { dynamicSize(userFont).chatInfoSize }
private var indicatorTint: Color {
if supportChat.mentions > 0 || supportChat.memberAttention > 0 {
return theme.colors.primary
} else {
return theme.colors.secondary
}
}
var body: some View {
HStack(alignment: .center, spacing: 2) {
if supportChat.unread > 0 || supportChat.mentions > 0 || supportChat.memberAttention > 0 {
if supportChat.mentions > 0 && supportChat.unread > 1 {
Text("\(MENTION_START)")
.font(userFont <= .xxxLarge ? .body : .callout)
.foregroundColor(indicatorTint)
.frame(minWidth: dynamicChatInfoSize, minHeight: dynamicChatInfoSize)
.cornerRadius(dynamicSize(userFont).unreadCorner)
.padding(.bottom, 1)
}
let singleUnreadIsMention = supportChat.mentions > 0 && supportChat.unread == 1
(singleUnreadIsMention ? Text("\(MENTION_START)") : unreadCountText(supportChat.unread))
.font(userFont <= .xxxLarge ? .caption : .caption2)
.foregroundColor(.white)
.padding(.horizontal, dynamicSize(userFont).unreadPadding)
.frame(minWidth: dynamicChatInfoSize, minHeight: dynamicChatInfoSize)
.background(indicatorTint)
.cornerRadius(dynamicSize(userFont).unreadCorner)
}
}
.frame(height: dynamicChatInfoSize)
.frame(minWidth: 22)
}
}
private var memberVerifiedShield: Text {
(Text(Image(systemName: "checkmark.shield")) + textSpace)
.font(.caption)
.baselineOffset(2)
.kerning(-2)
.foregroundColor(theme.colors.secondary)
}
}
}
func showDeleteMemberSupportChatAlert(_ groupInfo: GroupInfo, _ member: GroupMember) {
showAlert(
title: NSLocalizedString("Delete chat with member?", comment: "alert title"),
buttonTitle: "Delete",
buttonAction: { deleteMemberSupportChat(groupInfo, member) },
cancelButton: true
)
}
func deleteMemberSupportChat(_ groupInfo: GroupInfo, _ member: GroupMember) {
Task {
do {
let (gInfo, updatedMember) = try await apiDeleteMemberSupportChat(groupInfo.groupId, member.groupMemberId)
await MainActor.run {
_ = ChatModel.shared.upsertGroupMember(gInfo, updatedMember)
ChatModel.shared.updateGroup(gInfo)
}
// TODO member row doesn't get removed from list (upsertGroupMember correctly sets supportChat to nil) - this repopulates list to fix it
await ChatModel.shared.loadGroupMembers(gInfo)
} catch let error {
logger.error("apiDeleteMemberSupportChat error: \(responseError(error))")
await MainActor.run {
showAlert(
NSLocalizedString("Error deleting chat with member", comment: "alert title"),
message: responseError(error)
)
}
}
}
}
#Preview {
MemberSupportView(
groupInfo: GroupInfo.sampleData,
scrollToItemId: Binding.constant(nil)
)
}

View file

@ -0,0 +1,42 @@
//
// SecondaryChatView.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 29.04.2025.
// Copyright © 2025 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct SecondaryChatView: View {
@EnvironmentObject var chatModel: ChatModel
@ObservedObject var chat: Chat
@Binding var scrollToItemId: ChatItem.ID?
var body: some View {
if let im = chatModel.secondaryIM {
ChatView(
chat: chat,
im: im,
mergedItems: BoxedValue(MergedItems.create(im, [])),
floatingButtonModel: FloatingButtonModel(im: im),
scrollToItemId: $scrollToItemId
)
.onDisappear {
chatModel.secondaryIM = nil
}
}
}
}
#Preview {
SecondaryChatView(
chat: Chat(
chatInfo: .group(groupInfo: GroupInfo.sampleData, groupChatScope: .memberSupport(groupMember_: GroupMember.sampleData)),
chatItems: [],
chatStats: ChatStats()
),
scrollToItemId: Binding.constant(nil)
)
}

View file

@ -25,7 +25,7 @@ struct SelectedItemsTopToolbar: View {
struct SelectedItemsBottomToolbar: View {
@Environment(\.colorScheme) var colorScheme
@EnvironmentObject var theme: AppTheme
let chatItems: [ChatItem]
let im: ItemsModel
@Binding var selectedChatItems: Set<Int64>?
var chatInfo: ChatInfo
// Bool - delete for everyone is possible
@ -75,9 +75,9 @@ struct SelectedItemsBottomToolbar: View {
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!moderateEnabled || deleteCountProhibited ? theme.colors.secondary : .red)
.foregroundColor(!moderateEnabled || deleteCountProhibited || im.secondaryIMFilter != nil ? theme.colors.secondary : .red)
}
.disabled(!moderateEnabled || deleteCountProhibited)
.disabled(!moderateEnabled || deleteCountProhibited || im.secondaryIMFilter != nil)
.opacity(canModerate ? 1 : 0)
Spacer()
@ -88,24 +88,24 @@ struct SelectedItemsBottomToolbar: View {
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!forwardEnabled || forwardCountProhibited ? theme.colors.secondary : theme.colors.primary)
.foregroundColor(!forwardEnabled || forwardCountProhibited || im.secondaryIMFilter != nil ? theme.colors.secondary : theme.colors.primary)
}
.disabled(!forwardEnabled || forwardCountProhibited)
.disabled(!forwardEnabled || forwardCountProhibited || im.secondaryIMFilter != nil)
}
.frame(maxHeight: .infinity)
.padding([.leading, .trailing], 12)
}
.onAppear {
recheckItems(chatInfo, chatItems, selectedChatItems)
recheckItems(chatInfo, im.reversedChatItems, selectedChatItems)
}
.onChange(of: chatInfo) { info in
recheckItems(info, chatItems, selectedChatItems)
recheckItems(info, im.reversedChatItems, selectedChatItems)
}
.onChange(of: chatItems) { items in
.onChange(of: im.reversedChatItems) { items in
recheckItems(chatInfo, items, selectedChatItems)
}
.onChange(of: selectedChatItems) { selected in
recheckItems(chatInfo, chatItems, selected)
recheckItems(chatInfo, im.reversedChatItems, selected)
}
.frame(height: 55.5)
.background(.thinMaterial)
@ -116,7 +116,7 @@ struct SelectedItemsBottomToolbar: View {
deleteCountProhibited = count == 0 || count > 200
forwardCountProhibited = count == 0 || count > 20
canModerate = possibleToModerate(chatInfo)
let groupInfo: GroupInfo? = if case let ChatInfo.group(groupInfo: info) = chatInfo {
let groupInfo: GroupInfo? = if case let ChatInfo.group(groupInfo: info, _) = chatInfo {
info
} else {
nil
@ -145,7 +145,7 @@ struct SelectedItemsBottomToolbar: View {
private func possibleToModerate(_ chatInfo: ChatInfo) -> Bool {
return switch chatInfo {
case let .group(groupInfo):
case let .group(groupInfo, _):
groupInfo.membership.memberRole >= .admin
default: false
}

View file

@ -24,85 +24,70 @@ struct VerifyCodeView: View {
}
private func verifyCodeView(_ code: String) -> some View {
ScrollView {
let splitCode = splitToParts(code, length: 24)
VStack(alignment: .leading) {
Group {
let splitCode = splitToParts(code, length: 24)
return List {
Section {
QRCode(uri: code, small: true)
Text(splitCode)
.multilineTextAlignment(.leading)
.font(.body.monospaced())
.lineLimit(20)
.frame(maxWidth: .infinity, alignment: .center)
} header: {
if connectionVerified {
HStack {
if connectionVerified {
Image(systemName: "checkmark.shield")
.foregroundColor(theme.colors.secondary)
Text("\(displayName) is verified")
} else {
Text("\(displayName) is not verified")
}
Image(systemName: "checkmark.shield").foregroundColor(theme.colors.secondary)
Text("\(displayName) is verified").textCase(.none)
}
.frame(height: 24)
QRCode(uri: code)
.padding(.horizontal)
Text(splitCode)
.multilineTextAlignment(.leading)
.font(.body.monospaced())
.lineLimit(20)
.padding(.bottom, 8)
} else {
Text("\(displayName) is not verified").textCase(.none)
}
.frame(maxWidth: .infinity, alignment: .center)
} footer: {
Text("To verify end-to-end encryption with your contact compare (or scan) the code on your devices.")
.padding(.bottom)
}
Group {
if connectionVerified {
Button {
verifyCode(nil)
} label: {
Label("Clear verification", systemImage: "shield")
}
.padding()
} else {
HStack {
NavigationLink {
ScanCodeView(connectionVerified: $connectionVerified, verify: verify)
.navigationBarTitleDisplayMode(.large)
.navigationTitle("Scan code")
.modifier(ThemedBackground())
} label: {
Label("Scan code", systemImage: "qrcode")
}
.padding()
Button {
verifyCode(code) { verified in
if !verified { showCodeError = true }
}
} label: {
Label("Mark verified", systemImage: "checkmark.shield")
}
.padding()
.alert(isPresented: $showCodeError) {
Alert(title: Text("Incorrect security code!"))
}
}
}
}
.frame(maxWidth: .infinity, alignment: .center)
}
.padding()
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Section {
if connectionVerified {
Button {
showShareSheet(items: [splitCode])
verifyCode(nil)
} label: {
Image(systemName: "square.and.arrow.up")
Label("Clear verification", systemImage: "shield")
}
} else {
NavigationLink {
ScanCodeView(connectionVerified: $connectionVerified, verify: verify)
.navigationBarTitleDisplayMode(.large)
.navigationTitle("Scan code")
.modifier(ThemedBackground())
} label: {
Label("Scan code", systemImage: "qrcode")
}
Button {
verifyCode(code) { verified in
if !verified { showCodeError = true }
}
} label: {
Label("Mark verified", systemImage: "checkmark.shield")
}
.alert(isPresented: $showCodeError) {
Alert(title: Text("Incorrect security code!"))
}
}
}
.onChange(of: connectionVerified) { _ in
if connectionVerified { dismiss() }
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
showShareSheet(items: [splitCode])
} label: {
Image(systemName: "square.and.arrow.up")
}
}
}
.onChange(of: connectionVerified) { _ in
if connectionVerified { dismiss() }
}
}
private func verifyCode(_ code: String?, _ cb: ((Bool) -> Void)? = nil) {

View file

@ -66,7 +66,7 @@ struct ChatListNavLink: View {
switch chat.chatInfo {
case let .direct(contact):
contactNavLink(contact)
case let .group(groupInfo):
case let .group(groupInfo, _):
groupNavLink(groupInfo)
case let .local(noteFolder):
noteFolderNavLink(noteFolder)
@ -189,7 +189,7 @@ struct ChatListNavLink: View {
}
.swipeActions(edge: .trailing) {
tagChatButton(chat)
if (groupInfo.membership.memberCurrent) {
if (groupInfo.membership.memberCurrentOrPending) {
leaveGroupChatButton(groupInfo)
}
if groupInfo.canDelete {
@ -214,7 +214,7 @@ struct ChatListNavLink: View {
let showReportsButton = chat.chatStats.reportsCount > 0 && groupInfo.membership.memberRole >= .moderator
let showClearButton = !chat.chatItems.isEmpty
let showDeleteGroup = groupInfo.canDelete
let showLeaveGroup = groupInfo.membership.memberCurrent
let showLeaveGroup = groupInfo.membership.memberCurrentOrPending
let totalNumberOfButtons = 1 + (showReportsButton ? 1 : 0) + (showClearButton ? 1 : 0) + (showDeleteGroup ? 1 : 0) + (showLeaveGroup ? 1 : 0)
if showClearButton && totalNumberOfButtons <= 3 {
@ -276,7 +276,7 @@ struct ChatListNavLink: View {
@ViewBuilder private func markReadButton() -> some View {
if chat.chatStats.unreadCount > 0 || chat.chatStats.unreadChat {
Button {
Task { await markChatRead(chat) }
Task { await markChatRead(ItemsModel.shared, chat) }
} label: {
SwipeLabel(NSLocalizedString("Read", comment: "swipe action"), systemImage: "checkmark", inverted: oneHandUI)
}
@ -482,12 +482,10 @@ struct ChatListNavLink: View {
.tint(theme.colors.primary)
}
.appSheet(isPresented: $showContactConnectionInfo) {
Group {
if case let .contactConnection(contactConnection) = chat.chatInfo {
ContactConnectionInfo(contactConnection: contactConnection)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
.modifier(ThemedBackground(grouped: true))
}
if case let .contactConnection(contactConnection) = chat.chatInfo {
ContactConnectionInfo(contactConnection: contactConnection)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
.modifier(ThemedBackground(grouped: true))
}
}
.contentShape(Rectangle())

View file

@ -148,6 +148,7 @@ struct ChatListView: View {
@State private var userPickerShown: Bool = false
@State private var sheet: SomeSheet<AnyView>? = nil
@StateObject private var chatTagsModel = ChatTagsModel.shared
@State private var scrollToItemId: ChatItem.ID? = nil
// iOS 15 is required it to show/hide toolbar while chat is hidden/visible
@State private var viewOnScreen = true
@ -446,7 +447,14 @@ struct ChatListView: View {
@ViewBuilder private func chatView() -> some View {
if let chatId = chatModel.chatId, let chat = chatModel.getChat(chatId) {
ChatView(chat: chat)
let im = ItemsModel.shared
ChatView(
chat: chat,
im: im,
mergedItems: BoxedValue(MergedItems.create(im, [])),
floatingButtonModel: FloatingButtonModel(im: im),
scrollToItemId: $scrollToItemId
)
}
}
@ -571,8 +579,6 @@ struct ChatListSearchBar: View {
@Binding var searchChatFilteredBySimplexLink: String?
@Binding var parentSheet: SomeSheet<AnyView>?
@State private var ignoreSearchTextChange = false
@State private var alert: PlanAndConnectAlert?
@State private var sheet: PlanAndConnectActionSheet?
var body: some View {
VStack(spacing: 12) {
@ -637,12 +643,6 @@ struct ChatListSearchBar: View {
.onChange(of: chatTagsModel.activeFilter) { _ in
searchText = ""
}
.alert(item: $alert) { a in
planAndConnectAlert(a, dismiss: true, cleanup: { searchText = "" })
}
.actionSheet(item: $sheet) { s in
planAndConnectActionSheet(s, dismiss: true, cleanup: { searchText = "" })
}
}
private func toggleFilterButton() -> some View {
@ -668,10 +668,11 @@ struct ChatListSearchBar: View {
private func connect(_ link: String) {
planAndConnect(
link,
showAlert: { alert = $0 },
showActionSheet: { sheet = $0 },
dismiss: false,
incognito: nil,
cleanup: {
searchText = ""
searchFocussed = false
},
filterKnownContact: { searchChatFilteredBySimplexLink = $0.id },
filterKnownGroup: { searchChatFilteredBySimplexLink = $0.id }
)
@ -892,12 +893,12 @@ func presetTagMatchesChat(_ tag: PresetTag, _ chatInfo: ChatInfo, _ chatStats: C
case let .direct(contact): !(contact.activeConn == nil && contact.profile.contactLink != nil && contact.active) && !contact.chatDeleted
case .contactRequest: true
case .contactConnection: true
case let .group(groupInfo): groupInfo.businessChat?.chatType == .customer
case let .group(groupInfo, _): groupInfo.businessChat?.chatType == .customer
default: false
}
case .groups:
switch chatInfo {
case let .group(groupInfo): groupInfo.businessChat == nil
case let .group(groupInfo, _): groupInfo.businessChat == nil
default: false
}
case .business:

View file

@ -141,7 +141,7 @@ struct ChatPreviewView: View {
} else {
EmptyView()
}
case let .group(groupInfo):
case let .group(groupInfo, _):
switch (groupInfo.membership.memberStatus) {
case .memRejected: inactiveIcon()
case .memLeft: inactiveIcon()
@ -165,7 +165,7 @@ struct ChatPreviewView: View {
switch chat.chatInfo {
case let .direct(contact):
previewTitle(contact.verified == true ? verifiedIcon + t : t).foregroundColor(deleting ? Color.secondary : nil)
case let .group(groupInfo):
case let .group(groupInfo, _):
let v = previewTitle(t)
switch (groupInfo.membership.memberStatus) {
case .memInvited: v.foregroundColor(deleting ? theme.colors.secondary : chat.chatInfo.incognito ? .indigo : theme.colors.primary)
@ -341,11 +341,12 @@ struct ChatPreviewView: View {
chatPreviewInfoText("connecting…")
}
}
case let .group(groupInfo):
case let .group(groupInfo, _):
switch (groupInfo.membership.memberStatus) {
case .memRejected: chatPreviewInfoText("rejected")
case .memInvited: groupInvitationPreviewText(groupInfo)
case .memAccepted: chatPreviewInfoText("connecting…")
case .memPendingReview, .memPendingApproval: chatPreviewInfoText("reviewed by admins")
default: EmptyView()
}
default: EmptyView()
@ -439,7 +440,11 @@ struct ChatPreviewView: View {
if progressByTimeout {
ProgressView()
} else if chat.chatStats.reportsCount > 0 {
groupReportsIcon(size: size * 0.8)
flagIcon(size: size * 0.8, color: .red)
} else if chat.supportUnreadCount > 0 {
flagIcon(size: size * 0.8, color: theme.colors.primary)
} else if chat.chatInfo.groupInfo?.membership.memberPending ?? false {
flagIcon(size: size * 0.8, color: theme.colors.secondary)
} else {
incognitoIcon(chat.chatInfo.incognito, theme.colors.secondary, size: size)
}
@ -485,12 +490,12 @@ struct ChatPreviewView: View {
}
}
func groupReportsIcon(size: CGFloat) -> some View {
func flagIcon(size: CGFloat, color: Color) -> some View {
Image(systemName: "flag")
.resizable()
.scaledToFit()
.frame(width: size, height: size)
.foregroundColor(.red)
.foregroundColor(color)
}
func smallContentPreview(size: CGFloat, _ view: @escaping () -> some View) -> some View {

View file

@ -124,7 +124,7 @@ struct UserPicker: View {
ZStack(alignment: .topTrailing) {
ProfileImage(imageStr: u.user.image, size: size, color: Color(uiColor: .tertiarySystemGroupedBackground))
if (u.unreadCount > 0) {
UnreadBadge(userInfo: u).offset(x: 4, y: -4)
userUnreadBadge(u, theme: theme).offset(x: 4, y: -4)
}
}
.padding(.trailing, 6)
@ -171,19 +171,27 @@ struct UserPicker: View {
}
}
@inline(__always)
func userUnreadBadge(_ userInfo: UserInfo, theme: AppTheme) -> some View {
UnreadBadge(
count: userInfo.unreadCount,
color: userInfo.user.showNtfs ? theme.colors.primary : theme.colors.secondary
)
}
struct UnreadBadge: View {
var userInfo: UserInfo
@EnvironmentObject var theme: AppTheme
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
var count: Int
var color: Color
var body: some View {
let size = dynamicSize(userFont).chatInfoSize
unreadCountText(userInfo.unreadCount)
unreadCountText(count)
.font(userFont <= .xxxLarge ? .caption : .caption2)
.foregroundColor(.white)
.padding(.horizontal, dynamicSize(userFont).unreadPadding)
.frame(minWidth: size, minHeight: size)
.background(userInfo.user.showNtfs ? theme.colors.primary : theme.colors.secondary)
.background(color)
.cornerRadius(dynamicSize(userFont).unreadCorner)
}
}

View file

@ -21,7 +21,7 @@ enum DatabaseAlert: Identifiable {
case deleteLegacyDatabase
case deleteFilesAndMedia
case setChatItemTTL(ttl: ChatItemTTL)
case error(title: LocalizedStringKey, error: String = "")
case error(title: String, error: String = "")
var id: String {
switch self {
@ -456,7 +456,7 @@ struct DatabaseView: View {
}
} catch let error {
await MainActor.run {
alert = .error(title: "Error exporting chat database", error: responseError(error))
alert = .error(title: NSLocalizedString("Error exporting chat database", comment: "alert title"), error: responseError(error))
progressIndicator = false
}
}
@ -492,10 +492,10 @@ struct DatabaseView: View {
return migration
}
} catch let error {
await operationEnded(.error(title: "Error importing chat database", error: responseError(error)), progressIndicator, alert)
await operationEnded(.error(title: NSLocalizedString("Error importing chat database", comment: "alert title"), error: responseError(error)), progressIndicator, alert)
}
} catch let error {
await operationEnded(.error(title: "Error deleting chat database", error: responseError(error)), progressIndicator, alert)
await operationEnded(.error(title: NSLocalizedString("Error deleting chat database", comment: "alert title"), error: responseError(error)), progressIndicator, alert)
}
} else {
showAlert("Error accessing database file")
@ -513,7 +513,7 @@ struct DatabaseView: View {
await DatabaseView.operationEnded(.chatDeleted, $progressIndicator, $alert)
return true
} catch let error {
await DatabaseView.operationEnded(.error(title: "Error deleting database", error: responseError(error)), $progressIndicator, $alert)
await DatabaseView.operationEnded(.error(title: NSLocalizedString("Error deleting database", comment: "alert title"), error: responseError(error)), $progressIndicator, $alert)
return false
}
}
@ -522,7 +522,7 @@ struct DatabaseView: View {
if removeLegacyDatabaseAndFiles() {
legacyDatabase = false
} else {
alert = .error(title: "Error deleting old database")
alert = .error(title: NSLocalizedString("Error deleting old database", comment: "alert title"))
}
}
@ -546,7 +546,7 @@ struct DatabaseView: View {
let (title, message) = chatDeletedAlertText()
showAlert(title, message: message, actions: { [okAlertActionWaiting] })
} else if case let .error(title, error) = dbAlert {
showAlert("\(title)", message: error, actions: { [okAlertActionWaiting] })
showAlert(title, message: error, actions: { [okAlertActionWaiting] })
} else {
alert.wrappedValue = dbAlert
cont.resume()
@ -567,7 +567,7 @@ struct DatabaseView: View {
}
} catch {
await MainActor.run {
alert = .error(title: "Error changing setting", error: responseError(error))
alert = .error(title: NSLocalizedString("Error changing setting", comment: "alert title"), error: responseError(error))
chatItemTTL = currentChatItemTTL
afterSetCiTTL()
}

View file

@ -33,7 +33,7 @@ extension View {
func appSheet<Content>(
isPresented: Binding<Bool>,
onDismiss: (() -> Void)? = nil,
content: @escaping () -> Content
@ViewBuilder content: @escaping () -> Content
) -> some View where Content: View {
sheet(isPresented: isPresented, onDismiss: onDismiss) {
content().modifier(PrivacySensitive())
@ -43,7 +43,7 @@ extension View {
func appSheet<T, Content>(
item: Binding<T?>,
onDismiss: (() -> Void)? = nil,
content: @escaping (T) -> Content
@ViewBuilder content: @escaping (T) -> Content
) -> some View where T: Identifiable, Content: View {
sheet(item: item, onDismiss: onDismiss) { it in
content(it).modifier(PrivacySensitive())

View file

@ -65,6 +65,27 @@ func showAlert(
}
}
func showSheet(
_ title: String?,
message: String? = nil,
actions: () -> [UIAlertAction] = { [okAlertAction] },
sourceView: UIView? = nil // For iPad support
) {
if let topController = getTopViewController() {
let sheet = UIAlertController(title: title, message: message, preferredStyle: .actionSheet)
for action in actions() { sheet.addAction(action) }
// Required for iPad: Configure popover presentation
if let popover = sheet.popoverPresentationController {
popover.sourceView = sourceView ?? topController.view
popover.sourceRect = sourceView?.bounds ?? CGRect(x: topController.view.bounds.midX, y: topController.view.bounds.midY, width: 0, height: 0)
popover.permittedArrowDirections = []
}
topController.present(sheet, animated: true)
}
}
let okAlertAction = UIAlertAction(title: NSLocalizedString("Ok", comment: "alert button"), style: .default)
let cancelAlertAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: "alert button"), style: .cancel)

View file

@ -66,6 +66,8 @@ struct LocalAuthView: View {
m.chatId = nil
ItemsModel.shared.reversedChatItems = []
ItemsModel.shared.chatState.clear()
ChatModel.shared.secondaryIM?.reversedChatItems = []
ChatModel.shared.secondaryIM?.chatState.clear()
m.updateChats([])
m.users = []
_ = kcAppPassword.set(password)

View file

@ -193,7 +193,7 @@ struct AddGroupView: View {
Task {
await m.loadGroupMembers(gInfo)
}
let c = Chat(chatInfo: .group(groupInfo: gInfo), chatItems: [])
let c = Chat(chatInfo: .group(groupInfo: gInfo, groupChatScope: nil), chatItems: [])
m.addChat(c)
withAnimation {
groupInfo = gInfo

View file

@ -125,7 +125,7 @@ struct NewChatSheet: View {
}
NavigationLink {
AddGroupView()
.navigationTitle("Create secret group")
.navigationTitle("Create group")
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
} label: {
@ -346,8 +346,6 @@ struct ContactsListSearchBar: View {
@Binding var searchShowingSimplexLink: Bool
@Binding var searchChatFilteredBySimplexLink: String?
@State private var ignoreSearchTextChange = false
@State private var alert: PlanAndConnectAlert?
@State private var sheet: PlanAndConnectActionSheet?
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
var body: some View {
@ -416,12 +414,6 @@ struct ContactsListSearchBar: View {
}
}
}
.alert(item: $alert) { a in
planAndConnectAlert(a, dismiss: true, cleanup: { searchText = "" })
}
.actionSheet(item: $sheet) { s in
planAndConnectActionSheet(s, dismiss: true, cleanup: { searchText = "" })
}
}
private func toggleFilterButton() -> some View {
@ -442,10 +434,11 @@ struct ContactsListSearchBar: View {
private func connect(_ link: String) {
planAndConnect(
link,
showAlert: { alert = $0 },
showActionSheet: { sheet = $0 },
dismiss: true,
incognito: nil,
cleanup: {
searchText = ""
searchFocussed = false
},
filterKnownContact: { searchChatFilteredBySimplexLink = $0.id }
)
}

View file

@ -29,11 +29,9 @@ struct SomeSheet<Content: View>: Identifiable {
}
private enum NewChatViewAlert: Identifiable {
case planAndConnectAlert(alert: PlanAndConnectAlert)
case newChatSomeAlert(alert: SomeAlert)
var id: String {
switch self {
case let .planAndConnectAlert(alert): return "planAndConnectAlert \(alert.id)"
case let .newChatSomeAlert(alert): return "newChatSomeAlert \(alert.id)"
}
}
@ -165,8 +163,6 @@ struct NewChatView: View {
}
.alert(item: $alert) { a in
switch(a) {
case let .planAndConnectAlert(alert):
return planAndConnectAlert(alert, dismiss: true, cleanup: { pastedLink = "" })
case let .newChatSomeAlert(a):
return a.alert
}
@ -593,7 +589,6 @@ private struct ConnectView: View {
@Binding var showQRCodeScanner: Bool
@Binding var pastedLink: String
@Binding var alert: NewChatViewAlert?
@State private var sheet: PlanAndConnectActionSheet?
@State private var pasteboardHasStrings = UIPasteboard.general.hasStrings
var body: some View {
@ -605,9 +600,6 @@ private struct ConnectView: View {
ScannerInView(showQRCodeScanner: $showQRCodeScanner, processQRCode: processQRCode)
}
}
.actionSheet(item: $sheet) { s in
planAndConnectActionSheet(s, dismiss: true, cleanup: { pastedLink = "" })
}
}
@ViewBuilder private func pasteLinkView() -> some View {
@ -662,10 +654,7 @@ private struct ConnectView: View {
private func connect(_ link: String) {
planAndConnect(
link,
showAlert: { alert = .planAndConnectAlert(alert: $0) },
showActionSheet: { sheet = $0 },
dismiss: true,
incognito: nil
dismiss: true
)
}
}
@ -839,187 +828,184 @@ func sharedProfileInfo(_ incognito: Bool) -> Text {
)
}
enum PlanAndConnectAlert: Identifiable {
case ownInvitationLinkConfirmConnect(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan, incognito: Bool)
case invitationLinkConnecting(connectionLink: CreatedConnLink)
case ownContactAddressConfirmConnect(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan, incognito: Bool)
case contactAddressConnectingConfirmReconnect(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan, incognito: Bool)
case groupLinkConfirmConnect(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan, incognito: Bool)
case groupLinkConnectingConfirmReconnect(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan, incognito: Bool)
case groupLinkConnecting(connectionLink: CreatedConnLink, groupInfo: GroupInfo?)
case error(shortOrFullLink: String, alert: Alert)
var id: String {
switch self {
case let .ownInvitationLinkConfirmConnect(connectionLink, _, _): return "ownInvitationLinkConfirmConnect \(connectionLink.connFullLink)"
case let .invitationLinkConnecting(connectionLink): return "invitationLinkConnecting \(connectionLink.connFullLink)"
case let .ownContactAddressConfirmConnect(connectionLink, _, _): return "ownContactAddressConfirmConnect \(connectionLink.connFullLink)"
case let .contactAddressConnectingConfirmReconnect(connectionLink, _, _): return "contactAddressConnectingConfirmReconnect \(connectionLink.connFullLink)"
case let .groupLinkConfirmConnect(connectionLink, _, _): return "groupLinkConfirmConnect \(connectionLink.connFullLink)"
case let .groupLinkConnectingConfirmReconnect(connectionLink, _, _): return "groupLinkConnectingConfirmReconnect \(connectionLink.connFullLink)"
case let .groupLinkConnecting(connectionLink, _): return "groupLinkConnecting \(connectionLink.connFullLink)"
case let .error(shortOrFullLink, alert): return "error \(shortOrFullLink)"
}
}
private func showInvitationLinkConnectingAlert(cleanup: (() -> Void)?) {
showAlert(
NSLocalizedString("Already connecting!", comment: "new chat sheet title"),
message: NSLocalizedString("You are already connecting via this one-time link!", comment: "new chat sheet message"),
actions: {[
okCleanupAlertAction(cleanup: cleanup)
]}
)
}
func planAndConnectAlert(_ alert: PlanAndConnectAlert, dismiss: Bool, cleanup: (() -> Void)? = nil) -> Alert {
switch alert {
case let .ownInvitationLinkConfirmConnect(connectionLink, connectionPlan, incognito):
return Alert(
title: Text("Connect to yourself?"),
message: Text("This is your own one-time link!"),
primaryButton: .destructive(
Text(incognito ? "Connect incognito" : "Connect"),
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) }
),
secondaryButton: .cancel() { cleanup?() }
)
case .invitationLinkConnecting:
return Alert(
title: Text("Already connecting!"),
message: Text("You are already connecting via this one-time link!"),
dismissButton: .default(Text("OK")) { cleanup?() }
)
case let .ownContactAddressConfirmConnect(connectionLink, connectionPlan, incognito):
return Alert(
title: Text("Connect to yourself?"),
message: Text("This is your own SimpleX address!"),
primaryButton: .destructive(
Text(incognito ? "Connect incognito" : "Connect"),
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) }
),
secondaryButton: .cancel() { cleanup?() }
)
case let .contactAddressConnectingConfirmReconnect(connectionLink, connectionPlan, incognito):
return Alert(
title: Text("Repeat connection request?"),
message: Text("You have already requested connection via this address!"),
primaryButton: .destructive(
Text(incognito ? "Connect incognito" : "Connect"),
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) }
),
secondaryButton: .cancel() { cleanup?() }
)
case let .groupLinkConfirmConnect(connectionLink, connectionPlan, incognito):
return Alert(
title: Text("Join group?"),
message: Text("You will connect to all group members."),
primaryButton: .default(
Text(incognito ? "Join incognito" : "Join"),
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) }
),
secondaryButton: .cancel() { cleanup?() }
)
case let .groupLinkConnectingConfirmReconnect(connectionLink, connectionPlan, incognito):
return Alert(
title: Text("Repeat join request?"),
message: Text("You are already joining the group via this link!"),
primaryButton: .destructive(
Text(incognito ? "Join incognito" : "Join"),
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) }
),
secondaryButton: .cancel() { cleanup?() }
)
case let .groupLinkConnecting(_, groupInfo):
if let groupInfo = groupInfo {
return groupInfo.businessChat == nil
? Alert(
title: Text("Group already exists!"),
message: Text("You are already joining the group \(groupInfo.displayName)."),
dismissButton: .default(Text("OK")) { cleanup?() }
)
: Alert(
title: Text("Chat already exists!"),
message: Text("You are already connecting to \(groupInfo.displayName)."),
dismissButton: .default(Text("OK")) { cleanup?() }
private func showGroupLinkConnectingAlert(groupInfo: GroupInfo?, cleanup: (() -> Void)?) {
if let groupInfo = groupInfo {
if groupInfo.businessChat == nil {
showAlert(
NSLocalizedString("Group already exists!", comment: "new chat sheet title"),
message:
String.localizedStringWithFormat(
NSLocalizedString("You are already joining the group %@.", comment: "new chat sheet message"),
groupInfo.displayName
),
actions: {[
okCleanupAlertAction(cleanup: cleanup)
]}
)
} else {
return Alert(
title: Text("Already joining the group!"),
message: Text("You are already joining the group via this link."),
dismissButton: .default(Text("OK")) { cleanup?() }
showAlert(
NSLocalizedString("Chat already exists!", comment: "new chat sheet title"),
message:
String.localizedStringWithFormat(
NSLocalizedString("You are already connecting to %@.", comment: "new chat sheet message"),
groupInfo.displayName
),
actions: {[
okCleanupAlertAction(cleanup: cleanup)
]}
)
}
case let .error(_, alert): return alert
} else {
showAlert(
NSLocalizedString("Already joining the group!", comment: "new chat sheet title"),
message: NSLocalizedString("You are already joining the group via this link.", comment: "new chat sheet message"),
actions: {[
okCleanupAlertAction(cleanup: cleanup)
]}
)
}
}
enum PlanAndConnectActionSheet: Identifiable {
case askCurrentOrIncognitoProfile(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan?, title: LocalizedStringKey)
case askCurrentOrIncognitoProfileDestructive(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan, title: LocalizedStringKey)
case askCurrentOrIncognitoProfileConnectContactViaAddress(contact: Contact)
case ownGroupLinkConfirmConnect(connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan, incognito: Bool?, groupInfo: GroupInfo)
var id: String {
switch self {
case let .askCurrentOrIncognitoProfile(connectionLink, _, _): return "askCurrentOrIncognitoProfile \(connectionLink.connFullLink)"
case let .askCurrentOrIncognitoProfileDestructive(connectionLink, _, _): return "askCurrentOrIncognitoProfileDestructive \(connectionLink.connFullLink)"
case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact): return "askCurrentOrIncognitoProfileConnectContactViaAddress \(contact.contactId)"
case let .ownGroupLinkConfirmConnect(connectionLink, _, _, _): return "ownGroupLinkConfirmConnect \(connectionLink.connFullLink)"
private func okCleanupAlertAction(cleanup: (() -> Void)?) -> UIAlertAction {
UIAlertAction(
title: NSLocalizedString("Ok", comment: "new chat action"),
style: .default,
handler: { _ in
cleanup?()
}
}
)
}
func planAndConnectActionSheet(_ sheet: PlanAndConnectActionSheet, dismiss: Bool, cleanup: (() -> Void)? = nil) -> ActionSheet {
switch sheet {
case let .askCurrentOrIncognitoProfile(connectionLink, connectionPlan, title):
return ActionSheet(
title: Text(title),
buttons: [
.default(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup) },
.default(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup) },
.cancel() { cleanup?() }
]
)
case let .askCurrentOrIncognitoProfileDestructive(connectionLink, connectionPlan, title):
return ActionSheet(
title: Text(title),
buttons: [
.destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup) },
.destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup) },
.cancel() { cleanup?() }
]
)
case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact):
return ActionSheet(
title: Text("Connect with \(contact.chatViewName)"),
buttons: [
.default(Text("Use current profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: false, cleanup: cleanup) },
.default(Text("Use new incognito profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: true, cleanup: cleanup) },
.cancel() { cleanup?() }
]
)
case let .ownGroupLinkConfirmConnect(connectionLink, connectionPlan, incognito, groupInfo):
if let incognito = incognito {
return ActionSheet(
title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"),
buttons: [
.default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) },
.destructive(Text(incognito ? "Join incognito" : "Join with current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) },
.cancel() { cleanup?() }
]
private func showAskCurrentOrIncognitoProfileSheet(
title: String,
actionStyle: UIAlertAction.Style = .default,
connectionLink: CreatedConnLink,
connectionPlan: ConnectionPlan?,
dismiss: Bool,
cleanup: (() -> Void)?
) {
showSheet(
title,
actions: {[
UIAlertAction(
title: NSLocalizedString("Use current profile", comment: "new chat action"),
style: actionStyle,
handler: { _ in
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup)
}
),
UIAlertAction(
title: NSLocalizedString("Use new incognito profile", comment: "new chat action"),
style: actionStyle,
handler: { _ in
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup)
}
),
UIAlertAction(
title: NSLocalizedString("Cancel", comment: "new chat action"),
style: .default,
handler: { _ in
cleanup?()
}
)
} else {
return ActionSheet(
title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"),
buttons: [
.default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) },
.destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup) },
.destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup) },
.cancel() { cleanup?() }
]
]}
)
}
private func showAskCurrentOrIncognitoProfileConnectContactViaAddressSheet(
contact: Contact,
dismiss: Bool,
cleanup: (() -> Void)?
) {
showSheet(
String.localizedStringWithFormat(
NSLocalizedString("Connect with %@", comment: "new chat action"),
contact.chatViewName
),
actions: {[
UIAlertAction(
title: NSLocalizedString("Use current profile", comment: "new chat action"),
style: .default,
handler: { _ in
connectContactViaAddress_(contact, dismiss: dismiss, incognito: false, cleanup: cleanup)
}
),
UIAlertAction(
title: NSLocalizedString("Use new incognito profile", comment: "new chat action"),
style: .default,
handler: { _ in
connectContactViaAddress_(contact, dismiss: dismiss, incognito: true, cleanup: cleanup)
}
),
UIAlertAction(
title: NSLocalizedString("Cancel", comment: "new chat action"),
style: .default,
handler: { _ in
cleanup?()
}
)
}
}
]}
)
}
private func showOwnGroupLinkConfirmConnectSheet(
groupInfo: GroupInfo,
connectionLink: CreatedConnLink,
connectionPlan: ConnectionPlan?,
dismiss: Bool,
cleanup: (() -> Void)?
) {
showSheet(
String.localizedStringWithFormat(
NSLocalizedString("Join your group?\nThis is your link for group %@!", comment: "new chat action"),
groupInfo.displayName
),
actions: {[
UIAlertAction(
title: NSLocalizedString("Open group", comment: "new chat action"),
style: .default,
handler: { _ in
openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil)
}
),
UIAlertAction(
title: NSLocalizedString("Use current profile", comment: "new chat action"),
style: .destructive,
handler: { _ in
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup)
}
),
UIAlertAction(
title: NSLocalizedString("Use new incognito profile", comment: "new chat action"),
style: .destructive,
handler: { _ in
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup)
}
),
UIAlertAction(
title: NSLocalizedString("Cancel", comment: "new chat action"),
style: .default,
handler: { _ in
cleanup?()
}
)
]}
)
}
func planAndConnect(
_ shortOrFullLink: String,
showAlert: @escaping (PlanAndConnectAlert) -> Void,
showActionSheet: @escaping (PlanAndConnectActionSheet) -> Void,
dismiss: Bool,
incognito: Bool?,
cleanup: (() -> Void)? = nil,
filterKnownContact: ((Contact) -> Void)? = nil,
filterKnownGroup: ((GroupInfo) -> Void)? = nil
@ -1031,25 +1017,30 @@ func planAndConnect(
case let .invitationLink(ilp):
switch ilp {
case .ok:
logger.debug("planAndConnect, .invitationLink, .ok, incognito=\(incognito?.description ?? "nil")")
if let incognito = incognito {
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup)
} else {
await MainActor.run {
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via one-time link"))
}
logger.debug("planAndConnect, .invitationLink, .ok")
await MainActor.run {
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("Connect via one-time link", comment: "new chat sheet title"),
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case .ownLink:
logger.debug("planAndConnect, .invitationLink, .ownLink, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .invitationLink, .ownLink")
await MainActor.run {
if let incognito = incognito {
showAlert(.ownInvitationLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
} else {
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own one-time link!"))
}
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("Connect to yourself?\nThis is your own one-time link!", comment: "new chat sheet title"),
actionStyle: .destructive,
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case let .connecting(contact_):
logger.debug("planAndConnect, .invitationLink, .connecting, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .invitationLink, .connecting")
await MainActor.run {
if let contact = contact_ {
if let f = filterKnownContact {
@ -1058,11 +1049,11 @@ func planAndConnect(
openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyConnectingAlert(contact)) }
}
} else {
showAlert(.invitationLinkConnecting(connectionLink: connectionLink))
showInvitationLinkConnectingAlert(cleanup: cleanup)
}
}
case let .known(contact):
logger.debug("planAndConnect, .invitationLink, .known, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .invitationLink, .known")
await MainActor.run {
if let f = filterKnownContact {
f(contact)
@ -1074,34 +1065,42 @@ func planAndConnect(
case let .contactAddress(cap):
switch cap {
case .ok:
logger.debug("planAndConnect, .contactAddress, .ok, incognito=\(incognito?.description ?? "nil")")
if let incognito = incognito {
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup)
} else {
await MainActor.run {
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via contact address"))
}
logger.debug("planAndConnect, .contactAddress, .ok")
await MainActor.run {
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("Connect via contact address", comment: "new chat sheet title"),
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case .ownLink:
logger.debug("planAndConnect, .contactAddress, .ownLink, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .contactAddress, .ownLink")
await MainActor.run {
if let incognito = incognito {
showAlert(.ownContactAddressConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
} else {
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own SimpleX address!"))
}
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("Connect to yourself?\nThis is your own SimpleX address!", comment: "new chat sheet title"),
actionStyle: .destructive,
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case .connectingConfirmReconnect:
logger.debug("planAndConnect, .contactAddress, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .contactAddress, .connectingConfirmReconnect")
await MainActor.run {
if let incognito = incognito {
showAlert(.contactAddressConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
} else {
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You have already requested connection!\nRepeat connection request?"))
}
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("You have already requested connection!\nRepeat connection request?", comment: "new chat sheet title"),
actionStyle: .destructive,
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case let .connectingProhibit(contact):
logger.debug("planAndConnect, .contactAddress, .connectingProhibit, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .contactAddress, .connectingProhibit")
await MainActor.run {
if let f = filterKnownContact {
f(contact)
@ -1110,7 +1109,7 @@ func planAndConnect(
}
}
case let .known(contact):
logger.debug("planAndConnect, .contactAddress, .known, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .contactAddress, .known")
await MainActor.run {
if let f = filterKnownContact {
f(contact)
@ -1119,49 +1118,60 @@ func planAndConnect(
}
}
case let .contactViaAddress(contact):
logger.debug("planAndConnect, .contactAddress, .contactViaAddress, incognito=\(incognito?.description ?? "nil")")
if let incognito = incognito {
connectContactViaAddress_(contact, dismiss: dismiss, incognito: incognito, cleanup: cleanup)
} else {
await MainActor.run {
showActionSheet(.askCurrentOrIncognitoProfileConnectContactViaAddress(contact: contact))
}
logger.debug("planAndConnect, .contactAddress, .contactViaAddress")
await MainActor.run {
showAskCurrentOrIncognitoProfileConnectContactViaAddressSheet(
contact: contact,
dismiss: dismiss,
cleanup: cleanup
)
}
}
case let .groupLink(glp):
switch glp {
case .ok:
await MainActor.run {
if let incognito = incognito {
showAlert(.groupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
} else {
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Join group"))
}
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("Join group", comment: "new chat sheet title"),
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case let .ownLink(groupInfo):
logger.debug("planAndConnect, .groupLink, .ownLink, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .groupLink, .ownLink")
await MainActor.run {
if let f = filterKnownGroup {
f(groupInfo)
}
showActionSheet(.ownGroupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito, groupInfo: groupInfo))
showOwnGroupLinkConfirmConnectSheet(
groupInfo: groupInfo,
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case .connectingConfirmReconnect:
logger.debug("planAndConnect, .groupLink, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .groupLink, .connectingConfirmReconnect")
await MainActor.run {
if let incognito = incognito {
showAlert(.groupLinkConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
} else {
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You are already joining the group!\nRepeat join request?"))
}
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("You are already joining the group!\nRepeat join request?", comment: "new chat sheet title"),
actionStyle: .destructive,
connectionLink: connectionLink,
connectionPlan: connectionPlan,
dismiss: dismiss,
cleanup: cleanup
)
}
case let .connectingProhibit(groupInfo_):
logger.debug("planAndConnect, .groupLink, .connectingProhibit, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .groupLink, .connectingProhibit")
await MainActor.run {
showAlert(.groupLinkConnecting(connectionLink: connectionLink, groupInfo: groupInfo_))
showGroupLinkConnectingAlert(groupInfo: groupInfo_, cleanup: cleanup)
}
case let .known(groupInfo):
logger.debug("planAndConnect, .groupLink, .known, incognito=\(incognito?.description ?? "nil")")
logger.debug("planAndConnect, .groupLink, .known")
await MainActor.run {
if let f = filterKnownGroup {
f(groupInfo)
@ -1172,15 +1182,20 @@ func planAndConnect(
}
case let .error(chatError):
logger.debug("planAndConnect, .error \(chatErrorString(chatError))")
if let incognito = incognito {
connectViaLink(connectionLink, connectionPlan: nil, dismiss: dismiss, incognito: incognito, cleanup: cleanup)
} else {
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: nil, title: "Connect via link"))
}
showAskCurrentOrIncognitoProfileSheet(
title: NSLocalizedString("Connect via link", comment: "new chat sheet title"),
connectionLink: connectionLink,
connectionPlan: nil,
dismiss: dismiss,
cleanup: cleanup
)
}
} else if let alert {
await MainActor.run {
showAlert(.error(shortOrFullLink: shortOrFullLink, alert: alert))
dismissAllSheets(animated: true) {
AlertManager.shared.showAlert(alert)
cleanup?()
}
}
}
}

View file

@ -12,11 +12,12 @@ import SimpleXChat
struct MutableQRCode: View {
@Binding var uri: String
var small: Bool = false
var withLogo: Bool = true
var tintColor = UIColor(red: 0.023, green: 0.176, blue: 0.337, alpha: 1)
var body: some View {
QRCode(uri: uri, withLogo: withLogo, tintColor: tintColor)
QRCode(uri: uri, small: small, withLogo: withLogo, tintColor: tintColor)
.id("simplex-qrcode-view-for-\(uri)")
}
}
@ -27,7 +28,7 @@ struct SimpleXCreatedLinkQRCode: View {
var onShare: (() -> Void)? = nil
var body: some View {
QRCode(uri: link.simplexChatUri(short: short), onShare: onShare)
QRCode(uri: link.simplexChatUri(short: short), small: short && link.connShortLink != nil, onShare: onShare)
}
}
@ -38,50 +39,57 @@ struct SimpleXLinkQRCode: View {
var onShare: (() -> Void)? = nil
var body: some View {
QRCode(uri: simplexChatLink(uri), withLogo: withLogo, tintColor: tintColor, onShare: onShare)
QRCode(uri: simplexChatLink(uri), small: uri.count < 200, withLogo: withLogo, tintColor: tintColor, onShare: onShare)
}
}
private let smallQRRatio: CGFloat = 0.63
struct QRCode: View {
let uri: String
var small: Bool = false
var withLogo: Bool = true
var tintColor = UIColor(red: 0.023, green: 0.176, blue: 0.337, alpha: 1)
var onShare: (() -> Void)? = nil
@State private var image: UIImage? = nil
@State private var makeScreenshotFunc: () -> Void = {}
@State private var width: CGFloat = .infinity
var body: some View {
ZStack {
if let image = image {
qrCodeImage(image)
GeometryReader { geo in
qrCodeImage(image).frame(width: width, height: width)
GeometryReader { g in
let w = g.size.width * (small ? smallQRRatio : 1)
let l = w * (small ? 0.195 : 0.16)
let m = w * 0.005
ZStack {
if withLogo {
let w = geo.size.width
Image("icon-light")
.resizable()
.scaledToFit()
.frame(width: w * 0.16, height: w * 0.16)
.frame(width: w * 0.165, height: w * 0.165)
.frame(width: l, height: l)
.frame(width: l + m, height: l + m)
.background(.white)
.clipShape(Circle())
}
}
.onAppear {
width = w
makeScreenshotFunc = {
let size = CGSizeMake(1024 / UIScreen.main.scale, 1024 / UIScreen.main.scale)
showShareSheet(items: [makeScreenshot(geo.frame(in: .local).origin, size)])
showShareSheet(items: [makeScreenshot(g.frame(in: .local).origin, size)])
onShare?()
}
}
.frame(width: geo.size.width, height: geo.size.height)
.frame(width: g.size.width, height: g.size.height)
}
} else {
Color.clear.aspectRatio(1, contentMode: .fit)
Color.clear.aspectRatio(small ? 1 / smallQRRatio : 1, contentMode: .fit)
}
}
.onTapGesture(perform: makeScreenshotFunc)
.task { image = await generateImage(uri, tintColor: tintColor) }
.task { image = await generateImage(uri, tintColor: tintColor, errorLevel: small ? "M" : "L") }
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
@ -94,10 +102,11 @@ private func qrCodeImage(_ image: UIImage) -> some View {
.textSelection(.enabled)
}
private func generateImage(_ uri: String, tintColor: UIColor) async -> UIImage? {
private func generateImage(_ uri: String, tintColor: UIColor, errorLevel: String) async -> UIImage? {
let context = CIContext()
let filter = CIFilter.qrCodeGenerator()
filter.message = Data(uri.utf8)
filter.correctionLevel = errorLevel
if let outputImage = filter.outputImage,
let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
return UIImage(cgImage: cgImage).replaceColor(UIColor.black, tintColor)

View file

@ -367,13 +367,13 @@ struct ChatThemePreview: View {
let alice = ChatItem.getSample(1, CIDirection.directRcv, Date.now, NSLocalizedString("Good afternoon!", comment: "message preview"))
let bob = ChatItem.getSample(2, CIDirection.directSnd, Date.now, NSLocalizedString("Good morning!", comment: "message preview"), quotedItem: CIQuote.getSample(alice.id, alice.meta.itemTs, alice.content.text, chatDir: alice.chatDir))
HStack {
ChatItemView(chat: Chat.sampleData, chatItem: alice, scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, im: ItemsModel.shared, chatItem: alice, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
.modifier(ChatItemClipped(alice, tailVisible: true))
Spacer()
}
HStack {
Spacer()
ChatItemView(chat: Chat.sampleData, chatItem: bob, scrollToItemId: { _ in })
ChatItemView(chat: Chat.sampleData, im: ItemsModel.shared, chatItem: bob, scrollToItem: { _ in }, scrollToItemId: Binding.constant(nil))
.modifier(ChatItemClipped(bob, tailVisible: true))
.frame(alignment: .trailing)
}

View file

@ -65,7 +65,7 @@ struct NewServerView: View {
useServerSection(valid)
if valid {
Section(header: Text("Add to another device").foregroundColor(theme.colors.secondary)) {
MutableQRCode(uri: $serverToEdit.server)
MutableQRCode(uri: $serverToEdit.server, small: true)
.listRowInsets(EdgeInsets(top: 12, leading: 12, bottom: 12, trailing: 12))
}
}

View file

@ -110,7 +110,7 @@ struct ProtocolServerView: View {
useServerSection(valid)
if valid {
Section(header: Text("Add to another device").foregroundColor(theme.colors.secondary)) {
MutableQRCode(uri: $serverToEdit.server)
MutableQRCode(uri: $serverToEdit.server, small: true)
.listRowInsets(EdgeInsets(top: 12, leading: 12, bottom: 12, trailing: 12))
}
}

View file

@ -58,6 +58,7 @@ let DEFAULT_CONNECT_VIA_LINK_TAB = "connectViaLinkTab"
let DEFAULT_LIVE_MESSAGE_ALERT_SHOWN = "liveMessageAlertShown"
let DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE = "showHiddenProfilesNotice"
let DEFAULT_SHOW_MUTE_PROFILE_ALERT = "showMuteProfileAlert"
let DEFAULT_SHOW_REPORTS_IN_SUPPORT_CHAT_ALERT = "showReportsInSupportChatAlert"
let DEFAULT_WHATS_NEW_VERSION = "defaultWhatsNewVersion"
let DEFAULT_ONBOARDING_STAGE = "onboardingStage"
let DEFAULT_MIGRATION_TO_STAGE = "migrationToStage"
@ -117,6 +118,7 @@ let appDefaults: [String: Any] = [
DEFAULT_LIVE_MESSAGE_ALERT_SHOWN: false,
DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE: true,
DEFAULT_SHOW_MUTE_PROFILE_ALERT: true,
DEFAULT_SHOW_REPORTS_IN_SUPPORT_CHAT_ALERT: true,
DEFAULT_ONBOARDING_STAGE: OnboardingStage.onboardingComplete.rawValue,
DEFAULT_CUSTOM_DISAPPEARING_MESSAGE_TIME: 300,
DEFAULT_SHOW_UNREAD_AND_FAVORITES: false,
@ -144,6 +146,7 @@ let hintDefaults = [
DEFAULT_LIVE_MESSAGE_ALERT_SHOWN,
DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE,
DEFAULT_SHOW_MUTE_PROFILE_ALERT,
DEFAULT_SHOW_REPORTS_IN_SUPPORT_CHAT_ALERT,
DEFAULT_SHOW_DELETE_CONVERSATION_NOTICE,
DEFAULT_SHOW_DELETE_CONTACT_NOTICE
]
@ -195,6 +198,8 @@ let customDisappearingMessageTimeDefault = IntDefault(defaults: UserDefaults.sta
let showDeleteConversationNoticeDefault = BoolDefault(defaults: UserDefaults.standard, forKey: DEFAULT_SHOW_DELETE_CONVERSATION_NOTICE)
let showDeleteContactNoticeDefault = BoolDefault(defaults: UserDefaults.standard, forKey: DEFAULT_SHOW_DELETE_CONTACT_NOTICE)
let showReportsInSupportChatAlertDefault = BoolDefault(defaults: UserDefaults.standard, forKey: DEFAULT_SHOW_REPORTS_IN_SUPPORT_CHAT_ALERT)
/// after importing new database, this flag will be set and unset only after importing app settings in `initializeChat` */
let shouldImportAppSettingsDefault = BoolDefault(defaults: UserDefaults.standard, forKey: DEFAULT_SHOULD_IMPORT_APP_SETTINGS)
let currentThemeDefault = StringDefault(defaults: UserDefaults.standard, forKey: DEFAULT_CURRENT_THEME, withDefault: DefaultTheme.SYSTEM_THEME_NAME)

View file

@ -153,6 +153,9 @@ struct UserAddressView: View {
}
}
addressSettingsButton(userAddress)
if (userAddress.connLinkContact.connShortLink == nil && UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_SHORT_LINKS)) {
addShortLinkButton()
}
} header: {
ToggleShortLinkHeader(text: Text("For social media"), link: userAddress.connLinkContact, short: $showShortLink)
} footer: {
@ -209,6 +212,32 @@ struct UserAddressView: View {
}
}
private func addShortLinkButton() -> some View {
Button {
addShortLink()
} label: {
Label("Add short link", systemImage: "plus")
}
}
private func addShortLink() {
progressIndicator = true
Task {
do {
let userAddress = try await apiAddMyAddressShortLink()
await MainActor.run {
chatModel.userAddress = userAddress
}
await MainActor.run { progressIndicator = false }
} catch let error {
logger.error("apiAddMyAddressShortLink: \(responseError(error))")
let a = getErrorAlert(error, "Error creating address")
alert = .error(title: a.title, error: a.message)
await MainActor.run { progressIndicator = false }
}
}
}
private func createOneTimeLinkButton() -> some View {
NavigationLink {
NewChatView(selection: .invite)

View file

@ -25,28 +25,8 @@ struct UserProfile: View {
var body: some View {
List {
Group {
if profile.image != nil {
ZStack(alignment: .bottomTrailing) {
ZStack(alignment: .topTrailing) {
profileImageView(profile.image)
.onTapGesture { showChooseSource = true }
overlayButton("multiply", edge: .top) { profile.image = nil }
}
overlayButton("camera", edge: .bottom) { showChooseSource = true }
}
} else {
ZStack(alignment: .center) {
profileImageView(profile.image)
editImageButton { showChooseSource = true }
}
}
}
.frame(maxWidth: .infinity, alignment: .center)
.listRowBackground(Color.clear)
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
.padding(.top)
.contentShape(Rectangle())
EditProfileImage(profileImage: $profile.image, showChooseSource: $showChooseSource)
.padding(.top)
Section {
HStack {
@ -133,25 +113,6 @@ struct UserProfile: View {
.alert(item: $alert) { a in userProfileAlert(a, $profile.displayName) }
}
private func overlayButton(
_ systemName: String,
edge: Edge.Set,
action: @escaping () -> Void
) -> some View {
Image(systemName: systemName)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 12)
.foregroundColor(theme.colors.primary)
.padding(6)
.frame(width: 36, height: 36, alignment: .center)
.background(radius >= 20 ? Color.clear : theme.colors.background.opacity(0.5))
.clipShape(Circle())
.contentShape(Circle())
.padding([.trailing, edge], -12)
.onTapGesture(perform: action)
}
private func showFullName(_ user: User) -> Bool {
user.profile.fullName != "" && user.profile.fullName != user.profile.displayName
}
@ -189,8 +150,54 @@ struct UserProfile: View {
}
}
func profileImageView(_ imageStr: String?) -> some View {
ProfileImage(imageStr: imageStr, size: 192)
struct EditProfileImage: View {
@EnvironmentObject var theme: AppTheme
@AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var radius = defaultProfileImageCorner
@Binding var profileImage: String?
@Binding var showChooseSource: Bool
var body: some View {
Group {
if profileImage != nil {
ZStack(alignment: .bottomTrailing) {
ZStack(alignment: .topTrailing) {
ProfileImage(imageStr: profileImage, size: 160)
.onTapGesture { showChooseSource = true }
overlayButton("multiply", edge: .top) { profileImage = nil }
}
overlayButton("camera", edge: .bottom) { showChooseSource = true }
}
} else {
ZStack(alignment: .center) {
ProfileImage(imageStr: profileImage, size: 160)
editImageButton { showChooseSource = true }
}
}
}
.frame(maxWidth: .infinity, alignment: .center)
.listRowBackground(Color.clear)
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
.contentShape(Rectangle())
}
private func overlayButton(
_ systemName: String,
edge: Edge.Set,
action: @escaping () -> Void
) -> some View {
Image(systemName: systemName)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 12)
.foregroundColor(theme.colors.primary)
.padding(6)
.frame(width: 36, height: 36, alignment: .center)
.background(radius >= 20 ? Color.clear : theme.colors.background.opacity(0.5))
.clipShape(Circle())
.contentShape(Circle())
.padding([.trailing, edge], -12)
.onTapGesture(perform: action)
}
}
func editImageButton(action: @escaping () -> Void) -> some View {

View file

@ -350,7 +350,7 @@ struct UserProfilesView: View {
Image(systemName: "checkmark").foregroundColor(theme.colors.onBackground)
} else {
if userInfo.unreadCount > 0 {
UnreadBadge(userInfo: userInfo)
userUnreadBadge(userInfo, theme: theme)
}
if user.hidden {
Image(systemName: "lock").foregroundColor(theme.colors.secondary)

View file

@ -554,6 +554,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Приеми условията</target>
@ -575,6 +583,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Приети условия</target>
@ -628,6 +640,10 @@ swipe action</note>
<target>Добави сървъри чрез сканиране на QR кодове.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Добави членове на екипа</target>
@ -919,12 +935,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>В процес на свързване!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Вече се присъединихте към групата!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1354,7 +1370,8 @@ swipe action</note>
<source>Cancel</source>
<target>Отказ</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1455,7 +1472,7 @@ set passcode view</note>
</trans-unit>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1535,11 +1552,23 @@ set passcode view</note>
<source>Chat will be deleted for you - this cannot be undone!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Чатове</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<note>No comment provided by engineer.</note>
@ -1743,11 +1772,6 @@ set passcode view</note>
<target>Автоматично свъзрване</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Свързване инкогнито</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Свързване с настолно устройство</target>
@ -1757,44 +1781,39 @@ set passcode view</note>
<source>Connect to your friends faster.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Свърване със себе си?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Свърване със себе си?
Това е вашият личен SimpleX адрес!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Свърване със себе си?
Това е вашят еднократен линк за връзка!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Свързване чрез адрес за контакт</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Свърване чрез линк</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Свързване чрез еднократен линк за връзка</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Свързване с %@</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2051,11 +2070,6 @@ This is your own one-time link!</source>
<target>Създай опашка</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Създай тайна група</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Създай своя профил</target>
@ -2300,6 +2314,10 @@ swipe action</note>
<target>Изтриване на чат профила?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<note>No comment provided by engineer.</note>
@ -2698,7 +2716,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Не показвай отново</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3006,6 +3024,10 @@ chat item action</note>
<target>Грешка при приемане на заявка за контакт</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Грешка при добавяне на член(ове)</target>
@ -3015,6 +3037,10 @@ chat item action</note>
<source>Error adding server</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Грешка при промяна на адреса</target>
@ -3032,7 +3058,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Грешка при промяна на настройката</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3092,7 +3118,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Грешка при изтриване на базата данни</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3107,12 +3137,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Грешка при изтриване на базата данни</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Грешка при изтриване на старата база данни</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3147,7 +3177,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Грешка при експортиране на базата данни</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3156,7 +3186,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Грешка при импортиране на базата данни</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3196,7 +3226,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Грешка при отстраняване на член</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3731,7 +3761,7 @@ Error: %2$@</source>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Групата вече съществува!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3798,6 +3828,10 @@ Error: %2$@</source>
<target>Груповият профил се съхранява на устройствата на членовете, а не на сървърите.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Съобщение при посрещане в групата</target>
@ -4277,34 +4311,24 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Влез в групата</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Присъединяване към групи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Влез в групата?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Влез инкогнито</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Присъединяване с текущия профил</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Влез в твоята група?
Това е вашят линк за група %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4508,6 +4532,10 @@ This is your link for group %@!</source>
<target>Член</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
@ -4539,6 +4567,10 @@ This is your link for group %@!</source>
<target>Членът ще бъде премахнат от групата - това не може да бъде отменено!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Членовете на групата могат да добавят реакции към съобщенията.</target>
@ -4931,6 +4963,10 @@ This is your link for group %@!</source>
<target>Нова членска роля</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Ново съобщение</target>
@ -4967,6 +5003,10 @@ This is your link for group %@!</source>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Няма избрани контакти</target>
@ -5140,7 +5180,9 @@ This is your link for group %@!</source>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ок</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5288,7 +5330,7 @@ Requires compatible VPN.</source>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Отвори група</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5531,6 +5573,10 @@ Error: %@</source>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -5950,6 +5996,10 @@ swipe action</note>
<target>Отхвърли заявката за контакт</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Реле сървър се използва само ако е необходимо. Друга страна може да наблюдава вашия IP адрес.</target>
@ -6003,11 +6053,6 @@ swipe action</note>
<target>Предоговори криптирането?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Изпрати отново заявката за свързване?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Повтори изтеглянето</target>
@ -6018,11 +6063,6 @@ swipe action</note>
<target>Повтори импортирането</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>Изпрати отново заявката за присъединяване?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Повтори качването</target>
@ -6053,6 +6093,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -6157,6 +6201,14 @@ swipe action</note>
<source>Review conditions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Отзови</target>
@ -6210,6 +6262,14 @@ chat item action</note>
<target>Запази (и уведоми контактите)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Запази и уведоми контакта</target>
@ -6234,6 +6294,10 @@ chat item action</note>
<target>Запази профила на групата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -6689,6 +6753,10 @@ chat item action</note>
<target>Задайте го вместо системната идентификация.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7432,16 +7500,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Тази група вече не съществува.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Това е вашият личен SimpleX адрес!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Това е вашят еднократен линк за връзка!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -7831,7 +7889,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Използвай текущия профил</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -7859,7 +7917,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Използвай нов инкогнито профил</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8200,12 +8258,12 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>Вече се свързвате с %@.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>Вече се свързвате чрез този еднократен линк за връзка!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8215,24 +8273,19 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Вече се присъединявате към групата %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>Вие вече се присъединявате към групата чрез този линк!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Вие вече се присъединявате към групата чрез този линк.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>Вече се присъединихте към групата!
Изпрати отново заявката за присъединяване?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8343,6 +8396,10 @@ Repeat join request?</source>
<target>Можете да видите отново линкът за покана в подробностите за връзката.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Не може да изпращате съобщения!</target>
@ -8358,17 +8415,12 @@ Repeat join request?</source>
<target>Хората могат да се свържат с вас само чрез ликовете, които споделяте.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>Вече сте заявили връзка през този адрес!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Вече сте направили заявката за връзка!
Изпрати отново заявката за свързване?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8451,11 +8503,6 @@ Repeat connection request?</source>
<target>Ще трябва да се идентифицирате, когато стартирате или възобновите приложението след 30 секунди във фонов режим.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Ще се свържете с всички членове на групата.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Все още ще получавате обаждания и известия от заглушени профили, когато са активни.</target>
@ -8635,6 +8682,10 @@ Repeat connection request?</source>
<target>по-горе, след това избери:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>обаждането прието</target>
@ -8644,6 +8695,10 @@ Repeat connection request?</source>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>админ</target>
@ -8664,6 +8719,10 @@ Repeat connection request?</source>
<target>съгласуване на криптиране…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>всички членове</target>
@ -8747,6 +8806,10 @@ marked deleted chat item preview text</note>
<target>повикване…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>отменен %@</target>
@ -8852,6 +8915,14 @@ marked deleted chat item preview text</note>
<target>името на контакта %1$@ е променено на %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>контактът има e2e криптиране</target>
@ -8862,6 +8933,10 @@ marked deleted chat item preview text</note>
<target>контактът няма e2e криптиране</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>създател</target>
@ -9030,6 +9105,10 @@ pref value</note>
<target>групата е изтрита</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>профилът на групата е актуализиран</target>
@ -9153,6 +9232,10 @@ pref value</note>
<target>свързан</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<note>No comment provided by engineer.</note>
@ -9216,6 +9299,10 @@ pref value</note>
<target>няма текст</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>наблюдател</target>
@ -9226,6 +9313,7 @@ pref value</note>
<target>изключено</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9274,6 +9362,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>квантово устойчиво e2e криптиране</target>
@ -9313,6 +9405,10 @@ time to disappear</note>
<target>премахнат адрес за контакт</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>премахната профилна снимка</target>
@ -9323,10 +9419,22 @@ time to disappear</note>
<target>ви острани</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>запазено</target>
@ -9508,6 +9616,10 @@ last received msg: %2$@</source>
<target>вие</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>вие сте поканени в групата</target>

View file

@ -112,6 +112,7 @@
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ nahrán</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ wants to connect!" xml:space="preserve">
@ -126,6 +127,7 @@
</trans-unit>
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
<source>%@, %@ and %lld members</source>
<target>%@, %@ a %lld členů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
@ -544,6 +546,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<note>No comment provided by engineer.</note>
@ -564,6 +574,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<note>No comment provided by engineer.</note>
@ -612,6 +626,10 @@ swipe action</note>
<target>Přidejte servery skenováním QR kódů.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<note>No comment provided by engineer.</note>
@ -882,11 +900,11 @@ swipe action</note>
</trans-unit>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1281,7 +1299,8 @@ swipe action</note>
<source>Cancel</source>
<target>Zrušit</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1378,7 +1397,7 @@ set passcode view</note>
</trans-unit>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1456,11 +1475,23 @@ set passcode view</note>
<source>Chat will be deleted for you - this cannot be undone!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Chaty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<note>No comment provided by engineer.</note>
@ -1658,11 +1689,6 @@ set passcode view</note>
<source>Connect automatically</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Spojit se inkognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<note>No comment provided by engineer.</note>
@ -1671,37 +1697,33 @@ set passcode view</note>
<source>Connect to your friends faster.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Připojte se prostřednictvím odkazu</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Připojit se jednorázovým odkazem</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -1950,11 +1972,6 @@ This is your own one-time link!</source>
<target>Vytvořit frontu</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Vytvořit tajnou skupinu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Vytvořte si profil</target>
@ -2193,6 +2210,10 @@ swipe action</note>
<target>Smazat chat profil?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<note>No comment provided by engineer.</note>
@ -2584,7 +2605,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Znovu neukazuj</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -2878,6 +2899,10 @@ chat item action</note>
<target>Chyba při přijímání žádosti o kontakt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Chyba přidávání člena(ů)</target>
@ -2887,6 +2912,10 @@ chat item action</note>
<source>Error adding server</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Chuba změny adresy</target>
@ -2904,7 +2933,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Chyba změny nastavení</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -2963,7 +2992,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Chyba při mazání databáze chatu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -2978,12 +3011,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Chyba při mazání databáze</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Chyba při mazání staré databáze</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3017,7 +3050,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Chyba při exportu databáze chatu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3026,7 +3059,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Chyba při importu databáze chatu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3065,7 +3098,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Chyba při odebrání člena</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3582,7 +3615,7 @@ Error: %2$@</source>
</trans-unit>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3649,6 +3682,10 @@ Error: %2$@</source>
<target>Profil skupiny je uložen v zařízeních členů, nikoli na serverech.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Uvítací zpráva skupin</target>
@ -4113,29 +4150,21 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Připojit ke skupině</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Připojit se inkognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4333,6 +4362,10 @@ This is your link for group %@!</source>
<target>Člen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
@ -4364,6 +4397,10 @@ This is your link for group %@!</source>
<target>Člen bude odstraněn ze skupiny - toto nelze vzít zpět!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Členové skupin mohou přidávat reakce na zprávy.</target>
@ -4739,6 +4776,10 @@ This is your link for group %@!</source>
<target>Nová role člena</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Nová zpráva</target>
@ -4775,6 +4816,10 @@ This is your link for group %@!</source>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Nebyl vybrán žádný kontakt</target>
@ -4945,7 +4990,9 @@ This is your link for group %@!</source>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5092,7 +5139,7 @@ Vyžaduje povolení sítě VPN.</target>
</trans-unit>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5320,6 +5367,10 @@ Error: %@</source>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -5731,6 +5782,10 @@ swipe action</note>
<target>Odmítnout žádost o kontakt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Přenosový server se používá pouze v případě potřeby. Jiná strana může sledovat vaši IP adresu.</target>
@ -5784,10 +5839,6 @@ swipe action</note>
<target>Znovu vyjednat šifrování?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<note>No comment provided by engineer.</note>
@ -5796,10 +5847,6 @@ swipe action</note>
<source>Repeat import</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<note>No comment provided by engineer.</note>
@ -5829,6 +5876,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -5932,6 +5983,14 @@ swipe action</note>
<source>Review conditions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Odvolat</target>
@ -5984,6 +6043,14 @@ chat item action</note>
<target>Uložit (a informovat kontakty)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Uložit a upozornit kontakt</target>
@ -6008,6 +6075,10 @@ chat item action</note>
<target>Uložení profilu skupiny</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -6455,6 +6526,10 @@ chat item action</note>
<target>Nastavte jej namísto ověřování systému.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7179,14 +7254,6 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>Tato skupina již neexistuje.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -7564,7 +7631,7 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Použít aktuální profil</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -7591,7 +7658,7 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Použít nový inkognito profil</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -7911,11 +7978,11 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
</trans-unit>
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -7923,20 +7990,16 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
</trans-unit>
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8044,6 +8107,10 @@ Repeat join request?</source>
<source>You can view invitation link again in connection details.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Nemůžete posílat zprávy!</target>
@ -8059,14 +8126,10 @@ Repeat join request?</source>
<target>Lidé se s vámi mohou spojit pouze prostřednictvím odkazu, který sdílíte.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8148,10 +8211,6 @@ Repeat connection request?</source>
<target>Při spuštění nebo obnovení aplikace po 30 sekundách na pozadí budete požádáni o ověření.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní.</target>
@ -8330,6 +8389,10 @@ Repeat connection request?</source>
<target>výše, pak vyberte:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>přijatý hovor</target>
@ -8339,6 +8402,10 @@ Repeat connection request?</source>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>správce</target>
@ -8358,6 +8425,10 @@ Repeat connection request?</source>
<target>povoluji šifrování…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
@ -8435,6 +8506,10 @@ marked deleted chat item preview text</note>
<target>volání…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>zrušeno %@</target>
@ -8539,6 +8614,14 @@ marked deleted chat item preview text</note>
<source>contact %1$@ changed to %2$@</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>kontakt má šifrování e2e</target>
@ -8549,6 +8632,10 @@ marked deleted chat item preview text</note>
<target>kontakt nemá šifrování e2e</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>tvůrce</target>
@ -8715,6 +8802,10 @@ pref value</note>
<target>skupina smazána</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>profil skupiny aktualizován</target>
@ -8837,6 +8928,10 @@ pref value</note>
<target>připojeno</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<note>No comment provided by engineer.</note>
@ -8900,6 +8995,10 @@ pref value</note>
<target>žádný text</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>pozorovatel</target>
@ -8910,6 +9009,7 @@ pref value</note>
<target>vypnuto</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -8957,6 +9057,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<note>chat item text</note>
@ -8994,6 +9098,10 @@ time to disappear</note>
<source>removed contact address</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<note>profile update event chat item</note>
@ -9003,10 +9111,22 @@ time to disappear</note>
<target>odstranil vás</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<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>
@ -9178,6 +9298,10 @@ last received msg: %2$@</source>
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</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>

View file

@ -565,6 +565,16 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<target>Als Mitglied übernehmen</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<target>Als Beobachter übernehmen</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Nutzungsbedingungen akzeptieren</target>
@ -586,6 +596,11 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<target>Mitglied übernehmen</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Akzeptierte Nutzungsbedingungen</target>
@ -641,6 +656,10 @@ swipe action</note>
<target>Server durch Scannen von QR Codes hinzufügen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Team-Mitglieder aufnehmen</target>
@ -939,12 +958,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>Bereits verbunden!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Sie sind bereits Mitglied der Gruppe!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1389,7 +1408,8 @@ swipe action</note>
<source>Cancel</source>
<target>Abbrechen</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1495,7 +1515,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>Chat besteht bereits!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1582,11 +1602,26 @@ set passcode view</note>
<target>Der Chat wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<target>Chat mit Administratoren</target>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<target>Chat mit einem Mitglied</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<target>Chats mit Mitgliedern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Alle 20min Nachrichten überprüfen.</target>
@ -1812,11 +1847,6 @@ set passcode view</note>
<target>Automatisch verbinden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Inkognito verbinden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Mit dem Desktop verbinden</target>
@ -1827,44 +1857,39 @@ set passcode view</note>
<target>Schneller mit Ihren Freunden verbinden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Mit Ihnen selbst verbinden?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Sich mit Ihnen selbst verbinden?
Das ist Ihre eigene SimpleX-Adresse!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Mit Ihnen selbst verbinden?
Das ist Ihr eigener Einmal-Link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Über die Kontakt-Adresse verbinden</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Über einen Link verbinden</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Über einen Einmal-Link verbinden</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Mit %@ verbinden</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2143,11 +2168,6 @@ Das ist Ihr eigener Einmal-Link!</target>
<target>Erzeuge Warteschlange</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Geheime Gruppe erstellen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Erstellen Sie Ihr Profil</target>
@ -2402,6 +2422,11 @@ swipe action</note>
<target>Chat-Profil löschen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<target>Chat mit dem Mitglied löschen?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>Chat löschen?</target>
@ -2825,7 +2850,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Nicht nochmals anzeigen</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3143,6 +3168,11 @@ chat item action</note>
<target>Fehler beim Annehmen der Kontaktanfrage</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<target>Fehler beim Übernehmen des Mitglieds</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Fehler beim Hinzufügen von Mitgliedern</target>
@ -3153,6 +3183,10 @@ chat item action</note>
<target>Fehler beim Hinzufügen des Servers</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Fehler beim Wechseln der Empfängeradresse</target>
@ -3171,7 +3205,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Fehler beim Ändern der Einstellung</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3236,7 +3270,12 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Fehler beim Löschen der Chat-Datenbank</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<target>Fehler beim Löschen des Chats mit dem Mitglied</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3251,12 +3290,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Fehler beim Löschen der Datenbank</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Fehler beim Löschen der alten Datenbank</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3291,7 +3330,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Fehler beim Exportieren der Chat-Datenbank</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3301,7 +3340,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Fehler beim Importieren der Chat-Datenbank</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3346,7 +3385,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Fehler beim Entfernen des Mitglieds</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3926,7 +3965,7 @@ Fehler: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Die Gruppe besteht bereits!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3993,6 +4032,10 @@ Fehler: %2$@</target>
<target>Das Gruppenprofil wird nur auf den Mitglieds-Systemen gespeichert und nicht auf den Servern.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Gruppen-Begrüßungsmeldung</target>
@ -4491,34 +4534,24 @@ Weitere Verbesserungen sind bald verfügbar!</target>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Treten Sie der Gruppe bei</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Gruppenunterhaltungen beitreten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Der Gruppe beitreten?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Inkognito beitreten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Mit dem aktuellen Profil beitreten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Ihrer Gruppe beitreten?
Das ist Ihr Link für die Gruppe %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4730,6 +4763,11 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Mitglied</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<target>Aufnahme von Mitgliedern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Mitglied inaktiv</target>
@ -4765,6 +4803,11 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Das Mitglied wird aus der Gruppe entfernt. Dies kann nicht rückgängig gemacht werden!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<target>Ein Mitglied wird der Gruppe beitreten. Übernehmen?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Gruppenmitglieder können eine Reaktion auf Nachrichten geben.</target>
@ -5185,6 +5228,11 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Neue Mitgliedsrolle</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<target>Ein neues Mitglied will der Gruppe beitreten.</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Neue Nachricht</target>
@ -5225,6 +5273,11 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Keine Chats in der Liste %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<target>Keine Chats mit Mitgliedern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Keine Kontakte ausgewählt</target>
@ -5417,7 +5470,9 @@ Das ist Ihr Link für die Gruppe %@!</target>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5571,10 +5626,11 @@ Dies erfordert die Aktivierung eines VPNs.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Gruppe öffnen</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
<target>Link öffnen?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
@ -5828,6 +5884,11 @@ Fehler: %@</target>
<target>Bitte versuchen Sie, die Benachrichtigungen zu deaktivieren und wieder zu aktivieren.</target>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<target>Bitte warten Sie auf die Überprüfung Ihrer Anfrage durch die Gruppen-Moderatoren, um der Gruppe beitreten zu können.</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<target>Bitte warten Sie, bis die Token-Aktivierung abgeschlossen ist.</target>
@ -6281,6 +6342,11 @@ swipe action</note>
<target>Kontaktanfrage ablehnen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<target>Mitglied ablehnen?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Relais-Server werden nur genutzt, wenn sie benötigt werden. Ihre IP-Adresse kann von Anderen erfasst werden.</target>
@ -6336,11 +6402,6 @@ swipe action</note>
<target>Verschlüsselung neu aushandeln?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Verbindungsanfrage wiederholen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Herunterladen wiederholen</target>
@ -6351,11 +6412,6 @@ swipe action</note>
<target>Import wiederholen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>Verbindungsanfrage wiederholen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Hochladen wiederholen</target>
@ -6391,6 +6447,11 @@ swipe action</note>
<target>Grund der Meldung?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<target>Meldung wurde an die Moderatoren gesendet</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<target>Spam melden: Nur Gruppenmoderatoren werden es sehen.</target>
@ -6506,6 +6567,16 @@ swipe action</note>
<target>Nutzungsbedingungen einsehen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<target>Überprüfung der Mitglieder</target>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<target>Überprüfung der Mitglieder vor der Aufnahme ("Anklopfen").</target>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Widerrufen</target>
@ -6562,6 +6633,15 @@ chat item action</note>
<target>Speichern (und Kontakte benachrichtigen)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<target>Speichern der Aufnahme-Einstellungen?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Speichern und Kontakt benachrichtigen</target>
@ -6587,6 +6667,10 @@ chat item action</note>
<target>Gruppenprofil speichern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<target>Liste speichern</target>
@ -7077,6 +7161,11 @@ chat item action</note>
<target>Anstelle der System-Authentifizierung festlegen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<target>Aufnahme von Mitgliedern festlegen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<target>Verfallsdatum von Nachrichten in Chats festlegen.</target>
@ -7873,16 +7962,6 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Diese Gruppe existiert nicht mehr.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Das ist Ihre eigene SimpleX-Adresse!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Das ist Ihr eigener Einmal-Link!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<target>Für diesen Link wird eine neuere App-Version benötigt. Bitte aktualisieren Sie die App oder bitten Sie Ihren Kontakt einen kompatiblen Link zu senden.</target>
@ -8300,7 +8379,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Aktuelles Profil nutzen</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8330,7 +8409,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Neues Inkognito-Profil nutzen</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8690,12 +8769,12 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>Sie sind bereits mit %@ verbunden.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>Sie sind bereits über diesen Einmal-Link verbunden!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8705,24 +8784,19 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Sie sind bereits Mitglied der Gruppe %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>Sie sind über diesen Link bereits Mitglied der Gruppe!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Sie sind über diesen Link bereits Mitglied der Gruppe.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>Sie sind bereits Mitglied dieser Gruppe!
Verbindungsanfrage wiederholen?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8839,6 +8913,11 @@ Verbindungsanfrage wiederholen?</target>
<target>Den Einladungslink können Sie in den Details der Verbindung nochmals sehen.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<target>Sie können Ihre Meldungen im Chat mit den Administratoren sehen.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Sie können keine Nachrichten versenden!</target>
@ -8854,17 +8933,12 @@ Verbindungsanfrage wiederholen?</target>
<target>Sie entscheiden, wer sich mit Ihnen verbinden kann.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>Sie haben über diese Adresse bereits eine Verbindung beantragt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Sie haben bereits ein Verbindungsanfrage beantragt!
Verbindungsanfrage wiederholen?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8951,11 +9025,6 @@ Verbindungsanfrage wiederholen?</target>
<target>Sie müssen sich authentifizieren, wenn Sie die im Hintergrund befindliche App nach 30 Sekunden starten oder fortsetzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Sie werden mit allen Gruppenmitgliedern verbunden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Sie können Anrufe und Benachrichtigungen auch von stummgeschalteten Profilen empfangen, solange diese aktiv sind.</target>
@ -9078,7 +9147,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="Your profile is stored on your device and only shared with your contacts." xml:space="preserve">
<source>Your profile is stored on your device and only shared with your contacts.</source>
<target>Das Profil wird nur mit Ihren Kontakten geteilt.</target>
<target>Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
@ -9141,6 +9210,11 @@ Verbindungsanfrage wiederholen?</target>
<target>Danach die gewünschte Aktion auswählen:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<target>%@ übernommen</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>Anruf angenommen</target>
@ -9151,6 +9225,11 @@ Verbindungsanfrage wiederholen?</target>
<target>Einladung angenommen</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<target>hat Sie übernommen</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>Admin</target>
@ -9171,6 +9250,11 @@ Verbindungsanfrage wiederholen?</target>
<target>Verschlüsselung zustimmen…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<target>alle</target>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>Alle Mitglieder</target>
@ -9257,6 +9341,11 @@ marked deleted chat item preview text</note>
<target>Anrufen…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<target>Es können keine Nachrichten gesendet werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>abgebrochen %@</target>
@ -9362,6 +9451,16 @@ marked deleted chat item preview text</note>
<target>Der Kontaktname wurde von %1$@ auf %2$@ geändert</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<target>Kontakt gelöscht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<target>Kontakt deaktiviert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>Kontakt nutzt E2E-Verschlüsselung</target>
@ -9372,6 +9471,11 @@ marked deleted chat item preview text</note>
<target>Kontakt nutzt keine E2E-Verschlüsselung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<target>Kontakt nicht bereit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>Ersteller</target>
@ -9543,6 +9647,11 @@ pref value</note>
<target>Gruppe gelöscht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<target>Gruppe wird gelöscht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>Gruppenprofil aktualisiert</target>
@ -9668,6 +9777,11 @@ pref value</note>
<target>ist der Gruppe beigetreten</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<target>Das Mitglied hat eine alte App-Version</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>Nachricht</target>
@ -9733,6 +9847,11 @@ pref value</note>
<target>Kein Text</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<target>Nicht synchronisiert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>Beobachter</target>
@ -9743,6 +9862,7 @@ pref value</note>
<target>Aus</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9795,6 +9915,11 @@ time to disappear</note>
<target>ausstehende Genehmigung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<target>Ausstehende Überprüfung</target>
<note>No comment provided by engineer.</note>
</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>
@ -9835,6 +9960,11 @@ time to disappear</note>
<target>Die Kontaktadresse wurde entfernt</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<target>Von der Gruppe entfernt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>Das Profil-Bild wurde entfernt</target>
@ -9845,11 +9975,26 @@ time to disappear</note>
<target>hat Sie aus der Gruppe entfernt</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<target>Beitrittsanfrage abgelehnt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>Zur Verbindung aufgefordert</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<target>Überprüfung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<target>Von Administratoren überprüft</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>abgespeichert</target>
@ -10039,6 +10184,11 @@ Zuletzt empfangene Nachricht: %2$@</target>
<target>Profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<target>Sie haben dieses Mitglied übernommen</target>
<note>snd group event chat item</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>

View file

@ -565,6 +565,16 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<target>Accept as member</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<target>Accept as observer</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Accept conditions</target>
@ -586,6 +596,11 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<target>Accept member</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Accepted conditions</target>
@ -641,6 +656,11 @@ swipe action</note>
<target>Add servers by scanning QR codes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<target>Add short link</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Add team members</target>
@ -939,12 +959,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>Already connecting!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Already joining the group!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1389,7 +1409,8 @@ swipe action</note>
<source>Cancel</source>
<target>Cancel</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1495,7 +1516,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>Chat already exists!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1582,11 +1603,26 @@ set passcode view</note>
<target>Chat will be deleted for you - this cannot be undone!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<target>Chat with admins</target>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<target>Chat with member</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<target>Chats with members</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Check messages every 20 min.</target>
@ -1812,11 +1848,6 @@ set passcode view</note>
<target>Connect automatically</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Connect incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Connect to desktop</target>
@ -1827,44 +1858,39 @@ set passcode view</note>
<target>Connect to your friends faster.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Connect to yourself?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Connect to yourself?
This is your own SimpleX address!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Connect to yourself?
This is your own one-time link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Connect via contact address</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Connect via link</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Connect via one-time link</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Connect with %@</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2143,11 +2169,6 @@ This is your own one-time link!</target>
<target>Create queue</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Create secret group</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Create your profile</target>
@ -2402,6 +2423,11 @@ swipe action</note>
<target>Delete chat profile?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<target>Delete chat with member?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>Delete chat?</target>
@ -2825,7 +2851,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Don't show again</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3143,6 +3169,11 @@ chat item action</note>
<target>Error accepting contact request</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<target>Error accepting member</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Error adding member(s)</target>
@ -3153,6 +3184,11 @@ chat item action</note>
<target>Error adding server</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<target>Error adding short link</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Error changing address</target>
@ -3171,7 +3207,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Error changing setting</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3236,7 +3272,12 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Error deleting chat database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<target>Error deleting chat with member</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3251,12 +3292,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Error deleting database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Error deleting old database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3291,7 +3332,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Error exporting chat database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3301,7 +3342,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Error importing chat database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3346,7 +3387,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Error removing member</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3926,7 +3967,7 @@ Error: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Group already exists!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3993,6 +4034,11 @@ Error: %2$@</target>
<target>Group profile is stored on members' devices, not on the servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<target>Group profile was changed. If you save it, the updated profile will be sent to group members.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Group welcome message</target>
@ -4491,34 +4537,24 @@ More improvements are coming soon!</target>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Join group</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Join group conversations</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Join group?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Join incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Join with current profile</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Join your group?
This is your link for group %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4730,6 +4766,11 @@ This is your link for group %@!</target>
<target>Member</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<target>Member admission</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Member inactive</target>
@ -4765,6 +4806,11 @@ This is your link for group %@!</target>
<target>Member will be removed from group - this cannot be undone!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<target>Member will join the group, accept member?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Members can add message reactions.</target>
@ -5185,6 +5231,11 @@ This is your link for group %@!</target>
<target>New member role</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<target>New member wants to join the group.</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>New message</target>
@ -5225,6 +5276,11 @@ This is your link for group %@!</target>
<target>No chats in list %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<target>No chats with members</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>No contacts selected</target>
@ -5417,7 +5473,9 @@ This is your link for group %@!</target>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5571,7 +5629,7 @@ Requires compatible VPN.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Open group</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5829,6 +5887,11 @@ Error: %@</target>
<target>Please try to disable and re-enable notfications.</target>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<target>Please wait for group moderators to review your request to join the group.</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<target>Please wait for token activation to complete.</target>
@ -6282,6 +6345,11 @@ swipe action</note>
<target>Reject contact request</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<target>Reject member?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Relay server is only used if necessary. Another party can observe your IP address.</target>
@ -6337,11 +6405,6 @@ swipe action</note>
<target>Renegotiate encryption?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Repeat connection request?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Repeat download</target>
@ -6352,11 +6415,6 @@ swipe action</note>
<target>Repeat import</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>Repeat join request?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Repeat upload</target>
@ -6392,6 +6450,11 @@ swipe action</note>
<target>Report reason?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<target>Report sent to moderators</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<target>Report spam: only group moderators will see it.</target>
@ -6507,6 +6570,16 @@ swipe action</note>
<target>Review conditions</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<target>Review members</target>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<target>Review members before admitting ("knocking").</target>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Revoke</target>
@ -6563,6 +6636,16 @@ chat item action</note>
<target>Save (and notify contacts)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<target>Save (and notify members)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<target>Save admission settings?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Save and notify contact</target>
@ -6588,6 +6671,11 @@ chat item action</note>
<target>Save group profile</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<target>Save group profile?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<target>Save list</target>
@ -7078,6 +7166,11 @@ chat item action</note>
<target>Set it instead of system authentication.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<target>Set member admission</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<target>Set message expiration in chats.</target>
@ -7874,16 +7967,6 @@ It can happen because of some bug or when the connection is compromised.</target
<target>This group no longer exists.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>This is your own SimpleX address!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>This is your own one-time link!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<target>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</target>
@ -8301,7 +8384,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Use current profile</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8331,7 +8414,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Use new incognito profile</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8691,12 +8774,12 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>You are already connecting to %@.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>You are already connecting via this one-time link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8706,24 +8789,19 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>You are already joining the group %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>You are already joining the group via this link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>You are already joining the group via this link.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>You are already joining the group!
Repeat join request?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8840,6 +8918,11 @@ Repeat join request?</target>
<target>You can view invitation link again in connection details.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<target>You can view your reports in Chat with admins.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>You can't send messages!</target>
@ -8855,17 +8938,12 @@ Repeat join request?</target>
<target>You decide who can connect.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>You have already requested connection via this address!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>You have already requested connection!
Repeat connection request?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8952,11 +9030,6 @@ Repeat connection request?</target>
<target>You will be required to authenticate when you start or resume the app after 30 seconds in background.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>You will connect to all group members.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>You will still receive calls and notifications from muted profiles when they are active.</target>
@ -9142,6 +9215,11 @@ Repeat connection request?</target>
<target>above, then choose:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<target>accepted %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>accepted call</target>
@ -9152,6 +9230,11 @@ Repeat connection request?</target>
<target>accepted invitation</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<target>accepted you</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>admin</target>
@ -9172,6 +9255,11 @@ Repeat connection request?</target>
<target>agreeing encryption…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<target>all</target>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>all members</target>
@ -9258,6 +9346,11 @@ marked deleted chat item preview text</note>
<target>calling…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<target>can't send messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>cancelled %@</target>
@ -9363,6 +9456,16 @@ marked deleted chat item preview text</note>
<target>contact %1$@ changed to %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<target>contact deleted</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<target>contact disabled</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>contact has e2e encryption</target>
@ -9373,6 +9476,11 @@ marked deleted chat item preview text</note>
<target>contact has no e2e encryption</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<target>contact not ready</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>creator</target>
@ -9544,6 +9652,11 @@ pref value</note>
<target>group deleted</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<target>group is deleted</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>group profile updated</target>
@ -9669,6 +9782,11 @@ pref value</note>
<target>connected</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<target>member has old version</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>message</target>
@ -9734,6 +9852,11 @@ pref value</note>
<target>no text</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<target>not synchronized</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>observer</target>
@ -9744,6 +9867,7 @@ pref value</note>
<target>off</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9796,6 +9920,11 @@ time to disappear</note>
<target>pending approval</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<target>pending review</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>quantum resistant e2e encryption</target>
@ -9836,6 +9965,11 @@ time to disappear</note>
<target>removed contact address</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<target>removed from group</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>removed profile picture</target>
@ -9846,11 +9980,26 @@ time to disappear</note>
<target>removed you</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<target>request to join rejected</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>requested to connect</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<target>review</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<target>reviewed by admins</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>saved</target>
@ -10040,6 +10189,11 @@ last received msg: %2$@</target>
<target>you</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<target>you accepted this member</target>
<note>snd group event chat item</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>

View file

@ -565,6 +565,16 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<target>Aceptar como miembro</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<target>Aceptar como observador</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Aceptar condiciones</target>
@ -586,6 +596,11 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<target>Aceptar miembro</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Condiciones aceptadas</target>
@ -641,6 +656,10 @@ swipe action</note>
<target>Añadir servidores mediante el escaneo de códigos QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Añadir miembros del equipo</target>
@ -939,12 +958,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>¡Ya en proceso de conexión!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>¡Ya en proceso de unirte al grupo!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1389,7 +1408,8 @@ swipe action</note>
<source>Cancel</source>
<target>Cancelar</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1495,7 +1515,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>¡El chat ya existe!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1582,11 +1602,26 @@ set passcode view</note>
<target>El chat será eliminado para tí. ¡No puede deshacerse!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<target>Chat con administradores</target>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<target>Chat con miembro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<target>Chats con miembros</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Comprobar mensajes cada 20 min.</target>
@ -1812,11 +1847,6 @@ set passcode view</note>
<target>Conectar automáticamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Conectar incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Conectar con ordenador</target>
@ -1827,44 +1857,39 @@ set passcode view</note>
<target>Conecta más rápido con tus amigos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>¿Conectarte a tí mismo?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>¿Conectarte a tí mismo?
¡Esta es tu propia dirección SimpleX!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>¿Conectarte a tí mismo?
¡Este es tu propio enlace de un solo uso!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Conectar mediante dirección de contacto</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Conectar mediante enlace</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Conectar mediante enlace de un sólo uso</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Conectar con %@</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2143,11 +2168,6 @@ This is your own one-time link!</source>
<target>Crear cola</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Crea grupo secreto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Crea tu perfil</target>
@ -2402,6 +2422,11 @@ swipe action</note>
<target>¿Eliminar perfil?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<target>¿Eliminar el chat con el miembro?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>¿Eliminar chat?</target>
@ -2825,7 +2850,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>No volver a mostrar</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3143,6 +3168,11 @@ chat item action</note>
<target>Error al aceptar solicitud del contacto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<target>Error al aceptar el miembro</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Error al añadir miembro(s)</target>
@ -3153,6 +3183,10 @@ chat item action</note>
<target>Error al añadir servidor</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Error al cambiar servidor</target>
@ -3171,7 +3205,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Error cambiando configuración</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3236,7 +3270,12 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Error al eliminar base de datos</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<target>Error al eliminar el chat con el miembro</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3251,12 +3290,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Error al eliminar base de datos</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Error al eliminar base de datos antigua</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3291,7 +3330,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Error al exportar base de datos</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3301,7 +3340,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Error al importar base de datos</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3346,7 +3385,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Error al expulsar miembro</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3926,7 +3965,7 @@ Error: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>¡El grupo ya existe!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3993,6 +4032,10 @@ Error: %2$@</target>
<target>El perfil de grupo se almacena en los dispositivos, no en los servidores.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Mensaje de bienvenida en grupos</target>
@ -4491,34 +4534,24 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Unirte al grupo</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Unirse a la conversación del grupo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>¿Unirte al grupo?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Unirte en modo incógnito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Unirte con el perfil actual</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>¿Unirse a tu grupo?
¡Este es tu enlace para el grupo %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4730,6 +4763,11 @@ This is your link for group %@!</source>
<target>Miembro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<target>Admisión del miembro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Miembro inactivo</target>
@ -4765,6 +4803,11 @@ This is your link for group %@!</source>
<target>El miembro será expulsado del grupo. ¡No puede deshacerse!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<target>El miembro se unirá al grupo, ¿aceptas al miembro?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Los miembros pueden añadir reacciones a los mensajes.</target>
@ -5185,6 +5228,11 @@ This is your link for group %@!</source>
<target>Nuevo rol de miembro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<target>Un miembro nuevo desea unirse al grupo.</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Mensaje nuevo</target>
@ -5225,6 +5273,11 @@ This is your link for group %@!</source>
<target>Sin chats en la lista %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<target>Sin chats con miembros</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Ningún contacto seleccionado</target>
@ -5417,7 +5470,9 @@ This is your link for group %@!</source>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5571,10 +5626,11 @@ Requiere activación de la VPN.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Grupo abierto</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
<target>¿Abrir enlace?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
@ -5800,7 +5856,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Please remember or store it securely - there is no way to recover a lost passcode!" xml:space="preserve">
<source>Please remember or store it securely - there is no way to recover a lost passcode!</source>
<target>Por favor, recuerda y guarda el código de acceso en un lugar seguro. ¡No hay forma de recuperar un código perdido!</target>
<target>Por favor, recuerda y guarda el código de acceso en un lugar seguro. ¡No hay manera de recuperar un código perdido!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please report it to the developers." xml:space="preserve">
@ -5828,6 +5884,11 @@ Error: %@</target>
<target>Por favor, intenta desactivar y reactivar las notificaciones.</target>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<target>Por favor, espera a que tu solicitud sea revisada por los moderadores del grupo.</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<target>Por favor, espera a que el token de activación se complete.</target>
@ -6281,6 +6342,11 @@ swipe action</note>
<target>Rechazar solicitud de contacto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<target>¿Rechazar al miembro?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>El servidor de retransmisión sólo se usa en caso de necesidad. Un tercero podría ver tu IP.</target>
@ -6336,11 +6402,6 @@ swipe action</note>
<target>¿Renegociar cifrado?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>¿Repetir solicitud de conexión?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Repetir descarga</target>
@ -6351,11 +6412,6 @@ swipe action</note>
<target>Repetir importación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>¿Repetir solicitud de admisión?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Repetir subida</target>
@ -6391,6 +6447,11 @@ swipe action</note>
<target>¿Motivo del informe?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<target>Informe enviado a los moderadores</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<target>Informar de spam: sólo los moderadores del grupo lo verán.</target>
@ -6506,6 +6567,16 @@ swipe action</note>
<target>Revisar condiciones</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<target>Revisar miembros</target>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<target>Revisar miembros antes de admitir.</target>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Revocar</target>
@ -6562,6 +6633,15 @@ chat item action</note>
<target>Guardar (y notificar contactos)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<target>¿Guardar configuración?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Guardar y notificar contacto</target>
@ -6587,6 +6667,10 @@ chat item action</note>
<target>Guardar perfil de grupo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<target>Guardar lista</target>
@ -7077,6 +7161,11 @@ chat item action</note>
<target>Úsalo en lugar de la autenticación del sistema.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<target>Admisión miembro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<target>Establece el vencimiento para los mensajes en los chats.</target>
@ -7873,16 +7962,6 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
<target>Este grupo ya no existe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>¡Esta es tu propia dirección SimpleX!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>¡Este es tu propio enlace de un solo uso!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<target>Este enlace requiere una versión más reciente de la aplicación. Por favor, actualiza la aplicación o pide a tu contacto un enlace compatible.</target>
@ -8300,7 +8379,7 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Usar perfil actual</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8330,7 +8409,7 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Usar nuevo perfil incógnito</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8690,12 +8769,12 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>Ya estás conectando con %@.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>¡Ya estás conectando mediante este enlace de un solo uso!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8705,24 +8784,19 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Ya estás uniéndote al grupo %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>¡Ya estás uniéndote al grupo mediante este enlace!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Ya estás uniéndote al grupo mediante este enlace.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>¡En proceso de unirte al grupo!
¿Repetir solicitud de admisión?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8839,6 +8913,11 @@ Repeat join request?</source>
<target>Podrás ver el enlace de invitación en detalles de conexión.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<target>Puedes ver tus informes en Chat con administradores.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>¡No puedes enviar mensajes!</target>
@ -8854,17 +8933,12 @@ Repeat join request?</source>
<target>Tu decides quién se conecta.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>¡Ya has solicitado la conexión mediante esta dirección!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Ya has solicitado la conexión
¿Repetir solicitud?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8951,11 +9025,6 @@ Repeat connection request?</source>
<target>Se te pedirá autenticarte cuando inicies la aplicación o sigas usándola tras 30 segundos en segundo plano.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Te conectarás con todos los miembros del grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Seguirás recibiendo llamadas y notificaciones de los perfiles silenciados cuando estén activos.</target>
@ -9141,6 +9210,11 @@ Repeat connection request?</source>
<target>y después elige:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<target>%@ aceptado</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>llamada aceptada</target>
@ -9151,6 +9225,11 @@ Repeat connection request?</source>
<target>invitación aceptada</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<target>te ha aceptado</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>administrador</target>
@ -9171,6 +9250,11 @@ Repeat connection request?</source>
<target>acordando cifrado…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<target>todos</target>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>todos los miembros</target>
@ -9257,6 +9341,11 @@ marked deleted chat item preview text</note>
<target>llamando…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<target>no se pueden enviar mensajes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>cancelado %@</target>
@ -9362,6 +9451,16 @@ marked deleted chat item preview text</note>
<target>el contacto %1$@ ha cambiado a %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<target>contacto eliminado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<target>contacto desactivado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>el contacto dispone de cifrado de extremo a extremo</target>
@ -9372,6 +9471,11 @@ marked deleted chat item preview text</note>
<target>el contacto no dispone de cifrado de extremo a extremo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<target>el contacto no está listo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>creador</target>
@ -9543,6 +9647,11 @@ pref value</note>
<target>grupo eliminado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<target>el grupo ha sido eliminado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>perfil de grupo actualizado</target>
@ -9668,6 +9777,11 @@ pref value</note>
<target>conectado</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<target>el miembro usa una versión antigua</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>mensaje</target>
@ -9733,6 +9847,11 @@ pref value</note>
<target>sin texto</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<target>no sincronizado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>observador</target>
@ -9743,6 +9862,7 @@ pref value</note>
<target>desactivado</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9795,6 +9915,11 @@ time to disappear</note>
<target>pendiente de aprobación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<target>pendiente de revisión</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>cifrado e2e resistente a tecnología cuántica</target>
@ -9835,6 +9960,11 @@ time to disappear</note>
<target>dirección de contacto eliminada</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<target>expulsado del grupo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>ha eliminado la imagen del perfil</target>
@ -9845,11 +9975,26 @@ time to disappear</note>
<target>te ha expulsado</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<target>petición para unirse rechazada</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>solicitado para conectar</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<target>por revisar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<target>revisado por los administradores</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>guardado</target>
@ -10039,6 +10184,11 @@ last received msg: %2$@</source>
<target>tu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<target>has aceptado al miembro</target>
<note>snd group event chat item</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>

View file

@ -527,6 +527,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<note>No comment provided by engineer.</note>
@ -547,6 +555,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<note>No comment provided by engineer.</note>
@ -595,6 +607,10 @@ swipe action</note>
<target>Lisää palvelimia skannaamalla QR-koodeja.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<note>No comment provided by engineer.</note>
@ -865,11 +881,11 @@ swipe action</note>
</trans-unit>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1262,7 +1278,8 @@ swipe action</note>
<source>Cancel</source>
<target>Peruuta</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1359,7 +1376,7 @@ set passcode view</note>
</trans-unit>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1437,11 +1454,23 @@ set passcode view</note>
<source>Chat will be deleted for you - this cannot be undone!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Keskustelut</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<note>No comment provided by engineer.</note>
@ -1639,11 +1668,6 @@ set passcode view</note>
<source>Connect automatically</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Yhdistä Incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<note>No comment provided by engineer.</note>
@ -1652,37 +1676,33 @@ set passcode view</note>
<source>Connect to your friends faster.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Yhdistä linkin kautta</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Yhdistä kertalinkillä</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -1931,11 +1951,6 @@ This is your own one-time link!</source>
<target>Luo jono</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Luo salainen ryhmä</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Luo profiilisi</target>
@ -2174,6 +2189,10 @@ swipe action</note>
<target>Poista keskusteluprofiili?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<note>No comment provided by engineer.</note>
@ -2565,7 +2584,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Älä näytä uudelleen</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -2858,6 +2877,10 @@ chat item action</note>
<target>Virhe kontaktipyynnön hyväksymisessä</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Virhe lisättäessä jäseniä</target>
@ -2867,6 +2890,10 @@ chat item action</note>
<source>Error adding server</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Virhe osoitteenvaihdossa</target>
@ -2884,7 +2911,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Virhe asetuksen muuttamisessa</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -2942,7 +2969,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Virhe keskustelujen tietokannan poistamisessa</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -2957,12 +2988,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Virhe tietokannan poistamisessa</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Virhe vanhan tietokannan poistamisessa</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -2996,7 +3027,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Virhe vietäessä keskustelujen tietokantaa</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3005,7 +3036,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Virhe keskustelujen tietokannan tuonnissa</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3044,7 +3075,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Virhe poistettaessa jäsentä</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3560,7 +3591,7 @@ Error: %2$@</source>
</trans-unit>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3627,6 +3658,10 @@ Error: %2$@</source>
<target>Ryhmäprofiili tallennetaan jäsenten laitteille, ei palvelimille.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Ryhmän tervetuloviesti</target>
@ -4091,29 +4126,21 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Liity ryhmään</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Liity incognito-tilassa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4311,6 +4338,10 @@ This is your link for group %@!</source>
<target>Jäsen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
@ -4342,6 +4373,10 @@ This is your link for group %@!</source>
<target>Jäsen poistetaan ryhmästä - tätä ei voi perua!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Ryhmän jäsenet voivat lisätä viestireaktioita.</target>
@ -4716,6 +4751,10 @@ This is your link for group %@!</source>
<target>Uusi jäsenrooli</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Uusi viesti</target>
@ -4752,6 +4791,10 @@ This is your link for group %@!</source>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Kontakteja ei ole valittu</target>
@ -4922,7 +4965,9 @@ This is your link for group %@!</source>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5068,7 +5113,7 @@ Edellyttää VPN:n sallimista.</target>
</trans-unit>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5296,6 +5341,10 @@ Error: %@</source>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -5707,6 +5756,10 @@ swipe action</note>
<target>Hylkää yhteyspyyntö</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Välityspalvelinta käytetään vain tarvittaessa. Toinen osapuoli voi tarkkailla IP-osoitettasi.</target>
@ -5760,10 +5813,6 @@ swipe action</note>
<target>Uudelleenneuvottele salaus?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<note>No comment provided by engineer.</note>
@ -5772,10 +5821,6 @@ swipe action</note>
<source>Repeat import</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<note>No comment provided by engineer.</note>
@ -5805,6 +5850,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -5908,6 +5957,14 @@ swipe action</note>
<source>Review conditions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Peruuta</target>
@ -5960,6 +6017,14 @@ chat item action</note>
<target>Tallenna (ja ilmoita kontakteille)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Tallenna ja ilmoita kontaktille</target>
@ -5984,6 +6049,10 @@ chat item action</note>
<target>Tallenna ryhmäprofiili</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -6430,6 +6499,10 @@ chat item action</note>
<target>Aseta se järjestelmän todennuksen sijaan.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7153,14 +7226,6 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
<target>Tätä ryhmää ei enää ole olemassa.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -7537,7 +7602,7 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Käytä nykyistä profiilia</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -7564,7 +7629,7 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Käytä uutta incognito-profiilia</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -7884,11 +7949,11 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
</trans-unit>
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -7896,20 +7961,16 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
</trans-unit>
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8017,6 +8078,10 @@ Repeat join request?</source>
<source>You can view invitation link again in connection details.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Et voi lähettää viestejä!</target>
@ -8032,14 +8097,10 @@ Repeat join request?</source>
<target>Kimin bağlanabileceğine siz karar verirsiniz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8121,10 +8182,6 @@ Repeat connection request?</source>
<target>Sinun on tunnistauduttava, kun käynnistät sovelluksen tai jatkat sen käyttöä 30 sekunnin tauon jälkeen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Saat edelleen puheluita ja ilmoituksia mykistetyiltä profiileilta, kun ne ovat aktiivisia.</target>
@ -8303,6 +8360,10 @@ Repeat connection request?</source>
<target>edellä, valitse sitten:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>hyväksytty puhelu</target>
@ -8312,6 +8373,10 @@ Repeat connection request?</source>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>ylläpitäjä</target>
@ -8331,6 +8396,10 @@ Repeat connection request?</source>
<target>hyväksyy salausta…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
@ -8408,6 +8477,10 @@ marked deleted chat item preview text</note>
<target>soittaa…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>peruutettu %@</target>
@ -8511,6 +8584,14 @@ marked deleted chat item preview text</note>
<source>contact %1$@ changed to %2$@</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>kontaktilla on e2e-salaus</target>
@ -8521,6 +8602,10 @@ marked deleted chat item preview text</note>
<target>kontaktilla ei ole e2e-salausta</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>luoja</target>
@ -8687,6 +8772,10 @@ pref value</note>
<target>ryhmä poistettu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>ryhmäprofiili päivitetty</target>
@ -8809,6 +8898,10 @@ pref value</note>
<target>yhdistetty</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<note>No comment provided by engineer.</note>
@ -8872,6 +8965,10 @@ pref value</note>
<target>ei tekstiä</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>tarkkailija</target>
@ -8882,6 +8979,7 @@ pref value</note>
<target>pois</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -8929,6 +9027,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<note>chat item text</note>
@ -8966,6 +9068,10 @@ time to disappear</note>
<source>removed contact address</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<note>profile update event chat item</note>
@ -8975,10 +9081,22 @@ time to disappear</note>
<target>poisti sinut</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<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>
@ -9149,6 +9267,10 @@ last received msg: %2$@</source>
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</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>

View file

@ -565,6 +565,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Accepter les conditions</target>
@ -586,6 +594,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Conditions acceptées</target>
@ -641,6 +653,10 @@ swipe action</note>
<target>Ajoutez des serveurs en scannant des codes QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Ajouter des membres à l'équipe</target>
@ -938,12 +954,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>Déjà en connexion !</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Groupe déjà rejoint !</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1387,7 +1403,8 @@ swipe action</note>
<source>Cancel</source>
<target>Annuler</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1493,7 +1510,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>La discussion existe déjà!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1580,11 +1597,23 @@ set passcode view</note>
<target>Le discussion sera supprimé pour vous - il n'est pas possible de revenir en arrière!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Discussions</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Consulter les messages toutes les 20 minutes.</target>
@ -1810,11 +1839,6 @@ set passcode view</note>
<target>Connexion automatique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Se connecter incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Connexion au bureau</target>
@ -1825,44 +1849,39 @@ set passcode view</note>
<target>Connectez-vous à vos amis plus rapidement.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Se connecter à soi-même ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Se connecter à soi-même ?
C'est votre propre adresse SimpleX !</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Se connecter à soi-même ?
Il s'agit de votre propre lien unique !</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Se connecter via l'adresse de contact</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Se connecter via un lien</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Se connecter via un lien unique</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Se connecter avec %@</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2141,11 +2160,6 @@ Il s'agit de votre propre lien unique !</target>
<target>Créer une file d'attente</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Créer un groupe secret</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Créez votre profil</target>
@ -2400,6 +2414,10 @@ swipe action</note>
<target>Supprimer le profil du chat ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>Supprimer la discussion?</target>
@ -2823,7 +2841,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Ne plus afficher</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3141,6 +3159,10 @@ chat item action</note>
<target>Erreur de validation de la demande de contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Erreur lors de l'ajout de membre·s</target>
@ -3151,6 +3173,10 @@ chat item action</note>
<target>Erreur lors de l'ajout du serveur</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Erreur de changement d'adresse</target>
@ -3169,7 +3195,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Erreur de changement de paramètre</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3234,7 +3260,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Erreur lors de la suppression de la base de données du chat</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3249,12 +3279,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Erreur lors de la suppression de la base de données</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Erreur lors de la suppression de l'ancienne base de données</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3289,7 +3319,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Erreur lors de l'exportation de la base de données du chat</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3299,7 +3329,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Erreur lors de l'importation de la base de données du chat</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3344,7 +3374,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Erreur lors de la suppression d'un membre</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3921,7 +3951,7 @@ Erreur: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Ce groupe existe déjà !</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3988,6 +4018,10 @@ Erreur: %2$@</target>
<target>Le profil du groupe est stocké sur les appareils des membres, pas sur les serveurs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Message d'accueil du groupe</target>
@ -4476,34 +4510,24 @@ D'autres améliorations sont à venir!</target>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Rejoindre le groupe</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Participez aux conversations de groupe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Rejoindre le groupe ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Rejoindre en incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Rejoindre avec le profil actuel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Rejoindre votre groupe ?
Voici votre lien pour le groupe %@ !</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4712,6 +4736,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Membre</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Membre inactif</target>
@ -4746,6 +4774,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Ce membre sera retiré du groupe - impossible de revenir en arrière!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Les membres du groupe peuvent ajouter des réactions aux messages.</target>
@ -5160,6 +5192,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Nouveau rôle</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Nouveau message</target>
@ -5197,6 +5233,10 @@ Voici votre lien pour le groupe %@ !</target>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Aucun contact sélectionné</target>
@ -5383,7 +5423,9 @@ Voici votre lien pour le groupe %@ !</target>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5535,7 +5577,7 @@ Nécessite l'activation d'un VPN.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Ouvrir le groupe</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5790,6 +5832,10 @@ Erreur: %@</target>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -6234,6 +6280,10 @@ swipe action</note>
<target>Rejeter la demande de contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Le serveur relais n'est utilisé que si nécessaire. Un tiers peut observer votre adresse IP.</target>
@ -6289,11 +6339,6 @@ swipe action</note>
<target>Renégocier le chiffrement?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Répéter la demande de connexion ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Répéter le téléchargement</target>
@ -6304,11 +6349,6 @@ swipe action</note>
<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">
<source>Repeat join request?</source>
<target>Répéter la requête d'adhésion ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Répéter l'envoi</target>
@ -6339,6 +6379,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -6449,6 +6493,14 @@ swipe action</note>
<target>Vérifier les conditions</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Révoquer</target>
@ -6505,6 +6557,14 @@ chat item action</note>
<target>Enregistrer (et en informer les contacts)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Enregistrer et en informer le contact</target>
@ -6530,6 +6590,10 @@ chat item action</note>
<target>Enregistrer le profil du groupe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -7017,6 +7081,10 @@ chat item action</note>
<target>Il permet de remplacer l'authentification du système.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7805,16 +7873,6 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>Ce groupe n'existe plus.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Voici votre propre adresse SimpleX !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Voici votre propre lien unique !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -8225,7 +8283,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Utiliser le profil actuel</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8255,7 +8313,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Utiliser un nouveau profil incognito</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8613,12 +8671,12 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>Vous êtes déjà en train de vous connecter à %@.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>Vous êtes déjà connecté(e) via ce lien unique !</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8628,24 +8686,19 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Vous êtes déjà en train de rejoindre le groupe %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>Vous êtes déjà en train de rejoindre le groupe via ce lien !</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Vous êtes déjà en train de rejoindre le groupe via ce lien.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>Vous êtes déjà membre de ce groupe !
Répéter la demande d'adhésion ?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8762,6 +8815,10 @@ Répéter la demande d'adhésion ?</target>
<target>Vous pouvez à nouveau consulter le lien d'invitation dans les détails de la connexion.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Vous ne pouvez pas envoyer de messages !</target>
@ -8777,17 +8834,12 @@ Répéter la demande d'adhésion ?</target>
<target>Vous choisissez qui peut se connecter.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>Vous avez déjà demandé une connexion via cette adresse !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Vous avez déjà demandé une connexion !
Répéter la demande de connexion ?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8873,11 +8925,6 @@ Répéter la demande de connexion ?</target>
<target>Il vous sera demandé de vous authentifier lorsque vous démarrez ou reprenez l'application après 30 secondes en arrière-plan.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Vous vous connecterez à tous les membres du groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Vous continuerez à recevoir des appels et des notifications des profils mis en sourdine lorsqu'ils sont actifs.</target>
@ -9063,6 +9110,10 @@ Répéter la demande de connexion ?</target>
<target>ci-dessus, puis choisissez:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>appel accepté</target>
@ -9073,6 +9124,10 @@ Répéter la demande de connexion ?</target>
<target>invitation acceptée</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>admin</target>
@ -9093,6 +9148,10 @@ Répéter la demande de connexion ?</target>
<target>négociation du chiffrement…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>tous les membres</target>
@ -9178,6 +9237,10 @@ marked deleted chat item preview text</note>
<target>appel…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>annulé %@</target>
@ -9283,6 +9346,14 @@ marked deleted chat item preview text</note>
<target>le contact %1$@ est devenu %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>Ce contact a le chiffrement de bout en bout</target>
@ -9293,6 +9364,10 @@ marked deleted chat item preview text</note>
<target>Ce contact n'a pas le chiffrement de bout en bout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>créateur</target>
@ -9464,6 +9539,10 @@ pref value</note>
<target>groupe supprimé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>mise à jour du profil de groupe</target>
@ -9589,6 +9668,10 @@ pref value</note>
<target>est connecté·e</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>message</target>
@ -9653,6 +9736,10 @@ pref value</note>
<target>aucun texte</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>observateur</target>
@ -9663,6 +9750,7 @@ pref value</note>
<target>off</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9713,6 +9801,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</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>
@ -9752,6 +9844,10 @@ time to disappear</note>
<target>suppression de l'adresse de contact</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>suppression de la photo de profil</target>
@ -9762,11 +9858,23 @@ time to disappear</note>
<target>vous a retiré</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>demande à se connecter</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>enregistré</target>
@ -9956,6 +10064,10 @@ dernier message reçu: %2$@</target>
<target>vous</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</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>

View file

@ -565,6 +565,16 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<target>Accetta come membro</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<target>Accetta come osservatore</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Accetta le condizioni</target>
@ -586,6 +596,11 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<target>Accetta membro</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Condizioni accettate</target>
@ -641,6 +656,10 @@ swipe action</note>
<target>Aggiungi server scansionando codici QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Aggiungi membri del team</target>
@ -939,12 +958,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>Già in connessione!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Già in ingresso nel gruppo!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1389,7 +1408,8 @@ swipe action</note>
<source>Cancel</source>
<target>Annulla</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1495,7 +1515,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>La chat esiste già!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1582,11 +1602,26 @@ set passcode view</note>
<target>La chat verrà eliminata solo per te, non è reversibile!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<target>Chat con amministratori</target>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<target>Chatta con il membro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<target>Chat con membri</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Controlla i messaggi ogni 20 min.</target>
@ -1812,11 +1847,6 @@ set passcode view</note>
<target>Connetti automaticamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Connetti in incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Connetti al desktop</target>
@ -1827,44 +1857,39 @@ set passcode view</note>
<target>Connettiti più velocemente ai tuoi amici.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Connettersi a te stesso?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Connettersi a te stesso?
Questo è il tuo indirizzo SimpleX!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Connettersi a te stesso?
Questo è il tuo link una tantum!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Connettere via indirizzo del contatto</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Connetti via link</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Connetti via link una tantum</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Connettersi con %@</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2143,11 +2168,6 @@ Questo è il tuo link una tantum!</target>
<target>Crea coda</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Crea gruppo segreto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Crea il tuo profilo</target>
@ -2402,6 +2422,11 @@ swipe action</note>
<target>Eliminare il profilo di chat?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<target>Eliminare la chat con il membro?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>Eliminare la chat?</target>
@ -2825,7 +2850,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Non mostrare più</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3143,6 +3168,11 @@ chat item action</note>
<target>Errore nell'accettazione della richiesta di contatto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<target>Errore di accettazione del membro</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Errore di aggiunta membro/i</target>
@ -3153,6 +3183,10 @@ chat item action</note>
<target>Errore di aggiunta del server</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Errore nella modifica dell'indirizzo</target>
@ -3171,7 +3205,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Errore nella modifica dell'impostazione</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3236,7 +3270,12 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Errore nell'eliminazione del database della chat</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<target>Errore di eliminazione della chat con il membro</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3251,12 +3290,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Errore nell'eliminazione del database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Errore nell'eliminazione del database vecchio</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3291,7 +3330,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Errore nell'esportazione del database della chat</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3301,7 +3340,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Errore nell'importazione del database della chat</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3346,7 +3385,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Errore nella rimozione del membro</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3926,7 +3965,7 @@ Errore: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Il gruppo esiste già!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3993,6 +4032,10 @@ Errore: %2$@</target>
<target>Il profilo del gruppo è memorizzato sui dispositivi dei membri, non sui server.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Messaggio di benvenuto del gruppo</target>
@ -4491,34 +4534,24 @@ Altri miglioramenti sono in arrivo!</target>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Entra nel gruppo</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Entra in conversazioni di gruppo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Entrare nel gruppo?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Entra in incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Entra con il profilo attuale</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Entrare nel tuo gruppo?
Questo è il tuo link per il gruppo %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4730,6 +4763,11 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Membro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<target>Ammissione del membro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Membro inattivo</target>
@ -4765,6 +4803,11 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Il membro verrà rimosso dal gruppo, non è reversibile!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<target>Il membro entrerà nel gruppo, accettarlo?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>I membri del gruppo possono aggiungere reazioni ai messaggi.</target>
@ -5185,6 +5228,11 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Nuovo ruolo del membro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<target>Un nuovo membro vuole entrare nel gruppo.</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Nuovo messaggio</target>
@ -5225,6 +5273,11 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Nessuna chat nell'elenco %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<target>Nessuna chat con membri</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Nessun contatto selezionato</target>
@ -5417,7 +5470,9 @@ Questo è il tuo link per il gruppo %@!</target>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5571,10 +5626,11 @@ Richiede l'attivazione della VPN.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Apri gruppo</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
<target>Aprire il link?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
@ -5828,6 +5884,11 @@ Errore: %@</target>
<target>Prova a disattivare e riattivare le notifiche.</target>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<target>Attendi che i moderatori del gruppo revisionino la tua richiesta di entrare nel gruppo.</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<target>Attendi il completamento dell'attivazione del token.</target>
@ -6281,6 +6342,11 @@ swipe action</note>
<target>Rifiuta la richiesta di contatto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<target>Rifiutare il membro?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Il server relay viene usato solo se necessario. Un altro utente può osservare il tuo indirizzo IP.</target>
@ -6336,11 +6402,6 @@ swipe action</note>
<target>Rinegoziare la crittografia?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Ripetere la richiesta di connessione?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Ripeti scaricamento</target>
@ -6351,11 +6412,6 @@ swipe action</note>
<target>Ripeti importazione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>Ripetere la richiesta di ingresso?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Ripeti caricamento</target>
@ -6391,6 +6447,11 @@ swipe action</note>
<target>Motivo della segnalazione?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<target>Segnalazione inviata ai moderatori</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<target>Segnala spam: solo i moderatori del gruppo lo vedranno.</target>
@ -6506,6 +6567,16 @@ swipe action</note>
<target>Leggi le condizioni</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<target>Revisiona i membri</target>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<target>Revisiona i membri prima di ammetterli ("bussare").</target>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Revoca</target>
@ -6562,6 +6633,15 @@ chat item action</note>
<target>Salva (e avvisa i contatti)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<target>Salvare le impostazioni di ammissione?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Salva e avvisa il contatto</target>
@ -6587,6 +6667,10 @@ chat item action</note>
<target>Salva il profilo del gruppo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<target>Salva elenco</target>
@ -7077,6 +7161,11 @@ chat item action</note>
<target>Impostalo al posto dell'autenticazione di sistema.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<target>Imposta l'ammissione del membro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<target>Imposta la scadenza dei messaggi nelle chat.</target>
@ -7873,16 +7962,6 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>Questo gruppo non esiste più.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Questo è il tuo indirizzo SimpleX!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Questo è il tuo link una tantum!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<target>Questo link richiede una versione più recente dell'app. Aggiornala o chiedi al tuo contatto di inviare un link compatibile.</target>
@ -8300,7 +8379,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Usa il profilo attuale</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8330,7 +8409,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Usa nuovo profilo in incognito</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8690,12 +8769,12 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>Ti stai già connettendo a %@.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>Ti stai già connettendo tramite questo link una tantum!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8705,24 +8784,19 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Stai già entrando nel gruppo %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>Stai già entrando nel gruppo tramite questo link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Stai già entrando nel gruppo tramite questo link.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>Stai già entrando nel gruppo!
Ripetere la richiesta di ingresso?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8839,6 +8913,11 @@ Ripetere la richiesta di ingresso?</target>
<target>Puoi vedere di nuovo il link di invito nei dettagli di connessione.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<target>Puoi vedere le tue segnalazioni nella chat con gli amministratori.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Non puoi inviare messaggi!</target>
@ -8854,17 +8933,12 @@ Ripetere la richiesta di ingresso?</target>
<target>Sei tu a decidere chi può connettersi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>Hai già richiesto la connessione tramite questo indirizzo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Hai già richiesto la connessione!
Ripetere la richiesta di connessione?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8951,11 +9025,6 @@ Ripetere la richiesta di connessione?</target>
<target>Dovrai autenticarti quando avvii o riapri l'app dopo 30 secondi in secondo piano.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Ti connetterai a tutti i membri del gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Continuerai a ricevere chiamate e notifiche da profili silenziati quando sono attivi.</target>
@ -9141,6 +9210,11 @@ Ripetere la richiesta di connessione?</target>
<target>sopra, quindi scegli:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<target>%@ accettato</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>chiamata accettata</target>
@ -9151,6 +9225,11 @@ Ripetere la richiesta di connessione?</target>
<target>invito accettato</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<target>ti ha accettato/a</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>amministratore</target>
@ -9171,6 +9250,11 @@ Ripetere la richiesta di connessione?</target>
<target>concordando la crittografia…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<target>tutti</target>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>tutti i membri</target>
@ -9257,6 +9341,11 @@ marked deleted chat item preview text</note>
<target>chiamata…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<target>impossibile inviare messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>annullato %@</target>
@ -9362,6 +9451,16 @@ marked deleted chat item preview text</note>
<target>contatto %1$@ cambiato in %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<target>contatto eliminato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<target>contatto disattivato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>il contatto ha la crittografia e2e</target>
@ -9372,6 +9471,11 @@ marked deleted chat item preview text</note>
<target>il contatto non ha la crittografia e2e</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<target>contatto non pronto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>creatore</target>
@ -9543,6 +9647,11 @@ pref value</note>
<target>gruppo eliminato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<target>il gruppo è eliminato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>profilo del gruppo aggiornato</target>
@ -9668,6 +9777,11 @@ pref value</note>
<target>si è connesso/a</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<target>il membro ha una versione vecchia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>messaggio</target>
@ -9733,6 +9847,11 @@ pref value</note>
<target>nessun testo</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<target>non sincronizzato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>osservatore</target>
@ -9743,6 +9862,7 @@ pref value</note>
<target>off</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9795,6 +9915,11 @@ time to disappear</note>
<target>in attesa di approvazione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<target>in attesa di revisione</target>
<note>No comment provided by engineer.</note>
</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>
@ -9835,6 +9960,11 @@ time to disappear</note>
<target>indirizzo di contatto rimosso</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<target>rimosso dal gruppo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>immagine del profilo rimossa</target>
@ -9845,11 +9975,26 @@ time to disappear</note>
<target>ti ha rimosso/a</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<target>richiesta di entrare rifiutata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>richiesto di connettersi</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<target>revisiona</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<target>revisionato dagli amministratori</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>salvato</target>
@ -10039,6 +10184,11 @@ ultimo msg ricevuto: %2$@</target>
<target>tu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<target>hai accettato questo membro</target>
<note>snd group event chat item</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>

View file

@ -561,6 +561,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<note>No comment provided by engineer.</note>
@ -581,6 +589,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<note>No comment provided by engineer.</note>
@ -629,6 +641,10 @@ swipe action</note>
<target>QRコードでサーバを追加する。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<note>No comment provided by engineer.</note>
@ -907,12 +923,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>既に接続中です!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>すでにグループに参加しています!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1312,7 +1328,8 @@ swipe action</note>
<source>Cancel</source>
<target>中止</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1409,7 +1426,7 @@ set passcode view</note>
</trans-unit>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1488,11 +1505,23 @@ set passcode view</note>
<source>Chat will be deleted for you - this cannot be undone!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>チャット</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<note>No comment provided by engineer.</note>
@ -1695,11 +1724,6 @@ set passcode view</note>
<source>Connect automatically</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>シークレットモードで接続</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>デスクトップに接続</target>
@ -1710,37 +1734,33 @@ set passcode view</note>
<target>友達ともっと速くつながりましょう。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>リンク経由で接続</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>ワンタイムリンクで接続</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -1998,11 +2018,6 @@ This is your own one-time link!</source>
<target>キューの作成</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>シークレットグループを作成する</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>プロフィールを作成する</target>
@ -2244,6 +2259,10 @@ swipe action</note>
<target>チャットのプロフィールを削除しますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<note>No comment provided by engineer.</note>
@ -2637,7 +2656,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>次から表示しない</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -2931,6 +2950,10 @@ chat item action</note>
<target>連絡先リクエストの承諾にエラー発生</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>メンバー追加にエラー発生</target>
@ -2940,6 +2963,10 @@ chat item action</note>
<source>Error adding server</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>アドレス変更にエラー発生</target>
@ -2957,7 +2984,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>設定変更にエラー発生</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3016,7 +3043,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>チャットデータベース削除にエラー発生</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3031,12 +3062,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>データベースの削除にエラー発生</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>古いデータベースを削除にエラー発生</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3069,7 +3100,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>チャットデータベースのエキスポートにエラー発生</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3078,7 +3109,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>チャットデータベースのインポートにエラー発生</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3117,7 +3148,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>メンバー除名にエラー発生</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3633,7 +3664,7 @@ Error: %2$@</source>
</trans-unit>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3700,6 +3731,10 @@ Error: %2$@</source>
<target>グループのプロフィールはサーバではなく、メンバーの端末に保存されます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>グループのウェルカムメッセージ</target>
@ -4164,29 +4199,21 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>グループに参加</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>シークレットモードで参加</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4384,6 +4411,10 @@ This is your link for group %@!</source>
<target>メンバー</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
@ -4415,6 +4446,10 @@ This is your link for group %@!</source>
<target>メンバーをグループから除名する (※元に戻せません※)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>グループメンバーはメッセージへのリアクションを追加できます。</target>
@ -4792,6 +4827,10 @@ This is your link for group %@!</source>
<target>新しいメンバーの役割</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>新しいメッセージ</target>
@ -4828,6 +4867,10 @@ This is your link for group %@!</source>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>連絡先が選択されてません</target>
@ -4998,7 +5041,9 @@ This is your link for group %@!</source>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>OK</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5145,7 +5190,7 @@ VPN を有効にする必要があります。</target>
</trans-unit>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5373,6 +5418,10 @@ Error: %@</source>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -5784,6 +5833,10 @@ swipe action</note>
<target>連絡要求を拒否する</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>中継サーバーは必要な場合にのみ使用されます。 別の当事者があなたの IP アドレスを監視できます。</target>
@ -5837,10 +5890,6 @@ swipe action</note>
<target>暗号化を再ネゴシエートしますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<note>No comment provided by engineer.</note>
@ -5849,10 +5898,6 @@ swipe action</note>
<source>Repeat import</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<note>No comment provided by engineer.</note>
@ -5882,6 +5927,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -5985,6 +6034,14 @@ swipe action</note>
<source>Review conditions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>取り消す</target>
@ -6037,6 +6094,14 @@ chat item action</note>
<target>保存(連絡先に通知)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>保存して、連絡先にに知らせる</target>
@ -6061,6 +6126,10 @@ chat item action</note>
<target>グループプロフィールの保存</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -6500,6 +6569,10 @@ chat item action</note>
<target>システム認証の代わりに設定します。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7223,14 +7296,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>このグループはもう存在しません。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -7607,7 +7672,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>現在のプロファイルを使用する</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -7634,7 +7699,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>新しいシークレットプロファイルを使用する</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -7954,11 +8019,11 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -7966,20 +8031,16 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8088,6 +8149,10 @@ Repeat join request?</source>
<source>You can view invitation link again in connection details.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>メッセージを送信できませんでした!</target>
@ -8103,14 +8168,10 @@ Repeat join request?</source>
<target>あなたと繋がることができるのは、あなたからリンクを頂いた方のみです。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8192,10 +8253,6 @@ Repeat connection request?</source>
<target>起動時、または非アクティブ状態で30秒が経った後に戻ると、認証する必要となります。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>ミュートされたプロフィールがアクティブな場合でも、そのプロフィールからの通話や通知は引き続き受信します。</target>
@ -8374,6 +8431,10 @@ Repeat connection request?</source>
<target>上で選んでください:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>受けた通話</target>
@ -8383,6 +8444,10 @@ Repeat connection request?</source>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>管理者</target>
@ -8402,6 +8467,10 @@ Repeat connection request?</source>
<target>暗号化に同意しています…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
@ -8479,6 +8548,10 @@ marked deleted chat item preview text</note>
<target>発信中…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>キャンセルされました %@</target>
@ -8582,6 +8655,14 @@ marked deleted chat item preview text</note>
<source>contact %1$@ changed to %2$@</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>連絡先はエンドツーエンド暗号化があります</target>
@ -8592,6 +8673,10 @@ marked deleted chat item preview text</note>
<target>連絡先はエンドツーエンド暗号化がありません</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>作成者</target>
@ -8758,6 +8843,10 @@ pref value</note>
<target>グループ削除済み</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>グループのプロフィールが更新されました</target>
@ -8880,6 +8969,10 @@ pref value</note>
<target>接続中</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<note>No comment provided by engineer.</note>
@ -8943,6 +9036,10 @@ pref value</note>
<target>テキストなし</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>オブザーバー</target>
@ -8953,6 +9050,7 @@ pref value</note>
<target>オフ</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9000,6 +9098,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<note>chat item text</note>
@ -9037,6 +9139,10 @@ time to disappear</note>
<source>removed contact address</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<note>profile update event chat item</note>
@ -9046,10 +9152,22 @@ time to disappear</note>
<target>あなたを除名しました</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<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>
@ -9220,6 +9338,10 @@ last received msg: %2$@</source>
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>グループ招待が届きました</target>

View file

@ -565,6 +565,16 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<target>Accepteren als lid</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<target>Accepteren als waarnemer</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Accepteer voorwaarden</target>
@ -586,6 +596,11 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<target>Lid accepteren</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Geaccepteerde voorwaarden</target>
@ -641,6 +656,10 @@ swipe action</note>
<target>Servers toevoegen door QR-codes te scannen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Teamleden toevoegen</target>
@ -798,6 +817,7 @@ swipe action</note>
</trans-unit>
<trans-unit id="All servers" xml:space="preserve">
<source>All servers</source>
<target>Alle servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
@ -938,12 +958,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>Al bezig met verbinden!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Al lid van de groep!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1388,7 +1408,8 @@ swipe action</note>
<source>Cancel</source>
<target>Annuleren</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1494,7 +1515,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>Chat bestaat al!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1581,11 +1602,26 @@ set passcode view</note>
<target>De chat wordt voor je verwijderd - dit kan niet ongedaan worden gemaakt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<target>Chat met beheerders</target>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<target>Chat met lid</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<target>Chats met leden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Controleer uw berichten elke 20 minuten.</target>
@ -1811,11 +1847,6 @@ set passcode view</note>
<target>Automatisch verbinden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Verbind incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Verbinden met desktop</target>
@ -1826,44 +1857,39 @@ set passcode view</note>
<target>Maak sneller verbinding met je vrienden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Verbinding maken met jezelf?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Verbinding maken met jezelf?
Dit is uw eigen SimpleX adres!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Verbinding maken met jezelf?
Dit is uw eigen eenmalige link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Verbinding maken via contactadres</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Maak verbinding via link</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Verbinden via een eenmalige link?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Verbonden met %@</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2142,11 +2168,6 @@ Dit is uw eigen eenmalige link!</target>
<target>Maak een wachtrij</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Maak een geheime groep aan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Maak je profiel aan</target>
@ -2401,6 +2422,11 @@ swipe action</note>
<target>Chatprofiel verwijderen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<target>Chat met lid verwijderen?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>Chat verwijderen?</target>
@ -2824,7 +2850,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Niet meer weergeven</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3142,6 +3168,11 @@ chat item action</note>
<target>Fout bij het accepteren van een contactverzoek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<target>Fout bij het accepteren van lid</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Fout bij het toevoegen van leden</target>
@ -3152,6 +3183,10 @@ chat item action</note>
<target>Fout bij toevoegen server</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Fout bij wijzigen van adres</target>
@ -3170,7 +3205,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Fout bij wijzigen van instelling</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3235,7 +3270,12 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Fout bij het verwijderen van de chat database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<target>Fout bij het verwijderen van chat met lid</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3250,12 +3290,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Fout bij het verwijderen van de database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Fout bij het verwijderen van de oude database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3290,7 +3330,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Fout bij het exporteren van de chat database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3300,7 +3340,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Fout bij het importeren van de chat database</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3345,7 +3385,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Fout bij verwijderen van lid</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3925,7 +3965,7 @@ Fout: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Groep bestaat al!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3992,6 +4032,10 @@ Fout: %2$@</target>
<target>Groep profiel wordt opgeslagen op de apparaten van de leden, niet op de servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Groep welkom bericht</target>
@ -4490,34 +4534,24 @@ Binnenkort meer verbeteringen!</target>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Word lid van groep</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Neem deel aan groepsgesprekken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Deelnemen aan groep?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Doe incognito mee</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Word lid met huidig profiel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Sluit u aan bij uw groep?
Dit is jouw link voor groep %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4729,6 +4763,11 @@ Dit is jouw link voor groep %@!</target>
<target>Lid</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<target>Toelating van leden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Lid inactief</target>
@ -4764,6 +4803,11 @@ Dit is jouw link voor groep %@!</target>
<target>Lid wordt uit de groep verwijderd, dit kan niet ongedaan worden gemaakt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<target>Lid zal toetreden tot de groep, lid accepteren?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Groepsleden kunnen bericht reacties toevoegen.</target>
@ -5184,6 +5228,11 @@ Dit is jouw link voor groep %@!</target>
<target>Nieuwe leden rol</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<target>Nieuw lid wil zich bij de groep aansluiten.</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>nieuw bericht</target>
@ -5224,6 +5273,11 @@ Dit is jouw link voor groep %@!</target>
<target>Geen chats in lijst %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<target>Geen chats met leden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Geen contacten geselecteerd</target>
@ -5416,7 +5470,9 @@ Dit is jouw link voor groep %@!</target>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>OK</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5570,10 +5626,11 @@ Vereist het inschakelen van VPN.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Open groep</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
<target>Link openen?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Open migration to another device" xml:space="preserve">
@ -5827,6 +5884,11 @@ Fout: %@</target>
<target>Probeer meldingen uit en weer in te schakelen.</target>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<target>Wacht totdat de moderators van de groep uw verzoek tot lidmaatschap van de groep hebben beoordeeld.</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<target>Wacht tot de tokenactivering voltooid is.</target>
@ -6280,6 +6342,11 @@ swipe action</note>
<target>Contactverzoek afwijzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<target>Lid afwijzen?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Relay server wordt alleen gebruikt als dat nodig is. Een andere partij kan uw IP-adres zien.</target>
@ -6335,11 +6402,6 @@ swipe action</note>
<target>Heronderhandelen over versleuteling?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Verbindingsverzoek herhalen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Herhaal het downloaden</target>
@ -6350,11 +6412,6 @@ swipe action</note>
<target>Herhaal import</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>Deelnameverzoek herhalen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Herhaal het uploaden</target>
@ -6390,6 +6447,11 @@ swipe action</note>
<target>Reden melding?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<target>Rapport verzonden naar moderators</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<target>Spam melden: alleen groepsmoderators kunnen het zien.</target>
@ -6505,6 +6567,16 @@ swipe action</note>
<target>Voorwaarden bekijken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<target>Leden beoordelen</target>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<target>Controleer de leden voordat u ze toelaat ('knocking').</target>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Intrekken</target>
@ -6561,6 +6633,15 @@ chat item action</note>
<target>Bewaar (en informeer contacten)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<target>Toegangsinstellingen opslaan?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Opslaan en Contact melden</target>
@ -6586,6 +6667,10 @@ chat item action</note>
<target>Groep profiel opslaan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<target>Lijst opslaan</target>
@ -7076,6 +7161,11 @@ chat item action</note>
<target>Stel het in in plaats van systeemverificatie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<target>Toegang voor leden instellen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<target>Stel de berichtvervaldatum in chats in.</target>
@ -7189,6 +7279,7 @@ chat item action</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Korte link</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
@ -7293,6 +7384,7 @@ chat item action</note>
</trans-unit>
<trans-unit id="SimpleX channel link" xml:space="preserve">
<source>SimpleX channel link</source>
<target>SimpleX channel link</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX contact address" xml:space="preserve">
@ -7870,18 +7962,9 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>Deze groep bestaat niet meer.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Dit is uw eigen SimpleX adres!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Dit is uw eigen eenmalige link!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<target>Voor deze link is een nieuwere app-versie vereist. Werk de app bij of vraag je contactpersoon om een compatibele link te sturen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link was used with another mobile device, please create a new link on the desktop." xml:space="preserve">
@ -8185,6 +8268,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Unsupported connection link" xml:space="preserve">
<source>Unsupported connection link</source>
<target>Niet-ondersteunde verbindingslink</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Up to 100 last messages are sent to new members." xml:space="preserve">
@ -8284,6 +8368,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Use TCP port 443 for preset servers only." xml:space="preserve">
<source>Use TCP port 443 for preset servers only.</source>
<target>Gebruik TCP-poort 443 alleen voor vooraf ingestelde servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use chat" xml:space="preserve">
@ -8294,7 +8379,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Gebruik het huidige profiel</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8324,7 +8409,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Gebruik een nieuw incognitoprofiel</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8353,6 +8438,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
</trans-unit>
<trans-unit id="Use short links (BETA)" xml:space="preserve">
<source>Use short links (BETA)</source>
<target>Gebruik korte links (BETA)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
@ -8683,12 +8769,12 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>U maakt al verbinding met %@.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>Je maakt al verbinding via deze eenmalige link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8698,24 +8784,19 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Je bent al lid van de groep %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>Je wordt al lid van de groep via deze link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Je wordt al lid van de groep via deze link.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>Je sluit je al aan bij de groep!
Deelnameverzoek herhalen?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8832,6 +8913,11 @@ Deelnameverzoek herhalen?</target>
<target>U kunt de uitnodigingslink opnieuw bekijken in de verbindingsdetails.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<target>U kunt uw rapporten bekijken in Chat met beheerders.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Je kunt geen berichten versturen!</target>
@ -8847,17 +8933,12 @@ Deelnameverzoek herhalen?</target>
<target>Jij bepaalt wie er verbinding mag maken.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>U heeft al een verbinding aangevraagd via dit adres!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Je hebt al verbinding aangevraagd!
Verbindingsverzoek herhalen?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8944,11 +9025,6 @@ Verbindingsverzoek herhalen?</target>
<target>U moet zich authenticeren wanneer u de app na 30 seconden op de achtergrond start of hervat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Je maakt verbinding met alle leden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>U ontvangt nog steeds oproepen en meldingen van gedempte profielen wanneer deze actief zijn.</target>
@ -9134,6 +9210,11 @@ Verbindingsverzoek herhalen?</target>
<target>hier boven, kies dan:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<target>geaccepteerd %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>geaccepteerde oproep</target>
@ -9144,6 +9225,11 @@ Verbindingsverzoek herhalen?</target>
<target>geaccepteerde uitnodiging</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<target>heb je geaccepteerd</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>Beheerder</target>
@ -9164,6 +9250,11 @@ Verbindingsverzoek herhalen?</target>
<target>versleuteling overeenkomen…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<target>alle</target>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>alle leden</target>
@ -9250,6 +9341,11 @@ marked deleted chat item preview text</note>
<target>bellen…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<target>kan geen berichten versturen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>geannuleerd %@</target>
@ -9355,6 +9451,16 @@ marked deleted chat item preview text</note>
<target>contactpersoon %1$@ gewijzigd in %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<target>contact verwijderd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<target>contact uitgeschakeld</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>contact heeft e2e-codering</target>
@ -9365,6 +9471,11 @@ marked deleted chat item preview text</note>
<target>contact heeft geen e2e versleuteling</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<target>contact niet klaar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>creator</target>
@ -9536,6 +9647,11 @@ pref value</note>
<target>groep verwijderd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<target>groep is verwijderd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>groep profiel bijgewerkt</target>
@ -9661,6 +9777,11 @@ pref value</note>
<target>is toegetreden</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<target>lid heeft oude versie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>bericht</target>
@ -9726,6 +9847,11 @@ pref value</note>
<target>geen tekst</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<target>niet gesynchroniseerd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>Waarnemer</target>
@ -9736,6 +9862,7 @@ pref value</note>
<target>uit</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9788,6 +9915,11 @@ time to disappear</note>
<target>in afwachting van goedkeuring</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<target>in afwachting van beoordeling</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>quantum bestendige e2e-codering</target>
@ -9828,6 +9960,11 @@ time to disappear</note>
<target>contactadres verwijderd</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<target>verwijderd uit de groep</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>profielfoto verwijderd</target>
@ -9838,11 +9975,26 @@ time to disappear</note>
<target>heeft je verwijderd</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<target>verzoek tot toetreding afgewezen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>verzocht om verbinding te maken</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<target>beoordeling</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<target>beoordeeld door beheerders</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>opgeslagen</target>
@ -10032,6 +10184,11 @@ laatst ontvangen bericht: %2$@</target>
<target>jij</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<target>je hebt dit lid geaccepteerd</target>
<note>snd group event chat item</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>
@ -10175,6 +10332,7 @@ laatst ontvangen bericht: %2$@</target>
</trans-unit>
<trans-unit id="From %d chat(s)" xml:space="preserve">
<source>From %d chat(s)</source>
<target>Van %d chat(s)</target>
<note>notification body</note>
</trans-unit>
<trans-unit id="From: %@" xml:space="preserve">

View file

@ -565,6 +565,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Zaakceptuj warunki</target>
@ -586,6 +594,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Zaakceptowano warunki</target>
@ -641,6 +653,10 @@ swipe action</note>
<target>Dodaj serwery, skanując kody QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Dodaj członków zespołu</target>
@ -938,12 +954,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>Już połączony!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Już dołączono do grupy!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1383,7 +1399,8 @@ swipe action</note>
<source>Cancel</source>
<target>Anuluj</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1488,7 +1505,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>Czat już istnieje!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1575,11 +1592,23 @@ set passcode view</note>
<target>Czat zostanie usunięty dla Ciebie tej operacji nie można cofnąć!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Czaty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Sprawdzaj wiadomości co 20 min.</target>
@ -1797,11 +1826,6 @@ set passcode view</note>
<target>Łącz automatycznie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Połącz incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Połącz do komputera</target>
@ -1812,44 +1836,39 @@ set passcode view</note>
<target>Szybciej łącz się ze znajomymi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Połączyć się ze sobą?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Połączyć się ze sobą?
To jest twój własny adres SimpleX!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Połączyć się ze sobą?
To jest twój jednorazowy link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Połącz przez adres kontaktowy</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Połącz się przez link</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Połącz przez jednorazowy link</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>Połącz z %@</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2119,11 +2138,6 @@ To jest twój jednorazowy link!</target>
<target>Utwórz kolejkę</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Utwórz tajną grupę</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Utwórz swój profil</target>
@ -2374,6 +2388,10 @@ swipe action</note>
<target>Usunąć profil czatu?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<note>No comment provided by engineer.</note>
@ -2787,7 +2805,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Nie pokazuj ponownie</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3100,6 +3118,10 @@ chat item action</note>
<target>Błąd przyjmowania prośby o kontakt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Błąd dodawania członka(ów)</target>
@ -3109,6 +3131,10 @@ chat item action</note>
<source>Error adding server</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Błąd zmiany adresu</target>
@ -3127,7 +3153,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Błąd zmiany ustawienia</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3189,7 +3215,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Błąd usuwania bazy danych czatu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3204,12 +3234,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Błąd usuwania bazy danych</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Błąd usuwania starej bazy danych</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3244,7 +3274,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Błąd eksportu bazy danych czatu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3254,7 +3284,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Błąd importu bazy danych czatu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3297,7 +3327,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Błąd usuwania członka</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3857,7 +3887,7 @@ Błąd: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Grupa już istnieje!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3924,6 +3954,10 @@ Błąd: %2$@</target>
<target>Profil grupy jest przechowywany na urządzeniach członków, a nie na serwerach.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Wiadomość powitalna grupy</target>
@ -4407,34 +4441,24 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Dołącz do grupy</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Dołącz do grupowej rozmowy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Dołączyć do grupy?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Dołącz incognito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Dołącz z obecnym profilem</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Dołączyć do twojej grupy?
To jest twój link do grupy %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4641,6 +4665,10 @@ To jest twój link do grupy %@!</target>
<target>Członek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Członek nieaktywny</target>
@ -4673,6 +4701,10 @@ To jest twój link do grupy %@!</target>
<target>Członek zostanie usunięty z grupy - nie można tego cofnąć!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Członkowie grupy mogą dodawać reakcje wiadomości.</target>
@ -5083,6 +5115,10 @@ To jest twój link do grupy %@!</target>
<target>Nowa rola członka</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Nowa wiadomość</target>
@ -5119,6 +5155,10 @@ To jest twój link do grupy %@!</target>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Nie wybrano kontaktów</target>
@ -5298,7 +5338,9 @@ To jest twój link do grupy %@!</target>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Ok</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5447,7 +5489,7 @@ Wymaga włączenia VPN.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Grupa otwarta</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5698,6 +5740,10 @@ Błąd: %@</target>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -6140,6 +6186,10 @@ swipe action</note>
<target>Odrzuć prośbę kontaktu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Serwer przekaźnikowy jest używany tylko w razie potrzeby. Inna strona może obserwować Twój adres IP.</target>
@ -6195,11 +6245,6 @@ swipe action</note>
<target>Renegocjować szyfrowanie?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Powtórzyć prośbę połączenia?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Powtórz pobieranie</target>
@ -6210,11 +6255,6 @@ swipe action</note>
<target>Powtórz importowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>Powtórzyć prośbę dołączenia?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Powtórz wgrywanie</target>
@ -6245,6 +6285,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -6354,6 +6398,14 @@ swipe action</note>
<source>Review conditions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>Odwołaj</target>
@ -6410,6 +6462,14 @@ chat item action</note>
<target>Zapisz (i powiadom kontakty)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Zapisz i powiadom kontakt</target>
@ -6435,6 +6495,10 @@ chat item action</note>
<target>Zapisz profil grupy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -6918,6 +6982,10 @@ chat item action</note>
<target>Ustaw go zamiast uwierzytelniania systemowego.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7688,16 +7756,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Ta grupa już nie istnieje.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>To jest twój własny adres SimpleX!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>To jest twój jednorazowy link!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -8102,7 +8160,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Użyj obecnego profilu</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8130,7 +8188,7 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Użyj nowego profilu incognito</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8483,12 +8541,12 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>Już się łączysz z %@.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>Już jesteś połączony z tym jednorazowym linkiem!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8498,24 +8556,19 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Już dołączasz do grupy %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>Już dołączasz do grupy przez ten link!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Już dołączasz do grupy przez ten link.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>Już dołączasz do grupy!
Powtórzyć prośbę dołączenia?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8630,6 +8683,10 @@ Powtórzyć prośbę dołączenia?</target>
<target>Możesz zobaczyć link zaproszenia ponownie w szczegółach połączenia.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Nie możesz wysyłać wiadomości!</target>
@ -8645,17 +8702,12 @@ Powtórzyć prośbę dołączenia?</target>
<target>Ty decydujesz, kto może się połączyć.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>Już prosiłeś o połączenie na ten adres!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Już prosiłeś o połączenie!
Powtórzyć prośbę połączenia?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8741,11 +8793,6 @@ Powtórzyć prośbę połączenia?</target>
<target>Uwierzytelnienie będzie wymagane przy uruchamianiu lub wznawianiu aplikacji po 30 sekundach w tle.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Zostaniesz połączony ze wszystkimi członkami grupy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Nadal będziesz otrzymywać połączenia i powiadomienia z wyciszonych profili, gdy są one aktywne.</target>
@ -8930,6 +8977,10 @@ Powtórzyć prośbę połączenia?</target>
<target>powyżej, a następnie wybierz:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>zaakceptowane połączenie</target>
@ -8939,6 +8990,10 @@ Powtórzyć prośbę połączenia?</target>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>administrator</target>
@ -8959,6 +9014,10 @@ Powtórzyć prośbę połączenia?</target>
<target>uzgadnianie szyfrowania…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>wszyscy członkowie</target>
@ -9044,6 +9103,10 @@ marked deleted chat item preview text</note>
<target>dzwonie…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>anulowany %@</target>
@ -9149,6 +9212,14 @@ marked deleted chat item preview text</note>
<target>kontakt %1$@ zmieniony na %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>kontakt posiada szyfrowanie e2e</target>
@ -9159,6 +9230,10 @@ marked deleted chat item preview text</note>
<target>kontakt nie posiada szyfrowania e2e</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>twórca</target>
@ -9330,6 +9405,10 @@ pref value</note>
<target>grupa usunięta</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>zaktualizowano profil grupy</target>
@ -9455,6 +9534,10 @@ pref value</note>
<target>połączony</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>wiadomość</target>
@ -9519,6 +9602,10 @@ pref value</note>
<target>brak tekstu</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>obserwator</target>
@ -9529,6 +9616,7 @@ pref value</note>
<target>wyłączony</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9579,6 +9667,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>kwantowo odporne szyfrowanie e2e</target>
@ -9618,6 +9710,10 @@ time to disappear</note>
<target>usunięto adres kontaktu</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>usunięto zdjęcie profilu</target>
@ -9628,10 +9724,22 @@ time to disappear</note>
<target>usunął cię</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>zapisane</target>
@ -9821,6 +9929,10 @@ ostatnia otrzymana wiadomość: %2$@</target>
<target>Ty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</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>

View file

@ -520,6 +520,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<note>No comment provided by engineer.</note>
@ -539,6 +547,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<note>No comment provided by engineer.</note>
@ -587,6 +599,10 @@ swipe action</note>
<target>เพิ่มเซิร์ฟเวอร์โดยการสแกนรหัสคิวอาร์โค้ด</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<note>No comment provided by engineer.</note>
@ -857,11 +873,11 @@ swipe action</note>
</trans-unit>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1254,7 +1270,8 @@ swipe action</note>
<source>Cancel</source>
<target>ยกเลิก</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1351,7 +1368,7 @@ set passcode view</note>
</trans-unit>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1429,11 +1446,23 @@ set passcode view</note>
<source>Chat will be deleted for you - this cannot be undone!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>แชท</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<note>No comment provided by engineer.</note>
@ -1631,10 +1660,6 @@ set passcode view</note>
<source>Connect automatically</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<note>No comment provided by engineer.</note>
@ -1643,36 +1668,32 @@ set passcode view</note>
<source>Connect to your friends faster.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>เชื่อมต่อผ่านลิงก์</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -1919,11 +1940,6 @@ This is your own one-time link!</source>
<target>สร้างคิว</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>สร้างกลุ่มลับ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>สร้างโปรไฟล์ของคุณ</target>
@ -2162,6 +2178,10 @@ swipe action</note>
<target>ลบโปรไฟล์แชทไหม?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<note>No comment provided by engineer.</note>
@ -2551,7 +2571,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>ไม่ต้องแสดงอีก</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -2843,6 +2863,10 @@ chat item action</note>
<target>เกิดข้อผิดพลาดในการรับคำขอติดต่อ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>เกิดข้อผิดพลาดในการเพิ่มสมาชิก</target>
@ -2852,6 +2876,10 @@ chat item action</note>
<source>Error adding server</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>เกิดข้อผิดพลาดในการเปลี่ยนที่อยู่</target>
@ -2869,7 +2897,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>เกิดข้อผิดพลาดในการเปลี่ยนการตั้งค่า</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -2926,7 +2954,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>เกิดข้อผิดพลาดในการลบฐานข้อมูลแชท</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -2941,12 +2973,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>เกิดข้อผิดพลาดในการลบฐานข้อมูล</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>เกิดข้อผิดพลาดในการลบฐานข้อมูลเก่า</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -2980,7 +3012,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>เกิดข้อผิดพลาดในการส่งออกฐานข้อมูลแชท</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -2989,7 +3021,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>เกิดข้อผิดพลาดในการนำเข้าฐานข้อมูลแชท</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3028,7 +3060,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>เกิดข้อผิดพลาดในการลบสมาชิก</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3544,7 +3576,7 @@ Error: %2$@</source>
</trans-unit>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3611,6 +3643,10 @@ Error: %2$@</source>
<target>โปรไฟล์กลุ่มถูกจัดเก็บไว้ในอุปกรณ์ของสมาชิก ไม่ใช่บนเซิร์ฟเวอร์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>ข้อความต้อนรับกลุ่ม</target>
@ -4073,29 +4109,21 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>เข้าร่วมกลุ่ม</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>เข้าร่วมแบบไม่ระบุตัวตน</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4293,6 +4321,10 @@ This is your link for group %@!</source>
<target>สมาชิก</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
@ -4324,6 +4356,10 @@ This is your link for group %@!</source>
<target>สมาชิกจะถูกลบออกจากกลุ่ม - ไม่สามารถยกเลิกได้!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>สมาชิกกลุ่มสามารถเพิ่มการแสดงปฏิกิริยาต่อข้อความได้</target>
@ -4697,6 +4733,10 @@ This is your link for group %@!</source>
<target>บทบาทของสมาชิกใหม่</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>ข้อความใหม่</target>
@ -4733,6 +4773,10 @@ This is your link for group %@!</source>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>ไม่ได้เลือกผู้ติดต่อ</target>
@ -4902,7 +4946,9 @@ This is your link for group %@!</source>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>ตกลง</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5046,7 +5092,7 @@ Requires compatible VPN.</source>
</trans-unit>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5274,6 +5320,10 @@ Error: %@</source>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -5683,6 +5733,10 @@ swipe action</note>
<target>ปฏิเสธคำขอติดต่อ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>ใช้เซิร์ฟเวอร์รีเลย์ในกรณีที่จำเป็นเท่านั้น บุคคลอื่นสามารถสังเกตที่อยู่ IP ของคุณได้</target>
@ -5736,10 +5790,6 @@ swipe action</note>
<target>เจรจา enryption ใหม่หรือไม่?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<note>No comment provided by engineer.</note>
@ -5748,10 +5798,6 @@ swipe action</note>
<source>Repeat import</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<note>No comment provided by engineer.</note>
@ -5781,6 +5827,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -5884,6 +5934,14 @@ swipe action</note>
<source>Review conditions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>ถอน</target>
@ -5936,6 +5994,14 @@ chat item action</note>
<target>บันทึก (และแจ้งผู้ติดต่อ)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>บันทึกและแจ้งผู้ติดต่อ</target>
@ -5960,6 +6026,10 @@ chat item action</note>
<target>บันทึกโปรไฟล์กลุ่ม</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -6404,6 +6474,10 @@ chat item action</note>
<target>ตั้งแทนการรับรองความถูกต้องของระบบ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7124,14 +7198,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>ไม่มีกลุ่มนี้แล้ว</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -7507,7 +7573,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -7533,7 +7599,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -7853,11 +7919,11 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -7865,20 +7931,16 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -7986,6 +8048,10 @@ Repeat join request?</source>
<source>You can view invitation link again in connection details.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>คุณไม่สามารถส่งข้อความได้!</target>
@ -8001,14 +8067,10 @@ Repeat join request?</source>
<target>ผู้คนสามารถเชื่อมต่อกับคุณผ่านลิงก์ที่คุณแบ่งปันเท่านั้น</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8089,10 +8151,6 @@ Repeat connection request?</source>
<target>คุณจะต้องตรวจสอบสิทธิ์เมื่อคุณเริ่มหรือกลับมาใช้แอปพลิเคชันอีกครั้งหลังจากผ่านไป 30 วินาทีในพื้นหลัง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>คุณจะยังได้รับสายเรียกเข้าและการแจ้งเตือนจากโปรไฟล์ที่ปิดเสียงเมื่อโปรไฟล์ของเขามีการใช้งาน</target>
@ -8270,6 +8328,10 @@ Repeat connection request?</source>
<target>ด้านบน จากนั้นเลือก:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>รับสายแล้ว</target>
@ -8279,6 +8341,10 @@ Repeat connection request?</source>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>ผู้ดูแลระบบ</target>
@ -8298,6 +8364,10 @@ Repeat connection request?</source>
<target>เห็นด้วยกับการ encryption…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<note>feature role</note>
@ -8375,6 +8445,10 @@ marked deleted chat item preview text</note>
<target>กำลังโทร…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>ยกเลิก %@</target>
@ -8478,6 +8552,14 @@ marked deleted chat item preview text</note>
<source>contact %1$@ changed to %2$@</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>ผู้ติดต่อมีการ encrypt จากต้นจนจบ</target>
@ -8488,6 +8570,10 @@ marked deleted chat item preview text</note>
<target>ผู้ติดต่อไม่มีการ encrypt จากต้นจนจบ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>ผู้สร้าง</target>
@ -8653,6 +8739,10 @@ pref value</note>
<target>ลบกลุ่มแล้ว</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>อัปเดตโปรไฟล์กลุ่มแล้ว</target>
@ -8775,6 +8865,10 @@ pref value</note>
<target>เชื่อมต่อสำเร็จ</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<note>No comment provided by engineer.</note>
@ -8838,6 +8932,10 @@ pref value</note>
<target>ไม่มีข้อความ</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>ผู้สังเกตการณ์</target>
@ -8848,6 +8946,7 @@ pref value</note>
<target>ปิด</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -8895,6 +8994,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<note>chat item text</note>
@ -8932,6 +9035,10 @@ time to disappear</note>
<source>removed contact address</source>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<note>profile update event chat item</note>
@ -8941,10 +9048,22 @@ time to disappear</note>
<target>ลบคุณออกแล้ว</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<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>
@ -9115,6 +9234,10 @@ last received msg: %2$@</source>
<source>you</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>คุณได้รับเชิญให้เข้าร่วมกลุ่ม</target>

View file

@ -192,6 +192,7 @@
</trans-unit>
<trans-unit id="%d seconds(s)" xml:space="preserve">
<source>%d seconds(s)</source>
<target>%d saniye(ler)</target>
<note>delete after time</note>
</trans-unit>
<trans-unit id="%d skipped message(s)" xml:space="preserve">
@ -465,6 +466,7 @@ time interval</note>
</trans-unit>
<trans-unit id="1 year" xml:space="preserve">
<source>1 year</source>
<target>1 yıl</target>
<note>delete after time</note>
</trans-unit>
<trans-unit id="1-time link" xml:space="preserve">
@ -563,6 +565,16 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<target>Üye olarak kabul et</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<target>Gözlemci olarak kabul et</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>Koşulları kabul et</target>
@ -584,6 +596,11 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<target>Üyeyi kabul et</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>Kabul edilmiş koşullar</target>
@ -601,6 +618,7 @@ swipe action</note>
</trans-unit>
<trans-unit id="Active" xml:space="preserve">
<source>Active</source>
<target>Aktif</target>
<note>token status text</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
@ -620,6 +638,7 @@ swipe action</note>
</trans-unit>
<trans-unit id="Add list" xml:space="preserve">
<source>Add list</source>
<target>Liste ekle</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add profile" xml:space="preserve">
@ -637,6 +656,10 @@ swipe action</note>
<target>Karekod taratarak sunucuları ekleyin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>Takım üyesi ekle</target>
@ -649,6 +672,7 @@ swipe action</note>
</trans-unit>
<trans-unit id="Add to list" xml:space="preserve">
<source>Add to list</source>
<target>Listeye ekle</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add welcome message" xml:space="preserve">
@ -728,6 +752,7 @@ swipe action</note>
</trans-unit>
<trans-unit id="All" xml:space="preserve">
<source>All</source>
<target>Hepsi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All app data is deleted." xml:space="preserve">
@ -929,12 +954,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>Zaten bağlanılıyor!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>Zaten gruba bağlanılıyor!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1365,7 +1390,8 @@ swipe action</note>
<source>Cancel</source>
<target>İptal et</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1470,7 +1496,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>Sohbet zaten mevcut!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1557,11 +1583,23 @@ set passcode view</note>
<target>Sohbet senden silinecek - bu geri alınamaz!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>Sohbetler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>Her 20 dakikada mesajları kontrol et.</target>
@ -1782,11 +1820,6 @@ set passcode view</note>
<target>Otomatik olarak bağlan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>Gizli bağlan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Bilgisayara bağlan</target>
@ -1797,44 +1830,39 @@ set passcode view</note>
<target>Arkadaşlarınıza daha hızlı bağlanın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>Kendine mi bağlanacaksın?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Kendine mi bağlanacaksın?
Bu senin kendi SimpleX adresin!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Kendine mi bağlanacaksın?
Bu senin kendi tek kullanımlık bağlantın!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Kişi adresi aracılığıyla bağlan</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>Bağlantı aracılığıyla bağlan</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>Tek kullanımlık bağlantı aracılığıyla bağlan</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>%@ ile bağlan</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2106,11 +2134,6 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
<target>Sıra oluştur</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>Gizli grup oluştur</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>Profilini oluştur</target>
@ -2364,6 +2387,10 @@ swipe action</note>
<target>Sohbet profili silinsin mi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>Sohbet silinsin mi?</target>
@ -2780,7 +2807,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Yeniden gösterme</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3095,6 +3122,10 @@ chat item action</note>
<target>Bağlantı isteği kabul edilirken hata oluştu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Üye(ler) eklenirken hata oluştu</target>
@ -3105,6 +3136,10 @@ chat item action</note>
<target>Sunucu eklenirken hata oluştu</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Adres değiştirilirken hata oluştu</target>
@ -3123,7 +3158,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>Ayar değiştirilirken hata oluştu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3185,7 +3220,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>Sohbet veritabanı silinirken sorun oluştu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3200,12 +3239,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>Veritabanı silinirken hata oluştu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>Eski veritabanı silinirken hata oluştu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3240,7 +3279,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>Sohbet veritabanı dışa aktarılırken hata oluştu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3250,7 +3289,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>Sohbet veritabanı içe aktarılırken hata oluştu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3294,7 +3333,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>Kişiyi silerken sorun oluştu</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3862,7 +3901,7 @@ Hata: %2$@</target>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>Grup çoktan mevcut!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3929,6 +3968,10 @@ Hata: %2$@</target>
<target>Grup profili üyelerin cihazlarında saklanır, sunucularda değil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>Grup hoşgeldin mesajı</target>
@ -4417,34 +4460,24 @@ Daha fazla iyileştirme yakında geliyor!</target>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>Gruba katıl</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>Grup sohbetlerine katıl</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>Gruba katılınsın mı?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>Gizli katıl</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>Şu anki profille katıl</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>Bu gruba katılınsın mı?
Bu senin grup için bağlantın %@!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4653,6 +4686,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Kişi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Üye inaktif</target>
@ -4686,6 +4723,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Üye gruptan çıkarılacaktır - bu geri alınamaz!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>Grup üyeleri mesaj tepkileri ekleyebilir.</target>
@ -5096,6 +5137,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Yeni üye rolü</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>Yeni mesaj</target>
@ -5132,6 +5177,10 @@ Bu senin grup için bağlantın %@!</target>
<source>No chats in list %@</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Hiçbir kişi seçilmedi</target>
@ -5311,7 +5360,9 @@ Bu senin grup için bağlantın %@!</target>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>Tamam</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5460,7 +5511,7 @@ VPN'nin etkinleştirilmesi gerekir.</target>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>Grubu aç</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5711,6 +5762,10 @@ Hata: %@</target>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -6153,6 +6208,10 @@ swipe action</note>
<target>Bağlanma isteğini reddet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Yönlendirici sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir.</target>
@ -6208,11 +6267,6 @@ swipe action</note>
<target>Şifreleme yeniden müzakere edilsin mi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>Bağlantı isteği tekrarlansın mı?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>Tekrar indir</target>
@ -6223,11 +6277,6 @@ swipe action</note>
<target>İthalatı tekrarla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>Katılma isteği tekrarlansın mı?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>Yüklemeyi tekrarla</target>
@ -6258,6 +6307,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -6367,6 +6420,14 @@ swipe action</note>
<source>Review conditions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>İptal et</target>
@ -6423,6 +6484,14 @@ chat item action</note>
<target>Kaydet (ve kişilere bildir)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Kaydet ve kişilere bildir</target>
@ -6448,6 +6517,10 @@ chat item action</note>
<target>Grup profilini kaydet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<note>No comment provided by engineer.</note>
@ -6931,6 +7004,10 @@ chat item action</note>
<target>Sistem kimlik doğrulaması yerine ayarla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7704,16 +7781,6 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
<target>Bu grup artık mevcut değildir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Bu senin kendi SimpleX adresin!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Bu senin kendi tek kullanımlık bağlantın!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -8118,7 +8185,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>Şu anki profili kullan</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8146,7 +8213,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Yeni gizli profilden kullan</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8499,12 +8566,12 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>Zaten %@'a bağlanıyorsunuz.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>Bu tek seferlik bağlantı üzerinden zaten bağlanıyorsunuz!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8514,24 +8581,19 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>Zaten %@ grubuna katılıyorsunuz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>Bu bağlantı üzerinden gruba zaten katılıyorsunuz!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>Gruba zaten bu bağlantı üzerinden katılıyorsunuz.</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>Gruba zaten katılıyorsunuz!
Katılma isteği tekrarlansın mı?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8646,6 +8708,10 @@ Katılma isteği tekrarlansın mı?</target>
<target>Bağlantı detaylarından davet bağlantısını yeniden görüntüleyebilirsin.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>Mesajlar gönderemezsiniz!</target>
@ -8661,17 +8727,12 @@ Katılma isteği tekrarlansın mı?</target>
<target>Kimin bağlanabileceğine siz karar verirsiniz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>Bu adres üzerinden zaten bağlantı talebinde bulundunuz!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>Zaten bağlantı isteğinde bulundunuz!
Bağlantı isteği tekrarlansın mı?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8757,11 +8818,6 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>Arka planda 30 saniye kaldıktan sonra uygulamayı başlattığınızda veya devam ettirdiğinizde kimlik doğrulaması yapmanız gerekecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>Bütün grup üyelerine bağlanacaksın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>Aktif olduklarında sessize alınmış profillerden arama ve bildirim almaya devam edersiniz.</target>
@ -8945,6 +9001,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>yukarı çıkın, ardından seçin:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>kabul edilen arama</target>
@ -8954,6 +9014,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>yönetici</target>
@ -8974,6 +9038,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>şifreleme kabul ediliyor…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>bütün üyeler</target>
@ -9059,6 +9127,10 @@ marked deleted chat item preview text</note>
<target>aranıyor…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>%@ iptal edildi</target>
@ -9164,6 +9236,14 @@ marked deleted chat item preview text</note>
<target>%1$@ kişisi %2$@ olarak değişti</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>kişi uçtan uca şifrelemeye sahiptir</target>
@ -9174,6 +9254,10 @@ marked deleted chat item preview text</note>
<target>kişi uçtan uca şifrelemeye sahip değildir</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>oluşturan</target>
@ -9345,6 +9429,10 @@ pref value</note>
<target>grup silindi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>grup profili güncellendi</target>
@ -9470,6 +9558,10 @@ pref value</note>
<target>bağlanıldı</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>mesaj</target>
@ -9534,6 +9626,10 @@ pref value</note>
<target>metin yok</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>gözlemci</target>
@ -9544,6 +9640,7 @@ pref value</note>
<target>kapalı</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9594,6 +9691,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</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>
@ -9633,6 +9734,10 @@ time to disappear</note>
<target>kişi adresi silindi</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>profil fotoğrafı silindi</target>
@ -9643,10 +9748,22 @@ time to disappear</note>
<target>sen kaldırıldın</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>kaydedildi</target>
@ -9836,6 +9953,10 @@ son alınan msj: %2$@</target>
<target>sen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</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>

View file

@ -565,6 +565,14 @@ time interval</note>
accept incoming call via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept as member" xml:space="preserve">
<source>Accept as member</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept as observer" xml:space="preserve">
<source>Accept as observer</source>
<note>alert action</note>
</trans-unit>
<trans-unit id="Accept conditions" xml:space="preserve">
<source>Accept conditions</source>
<target>接受条款</target>
@ -586,6 +594,10 @@ swipe action</note>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
<trans-unit id="Accept member" xml:space="preserve">
<source>Accept member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Accepted conditions" xml:space="preserve">
<source>Accepted conditions</source>
<target>已接受的条款</target>
@ -641,6 +653,10 @@ swipe action</note>
<target>扫描二维码来添加服务器。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add short link" xml:space="preserve">
<source>Add short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add team members" xml:space="preserve">
<source>Add team members</source>
<target>添加团队成员</target>
@ -939,12 +955,12 @@ swipe action</note>
<trans-unit id="Already connecting!" xml:space="preserve">
<source>Already connecting!</source>
<target>已经在连接了!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Already joining the group!" xml:space="preserve">
<source>Already joining the group!</source>
<target>已经加入了该群组!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
@ -1389,7 +1405,8 @@ swipe action</note>
<source>Cancel</source>
<target>取消</target>
<note>alert action
alert button</note>
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@ -1495,7 +1512,7 @@ set passcode view</note>
<trans-unit id="Chat already exists!" xml:space="preserve">
<source>Chat already exists!</source>
<target>聊天已存在!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Chat colors" xml:space="preserve">
<source>Chat colors</source>
@ -1582,11 +1599,23 @@ set passcode view</note>
<target>将为你删除聊天 - 此操作无法撤销!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat with admins" xml:space="preserve">
<source>Chat with admins</source>
<note>chat toolbar</note>
</trans-unit>
<trans-unit id="Chat with member" xml:space="preserve">
<source>Chat with member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats" xml:space="preserve">
<source>Chats</source>
<target>聊天</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chats with members" xml:space="preserve">
<source>Chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Check messages every 20 min." xml:space="preserve">
<source>Check messages every 20 min.</source>
<target>每 20 分钟检查消息。</target>
@ -1812,11 +1841,6 @@ set passcode view</note>
<target>自动连接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect incognito" xml:space="preserve">
<source>Connect incognito</source>
<target>在隐身状态下连接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>连接到桌面</target>
@ -1827,44 +1851,39 @@ set passcode view</note>
<target>更快地与您的朋友联系。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?" xml:space="preserve">
<source>Connect to yourself?</source>
<target>连接到你自己?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own SimpleX address!" xml:space="preserve">
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>与自己建立联系?
这是您自己的 SimpleX 地址!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>与自己建立联系?
这是您自己的一次性链接!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>通过联系地址连接</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
<source>Connect via link</source>
<target>通过链接连接</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect via one-time link" xml:space="preserve">
<source>Connect via one-time link</source>
<target>通过一次性链接连接</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Connect with %@" xml:space="preserve">
<source>Connect with %@</source>
<target>与 %@连接</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Connected" xml:space="preserve">
<source>Connected</source>
@ -2142,11 +2161,6 @@ This is your own one-time link!</source>
<target>创建队列</target>
<note>server test step</note>
</trans-unit>
<trans-unit id="Create secret group" xml:space="preserve">
<source>Create secret group</source>
<target>创建私密群组</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create your profile" xml:space="preserve">
<source>Create your profile</source>
<target>创建您的资料</target>
@ -2401,6 +2415,10 @@ swipe action</note>
<target>删除聊天资料?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete chat with member?" xml:space="preserve">
<source>Delete chat with member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Delete chat?" xml:space="preserve">
<source>Delete chat?</source>
<target>删除聊天?</target>
@ -2824,7 +2842,7 @@ swipe action</note>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>不再显示</target>
<note>No comment provided by engineer.</note>
<note>alert action</note>
</trans-unit>
<trans-unit id="Done" xml:space="preserve">
<source>Done</source>
@ -3142,6 +3160,10 @@ chat item action</note>
<target>接受联系人请求错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting member" xml:space="preserve">
<source>Error accepting member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>添加成员错误</target>
@ -3152,6 +3174,10 @@ chat item action</note>
<target>添加服务器出错</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error adding short link" xml:space="preserve">
<source>Error adding short link</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>更改地址错误</target>
@ -3170,7 +3196,7 @@ chat item action</note>
<trans-unit id="Error changing setting" xml:space="preserve">
<source>Error changing setting</source>
<target>更改设置错误</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
@ -3234,7 +3260,11 @@ chat item action</note>
<trans-unit id="Error deleting chat database" xml:space="preserve">
<source>Error deleting chat database</source>
<target>删除聊天数据库错误</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat with member" xml:space="preserve">
<source>Error deleting chat with member</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting chat!" xml:space="preserve">
<source>Error deleting chat!</source>
@ -3249,12 +3279,12 @@ chat item action</note>
<trans-unit id="Error deleting database" xml:space="preserve">
<source>Error deleting database</source>
<target>删除数据库错误</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting old database" xml:space="preserve">
<source>Error deleting old database</source>
<target>删除旧数据库错误</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error deleting token" xml:space="preserve">
<source>Error deleting token</source>
@ -3289,7 +3319,7 @@ chat item action</note>
<trans-unit id="Error exporting chat database" xml:space="preserve">
<source>Error exporting chat database</source>
<target>导出聊天数据库错误</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error exporting theme: %@" xml:space="preserve">
<source>Error exporting theme: %@</source>
@ -3299,7 +3329,7 @@ chat item action</note>
<trans-unit id="Error importing chat database" xml:space="preserve">
<source>Error importing chat database</source>
<target>导入聊天数据库错误</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error joining group" xml:space="preserve">
<source>Error joining group</source>
@ -3344,7 +3374,7 @@ chat item action</note>
<trans-unit id="Error removing member" xml:space="preserve">
<source>Error removing member</source>
<target>删除成员错误</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Error reordering lists" xml:space="preserve">
<source>Error reordering lists</source>
@ -3924,7 +3954,7 @@ Error: %2$@</source>
<trans-unit id="Group already exists!" xml:space="preserve">
<source>Group already exists!</source>
<target>群已存在!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Group display name" xml:space="preserve">
<source>Group display name</source>
@ -3991,6 +4021,10 @@ Error: %2$@</source>
<target>群组资料存储在成员的设备上,而不是服务器上。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile was changed. If you save it, the updated profile will be sent to group members." xml:space="preserve">
<source>Group profile was changed. If you save it, the updated profile will be sent to group members.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Group welcome message" xml:space="preserve">
<source>Group welcome message</source>
<target>群欢迎词</target>
@ -4489,34 +4523,24 @@ More improvements are coming soon!</source>
<trans-unit id="Join group" xml:space="preserve">
<source>Join group</source>
<target>加入群组</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="Join group conversations" xml:space="preserve">
<source>Join group conversations</source>
<target>加入群对话</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join group?" xml:space="preserve">
<source>Join group?</source>
<target>加入群组?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join incognito" xml:space="preserve">
<source>Join incognito</source>
<target>加入隐身聊天</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join with current profile" xml:space="preserve">
<source>Join with current profile</source>
<target>使用当前档案加入</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Join your group?&#10;This is your link for group %@!" xml:space="preserve">
<source>Join your group?
This is your link for group %@!</source>
<target>加入您的群组?
这是您组 %@ 的链接!</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
@ -4728,6 +4752,10 @@ This is your link for group %@!</source>
<target>成员</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member admission" xml:space="preserve">
<source>Member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>成员不活跃</target>
@ -4763,6 +4791,10 @@ This is your link for group %@!</source>
<target>成员将被移出群组——此操作无法撤消!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will join the group, accept member?" xml:space="preserve">
<source>Member will join the group, accept member?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Members can add message reactions." xml:space="preserve">
<source>Members can add message reactions.</source>
<target>群组成员可以添加信息回应。</target>
@ -5183,6 +5215,10 @@ This is your link for group %@!</source>
<target>新成员角色</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New member wants to join the group." xml:space="preserve">
<source>New member wants to join the group.</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="New message" xml:space="preserve">
<source>New message</source>
<target>新消息</target>
@ -5223,6 +5259,10 @@ This is your link for group %@!</source>
<target>列表 %@ 中无聊天</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No chats with members" xml:space="preserve">
<source>No chats with members</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>未选择联系人</target>
@ -5415,7 +5455,9 @@ This is your link for group %@!</source>
<trans-unit id="Ok" xml:space="preserve">
<source>Ok</source>
<target>好的</target>
<note>alert button</note>
<note>alert action
alert button
new chat action</note>
</trans-unit>
<trans-unit id="Old database" xml:space="preserve">
<source>Old database</source>
@ -5569,7 +5611,7 @@ Requires compatible VPN.</source>
<trans-unit id="Open group" xml:space="preserve">
<source>Open group</source>
<target>打开群</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Open link?" xml:space="preserve">
<source>Open link?</source>
@ -5823,6 +5865,10 @@ Error: %@</source>
<source>Please try to disable and re-enable notfications.</source>
<note>token info</note>
</trans-unit>
<trans-unit id="Please wait for group moderators to review your request to join the group." xml:space="preserve">
<source>Please wait for group moderators to review your request to join the group.</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="Please wait for token activation to complete." xml:space="preserve">
<source>Please wait for token activation to complete.</source>
<note>token info</note>
@ -6265,6 +6311,10 @@ swipe action</note>
<target>拒绝联系人请求</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reject member?" xml:space="preserve">
<source>Reject member?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>中继服务器仅在必要时使用。其他人可能会观察到您的IP地址。</target>
@ -6319,11 +6369,6 @@ swipe action</note>
<target>重新协商加密?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
<source>Repeat connection request?</source>
<target>重复连接请求吗?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>重复下载</target>
@ -6334,11 +6379,6 @@ swipe action</note>
<target>重复导入</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
<source>Repeat join request?</source>
<target>重复加入请求吗?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>重复上传</target>
@ -6369,6 +6409,10 @@ swipe action</note>
<source>Report reason?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Report sent to moderators" xml:space="preserve">
<source>Report sent to moderators</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Report spam: only group moderators will see it." xml:space="preserve">
<source>Report spam: only group moderators will see it.</source>
<note>report reason</note>
@ -6479,6 +6523,14 @@ swipe action</note>
<target>审阅条款</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Review members" xml:space="preserve">
<source>Review members</source>
<note>admission stage</note>
</trans-unit>
<trans-unit id="Review members before admitting (&quot;knocking&quot;)." xml:space="preserve">
<source>Review members before admitting ("knocking").</source>
<note>admission stage description</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
<source>Revoke</source>
<target>吊销</target>
@ -6534,6 +6586,14 @@ chat item action</note>
<target>保存(并通知联系人)</target>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save (and notify members)" xml:space="preserve">
<source>Save (and notify members)</source>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save admission settings?" xml:space="preserve">
<source>Save admission settings?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>保存并通知联系人</target>
@ -6559,6 +6619,10 @@ chat item action</note>
<target>保存群组资料</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile?" xml:space="preserve">
<source>Save group profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save list" xml:space="preserve">
<source>Save list</source>
<target>保存列表</target>
@ -7041,6 +7105,10 @@ chat item action</note>
<target>设置它以代替系统身份验证。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set member admission" xml:space="preserve">
<source>Set member admission</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set message expiration in chats." xml:space="preserve">
<source>Set message expiration in chats.</source>
<note>No comment provided by engineer.</note>
@ -7812,16 +7880,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>该群组已不存在。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>这是你自己的 SimpleX 地址!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>这是你自己的一次性链接!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." xml:space="preserve">
<source>This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link.</source>
<note>No comment provided by engineer.</note>
@ -8223,7 +8281,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use current profile" xml:space="preserve">
<source>Use current profile</source>
<target>使用当前配置文件</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use for files" xml:space="preserve">
<source>Use for files</source>
@ -8251,7 +8309,7 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>使用新的隐身配置文件</target>
<note>No comment provided by engineer.</note>
<note>new chat action</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
<source>Use only local notifications?</source>
@ -8603,12 +8661,12 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="You are already connecting to %@." xml:space="preserve">
<source>You are already connecting to %@.</source>
<target>您已连接到 %@。</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
<source>You are already connecting via this one-time link!</source>
<target>你已经在通过这个一次性链接进行连接!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already in group %@." xml:space="preserve">
<source>You are already in group %@.</source>
@ -8618,24 +8676,19 @@ To connect, please ask your contact to create another connection link and check
<trans-unit id="You are already joining the group %@." xml:space="preserve">
<source>You are already joining the group %@.</source>
<target>您已加入组 %@。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
<source>You are already joining the group via this link!</source>
<target>您已经通过此链接加入群组!</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
<source>You are already joining the group via this link.</source>
<target>你已经在通过此链接加入该群。</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet message</note>
</trans-unit>
<trans-unit id="You are already joining the group!&#10;Repeat join request?" xml:space="preserve">
<source>You are already joining the group!
Repeat join request?</source>
<target>您已经加入了这个群组!
重复加入请求?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
@ -8750,6 +8803,10 @@ Repeat join request?</source>
<target>您可以在连接详情中再次查看邀请链接。</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
<source>You can view your reports in Chat with admins.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="You can't send messages!" xml:space="preserve">
<source>You can't send messages!</source>
<target>您无法发送消息!</target>
@ -8765,17 +8822,12 @@ Repeat join request?</source>
<target>你决定谁可以连接。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>你已经请求通过此地址进行连接!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
<source>You have already requested connection!
Repeat connection request?</source>
<target>您已经请求连接了!
重复连接请求?</target>
<note>No comment provided by engineer.</note>
<note>new chat sheet title</note>
</trans-unit>
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
@ -8861,11 +8913,6 @@ Repeat connection request?</source>
<target>当您启动应用或在应用程序驻留后台超过30 秒后,您将需要进行身份验证。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
<source>You will connect to all group members.</source>
<target>你将连接到所有群成员。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
<source>You will still receive calls and notifications from muted profiles when they are active.</source>
<target>当静音配置文件处于活动状态时,您仍会收到来自静音配置文件的电话和通知。</target>
@ -9045,6 +9092,10 @@ Repeat connection request?</source>
<target>上面,然后选择:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="accepted %@" xml:space="preserve">
<source>accepted %@</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="accepted call" xml:space="preserve">
<source>accepted call</source>
<target>已接受通话</target>
@ -9054,6 +9105,10 @@ Repeat connection request?</source>
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="accepted you" xml:space="preserve">
<source>accepted you</source>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>管理员</target>
@ -9074,6 +9129,10 @@ Repeat connection request?</source>
<target>同意加密…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="all" xml:space="preserve">
<source>all</source>
<note>member criteria value</note>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>所有成员</target>
@ -9159,6 +9218,10 @@ marked deleted chat item preview text</note>
<target>呼叫中……</target>
<note>call status</note>
</trans-unit>
<trans-unit id="can't send messages" xml:space="preserve">
<source>can't send messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>已取消 %@</target>
@ -9264,6 +9327,14 @@ marked deleted chat item preview text</note>
<target>联系人 %1$@ 已更改为 %2$@</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="contact deleted" xml:space="preserve">
<source>contact deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact disabled" xml:space="preserve">
<source>contact disabled</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact has e2e encryption" xml:space="preserve">
<source>contact has e2e encryption</source>
<target>联系人具有端到端加密</target>
@ -9274,6 +9345,10 @@ marked deleted chat item preview text</note>
<target>联系人没有端到端加密</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="contact not ready" xml:space="preserve">
<source>contact not ready</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>创建者</target>
@ -9445,6 +9520,10 @@ pref value</note>
<target>群组已删除</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group is deleted" xml:space="preserve">
<source>group is deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>群组资料已更新</target>
@ -9570,6 +9649,10 @@ pref value</note>
<target>已连接</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="member has old version" xml:space="preserve">
<source>member has old version</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="message" xml:space="preserve">
<source>message</source>
<target>消息</target>
@ -9634,6 +9717,10 @@ pref value</note>
<target>无文本</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="not synchronized" xml:space="preserve">
<source>not synchronized</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
<source>observer</source>
<target>观察者</target>
@ -9644,6 +9731,7 @@ pref value</note>
<target>关闭</target>
<note>enabled status
group pref value
member criteria value
time to disappear</note>
</trans-unit>
<trans-unit id="offered %@" xml:space="preserve">
@ -9694,6 +9782,10 @@ time to disappear</note>
<source>pending approval</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="pending review" xml:space="preserve">
<source>pending review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>抗量子端到端加密</target>
@ -9733,6 +9825,10 @@ time to disappear</note>
<target>删除了联系地址</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed from group" xml:space="preserve">
<source>removed from group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>删除了资料图片</target>
@ -9743,10 +9839,22 @@ time to disappear</note>
<target>已将您移除</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="request to join rejected" xml:space="preserve">
<source>request to join rejected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="review" xml:space="preserve">
<source>review</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="reviewed by admins" xml:space="preserve">
<source>reviewed by admins</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>已保存</target>
@ -9936,6 +10044,10 @@ last received msg: %2$@</source>
<target>您</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you accepted this member" xml:space="preserve">
<source>you accepted this member</source>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
<source>you are invited to group</source>
<target>您被邀请加入群组</target>

View file

@ -4783,7 +4783,7 @@ Available in v5.1</source>
</trans-unit>
<trans-unit id="Migrations:" xml:space="preserve" approved="no">
<source>Migrations:</source>
<target state="translated">遷移:%@</target>
<target state="translated">遷移:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve" approved="no">

View file

@ -1,6 +1,9 @@
/* notification body */
"%d new events" = "%d nieuwe gebeurtenissen";
/* notification body */
"From %d chat(s)" = "Van %d chat(s)";
/* notification body */
"From: %@" = "Van: %@";

View file

@ -1,6 +1,9 @@
/* notification body */
"%d new events" = "%d новых сообщений";
/* notification body */
"From %d chat(s)" = "Из %d чатов";
/* notification body */
"From: %@" = "От: %@";

View file

@ -67,6 +67,7 @@ func apiSendMessages(
: SEChatCommand.apiSendMessages(
type: chatInfo.chatType,
id: chatInfo.apiId,
scope: chatInfo.groupChatScope(),
live: false,
ttl: nil,
composedMessages: composedMessages
@ -123,7 +124,7 @@ enum SEChatCommand: ChatCmdProtocol {
case apiSetEncryptLocalFiles(enable: Bool)
case apiGetChats(userId: Int64)
case apiCreateChatItems(noteFolderId: Int64, composedMessages: [ComposedMessage])
case apiSendMessages(type: ChatType, id: Int64, live: Bool, ttl: Int?, composedMessages: [ComposedMessage])
case apiSendMessages(type: ChatType, id: Int64, scope: GroupChatScope?, live: Bool, ttl: Int?, composedMessages: [ComposedMessage])
var cmdString: String {
switch self {
@ -139,15 +140,27 @@ enum SEChatCommand: ChatCmdProtocol {
case let .apiCreateChatItems(noteFolderId, composedMessages):
let msgs = encodeJSON(composedMessages)
return "/_create *\(noteFolderId) json \(msgs)"
case let .apiSendMessages(type, id, live, ttl, composedMessages):
case let .apiSendMessages(type, id, scope, live, ttl, composedMessages):
let msgs = encodeJSON(composedMessages)
let ttlStr = ttl != nil ? "\(ttl!)" : "default"
return "/_send \(ref(type, id)) live=\(onOff(live)) ttl=\(ttlStr) json \(msgs)"
return "/_send \(ref(type, id, scope: scope)) live=\(onOff(live)) ttl=\(ttlStr) json \(msgs)"
}
}
func ref(_ type: ChatType, _ id: Int64) -> String {
"\(type.rawValue)\(id)"
func ref(_ type: ChatType, _ id: Int64, scope: GroupChatScope?) -> String {
"\(type.rawValue)\(id)\(scopeRef(scope: scope))"
}
func scopeRef(scope: GroupChatScope?) -> String {
switch (scope) {
case .none: ""
case let .memberSupport(groupMemberId_):
if let groupMemberId = groupMemberId_ {
"(_support:\(groupMemberId))"
} else {
"(_support)"
}
}
}
}

View file

@ -168,14 +168,19 @@
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 */; };
64A779F62DBFB9F200FDEF2F /* MemberAdmissionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A779F52DBFB9F200FDEF2F /* MemberAdmissionView.swift */; };
64A779F82DBFDBF200FDEF2F /* MemberSupportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A779F72DBFDBF200FDEF2F /* MemberSupportView.swift */; };
64A779FC2DC1040000FDEF2F /* SecondaryChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A779FB2DC1040000FDEF2F /* SecondaryChatView.swift */; };
64A779FE2DC3AFF200FDEF2F /* MemberSupportChatToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A779FD2DC3AFF200FDEF2F /* MemberSupportChatToolbar.swift */; };
64A77A022DC4AD6100FDEF2F /* ContextPendingMemberActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A77A012DC4AD6100FDEF2F /* ContextPendingMemberActionsView.swift */; };
64AA1C6927EE10C800AC7277 /* ContextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6827EE10C800AC7277 /* ContextItemView.swift */; };
64AA1C6C27F3537400AC7277 /* DeletedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */; };
64C06EB52A0A4A7C00792D4D /* ChatItemInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */; };
64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; };
64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; };
64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; };
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss-ghc9.6.3.a */; };
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss.a */; };
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W-ghc9.6.3.a */; };
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W.a */; };
64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; };
64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; };
64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; };
@ -527,14 +532,19 @@
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>"; };
64A779F52DBFB9F200FDEF2F /* MemberAdmissionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberAdmissionView.swift; sourceTree = "<group>"; };
64A779F72DBFDBF200FDEF2F /* MemberSupportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberSupportView.swift; sourceTree = "<group>"; };
64A779FB2DC1040000FDEF2F /* SecondaryChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondaryChatView.swift; sourceTree = "<group>"; };
64A779FD2DC3AFF200FDEF2F /* MemberSupportChatToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberSupportChatToolbar.swift; sourceTree = "<group>"; };
64A77A012DC4AD6100FDEF2F /* ContextPendingMemberActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextPendingMemberActionsView.swift; sourceTree = "<group>"; };
64AA1C6827EE10C800AC7277 /* ContextItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextItemView.swift; sourceTree = "<group>"; };
64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedItemView.swift; sourceTree = "<group>"; };
64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemInfoView.swift; sourceTree = "<group>"; };
64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = "<group>"; };
64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss-ghc9.6.3.a"; sourceTree = "<group>"; };
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss.a"; sourceTree = "<group>"; };
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W-ghc9.6.3.a"; sourceTree = "<group>"; };
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W.a"; sourceTree = "<group>"; };
64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = "<group>"; };
64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = "<group>"; };
@ -692,8 +702,8 @@
64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */,
64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */,
64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */,
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss-ghc9.6.3.a in Frameworks */,
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss.a in Frameworks */,
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W-ghc9.6.3.a in Frameworks */,
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W.a in Frameworks */,
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -778,8 +788,8 @@
64C829992D54AEEE006B9E89 /* libffi.a */,
64C829982D54AEED006B9E89 /* libgmp.a */,
64C8299C2D54AEEE006B9E89 /* libgmpxx.a */,
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss-ghc9.6.3.a */,
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.3.6.0-64eNxtIoLF9BaOhAoPagss.a */,
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W-ghc9.6.3.a */,
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.4-LLcXQT7lD7m57CUQwpBZ6W.a */,
);
path = Libraries;
sourceTree = "<group>";
@ -1076,6 +1086,7 @@
644EFFDD292BCD9D00525D5B /* ComposeVoiceView.swift */,
D72A9087294BD7A70047C86D /* NativeTextEditor.swift */,
6419EC552AB8BC8B004A607A /* ContextInvitingContactMemberView.swift */,
64A77A012DC4AD6100FDEF2F /* ContextPendingMemberActionsView.swift */,
);
path = ComposeMessage;
sourceTree = "<group>";
@ -1117,6 +1128,10 @@
6448BBB528FA9D56000D2AB9 /* GroupLinkView.swift */,
1841516F0CE5992B0EDFB377 /* GroupWelcomeView.swift */,
B70CE9E52D4BE5930080F36D /* GroupMentions.swift */,
64A779F52DBFB9F200FDEF2F /* MemberAdmissionView.swift */,
64A779F72DBFDBF200FDEF2F /* MemberSupportView.swift */,
64A779FB2DC1040000FDEF2F /* SecondaryChatView.swift */,
64A779FD2DC3AFF200FDEF2F /* MemberSupportChatToolbar.swift */,
);
path = Group;
sourceTree = "<group>";
@ -1431,8 +1446,10 @@
640417CE2B29B8C200CCB412 /* NewChatView.swift in Sources */,
6440CA03288AECA70062C672 /* AddGroupMembersView.swift in Sources */,
640743612CD360E600158442 /* ChooseServerOperators.swift in Sources */,
64A779FE2DC3AFF200FDEF2F /* MemberSupportChatToolbar.swift in Sources */,
5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */,
5C55A923283CEDE600C4E99E /* SoundPlayer.swift in Sources */,
64A779F82DBFDBF200FDEF2F /* MemberSupportView.swift in Sources */,
5C93292F29239A170090FFF9 /* ProtocolServersView.swift in Sources */,
5CB924D727A8563F00ACCCDD /* SettingsView.swift in Sources */,
B79ADAFF2CE4EF930083DFFD /* AddressCreationCard.swift in Sources */,
@ -1467,6 +1484,7 @@
5CB634AF29E4BB7D0066AD6B /* SetAppPasscodeView.swift in Sources */,
5C10D88828EED12E00E58BF0 /* ContactConnectionInfo.swift in Sources */,
5CBE6C12294487F7002D9531 /* VerifyCodeView.swift in Sources */,
64A779FC2DC1040000FDEF2F /* SecondaryChatView.swift in Sources */,
3CDBCF4227FAE51000354CDD /* ComposeLinkView.swift in Sources */,
648679AB2BC96A74006456E7 /* ChatItemForwardingView.swift in Sources */,
3CDBCF4827FF621E00354CDD /* CILinkView.swift in Sources */,
@ -1509,6 +1527,7 @@
5CB346E72868D76D001FD2EF /* NotificationsView.swift in Sources */,
647F090E288EA27B00644C40 /* GroupMemberInfoView.swift in Sources */,
646BB38E283FDB6D001CE359 /* LocalAuthenticationUtils.swift in Sources */,
64A77A022DC4AD6100FDEF2F /* ContextPendingMemberActionsView.swift in Sources */,
8C74C3EA2C1B90AF00039E77 /* ThemeManager.swift in Sources */,
5C7505A227B65FDB00BE3227 /* CIMetaView.swift in Sources */,
5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */,
@ -1587,6 +1606,7 @@
1841560FD1CD447955474C1D /* UserProfilesView.swift in Sources */,
64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */,
8CC4ED902BD7B8530078AEE8 /* CallAudioDeviceManager.swift in Sources */,
64A779F62DBFB9F200FDEF2F /* MemberAdmissionView.swift in Sources */,
18415C6C56DBCEC2CBBD2F11 /* WebRTCClient.swift in Sources */,
8CB15EA02CFDA30600C28209 /* ChatItemsMerger.swift in Sources */,
184152CEF68D2336FC2EBCB0 /* CallViewRenderers.swift in Sources */,
@ -1971,7 +1991,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@ -1996,7 +2016,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES_THIN;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
OTHER_LDFLAGS = "-Wl,-stack_size,0x1000000";
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
@ -2021,7 +2041,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@ -2046,7 +2066,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
OTHER_LDFLAGS = "-Wl,-stack_size,0x1000000";
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
@ -2063,11 +2083,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@ -2083,11 +2103,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@ -2108,7 +2128,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@ -2123,7 +2143,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -2145,7 +2165,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@ -2160,7 +2180,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -2182,7 +2202,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@ -2208,7 +2228,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@ -2233,7 +2253,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@ -2259,7 +2279,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@ -2284,7 +2304,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@ -2299,7 +2319,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@ -2318,7 +2338,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 282;
CURRENT_PROJECT_VERSION = 283;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@ -2333,7 +2353,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 6.3.6;
MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;

View file

@ -15,6 +15,9 @@ public let CREATE_MEMBER_CONTACT_VERSION = 2
// version to receive reports (MCReport)
public let REPORTS_VERSION = 12
// support group knocking (MsgScope)
public let GROUP_KNOCKING_VERSION = 15
public let contentModerationPostLink = URL(string: "https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#preventing-server-abuse-without-compromising-e2e-encryption")!
public struct User: Identifiable, Decodable, UserLike, NamedChat, Hashable {
@ -1197,7 +1200,7 @@ public enum GroupFeatureEnabled: String, Codable, Identifiable, Hashable {
public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
case direct(contact: Contact)
case group(groupInfo: GroupInfo)
case group(groupInfo: GroupInfo, groupChatScope: GroupChatScopeInfo?)
case local(noteFolder: NoteFolder)
case contactRequest(contactRequest: UserContactRequest)
case contactConnection(contactConnection: PendingContactConnection)
@ -1211,7 +1214,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.localDisplayName
case let .group(groupInfo): return groupInfo.localDisplayName
case let .group(groupInfo, _): return groupInfo.localDisplayName
case .local: return ""
case let .contactRequest(contactRequest): return contactRequest.localDisplayName
case let .contactConnection(contactConnection): return contactConnection.localDisplayName
@ -1224,7 +1227,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.displayName
case let .group(groupInfo): return groupInfo.displayName
case let .group(groupInfo, _): return groupInfo.displayName
case .local: return ChatInfo.privateNotesChatName
case let .contactRequest(contactRequest): return contactRequest.displayName
case let .contactConnection(contactConnection): return contactConnection.displayName
@ -1237,7 +1240,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.fullName
case let .group(groupInfo): return groupInfo.fullName
case let .group(groupInfo, _): return groupInfo.fullName
case .local: return ""
case let .contactRequest(contactRequest): return contactRequest.fullName
case let .contactConnection(contactConnection): return contactConnection.fullName
@ -1250,7 +1253,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.image
case let .group(groupInfo): return groupInfo.image
case let .group(groupInfo, _): return groupInfo.image
case .local: return nil
case let .contactRequest(contactRequest): return contactRequest.image
case let .contactConnection(contactConnection): return contactConnection.image
@ -1263,7 +1266,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.localAlias
case let .group(groupInfo): return groupInfo.localAlias
case let .group(groupInfo, _): return groupInfo.localAlias
case .local: return ""
case let .contactRequest(contactRequest): return contactRequest.localAlias
case let .contactConnection(contactConnection): return contactConnection.localAlias
@ -1276,7 +1279,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.id
case let .group(groupInfo): return groupInfo.id
case let .group(groupInfo, _): return groupInfo.id
case let .local(noteFolder): return noteFolder.id
case let .contactRequest(contactRequest): return contactRequest.id
case let .contactConnection(contactConnection): return contactConnection.id
@ -1302,7 +1305,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.apiId
case let .group(groupInfo): return groupInfo.apiId
case let .group(groupInfo, _): return groupInfo.apiId
case let .local(noteFolder): return noteFolder.apiId
case let .contactRequest(contactRequest): return contactRequest.apiId
case let .contactConnection(contactConnection): return contactConnection.apiId
@ -1315,7 +1318,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
get {
switch self {
case let .direct(contact): return contact.ready
case let .group(groupInfo): return groupInfo.ready
case let .group(groupInfo, _): return groupInfo.ready
case let .local(noteFolder): return noteFolder.ready
case let .contactRequest(contactRequest): return contactRequest.ready
case let .contactConnection(contactConnection): return contactConnection.ready
@ -1336,34 +1339,57 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? {
get {
switch self {
case let .direct(contact): return contact.userCantSendReason
case let .group(groupInfo): return groupInfo.userCantSendReason
case let .local(noteFolder): return noteFolder.userCantSendReason
case let .contactRequest(contactRequest): return contactRequest.userCantSendReason
case let .contactConnection(contactConnection): return contactConnection.userCantSendReason
case .invalidJSON: return ("can't send messages", nil)
case let .direct(contact):
// TODO [short links] this will have additional statuses for pending contact requests before they are accepted
if contact.nextSendGrpInv { return nil }
if !contact.active { return ("contact deleted", nil) }
if !contact.sndReady { return ("contact not ready", nil) }
if contact.activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false { return ("not synchronized", nil) }
if contact.activeConn?.connDisabled ?? true { return ("contact disabled", nil) }
return nil
case let .group(groupInfo, groupChatScope):
if groupInfo.membership.memberActive {
switch(groupChatScope) {
case .none:
if groupInfo.membership.memberPending { return ("reviewed by admins", "Please contact group admin.") }
if groupInfo.membership.memberRole == .observer { return ("you are observer", "Please contact group admin.") }
return nil
case let .some(.memberSupport(groupMember_: .some(supportMember))):
if supportMember.versionRange.maxVersion < GROUP_KNOCKING_VERSION && !supportMember.memberPending {
return ("member has old version", nil)
}
return nil
case .some(.memberSupport(groupMember_: .none)):
return nil
}
} else {
switch groupInfo.membership.memberStatus {
case .memRejected: return ("request to join rejected", nil)
case .memGroupDeleted: return ("group is deleted", nil)
case .memRemoved: return ("removed from group", nil)
case .memLeft: return ("you left", nil)
default: return ("can't send messages", nil)
}
}
case .local:
return nil
case .contactRequest:
return ("can't send messages", nil)
case .contactConnection:
return ("can't send messages", nil)
case .invalidJSON:
return ("can't send messages", nil)
}
}
}
public var sendMsgEnabled: Bool {
get {
switch self {
case let .direct(contact): return contact.sendMsgEnabled
case let .group(groupInfo): return groupInfo.sendMsgEnabled
case let .local(noteFolder): return noteFolder.sendMsgEnabled
case let .contactRequest(contactRequest): return contactRequest.sendMsgEnabled
case let .contactConnection(contactConnection): return contactConnection.sendMsgEnabled
case .invalidJSON: return false
}
}
}
public var sendMsgEnabled: Bool { userCantSendReason == nil }
public var incognito: Bool {
get {
switch self {
case let .direct(contact): return contact.contactConnIncognito
case let .group(groupInfo): return groupInfo.membership.memberIncognito
case let .group(groupInfo, _): return groupInfo.membership.memberIncognito
case .local: return false
case .contactRequest: return false
case let .contactConnection(contactConnection): return contactConnection.incognito
@ -1388,7 +1414,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
public var groupInfo: GroupInfo? {
switch self {
case let .group(groupInfo): return groupInfo
case let .group(groupInfo, _): return groupInfo
default: return nil
}
}
@ -1405,7 +1431,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
case .voice: return cups.voice.enabled.forUser
case .calls: return cups.calls.enabled.forUser
}
case let .group(groupInfo):
case let .group(groupInfo, _):
let prefs = groupInfo.fullGroupPreferences
switch feature {
case .timedMessages: return prefs.timedMessages.on
@ -1428,7 +1454,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
case let .direct(contact):
let pref = contact.mergedPreferences.timedMessages
return pref.enabled.forUser ? pref.userPreference.preference.ttl : nil
case let .group(groupInfo):
case let .group(groupInfo, _):
let pref = groupInfo.fullGroupPreferences.timedMessages
return pref.on ? pref.ttl : nil
default:
@ -1453,7 +1479,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
} else {
return .other
}
case let .group(groupInfo):
case let .group(groupInfo, _):
if !groupInfo.fullGroupPreferences.voice.on(for: groupInfo.membership) {
return .groupOwnerCan
} else {
@ -1484,7 +1510,14 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
return .other
}
}
public func groupChatScope() -> GroupChatScope? {
switch self {
case let .group(_, groupChatScope): groupChatScope?.toChatScope()
default: nil
}
}
public func ntfsEnabled(chatItem: ChatItem) -> Bool {
ntfsEnabled(chatItem.meta.userMention)
}
@ -1500,7 +1533,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
public var chatSettings: ChatSettings? {
switch self {
case let .direct(contact): return contact.chatSettings
case let .group(groupInfo): return groupInfo.chatSettings
case let .group(groupInfo, _): return groupInfo.chatSettings
default: return nil
}
}
@ -1516,7 +1549,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
public var chatTags: [Int64]? {
switch self {
case let .direct(contact): return contact.chatTags
case let .group(groupInfo): return groupInfo.chatTags
case let .group(groupInfo, _): return groupInfo.chatTags
default: return nil
}
}
@ -1524,7 +1557,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
var createdAt: Date {
switch self {
case let .direct(contact): return contact.createdAt
case let .group(groupInfo): return groupInfo.createdAt
case let .group(groupInfo, _): return groupInfo.createdAt
case let .local(noteFolder): return noteFolder.createdAt
case let .contactRequest(contactRequest): return contactRequest.createdAt
case let .contactConnection(contactConnection): return contactConnection.createdAt
@ -1535,7 +1568,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
public var updatedAt: Date {
switch self {
case let .direct(contact): return contact.updatedAt
case let .group(groupInfo): return groupInfo.updatedAt
case let .group(groupInfo, _): return groupInfo.updatedAt
case let .local(noteFolder): return noteFolder.updatedAt
case let .contactRequest(contactRequest): return contactRequest.updatedAt
case let .contactConnection(contactConnection): return contactConnection.updatedAt
@ -1546,7 +1579,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
public var chatTs: Date {
switch self {
case let .direct(contact): return contact.chatTs ?? contact.updatedAt
case let .group(groupInfo): return groupInfo.chatTs ?? groupInfo.updatedAt
case let .group(groupInfo, _): return groupInfo.chatTs ?? groupInfo.updatedAt
case let .local(noteFolder): return noteFolder.chatTs
case let .contactRequest(contactRequest): return contactRequest.updatedAt
case let .contactConnection(contactConnection): return contactConnection.updatedAt
@ -1562,7 +1595,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
} else {
ChatTTL.userDefault(globalTTL)
}
case let .group(groupInfo):
case let .group(groupInfo, _):
return if let ciTTL = groupInfo.chatItemTTL {
ChatTTL.chat(ChatItemTTL(ciTTL))
} else {
@ -1582,7 +1615,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
public static var sampleData: ChatInfo.SampleData = SampleData(
direct: ChatInfo.direct(contact: Contact.sampleData),
group: ChatInfo.group(groupInfo: GroupInfo.sampleData),
group: ChatInfo.group(groupInfo: GroupInfo.sampleData, groupChatScope: nil),
local: ChatInfo.local(noteFolder: NoteFolder.sampleData),
contactRequest: ChatInfo.contactRequest(contactRequest: UserContactRequest.sampleData),
contactConnection: ChatInfo.contactConnection(contactConnection: PendingContactConnection.getSampleData())
@ -1612,7 +1645,13 @@ public struct ChatData: Decodable, Identifiable, Hashable, ChatLike {
}
public struct ChatStats: Decodable, Hashable {
public init(unreadCount: Int = 0, unreadMentions: Int = 0, reportsCount: Int = 0, minUnreadItemId: Int64 = 0, unreadChat: Bool = false) {
public init(
unreadCount: Int = 0,
unreadMentions: Int = 0,
reportsCount: Int = 0,
minUnreadItemId: Int64 = 0,
unreadChat: Bool = false
) {
self.unreadCount = unreadCount
self.unreadMentions = unreadMentions
self.reportsCount = reportsCount
@ -1629,6 +1668,32 @@ public struct ChatStats: Decodable, Hashable {
public var unreadChat: Bool = false
}
public enum GroupChatScope: Decodable {
case memberSupport(groupMemberId_: Int64?)
}
public func sameChatScope(_ scope1: GroupChatScope, _ scope2: GroupChatScope) -> Bool {
switch (scope1, scope2) {
case let (.memberSupport(groupMemberId1_), .memberSupport(groupMemberId2_)):
return groupMemberId1_ == groupMemberId2_
}
}
public enum GroupChatScopeInfo: Decodable, Hashable {
case memberSupport(groupMember_: GroupMember?)
public func toChatScope() -> GroupChatScope {
switch self {
case let .memberSupport(groupMember_):
if let groupMember = groupMember_ {
return .memberSupport(groupMemberId_: groupMember.groupMemberId)
} else {
return .memberSupport(groupMemberId_: nil)
}
}
}
}
public struct Contact: Identifiable, Decodable, NamedChat, Hashable {
public var contactId: Int64
var localDisplayName: ContactName
@ -1655,16 +1720,6 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable {
public var ready: Bool { get { activeConn?.connStatus == .ready } }
public var sndReady: Bool { get { ready || activeConn?.connStatus == .sndReady } }
public var active: Bool { get { contactStatus == .active } }
public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? {
// TODO [short links] this will have additional statuses for pending contact requests before they are accepted
if nextSendGrpInv { return nil }
if !active { return ("contact deleted", nil) }
if !sndReady { return ("contact not ready", nil) }
if activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false { return ("not synchronized", nil) }
if activeConn?.connDisabled ?? true { return ("contact disabled", nil) }
return nil
}
public var sendMsgEnabled: Bool { userCantSendReason == nil }
public var nextSendGrpInv: Bool { get { contactGroupMemberId != nil && !contactGrpInvSent } }
public var displayName: String { localAlias == "" ? profile.displayName : localAlias }
public var fullName: String { get { profile.fullName } }
@ -1843,8 +1898,6 @@ public struct UserContactRequest: Decodable, NamedChat, Hashable {
public var id: ChatId { get { "<@\(contactRequestId)" } }
public var apiId: Int64 { get { contactRequestId } }
var ready: Bool { get { true } }
public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { ("can't send messages", nil) }
public var sendMsgEnabled: Bool { get { false } }
public var displayName: String { get { profile.displayName } }
public var fullName: String { get { profile.fullName } }
public var image: String? { get { profile.image } }
@ -1876,8 +1929,6 @@ public struct PendingContactConnection: Decodable, NamedChat, Hashable {
public var id: ChatId { get { ":\(pccConnId)" } }
public var apiId: Int64 { get { pccConnId } }
var ready: Bool { get { false } }
public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { ("can't send messages", nil) }
public var sendMsgEnabled: Bool { get { false } }
var localDisplayName: String {
get { String.localizedStringWithFormat(NSLocalizedString("connection:%@", comment: "connection information"), pccConnId) }
}
@ -2002,24 +2053,11 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat, Hashable {
var updatedAt: Date
var chatTs: Date?
public var uiThemes: ThemeModeOverrides?
public var membersRequireAttention: Int
public var id: ChatId { get { "#\(groupId)" } }
public var apiId: Int64 { get { groupId } }
public var ready: Bool { get { true } }
public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? {
return if membership.memberActive {
membership.memberRole == .observer ? ("you are observer", "Please contact group admin.") : nil
} else {
switch membership.memberStatus {
case .memRejected: ("request to join rejected", nil)
case .memGroupDeleted: ("group is deleted", nil)
case .memRemoved: ("removed from group", nil)
case .memLeft: ("you left", nil)
default: ("can't send messages", nil)
}
}
}
public var sendMsgEnabled: Bool { userCantSendReason == nil }
public var displayName: String { localAlias == "" ? groupProfile.displayName : localAlias }
public var fullName: String { get { groupProfile.fullName } }
public var image: String? { get { groupProfile.image } }
@ -2032,13 +2070,17 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat, Hashable {
}
public var canDelete: Bool {
return membership.memberRole == .owner || !membership.memberCurrent
return membership.memberRole == .owner || !membership.memberCurrentOrPending
}
public var canAddMembers: Bool {
return membership.memberRole >= .admin && membership.memberActive
}
public var canModerate: Bool {
return membership.memberRole >= .moderator && membership.memberActive
}
public static let sampleData = GroupInfo(
groupId: 1,
localDisplayName: "team",
@ -2048,6 +2090,7 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat, Hashable {
chatSettings: ChatSettings.defaults,
createdAt: .now,
updatedAt: .now,
membersRequireAttention: 0,
chatTags: [],
localAlias: ""
)
@ -2059,12 +2102,20 @@ public struct GroupRef: Decodable, Hashable {
}
public struct GroupProfile: Codable, NamedChat, Hashable {
public init(displayName: String, fullName: String, description: String? = nil, image: String? = nil, groupPreferences: GroupPreferences? = nil) {
public init(
displayName: String,
fullName: String,
description: String? = nil,
image: String? = nil,
groupPreferences: GroupPreferences? = nil,
memberAdmission: GroupMemberAdmission? = nil
) {
self.displayName = displayName
self.fullName = fullName
self.description = description
self.image = image
self.groupPreferences = groupPreferences
self.memberAdmission = memberAdmission
}
public var displayName: String
@ -2072,14 +2123,48 @@ public struct GroupProfile: Codable, NamedChat, Hashable {
public var description: String?
public var image: String?
public var groupPreferences: GroupPreferences?
public var memberAdmission: GroupMemberAdmission?
public var localAlias: String { "" }
public var memberAdmission_: GroupMemberAdmission {
get { self.memberAdmission ?? GroupMemberAdmission() }
set { memberAdmission = newValue }
}
public static let sampleData = GroupProfile(
displayName: "team",
fullName: "My Team"
)
}
public struct GroupMemberAdmission: Codable, Hashable {
public var review: MemberCriteria?
public init(
review: MemberCriteria? = nil
) {
self.review = review
}
public static let sampleData = GroupMemberAdmission(
review: .all
)
}
public enum MemberCriteria: String, Codable, Identifiable, Hashable {
case all
public static var values: [MemberCriteria] { [.all] }
public var id: Self { self }
public var text: String {
switch self {
case .all: return NSLocalizedString("all", comment: "member criteria value")
}
}
}
public struct BusinessChatInfo: Decodable, Hashable {
public var chatType: BusinessChatType
public var businessId: String
@ -2106,6 +2191,7 @@ public struct GroupMember: Identifiable, Decodable, Hashable {
public var memberContactId: Int64?
public var memberContactProfileId: Int64
public var activeConn: Connection?
public var supportChat: GroupSupportChat?
public var memberChatVRange: VersionRange
public var id: String { "#\(groupId) @\(groupMemberId)" }
@ -2177,6 +2263,7 @@ public struct GroupMember: Identifiable, Decodable, Hashable {
case .memUnknown: return false
case .memInvited: return false
case .memPendingApproval: return true
case .memPendingReview: return true
case .memIntroduced: return false
case .memIntroInvited: return false
case .memAccepted: return false
@ -2196,6 +2283,7 @@ public struct GroupMember: Identifiable, Decodable, Hashable {
case .memUnknown: return false
case .memInvited: return false
case .memPendingApproval: return false
case .memPendingReview: return false
case .memIntroduced: return true
case .memIntroInvited: return true
case .memAccepted: return true
@ -2206,6 +2294,18 @@ public struct GroupMember: Identifiable, Decodable, Hashable {
}
}
public var memberPending: Bool {
switch memberStatus {
case .memPendingApproval: return true
case .memPendingReview: return true
default: return false
}
}
public var memberCurrentOrPending: Bool {
memberCurrent || memberPending
}
public func canBeRemoved(groupInfo: GroupInfo) -> Bool {
let userRole = groupInfo.membership.memberRole
return memberStatus != .memRemoved && memberStatus != .memLeft
@ -2259,6 +2359,13 @@ public struct GroupMember: Identifiable, Decodable, Hashable {
)
}
public struct GroupSupportChat: Codable, Hashable {
public var chatTs: Date
public var unread: Int
public var memberAttention: Int
public var mentions: Int
}
public struct GroupMemberSettings: Codable, Hashable {
public var showMessages: Bool
}
@ -2328,6 +2435,7 @@ public enum GroupMemberStatus: String, Decodable, Hashable {
case memUnknown = "unknown"
case memInvited = "invited"
case memPendingApproval = "pending_approval"
case memPendingReview = "pending_review"
case memIntroduced = "introduced"
case memIntroInvited = "intro-inv"
case memAccepted = "accepted"
@ -2345,6 +2453,7 @@ public enum GroupMemberStatus: String, Decodable, Hashable {
case .memUnknown: return "unknown status"
case .memInvited: return "invited"
case .memPendingApproval: return "pending approval"
case .memPendingReview: return "pending review"
case .memIntroduced: return "connecting (introduced)"
case .memIntroInvited: return "connecting (introduction invitation)"
case .memAccepted: return "connecting (accepted)"
@ -2364,6 +2473,7 @@ public enum GroupMemberStatus: String, Decodable, Hashable {
case .memUnknown: return "unknown"
case .memInvited: return "invited"
case .memPendingApproval: return "pending"
case .memPendingReview: return "review"
case .memIntroduced: return "connecting"
case .memIntroInvited: return "connecting"
case .memAccepted: return "connecting"
@ -2386,8 +2496,6 @@ public struct NoteFolder: Identifiable, Decodable, NamedChat, Hashable {
public var id: ChatId { get { "*\(noteFolderId)" } }
public var apiId: Int64 { get { noteFolderId } }
public var ready: Bool { get { true } }
public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { nil }
public var sendMsgEnabled: Bool { get { true } }
public var displayName: String { get { ChatInfo.privateNotesChatName } }
public var fullName: String { get { "" } }
public var image: String? { get { nil } }
@ -2647,12 +2755,15 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
case .userDeleted: nil
case .groupDeleted: nil
case .memberCreatedContact: nil
case .newMemberPendingReview: nil
default: .rcvGroupEvent
}
case let .sndGroupEvent(event):
switch event {
case .userRole: nil
case .userLeft: nil
case .memberAccepted: nil
case .userPendingReview: nil
default: .sndGroupEvent
}
default:
@ -2685,6 +2796,8 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
switch rcvGroupEvent {
case .groupUpdated: return false
case .memberConnected: return false
case .memberAccepted: return false
case .userAccepted: return false
case .memberRole: return false
case .memberBlocked: return false
case .userRole: return true
@ -2696,6 +2809,7 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
case .invitedViaGroupLink: return false
case .memberCreatedContact: return false
case .memberProfileUpdated: return false
case .newMemberPendingReview: return true
}
case .sndGroupEvent: return false
case .rcvConnEvent: return false
@ -2764,12 +2878,12 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
public func memberToModerate(_ chatInfo: ChatInfo) -> (GroupInfo, GroupMember?)? {
switch (chatInfo, chatDir) {
case let (.group(groupInfo), .groupRcv(groupMember)):
case let (.group(groupInfo, _), .groupRcv(groupMember)):
let m = groupInfo.membership
return m.memberRole >= .admin && m.memberRole >= groupMember.memberRole && meta.itemDeleted == nil
? (groupInfo, groupMember)
: nil
case let (.group(groupInfo), .groupSnd):
case let (.group(groupInfo, _), .groupSnd):
let m = groupInfo.membership
return m.memberRole >= .admin ? (groupInfo, nil) : nil
default: return nil
@ -3151,6 +3265,21 @@ public enum CIStatus: Decodable, Hashable {
}
}
// as in corresponds to SENT response from agent, opposed to `sent` which means snd status
public var isSent: Bool {
switch self {
case .sndNew: false
case .sndSent: true
case .sndRcvd: false
case .sndErrorAuth: true
case .sndError: true
case .sndWarning: true
case .rcvNew: false
case .rcvRead: false
case .invalid: false
}
}
public func statusIcon(_ metaColor: Color, _ paleMetaColor: Color, _ primaryColor: Color = .accentColor) -> (Image, Color)? {
switch self {
case .sndNew: nil
@ -3204,6 +3333,17 @@ public enum CIStatus: Decodable, Hashable {
}
}
public func shouldKeepOldSndCIStatus(oldStatus: CIStatus, newStatus: CIStatus) -> Bool {
switch (oldStatus, newStatus) {
case (.sndRcvd, let new) where !new.isSndRcvd:
return true
case (let old, .sndNew) where old.isSent:
return true
default:
return false
}
}
public enum SndError: Decodable, Hashable {
case auth
case quota
@ -4103,6 +4243,16 @@ extension MsgContent: Encodable {
}
}
public enum MsgContentTag: String {
case text
case link
case image
case video
case voice
case file
case report
}
public struct FormattedText: Decodable, Hashable {
public var text: String
public var format: Format?
@ -4440,6 +4590,8 @@ public enum RcvDirectEvent: Decodable, Hashable {
public enum RcvGroupEvent: Decodable, Hashable {
case memberAdded(groupMemberId: Int64, profile: Profile)
case memberConnected
case memberAccepted(groupMemberId: Int64, profile: Profile)
case userAccepted
case memberLeft
case memberRole(groupMemberId: Int64, profile: Profile, role: GroupMemberRole)
case memberBlocked(groupMemberId: Int64, profile: Profile, blocked: Bool)
@ -4451,12 +4603,16 @@ public enum RcvGroupEvent: Decodable, Hashable {
case invitedViaGroupLink
case memberCreatedContact
case memberProfileUpdated(fromProfile: Profile, toProfile: Profile)
case newMemberPendingReview
var text: String {
switch self {
case let .memberAdded(_, profile):
return String.localizedStringWithFormat(NSLocalizedString("invited %@", comment: "rcv group event chat item"), profile.profileViewName)
case .memberConnected: return NSLocalizedString("member connected", comment: "rcv group event chat item")
case let .memberAccepted(_, profile):
return String.localizedStringWithFormat(NSLocalizedString("accepted %@", comment: "rcv group event chat item"), profile.profileViewName)
case .userAccepted: return NSLocalizedString("accepted you", comment: "rcv group event chat item")
case .memberLeft: return NSLocalizedString("left", comment: "rcv group event chat item")
case let .memberRole(_, profile, role):
return String.localizedStringWithFormat(NSLocalizedString("changed role of %@ to %@", comment: "rcv group event chat item"), profile.profileViewName, role.text)
@ -4476,6 +4632,7 @@ public enum RcvGroupEvent: Decodable, Hashable {
case .invitedViaGroupLink: return NSLocalizedString("invited via your group link", comment: "rcv group event chat item")
case .memberCreatedContact: return NSLocalizedString("connected directly", comment: "rcv group event chat item")
case let .memberProfileUpdated(fromProfile, toProfile): return profileUpdatedText(fromProfile, toProfile)
case .newMemberPendingReview: return NSLocalizedString("New member wants to join the group.", comment: "rcv group event chat item")
}
}
@ -4500,6 +4657,8 @@ public enum SndGroupEvent: Decodable, Hashable {
case memberDeleted(groupMemberId: Int64, profile: Profile)
case userLeft
case groupUpdated(groupProfile: GroupProfile)
case memberAccepted(groupMemberId: Int64, profile: Profile)
case userPendingReview
var text: String {
switch self {
@ -4517,6 +4676,9 @@ public enum SndGroupEvent: Decodable, Hashable {
return String.localizedStringWithFormat(NSLocalizedString("you removed %@", comment: "snd group event chat item"), profile.profileViewName)
case .userLeft: return NSLocalizedString("you left", comment: "snd group event chat item")
case .groupUpdated: return NSLocalizedString("group profile updated", comment: "snd group event chat item")
case .memberAccepted: return NSLocalizedString("you accepted this member", comment: "snd group event chat item")
case .userPendingReview:
return NSLocalizedString("Please wait for group moderators to review your request to join the group.", comment: "snd group event chat item")
}
}
}

View file

@ -16,7 +16,7 @@ public protocol ChatLike {
extension ChatLike {
public func groupFeatureEnabled(_ feature: GroupFeature) -> Bool {
if case let .group(groupInfo) = self.chatInfo {
if case let .group(groupInfo, _) = self.chatInfo {
let p = groupInfo.fullGroupPreferences
return switch feature {
case .timedMessages: p.timedMessages.on
@ -82,9 +82,9 @@ public func foundChat(_ chat: ChatLike, _ searchStr: String) -> Bool {
private func canForwardToChat(_ cInfo: ChatInfo) -> Bool {
switch cInfo {
case let .direct(contact): contact.sendMsgEnabled && !contact.nextSendGrpInv
case let .group(groupInfo): groupInfo.sendMsgEnabled
case let .local(noteFolder): noteFolder.sendMsgEnabled
case let .direct(contact): cInfo.sendMsgEnabled && !contact.nextSendGrpInv
case .group: cInfo.sendMsgEnabled
case .local: cInfo.sendMsgEnabled
case .contactRequest: false
case .contactConnection: false
case .invalidJSON: false
@ -94,7 +94,7 @@ private func canForwardToChat(_ cInfo: ChatInfo) -> Bool {
public func chatIconName(_ cInfo: ChatInfo) -> String {
switch cInfo {
case .direct: "person.crop.circle.fill"
case let .group(groupInfo):
case let .group(groupInfo, _):
switch groupInfo.businessChat?.chatType {
case .none: "person.2.circle.fill"
case .business: "briefcase.circle.fill"

View file

@ -62,7 +62,7 @@ public func createContactConnectedNtf(_ user: any UserLike, _ contact: Contact,
public func createMessageReceivedNtf(_ user: any UserLike, _ cInfo: ChatInfo, _ cItem: ChatItem, _ badgeCount: Int) -> UNMutableNotificationContent {
let previewMode = ntfPreviewModeGroupDefault.get()
var title: String
if case let .group(groupInfo) = cInfo, case let .groupRcv(groupMember) = cItem.chatDir {
if case let .group(groupInfo, _) = cInfo, case let .groupRcv(groupMember) = cItem.chatDir {
title = groupMsgNtfTitle(groupInfo, groupMember, hideContent: previewMode == .hidden)
} else {
title = previewMode == .hidden ? contactHidden : "\(cInfo.chatViewName):"

View file

@ -526,10 +526,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Вече сте свързани?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "В процес на свързване!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Вече се присъединихте към групата!";
/* pref value */
@ -795,7 +795,8 @@ marked deleted chat item preview text */
"Can't invite contacts!" = "Не може да поканят контактите!";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Отказ";
/* No comment provided by engineer. */
@ -973,34 +974,28 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Автоматично свъзрване";
/* No comment provided by engineer. */
"Connect incognito" = "Свързване инкогнито";
/* No comment provided by engineer. */
"Connect to desktop" = "Свързване с настолно устройство";
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "свържете се с разработчиците на SimpleX Chat.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Свърване със себе си?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Свърване със себе си?\nТова е вашят еднократен линк за връзка!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Свърване със себе си?\nТова е вашият личен SimpleX адрес!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Свързване чрез адрес за контакт";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Свърване чрез линк";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Свързване чрез еднократен линк за връзка";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Свързване с %@";
/* No comment provided by engineer. */
@ -1144,9 +1139,6 @@ set passcode view */
/* server test step */
"Create queue" = "Създай опашка";
/* No comment provided by engineer. */
"Create secret group" = "Създай тайна група";
/* No comment provided by engineer. */
"Create SimpleX address" = "Създаване на адрес в SimpleX";
@ -1485,7 +1477,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Не активирай";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Не показвай отново";
/* No comment provided by engineer. */
@ -1705,7 +1697,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Грешка при промяна на ролята";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Грешка при промяна на настройката";
/* No comment provided by engineer. */
@ -1729,7 +1721,7 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Грешка при декриптирането на файла";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Грешка при изтриване на базата данни";
/* No comment provided by engineer. */
@ -1738,10 +1730,10 @@ chat item action */
/* No comment provided by engineer. */
"Error deleting connection" = "Грешка при изтриване на връзката";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Грешка при изтриване на базата данни";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Грешка при изтриване на старата база данни";
/* No comment provided by engineer. */
@ -1762,10 +1754,10 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Грешка при криптиране на базата данни";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Грешка при експортиране на базата данни";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Грешка при импортиране на базата данни";
/* No comment provided by engineer. */
@ -1777,7 +1769,7 @@ chat item action */
/* alert title */
"Error receiving file" = "Грешка при получаване на файл";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Грешка при отстраняване на член";
/* No comment provided by engineer. */
@ -2001,7 +1993,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Групата вече съществува";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Групата вече съществува!";
/* No comment provided by engineer. */
@ -2337,22 +2329,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "присъединяване като %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Влез в групата";
/* No comment provided by engineer. */
"Join group conversations" = "Присъединяване към групи";
/* No comment provided by engineer. */
"Join group?" = "Влез в групата?";
/* No comment provided by engineer. */
"Join incognito" = "Влез инкогнито";
/* No comment provided by engineer. */
"Join with current profile" = "Присъединяване с текущия профил";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Влез в твоята група?\nТова е вашят линк за група %@!";
/* No comment provided by engineer. */
@ -2747,6 +2733,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "изключено";
@ -2759,7 +2746,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "предлага %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ок";
/* No comment provided by engineer. */
@ -2834,7 +2823,7 @@ time to disappear */
/* authentication reason */
"Open chat console" = "Отвори конзолата";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Отвори група";
/* authentication reason */
@ -3186,18 +3175,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Предоговори криптирането?";
/* 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" = "Повтори качването";
@ -3776,9 +3759,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Старата база данни не бе премахната по време на миграцията, тя може да бъде изтрита.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Профилът се споделя само с вашите контакти.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Втората отметка, която пропуснахме! ✅";
@ -3827,12 +3807,6 @@ chat item action */
/* No comment provided by engineer. */
"This group no longer exists." = "Тази група вече не съществува.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Това е вашят еднократен линк за връзка!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Това е вашият личен SimpleX адрес!";
/* No comment provided by engineer. */
"This setting applies to messages in your current chat profile **%@**." = "Тази настройка се прилага за съобщения в текущия ви профил **%@**.";
@ -4007,7 +3981,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "Използвай чата";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Използвай текущия профил";
/* No comment provided by engineer. */
@ -4019,7 +3993,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "Използвай интерфейса за повикване на iOS";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Използвай нов инкогнито профил";
/* No comment provided by engineer. */
@ -4220,25 +4194,22 @@ chat item action */
/* No comment provided by engineer. */
"You are already connected to %@." = "Вече сте вече свързани с %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Вече се свързвате с %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Вече се свързвате чрез този еднократен линк за връзка!";
/* No comment provided by engineer. */
"You are already in group %@." = "Вече сте в група %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Вече се присъединявате към групата %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Вие вече се присъединявате към групата чрез този линк!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Вие вече се присъединявате към групата чрез този линк.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Вече се присъединихте към групата!\nИзпрати отново заявката за присъединяване?";
/* No comment provided by engineer. */
@ -4322,10 +4293,7 @@ chat item action */
/* No comment provided by engineer. */
"You decide who can connect." = "Хората могат да се свържат с вас само чрез ликовете, които споделяте.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Вече сте заявили връзка през този адрес!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Вече сте направили заявката за връзка!\nИзпрати отново заявката за свързване?";
/* No comment provided by engineer. */
@ -4382,9 +4350,6 @@ chat item action */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Ще трябва да се идентифицирате, когато стартирате или възобновите приложението след 30 секунди във фонов режим.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Ще се свържете с всички членове на групата.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Все още ще получавате обаждания и известия от заглушени профили, когато са активни.";
@ -4446,10 +4411,10 @@ chat item action */
"Your profile **%@** will be shared." = "Вашият профил **%@** ще бъде споделен.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти. SimpleX сървърите не могат да видят вашия профил.";
"Your profile is stored on your device and only shared with your contacts." = "Профилът се споделя само с вашите контакти.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство.";
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти. SimpleX сървърите не могат да видят вашия профил.";
/* No comment provided by engineer. */
"Your random profile" = "Вашият автоматично генериран профил";

View file

@ -109,12 +109,18 @@
/* No comment provided by engineer. */
"%@ servers" = "%@ servery";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ nahrán";
/* notification title */
"%@ wants to connect!" = "%@ se chce připojit!";
/* format for date separator in chat */
"%@, %@" = "%1$@, %2$@";
/* No comment provided by engineer. */
"%@, %@ and %lld members" = "%@, %@ a %lld členů";
/* No comment provided by engineer. */
"%@, %@ and %lld other members connected" = "%@, %@ a %lld ostatní členové připojeni";
@ -560,7 +566,8 @@ swipe action */
"Can't invite contacts!" = "Nelze pozvat kontakty!";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Zrušit";
/* feature offered item */
@ -702,16 +709,13 @@ set passcode view */
/* server test step */
"Connect" = "Připojit";
/* No comment provided by engineer. */
"Connect incognito" = "Spojit se inkognito";
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "připojit se k vývojářům SimpleX Chat.";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Připojte se prostřednictvím odkazu";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Připojit se jednorázovým odkazem";
/* No comment provided by engineer. */
@ -828,9 +832,6 @@ set passcode view */
/* server test step */
"Create queue" = "Vytvořit frontu";
/* No comment provided by engineer. */
"Create secret group" = "Vytvořit tajnou skupinu";
/* No comment provided by engineer. */
"Create SimpleX address" = "Vytvořit SimpleX adresu";
@ -1127,7 +1128,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Nepovolovat";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Znovu neukazuj";
/* No comment provided by engineer. */
@ -1304,7 +1305,7 @@ swipe action */
/* No comment provided by engineer. */
"Error changing role" = "Chyba při změně role";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Chyba změny nastavení";
/* No comment provided by engineer. */
@ -1325,7 +1326,7 @@ swipe action */
/* No comment provided by engineer. */
"Error decrypting file" = "Chyba dešifrování souboru";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Chyba při mazání databáze chatu";
/* No comment provided by engineer. */
@ -1334,10 +1335,10 @@ swipe action */
/* No comment provided by engineer. */
"Error deleting connection" = "Chyba při mazání připojení";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Chyba při mazání databáze";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Chyba při mazání staré databáze";
/* No comment provided by engineer. */
@ -1355,10 +1356,10 @@ swipe action */
/* No comment provided by engineer. */
"Error encrypting database" = "Chyba šifrování databáze";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Chyba při exportu databáze chatu";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Chyba při importu databáze chatu";
/* No comment provided by engineer. */
@ -1367,7 +1368,7 @@ swipe action */
/* alert title */
"Error receiving file" = "Chyba při příjmu souboru";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Chyba při odebrání člena";
/* No comment provided by engineer. */
@ -1825,7 +1826,7 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "připojit se jako %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Připojit ke skupině";
/* No comment provided by engineer. */
@ -2145,6 +2146,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "vypnuto";
@ -2157,7 +2159,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "nabídl %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ok";
/* No comment provided by engineer. */
@ -2988,9 +2992,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Stará databáze nebyla během přenášení odstraněna, lze ji smazat.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Profil je sdílen pouze s vašimi kontakty.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Druhé zaškrtnutí jsme přehlédli! ✅";
@ -3153,7 +3154,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "Použijte chat";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Použít aktuální profil";
/* No comment provided by engineer. */
@ -3162,7 +3163,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "Použít rozhraní volání iOS";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Použít nový inkognito profil";
/* No comment provided by engineer. */
@ -3472,10 +3473,10 @@ chat item action */
"Your profile **%@** will be shared." = "Váš profil **%@** bude sdílen.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil.";
"Your profile is stored on your device and only shared with your contacts." = "Profil je sdílen pouze s vašimi kontakty.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Váš profil, kontakty a doručené zprávy jsou uloženy ve vašem zařízení.";
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil.";
/* No comment provided by engineer. */
"Your random profile" = "Váš náhodný profil";

View file

@ -345,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Annehmen";
/* alert action */
"Accept as member" = "Als Mitglied übernehmen";
/* alert action */
"Accept as observer" = "Als Beobachter übernehmen";
/* No comment provided by engineer. */
"Accept conditions" = "Nutzungsbedingungen akzeptieren";
@ -358,6 +364,12 @@ swipe action */
swipe action */
"Accept incognito" = "Inkognito akzeptieren";
/* alert title */
"Accept member" = "Mitglied übernehmen";
/* rcv group event chat item */
"accepted %@" = "%@ übernommen";
/* call status */
"accepted call" = "Anruf angenommen";
@ -367,6 +379,9 @@ swipe action */
/* chat list item title */
"accepted invitation" = "Einladung angenommen";
/* rcv group event chat item */
"accepted you" = "hat Sie übernommen";
/* No comment provided by engineer. */
"Acknowledged" = "Bestätigt";
@ -463,6 +478,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "Verschlüsselung zustimmen…";
/* member criteria value */
"all" = "alle";
/* No comment provided by engineer. */
"All" = "Alle";
@ -589,10 +607,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Sind Sie bereits verbunden?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Bereits verbunden!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Sie sind bereits Mitglied der Gruppe!";
/* pref value */
@ -905,8 +923,12 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Can't message member" = "Mitglied kann nicht benachrichtigt werden";
/* No comment provided by engineer. */
"can't send messages" = "Es können keine Nachrichten gesendet werden";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Abbrechen";
/* No comment provided by engineer. */
@ -988,7 +1010,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "Chat besteht bereits";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "Chat besteht bereits!";
/* No comment provided by engineer. */
@ -1042,9 +1064,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "Der Chat wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden!";
/* chat toolbar */
"Chat with admins" = "Chat mit Administratoren";
/* No comment provided by engineer. */
"Chat with member" = "Chat mit einem Mitglied";
/* No comment provided by engineer. */
"Chats" = "Chats";
/* No comment provided by engineer. */
"Chats with members" = "Chats mit Mitgliedern";
/* No comment provided by engineer. */
"Check messages every 20 min." = "Alle 20min Nachrichten überprüfen.";
@ -1186,9 +1217,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Automatisch verbinden";
/* No comment provided by engineer. */
"Connect incognito" = "Inkognito verbinden";
/* No comment provided by engineer. */
"Connect to desktop" = "Mit dem Desktop verbinden";
@ -1198,25 +1226,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Schneller mit Ihren Freunden verbinden.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Mit Ihnen selbst verbinden?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Mit Ihnen selbst verbinden?\nDas ist Ihr eigener Einmal-Link!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Sich mit Ihnen selbst verbinden?\nDas ist Ihre eigene SimpleX-Adresse!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Über die Kontakt-Adresse verbinden";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Über einen Link verbinden";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Über einen Einmal-Link verbinden";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Mit %@ verbinden";
/* No comment provided by engineer. */
@ -1333,9 +1358,15 @@ set passcode view */
/* No comment provided by engineer. */
"Contact already exists" = "Der Kontakt ist bereits vorhanden";
/* No comment provided by engineer. */
"contact deleted" = "Kontakt gelöscht";
/* No comment provided by engineer. */
"Contact deleted!" = "Kontakt gelöscht!";
/* No comment provided by engineer. */
"contact disabled" = "Kontakt deaktiviert";
/* No comment provided by engineer. */
"contact has e2e encryption" = "Kontakt nutzt E2E-Verschlüsselung";
@ -1354,6 +1385,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contact name" = "Kontaktname";
/* No comment provided by engineer. */
"contact not ready" = "Kontakt nicht bereit";
/* No comment provided by engineer. */
"Contact preferences" = "Kontakt-Präferenzen";
@ -1423,9 +1457,6 @@ set passcode view */
/* server test step */
"Create queue" = "Erzeuge Warteschlange";
/* No comment provided by engineer. */
"Create secret group" = "Geheime Gruppe erstellen";
/* No comment provided by engineer. */
"Create SimpleX address" = "SimpleX-Adresse erstellen";
@ -1602,6 +1633,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat profile?" = "Chat-Profil löschen?";
/* alert title */
"Delete chat with member?" = "Chat mit dem Mitglied löschen?";
/* No comment provided by engineer. */
"Delete chat?" = "Chat löschen?";
@ -1872,7 +1906,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Verpassen Sie keine wichtigen Nachrichten.";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Nicht nochmals anzeigen";
/* No comment provided by engineer. */
@ -2116,6 +2150,9 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Fehler beim Annehmen der Kontaktanfrage";
/* alert title */
"Error accepting member" = "Fehler beim Übernehmen des Mitglieds";
/* No comment provided by engineer. */
"Error adding member(s)" = "Fehler beim Hinzufügen von Mitgliedern";
@ -2131,7 +2168,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Fehler beim Ändern der Rolle";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Fehler beim Ändern der Einstellung";
/* No comment provided by engineer. */
@ -2170,19 +2207,22 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Fehler beim Entschlüsseln der Datei";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Fehler beim Löschen der Chat-Datenbank";
/* alert title */
"Error deleting chat with member" = "Fehler beim Löschen des Chats mit dem Mitglied";
/* No comment provided by engineer. */
"Error deleting chat!" = "Fehler beim Löschen des Chats!";
/* No comment provided by engineer. */
"Error deleting connection" = "Fehler beim Löschen der Verbindung";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Fehler beim Löschen der Datenbank";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Fehler beim Löschen der alten Datenbank";
/* No comment provided by engineer. */
@ -2203,13 +2243,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Fehler beim Verschlüsseln der Datenbank";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Fehler beim Exportieren der Chat-Datenbank";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Fehler beim Exportieren des Designs: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Fehler beim Importieren der Chat-Datenbank";
/* No comment provided by engineer. */
@ -2236,7 +2276,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Fehler beim Registrieren für Benachrichtigungen";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Fehler beim Entfernen des Mitglieds";
/* alert title */
@ -2586,7 +2626,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Die Gruppe besteht bereits";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Die Gruppe besteht bereits!";
/* No comment provided by engineer. */
@ -2610,6 +2650,9 @@ snd error text */
/* No comment provided by engineer. */
"Group invitation is no longer valid, it was removed by sender." = "Die Gruppeneinladung ist nicht mehr gültig, da sie vom Absender entfernt wurde.";
/* No comment provided by engineer. */
"group is deleted" = "Gruppe wird gelöscht";
/* No comment provided by engineer. */
"Group link" = "Gruppen-Link";
@ -2982,22 +3025,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "beitreten als %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Treten Sie der Gruppe bei";
/* No comment provided by engineer. */
"Join group conversations" = "Gruppenunterhaltungen beitreten";
/* No comment provided by engineer. */
"Join group?" = "Der Gruppe beitreten?";
/* No comment provided by engineer. */
"Join incognito" = "Inkognito beitreten";
/* No comment provided by engineer. */
"Join with current profile" = "Mit dem aktuellen Profil beitreten";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Ihrer Gruppe beitreten?\nDas ist Ihr Link für die Gruppe %@!";
/* No comment provided by engineer. */
@ -3138,9 +3175,15 @@ snd error text */
/* profile update event chat item */
"member %@ changed to %@" = "Der Mitgliedsname von %1$@ wurde auf %2$@ geändert";
/* No comment provided by engineer. */
"Member admission" = "Aufnahme von Mitgliedern";
/* rcv group event chat item */
"member connected" = "ist der Gruppe beigetreten";
/* No comment provided by engineer. */
"member has old version" = "Das Mitglied hat eine alte App-Version";
/* item status text */
"Member inactive" = "Mitglied inaktiv";
@ -3162,6 +3205,9 @@ snd error text */
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "Das Mitglied wird aus der Gruppe entfernt. Dies kann nicht rückgängig gemacht werden!";
/* alert message */
"Member will join the group, accept member?" = "Ein Mitglied wird der Gruppe beitreten. Übernehmen?";
/* No comment provided by engineer. */
"Members can add message reactions." = "Gruppenmitglieder können eine Reaktion auf Nachrichten geben.";
@ -3432,6 +3478,9 @@ snd error text */
/* No comment provided by engineer. */
"New member role" = "Neue Mitgliedsrolle";
/* rcv group event chat item */
"New member wants to join the group." = "Ein neues Mitglied will der Gruppe beitreten.";
/* notification */
"new message" = "Neue Nachricht";
@ -3471,6 +3520,9 @@ snd error text */
/* No comment provided by engineer. */
"No chats in list %@" = "Keine Chats in der Liste %@";
/* No comment provided by engineer. */
"No chats with members" = "Keine Chats mit Mitgliedern";
/* No comment provided by engineer. */
"No contacts selected" = "Keine Kontakte ausgewählt";
@ -3555,6 +3607,9 @@ snd error text */
/* No comment provided by engineer. */
"Not compatible!" = "Nicht kompatibel!";
/* No comment provided by engineer. */
"not synchronized" = "Nicht synchronisiert";
/* No comment provided by engineer. */
"Notes" = "Anmerkungen";
@ -3587,6 +3642,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "Aus";
@ -3599,7 +3655,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "angeboten %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ok";
/* No comment provided by engineer. */
@ -3692,9 +3750,12 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Nutzungsbedingungen öffnen";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Gruppe öffnen";
/* alert title */
"Open link?" = "Link öffnen?";
/* authentication reason */
"Open migration to another device" = "Migration auf ein anderes Gerät öffnen";
@ -3797,6 +3858,9 @@ time to disappear */
/* No comment provided by engineer. */
"pending approval" = "ausstehende Genehmigung";
/* No comment provided by engineer. */
"pending review" = "Ausstehende Überprüfung";
/* No comment provided by engineer. */
"Periodic" = "Periodisch";
@ -3866,6 +3930,9 @@ time to disappear */
/* token info */
"Please try to disable and re-enable notfications." = "Bitte versuchen Sie, die Benachrichtigungen zu deaktivieren und wieder zu aktivieren.";
/* snd group event chat item */
"Please wait for group moderators to review your request to join the group." = "Bitte warten Sie auf die Überprüfung Ihrer Anfrage durch die Gruppen-Moderatoren, um der Gruppe beitreten zu können.";
/* token info */
"Please wait for token activation to complete." = "Bitte warten Sie, bis die Token-Aktivierung abgeschlossen ist.";
@ -4146,6 +4213,9 @@ swipe action */
/* No comment provided by engineer. */
"Reject contact request" = "Kontaktanfrage ablehnen";
/* alert title */
"Reject member?" = "Mitglied ablehnen?";
/* No comment provided by engineer. */
"rejected" = "abgelehnt";
@ -4185,6 +4255,9 @@ swipe action */
/* profile update event chat item */
"removed contact address" = "Die Kontaktadresse wurde entfernt";
/* No comment provided by engineer. */
"removed from group" = "Von der Gruppe entfernt";
/* profile update event chat item */
"removed profile picture" = "Das Profil-Bild wurde entfernt";
@ -4200,18 +4273,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Verschlüsselung neu aushandeln?";
/* 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";
@ -4233,6 +4300,9 @@ swipe action */
/* No comment provided by engineer. */
"Report reason?" = "Grund der Meldung?";
/* alert title */
"Report sent to moderators" = "Meldung wurde an die Moderatoren gesendet";
/* report reason */
"Report spam: only group moderators will see it." = "Spam melden: Nur Gruppenmoderatoren werden es sehen.";
@ -4248,6 +4318,9 @@ swipe action */
/* No comment provided by engineer. */
"Reports" = "Meldungen";
/* No comment provided by engineer. */
"request to join rejected" = "Beitrittsanfrage abgelehnt";
/* chat list item title */
"requested to connect" = "Zur Verbindung aufgefordert";
@ -4302,9 +4375,21 @@ swipe action */
/* chat item action */
"Reveal" = "Aufdecken";
/* No comment provided by engineer. */
"review" = "Überprüfung";
/* No comment provided by engineer. */
"Review conditions" = "Nutzungsbedingungen einsehen";
/* admission stage */
"Review members" = "Überprüfung der Mitglieder";
/* admission stage description */
"Review members before admitting (\"knocking\")." = "Überprüfung der Mitglieder vor der Aufnahme (\"Anklopfen\").";
/* No comment provided by engineer. */
"reviewed by admins" = "Von Administratoren überprüft";
/* No comment provided by engineer. */
"Revoke" = "Widerrufen";
@ -4333,6 +4418,9 @@ chat item action */
/* alert button */
"Save (and notify contacts)" = "Speichern (und Kontakte benachrichtigen)";
/* alert title */
"Save admission settings?" = "Speichern der Aufnahme-Einstellungen?";
/* alert button */
"Save and notify contact" = "Speichern und Kontakt benachrichtigen";
@ -4669,6 +4757,9 @@ chat item action */
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Anstelle der System-Authentifizierung festlegen.";
/* No comment provided by engineer. */
"Set member admission" = "Aufnahme von Mitgliedern festlegen";
/* No comment provided by engineer. */
"Set message expiration in chats." = "Verfallsdatum von Nachrichten in Chats festlegen.";
@ -5100,9 +5191,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Die alte Datenbank wurde während der Migration nicht entfernt. Sie kann gelöscht werden.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Das Profil wird nur mit Ihren Kontakten geteilt.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Dieselben Nutzungsbedingungen gelten auch für den Betreiber **%@**.";
@ -5172,12 +5260,6 @@ report reason */
/* No comment provided by engineer. */
"This group no longer exists." = "Diese Gruppe existiert nicht mehr.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Das ist Ihr eigener Einmal-Link!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Das ist Ihre eigene SimpleX-Adresse!";
/* No comment provided by engineer. */
"This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." = "Für diesen Link wird eine neuere App-Version benötigt. Bitte aktualisieren Sie die App oder bitten Sie Ihren Kontakt einen kompatiblen Link zu senden.";
@ -5433,7 +5515,7 @@ report reason */
/* No comment provided by engineer. */
"Use chat" = "Verwenden Sie Chat";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Aktuelles Profil nutzen";
/* No comment provided by engineer. */
@ -5451,7 +5533,7 @@ report reason */
/* No comment provided by engineer. */
"Use iOS call interface" = "iOS Anrufschnittstelle nutzen";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Neues Inkognito-Profil nutzen";
/* No comment provided by engineer. */
@ -5712,6 +5794,9 @@ report reason */
/* No comment provided by engineer. */
"You accepted connection" = "Sie haben die Verbindung akzeptiert";
/* snd group event chat item */
"you accepted this member" = "Sie haben dieses Mitglied übernommen";
/* No comment provided by engineer. */
"You allow" = "Sie erlauben";
@ -5724,25 +5809,22 @@ report reason */
/* No comment provided by engineer. */
"You are already connected with %@." = "Sie sind bereits mit %@ verbunden.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Sie sind bereits mit %@ verbunden.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Sie sind bereits über diesen Einmal-Link verbunden!";
/* No comment provided by engineer. */
"You are already in group %@." = "Sie sind bereits Mitglied der Gruppe %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Sie sind bereits Mitglied der Gruppe %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Sie sind über diesen Link bereits Mitglied der Gruppe!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Sie sind über diesen Link bereits Mitglied der Gruppe.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Sie sind bereits Mitglied dieser Gruppe!\nVerbindungsanfrage wiederholen?";
/* No comment provided by engineer. */
@ -5823,6 +5905,9 @@ report reason */
/* alert message */
"You can view invitation link again in connection details." = "Den Einladungslink können Sie in den Details der Verbindung nochmals sehen.";
/* alert message */
"You can view your reports in Chat with admins." = "Sie können Ihre Meldungen im Chat mit den Administratoren sehen.";
/* No comment provided by engineer. */
"You can't send messages!" = "Sie können keine Nachrichten versenden!";
@ -5844,10 +5929,7 @@ report reason */
/* No comment provided by engineer. */
"You decide who can connect." = "Sie entscheiden, wer sich mit Ihnen verbinden kann.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Sie haben über diese Adresse bereits eine Verbindung beantragt!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Sie haben bereits ein Verbindungsanfrage beantragt!\nVerbindungsanfrage wiederholen?";
/* No comment provided by engineer. */
@ -5916,9 +5998,6 @@ report reason */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Sie müssen sich authentifizieren, wenn Sie die im Hintergrund befindliche App nach 30 Sekunden starten oder fortsetzen.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Sie werden mit allen Gruppenmitgliedern verbunden.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Sie können Anrufe und Benachrichtigungen auch von stummgeschalteten Profilen empfangen, solange diese aktiv sind.";
@ -5991,15 +6070,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Ihr Profil **%@** wird geteilt.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt. SimpleX-Server können Ihr Profil nicht einsehen.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ihr Profil wurde geändert. Wenn Sie es speichern, wird das aktualisierte Profil an alle Ihre Kontakte gesendet.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Ihr Profil, Ihre Kontakte und zugestellten Nachrichten werden auf Ihrem Gerät gespeichert.";
/* No comment provided by engineer. */
"Your random profile" = "Ihr Zufallsprofil";

View file

@ -345,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Aceptar";
/* alert action */
"Accept as member" = "Aceptar como miembro";
/* alert action */
"Accept as observer" = "Aceptar como observador";
/* No comment provided by engineer. */
"Accept conditions" = "Aceptar condiciones";
@ -358,6 +364,12 @@ swipe action */
swipe action */
"Accept incognito" = "Aceptar incógnito";
/* alert title */
"Accept member" = "Aceptar miembro";
/* rcv group event chat item */
"accepted %@" = "%@ aceptado";
/* call status */
"accepted call" = "llamada aceptada";
@ -367,6 +379,9 @@ swipe action */
/* chat list item title */
"accepted invitation" = "invitación aceptada";
/* rcv group event chat item */
"accepted you" = "te ha aceptado";
/* No comment provided by engineer. */
"Acknowledged" = "Confirmaciones";
@ -463,6 +478,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "acordando cifrado…";
/* member criteria value */
"all" = "todos";
/* No comment provided by engineer. */
"All" = "Todo";
@ -589,10 +607,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "¿Ya está conectado?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "¡Ya en proceso de conexión!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "¡Ya en proceso de unirte al grupo!";
/* pref value */
@ -905,8 +923,12 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Can't message member" = "No se pueden enviar mensajes al miembro";
/* No comment provided by engineer. */
"can't send messages" = "no se pueden enviar mensajes";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Cancelar";
/* No comment provided by engineer. */
@ -988,7 +1010,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "El chat ya existe";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "¡El chat ya existe!";
/* No comment provided by engineer. */
@ -1042,9 +1064,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "El chat será eliminado para tí. ¡No puede deshacerse!";
/* chat toolbar */
"Chat with admins" = "Chat con administradores";
/* No comment provided by engineer. */
"Chat with member" = "Chat con miembro";
/* No comment provided by engineer. */
"Chats" = "Chats";
/* No comment provided by engineer. */
"Chats with members" = "Chats con miembros";
/* No comment provided by engineer. */
"Check messages every 20 min." = "Comprobar mensajes cada 20 min.";
@ -1186,9 +1217,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Conectar automáticamente";
/* No comment provided by engineer. */
"Connect incognito" = "Conectar incognito";
/* No comment provided by engineer. */
"Connect to desktop" = "Conectar con ordenador";
@ -1198,25 +1226,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Conecta más rápido con tus amigos.";
/* No comment provided by engineer. */
"Connect to yourself?" = "¿Conectarte a tí mismo?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "¿Conectarte a tí mismo?\n¡Este es tu propio enlace de un solo uso!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "¿Conectarte a tí mismo?\n¡Esta es tu propia dirección SimpleX!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Conectar mediante dirección de contacto";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Conectar mediante enlace";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Conectar mediante enlace de un sólo uso";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Conectar con %@";
/* No comment provided by engineer. */
@ -1333,9 +1358,15 @@ set passcode view */
/* No comment provided by engineer. */
"Contact already exists" = "El contácto ya existe";
/* No comment provided by engineer. */
"contact deleted" = "contacto eliminado";
/* No comment provided by engineer. */
"Contact deleted!" = "¡Contacto eliminado!";
/* No comment provided by engineer. */
"contact disabled" = "contacto desactivado";
/* No comment provided by engineer. */
"contact has e2e encryption" = "el contacto dispone de cifrado de extremo a extremo";
@ -1354,6 +1385,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contact name" = "Contacto";
/* No comment provided by engineer. */
"contact not ready" = "el contacto no está listo";
/* No comment provided by engineer. */
"Contact preferences" = "Preferencias de contacto";
@ -1423,9 +1457,6 @@ set passcode view */
/* server test step */
"Create queue" = "Crear cola";
/* No comment provided by engineer. */
"Create secret group" = "Crea grupo secreto";
/* No comment provided by engineer. */
"Create SimpleX address" = "Crear dirección SimpleX";
@ -1602,6 +1633,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat profile?" = "¿Eliminar perfil?";
/* alert title */
"Delete chat with member?" = "¿Eliminar el chat con el miembro?";
/* No comment provided by engineer. */
"Delete chat?" = "¿Eliminar chat?";
@ -1872,7 +1906,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "No pierdas los mensajes importantes.";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "No volver a mostrar";
/* No comment provided by engineer. */
@ -2116,6 +2150,9 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Error al aceptar solicitud del contacto";
/* alert title */
"Error accepting member" = "Error al aceptar el miembro";
/* No comment provided by engineer. */
"Error adding member(s)" = "Error al añadir miembro(s)";
@ -2131,7 +2168,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Error al cambiar rol";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Error cambiando configuración";
/* No comment provided by engineer. */
@ -2170,19 +2207,22 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Error al descifrar el archivo";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Error al eliminar base de datos";
/* alert title */
"Error deleting chat with member" = "Error al eliminar el chat con el miembro";
/* No comment provided by engineer. */
"Error deleting chat!" = "¡Error al eliminar chat!";
/* No comment provided by engineer. */
"Error deleting connection" = "Error al eliminar conexión";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Error al eliminar base de datos";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Error al eliminar base de datos antigua";
/* No comment provided by engineer. */
@ -2203,13 +2243,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Error al cifrar base de datos";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Error al exportar base de datos";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Error al exportar tema: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Error al importar base de datos";
/* No comment provided by engineer. */
@ -2236,7 +2276,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Error al registrarse para notificaciones";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Error al expulsar miembro";
/* alert title */
@ -2586,7 +2626,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "El grupo ya existe";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "¡El grupo ya existe!";
/* No comment provided by engineer. */
@ -2610,6 +2650,9 @@ snd error text */
/* No comment provided by engineer. */
"Group invitation is no longer valid, it was removed by sender." = "La invitación al grupo ya no es válida, ha sido eliminada por el remitente.";
/* No comment provided by engineer. */
"group is deleted" = "el grupo ha sido eliminado";
/* No comment provided by engineer. */
"Group link" = "Enlace de grupo";
@ -2982,22 +3025,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "unirte como %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Unirte al grupo";
/* No comment provided by engineer. */
"Join group conversations" = "Unirse a la conversación del grupo";
/* No comment provided by engineer. */
"Join group?" = "¿Unirte al grupo?";
/* No comment provided by engineer. */
"Join incognito" = "Unirte en modo incógnito";
/* No comment provided by engineer. */
"Join with current profile" = "Unirte con el perfil actual";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "¿Unirse a tu grupo?\n¡Este es tu enlace para el grupo %@!";
/* No comment provided by engineer. */
@ -3138,9 +3175,15 @@ snd error text */
/* profile update event chat item */
"member %@ changed to %@" = "el miembro %1$@ ha cambiado a %2$@";
/* No comment provided by engineer. */
"Member admission" = "Admisión del miembro";
/* rcv group event chat item */
"member connected" = "conectado";
/* No comment provided by engineer. */
"member has old version" = "el miembro usa una versión antigua";
/* item status text */
"Member inactive" = "Miembro inactivo";
@ -3162,6 +3205,9 @@ snd error text */
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "El miembro será expulsado del grupo. ¡No puede deshacerse!";
/* alert message */
"Member will join the group, accept member?" = "El miembro se unirá al grupo, ¿aceptas al miembro?";
/* No comment provided by engineer. */
"Members can add message reactions." = "Los miembros pueden añadir reacciones a los mensajes.";
@ -3432,6 +3478,9 @@ snd error text */
/* No comment provided by engineer. */
"New member role" = "Nuevo rol de miembro";
/* rcv group event chat item */
"New member wants to join the group." = "Un miembro nuevo desea unirse al grupo.";
/* notification */
"new message" = "mensaje nuevo";
@ -3471,6 +3520,9 @@ snd error text */
/* No comment provided by engineer. */
"No chats in list %@" = "Sin chats en la lista %@";
/* No comment provided by engineer. */
"No chats with members" = "Sin chats con miembros";
/* No comment provided by engineer. */
"No contacts selected" = "Ningún contacto seleccionado";
@ -3555,6 +3607,9 @@ snd error text */
/* No comment provided by engineer. */
"Not compatible!" = "¡No compatible!";
/* No comment provided by engineer. */
"not synchronized" = "no sincronizado";
/* No comment provided by engineer. */
"Notes" = "Notas";
@ -3587,6 +3642,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "desactivado";
@ -3599,7 +3655,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "ofrecido %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ok";
/* No comment provided by engineer. */
@ -3692,9 +3750,12 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Abrir condiciones";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Grupo abierto";
/* alert title */
"Open link?" = "¿Abrir enlace?";
/* authentication reason */
"Open migration to another device" = "Abrir menú migración a otro dispositivo";
@ -3797,6 +3858,9 @@ time to disappear */
/* No comment provided by engineer. */
"pending approval" = "pendiente de aprobación";
/* No comment provided by engineer. */
"pending review" = "pendiente de revisión";
/* No comment provided by engineer. */
"Periodic" = "Periódicamente";
@ -3849,7 +3913,7 @@ time to disappear */
"Please enter the previous password after restoring database backup. This action can not be undone." = "Introduce la contraseña anterior después de restaurar la copia de seguridad de la base de datos. Esta acción no se puede deshacer.";
/* No comment provided by engineer. */
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Por favor, recuerda y guarda el código de acceso en un lugar seguro. ¡No hay forma de recuperar un código perdido!";
"Please remember or store it securely - there is no way to recover a lost passcode!" = "Por favor, recuerda y guarda el código de acceso en un lugar seguro. ¡No hay manera de recuperar un código perdido!";
/* No comment provided by engineer. */
"Please report it to the developers." = "Por favor, informa a los desarrolladores.";
@ -3866,6 +3930,9 @@ time to disappear */
/* token info */
"Please try to disable and re-enable notfications." = "Por favor, intenta desactivar y reactivar las notificaciones.";
/* snd group event chat item */
"Please wait for group moderators to review your request to join the group." = "Por favor, espera a que tu solicitud sea revisada por los moderadores del grupo.";
/* token info */
"Please wait for token activation to complete." = "Por favor, espera a que el token de activación se complete.";
@ -4146,6 +4213,9 @@ swipe action */
/* No comment provided by engineer. */
"Reject contact request" = "Rechazar solicitud de contacto";
/* alert title */
"Reject member?" = "¿Rechazar al miembro?";
/* No comment provided by engineer. */
"rejected" = "rechazado";
@ -4185,6 +4255,9 @@ swipe action */
/* profile update event chat item */
"removed contact address" = "dirección de contacto eliminada";
/* No comment provided by engineer. */
"removed from group" = "expulsado del grupo";
/* profile update event chat item */
"removed profile picture" = "ha eliminado la imagen del perfil";
@ -4200,18 +4273,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "¿Renegociar cifrado?";
/* 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 subida";
@ -4233,6 +4300,9 @@ swipe action */
/* No comment provided by engineer. */
"Report reason?" = "¿Motivo del informe?";
/* alert title */
"Report sent to moderators" = "Informe enviado a los moderadores";
/* report reason */
"Report spam: only group moderators will see it." = "Informar de spam: sólo los moderadores del grupo lo verán.";
@ -4248,6 +4318,9 @@ swipe action */
/* No comment provided by engineer. */
"Reports" = "Informes";
/* No comment provided by engineer. */
"request to join rejected" = "petición para unirse rechazada";
/* chat list item title */
"requested to connect" = "solicitado para conectar";
@ -4302,9 +4375,21 @@ swipe action */
/* chat item action */
"Reveal" = "Revelar";
/* No comment provided by engineer. */
"review" = "por revisar";
/* No comment provided by engineer. */
"Review conditions" = "Revisar condiciones";
/* admission stage */
"Review members" = "Revisar miembros";
/* admission stage description */
"Review members before admitting (\"knocking\")." = "Revisar miembros antes de admitir.";
/* No comment provided by engineer. */
"reviewed by admins" = "revisado por los administradores";
/* No comment provided by engineer. */
"Revoke" = "Revocar";
@ -4333,6 +4418,9 @@ chat item action */
/* alert button */
"Save (and notify contacts)" = "Guardar (y notificar contactos)";
/* alert title */
"Save admission settings?" = "¿Guardar configuración?";
/* alert button */
"Save and notify contact" = "Guardar y notificar contacto";
@ -4669,6 +4757,9 @@ chat item action */
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Úsalo en lugar de la autenticación del sistema.";
/* No comment provided by engineer. */
"Set member admission" = "Admisión miembro";
/* No comment provided by engineer. */
"Set message expiration in chats." = "Establece el vencimiento para los mensajes en los chats.";
@ -5100,9 +5191,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "La base de datos antigua no se eliminó durante la migración, puede eliminarse.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "El perfil sólo se comparte con tus contactos.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Las mismas condiciones se aplicarán al operador **%@**.";
@ -5172,12 +5260,6 @@ report reason */
/* No comment provided by engineer. */
"This group no longer exists." = "Este grupo ya no existe.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "¡Este es tu propio enlace de un solo uso!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "¡Esta es tu propia dirección SimpleX!";
/* No comment provided by engineer. */
"This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." = "Este enlace requiere una versión más reciente de la aplicación. Por favor, actualiza la aplicación o pide a tu contacto un enlace compatible.";
@ -5433,7 +5515,7 @@ report reason */
/* No comment provided by engineer. */
"Use chat" = "Usar Chat";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Usar perfil actual";
/* No comment provided by engineer. */
@ -5451,7 +5533,7 @@ report reason */
/* No comment provided by engineer. */
"Use iOS call interface" = "Usar interfaz de llamada de iOS";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Usar nuevo perfil incógnito";
/* No comment provided by engineer. */
@ -5712,6 +5794,9 @@ report reason */
/* No comment provided by engineer. */
"You accepted connection" = "Has aceptado la conexión";
/* snd group event chat item */
"you accepted this member" = "has aceptado al miembro";
/* No comment provided by engineer. */
"You allow" = "Permites";
@ -5724,25 +5809,22 @@ report reason */
/* No comment provided by engineer. */
"You are already connected with %@." = "Ya estás conectado con %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Ya estás conectando con %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "¡Ya estás conectando mediante este enlace de un solo uso!";
/* No comment provided by engineer. */
"You are already in group %@." = "Ya estás en el grupo %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Ya estás uniéndote al grupo %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "¡Ya estás uniéndote al grupo mediante este enlace!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Ya estás uniéndote al grupo mediante este enlace.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "¡En proceso de unirte al grupo!\n¿Repetir solicitud de admisión?";
/* No comment provided by engineer. */
@ -5823,6 +5905,9 @@ report reason */
/* alert message */
"You can view invitation link again in connection details." = "Podrás ver el enlace de invitación en detalles de conexión.";
/* alert message */
"You can view your reports in Chat with admins." = "Puedes ver tus informes en Chat con administradores.";
/* No comment provided by engineer. */
"You can't send messages!" = "¡No puedes enviar mensajes!";
@ -5844,10 +5929,7 @@ report reason */
/* No comment provided by engineer. */
"You decide who can connect." = "Tu decides quién se conecta.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "¡Ya has solicitado la conexión mediante esta dirección!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Ya has solicitado la conexión\n¿Repetir solicitud?";
/* No comment provided by engineer. */
@ -5916,9 +5998,6 @@ report reason */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Se te pedirá autenticarte cuando inicies la aplicación o sigas usándola tras 30 segundos en segundo plano.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Te conectarás con todos los miembros del grupo.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Seguirás recibiendo llamadas y notificaciones de los perfiles silenciados cuando estén activos.";
@ -5991,15 +6070,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "El perfil **%@** será compartido.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "El perfil sólo se comparte con tus contactos.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos. Los servidores SimpleX no pueden ver tu perfil.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Tu perfil ha sido modificado. Si lo guardas la actualización será enviada a todos tus contactos.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Tu perfil, contactos y mensajes se almacenan en tu dispositivo.";
/* No comment provided by engineer. */
"Your random profile" = "Tu perfil aleatorio";

View file

@ -509,7 +509,8 @@ swipe action */
"Can't invite contacts!" = "Kontakteja ei voi kutsua!";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Peruuta";
/* feature offered item */
@ -651,16 +652,13 @@ set passcode view */
/* server test step */
"Connect" = "Yhdistä";
/* No comment provided by engineer. */
"Connect incognito" = "Yhdistä Incognito";
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "ole yhteydessä SimpleX Chat -kehittäjiin.";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Yhdistä linkin kautta";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Yhdistä kertalinkillä";
/* No comment provided by engineer. */
@ -774,9 +772,6 @@ set passcode view */
/* server test step */
"Create queue" = "Luo jono";
/* No comment provided by engineer. */
"Create secret group" = "Luo salainen ryhmä";
/* No comment provided by engineer. */
"Create SimpleX address" = "Luo SimpleX-osoite";
@ -1073,7 +1068,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Älä salli";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Älä näytä uudelleen";
/* No comment provided by engineer. */
@ -1247,7 +1242,7 @@ swipe action */
/* No comment provided by engineer. */
"Error changing role" = "Virhe roolin vaihdossa";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Virhe asetuksen muuttamisessa";
/* No comment provided by engineer. */
@ -1265,7 +1260,7 @@ swipe action */
/* No comment provided by engineer. */
"Error decrypting file" = "Virhe tiedoston salauksen purussa";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Virhe keskustelujen tietokannan poistamisessa";
/* No comment provided by engineer. */
@ -1274,10 +1269,10 @@ swipe action */
/* No comment provided by engineer. */
"Error deleting connection" = "Virhe yhteyden poistamisessa";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Virhe tietokannan poistamisessa";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Virhe vanhan tietokannan poistamisessa";
/* No comment provided by engineer. */
@ -1295,10 +1290,10 @@ swipe action */
/* No comment provided by engineer. */
"Error encrypting database" = "Virhe tietokannan salauksessa";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Virhe vietäessä keskustelujen tietokantaa";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Virhe keskustelujen tietokannan tuonnissa";
/* No comment provided by engineer. */
@ -1307,7 +1302,7 @@ swipe action */
/* alert title */
"Error receiving file" = "Virhe tiedoston vastaanottamisessa";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Virhe poistettaessa jäsentä";
/* No comment provided by engineer. */
@ -1762,7 +1757,7 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "Liity %@:nä";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Liity ryhmään";
/* No comment provided by engineer. */
@ -2079,6 +2074,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "pois";
@ -2091,7 +2087,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "tarjottu %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ok";
/* No comment provided by engineer. */
@ -2910,9 +2908,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Vanhaa tietokantaa ei poistettu siirron aikana, se voidaan kuitenkin poistaa.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Profiili jaetaan vain kontaktiesi kanssa.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Toinen kuittaus, joka uupui! ✅";
@ -3072,7 +3067,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "Käytä chattia";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Käytä nykyistä profiilia";
/* No comment provided by engineer. */
@ -3081,7 +3076,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "Käytä iOS:n puhelujen käyttöliittymää";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Käytä uutta incognito-profiilia";
/* No comment provided by engineer. */
@ -3391,10 +3386,10 @@ chat item action */
"Your profile **%@** will be shared." = "Profiilisi **%@** jaetaan.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi.";
"Your profile is stored on your device and only shared with your contacts." = "Profiili jaetaan vain kontaktiesi kanssa.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Profiilisi, kontaktisi ja toimitetut viestit tallennetaan laitteellesi.";
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi.";
/* No comment provided by engineer. */
"Your random profile" = "Satunnainen profiilisi";

View file

@ -586,10 +586,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Déjà connecté ?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Déjà en connexion !";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Groupe déjà rejoint !";
/* pref value */
@ -897,7 +897,8 @@ marked deleted chat item preview text */
"Can't message member" = "Impossible d'envoyer un message à ce membre";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Annuler";
/* No comment provided by engineer. */
@ -979,7 +980,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "La discussion existe déjà";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "La discussion existe déjà!";
/* No comment provided by engineer. */
@ -1177,9 +1178,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Connexion automatique";
/* No comment provided by engineer. */
"Connect incognito" = "Se connecter incognito";
/* No comment provided by engineer. */
"Connect to desktop" = "Connexion au bureau";
@ -1189,25 +1187,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Connectez-vous à vos amis plus rapidement.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Se connecter à soi-même ?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Se connecter à soi-même ?\nIl s'agit de votre propre lien unique !";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Se connecter à soi-même ?\nC'est votre propre adresse SimpleX !";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Se connecter via l'adresse de contact";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Se connecter via un lien";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Se connecter via un lien unique";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Se connecter avec %@";
/* No comment provided by engineer. */
@ -1414,9 +1409,6 @@ set passcode view */
/* server test step */
"Create queue" = "Créer une file d'attente";
/* No comment provided by engineer. */
"Create secret group" = "Créer un groupe secret";
/* No comment provided by engineer. */
"Create SimpleX address" = "Créer une adresse SimpleX";
@ -1863,7 +1855,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Ne manquez pas les messages importants.";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Ne plus afficher";
/* No comment provided by engineer. */
@ -2122,7 +2114,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Erreur lors du changement de rôle";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Erreur de changement de paramètre";
/* No comment provided by engineer. */
@ -2161,7 +2153,7 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Erreur lors du déchiffrement du fichier";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Erreur lors de la suppression de la base de données du chat";
/* No comment provided by engineer. */
@ -2170,10 +2162,10 @@ chat item action */
/* No comment provided by engineer. */
"Error deleting connection" = "Erreur lors de la suppression de la connexion";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Erreur lors de la suppression de la base de données";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Erreur lors de la suppression de l'ancienne base de données";
/* No comment provided by engineer. */
@ -2194,13 +2186,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Erreur lors du chiffrement de la base de données";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Erreur lors de l'exportation de la base de données du chat";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Erreur d'exportation du thème: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Erreur lors de l'importation de la base de données du chat";
/* No comment provided by engineer. */
@ -2227,7 +2219,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Erreur lors de l'inscription aux notifications";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Erreur lors de la suppression d'un membre";
/* alert title */
@ -2568,7 +2560,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Le groupe existe déjà";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Ce groupe existe déjà !";
/* No comment provided by engineer. */
@ -2934,22 +2926,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "rejoindre entant que %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Rejoindre le groupe";
/* No comment provided by engineer. */
"Join group conversations" = "Participez aux conversations de groupe";
/* No comment provided by engineer. */
"Join group?" = "Rejoindre le groupe ?";
/* No comment provided by engineer. */
"Join incognito" = "Rejoindre en incognito";
/* No comment provided by engineer. */
"Join with current profile" = "Rejoindre avec le profil actuel";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Rejoindre votre groupe ?\nVoici votre lien pour le groupe %@ !";
/* No comment provided by engineer. */
@ -3479,6 +3465,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "off";
@ -3491,7 +3478,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "propose %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ok";
/* No comment provided by engineer. */
@ -3578,7 +3567,7 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Ouvrir les conditions";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Ouvrir le groupe";
/* authentication reason */
@ -4044,18 +4033,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Renégocier le chiffrement?";
/* 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";
@ -4883,9 +4866,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "L'ancienne base de données n'a pas été supprimée lors de la migration, elle peut être supprimée.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Le profil n'est partagé qu'avec vos contacts.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Les mêmes conditions s'appliquent à l'opérateur **%@**.";
@ -4952,12 +4932,6 @@ chat item action */
/* No comment provided by engineer. */
"This group no longer exists." = "Ce groupe n'existe plus.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Voici votre propre lien unique !";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Voici votre propre adresse SimpleX !";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Ce lien a été utilisé avec un autre appareil mobile, veuillez créer un nouveau lien sur le bureau.";
@ -5198,7 +5172,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "Utiliser le chat";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Utiliser le profil actuel";
/* No comment provided by engineer. */
@ -5216,7 +5190,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "Utiliser l'interface d'appel d'iOS";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Utiliser un nouveau profil incognito";
/* No comment provided by engineer. */
@ -5477,25 +5451,22 @@ chat item action */
/* No comment provided by engineer. */
"You are already connected with %@." = "Vous êtes déjà connecté avec %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Vous êtes déjà en train de vous connecter à %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Vous êtes déjà connecté(e) via ce lien unique !";
/* No comment provided by engineer. */
"You are already in group %@." = "Vous êtes déjà dans le groupe %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Vous êtes déjà en train de rejoindre le groupe %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Vous êtes déjà en train de rejoindre le groupe via ce lien !";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Vous êtes déjà en train de rejoindre le groupe via ce lien.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Vous êtes déjà membre de ce groupe !\nRépéter la demande d'adhésion ?";
/* No comment provided by engineer. */
@ -5597,10 +5568,7 @@ chat item action */
/* No comment provided by engineer. */
"You decide who can connect." = "Vous choisissez qui peut se connecter.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Vous avez déjà demandé une connexion via cette adresse !";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Vous avez déjà demandé une connexion !\nRépéter la demande de connexion ?";
/* No comment provided by engineer. */
@ -5666,9 +5634,6 @@ chat item action */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Il vous sera demandé de vous authentifier lorsque vous démarrez ou reprenez l'application après 30 secondes en arrière-plan.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Vous vous connecterez à tous les membres du groupe.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Vous continuerez à recevoir des appels et des notifications des profils mis en sourdine lorsqu'ils sont actifs.";
@ -5741,15 +5706,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Votre profil **%@** sera partagé.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Le profil n'est partagé qu'avec vos contacts.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts. Les serveurs SimpleX ne peuvent pas voir votre profil.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Votre profil a été modifié. Si vous l'enregistrez, le profil mis à jour sera envoyé à tous vos contacts.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Votre profil, vos contacts et les messages reçus sont stockés sur votre appareil.";
/* No comment provided by engineer. */
"Your random profile" = "Votre profil aléatoire";

View file

@ -14,7 +14,7 @@
"- optionally notify deleted contacts.\n- profile names with spaces.\n- and more!" = "- partnerek értesítése a törlésről (nem kötelező)\n- profilnevek szóközökkel\n- és még sok más!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- legfeljebb 5 perc hosszúságú hangüzenetek.\n- egyéni üzenet-eltűnési időkorlát.\n- előzmények szerkesztése.";
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- legfeljebb 5 perc hosszúságú hangüzenetek.\n- egyéni időkorlát beállítása az üzenetek eltűnéséhez.\n- előzmények szerkesztése.";
/* No comment provided by engineer. */
"!1 colored!" = "!1 színezett!";
@ -47,7 +47,7 @@
"**e2e encrypted** video call" = "**e2e titkosított** videóhívás";
/* No comment provided by engineer. */
"**More private**: check new messages every 20 minutes. Only device token is shared with our push server. It doesn't see how many contacts you have, or any message metadata." = "**Privátabb:** 20 percenként ellenőrzi az új üzeneteket. Az eszköztoken meg lesz osztva a SimpleX Chat-kiszolgálóval, de az nem, hogy hány partnere vagy üzenete van.";
"**More private**: check new messages every 20 minutes. Only device token is shared with our push server. It doesn't see how many contacts you have, or any message metadata." = "**Privátabb:** 20 percenként ellenőrzi az új üzeneteket. Az eszköztoken meg lesz osztva a SimpleX Chat kiszolgálóval, de az nem, hogy hány partnere vagy üzenete van.";
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat push server. The app will check messages in background, when the system allows it, depending on how often you use the app." = "**Legprivátabb:** ne használja a SimpleX Chat értesítési kiszolgálót, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).";
@ -345,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Elfogadás";
/* alert action */
"Accept as member" = "Befogadás tagként";
/* alert action */
"Accept as observer" = "Befogadás megfigyelőként";
/* No comment provided by engineer. */
"Accept conditions" = "Feltételek elfogadása";
@ -358,6 +364,12 @@ swipe action */
swipe action */
"Accept incognito" = "Elfogadás inkognitóban";
/* alert title */
"Accept member" = "Tag befogadása";
/* rcv group event chat item */
"accepted %@" = "befogadta őt: %@";
/* call status */
"accepted call" = "fogadott hívás";
@ -367,6 +379,9 @@ swipe action */
/* chat list item title */
"accepted invitation" = "elfogadott meghívó";
/* rcv group event chat item */
"accepted you" = "befogadta Önt";
/* No comment provided by engineer. */
"Acknowledged" = "Visszaigazolt";
@ -463,6 +478,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "titkosítás elfogadása…";
/* member criteria value */
"all" = "összes";
/* No comment provided by engineer. */
"All" = "Összes";
@ -589,10 +607,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Már kapcsolódott?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Kapcsolódás folyamatban!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "A csatlakozás folyamatban van a csoporthoz!";
/* pref value */
@ -905,8 +923,12 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Can't message member" = "Nem lehet üzenetet küldeni a tagnak";
/* No comment provided by engineer. */
"can't send messages" = "nem lehet üzeneteket küldeni";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Mégse";
/* No comment provided by engineer. */
@ -988,7 +1010,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "A csevegés már létezik";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "A csevegés már létezik!";
/* No comment provided by engineer. */
@ -1042,9 +1064,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "A csevegés törölve lesz az Ön számára ez a művelet nem vonható vissza!";
/* chat toolbar */
"Chat with admins" = "Csevegés az adminisztrátorokkal";
/* No comment provided by engineer. */
"Chat with member" = "Csevegés a taggal";
/* No comment provided by engineer. */
"Chats" = "Csevegések";
/* No comment provided by engineer. */
"Chats with members" = "Csevegés a tagokkal";
/* No comment provided by engineer. */
"Check messages every 20 min." = "Üzenetek ellenőrzése 20 percenként.";
@ -1186,9 +1217,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Kapcsolódás automatikusan";
/* No comment provided by engineer. */
"Connect incognito" = "Kapcsolódás inkognitóban";
/* No comment provided by engineer. */
"Connect to desktop" = "Társítás számítógéppel";
@ -1198,25 +1226,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Kapcsolódjon gyorsabban a partnereihez.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Kapcsolódik saját magához?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Kapcsolódik saját magához?\nEz a saját egyszer használható meghívója!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Kapcsolódik saját magához?\nEz a saját SimpleX-címe!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Kapcsolódás a kapcsolattartási címen keresztül";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Kapcsolódás egy hivatkozáson keresztül";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Kapcsolódás egyszer használható meghívón keresztül";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Kapcsolódás a következővel: %@";
/* No comment provided by engineer. */
@ -1333,9 +1358,15 @@ set passcode view */
/* No comment provided by engineer. */
"Contact already exists" = "A partner már létezik";
/* No comment provided by engineer. */
"contact deleted" = "partner törölve";
/* No comment provided by engineer. */
"Contact deleted!" = "Partner törölve!";
/* No comment provided by engineer. */
"contact disabled" = "partner letiltva";
/* No comment provided by engineer. */
"contact has e2e encryption" = "a partner e2e titkosítással rendelkezik";
@ -1354,6 +1385,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contact name" = "Csak név";
/* No comment provided by engineer. */
"contact not ready" = "a kapcsolat nem áll készen";
/* No comment provided by engineer. */
"Contact preferences" = "Partnerbeállítások";
@ -1423,9 +1457,6 @@ set passcode view */
/* server test step */
"Create queue" = "Sorba állítás létrehozása";
/* No comment provided by engineer. */
"Create secret group" = "Titkos csoport létrehozása";
/* No comment provided by engineer. */
"Create SimpleX address" = "SimpleX-cím létrehozása";
@ -1505,7 +1536,7 @@ set passcode view */
"Database ID: %d" = "Adatbázis-azonosító: %d";
/* No comment provided by engineer. */
"Database IDs and Transport isolation option." = "Adatbázis-azonosítók és átvitel-izolációs beállítások.";
"Database IDs and Transport isolation option." = "Adatbázis-azonosítók és átvitelelkülönítési beállítások.";
/* No comment provided by engineer. */
"Database is encrypted using a random passphrase, you can change it." = "Az adatbázis egy véletlenszerű jelmondattal van titkosítva, amelyet szabadon módosíthat.";
@ -1550,7 +1581,7 @@ set passcode view */
"Decentralized" = "Decentralizált";
/* message decrypt error item */
"Decryption error" = "Titkosítás visszafejtési hiba";
"Decryption error" = "Titkosításvisszafejtési hiba";
/* No comment provided by engineer. */
"decryption errors" = "visszafejtési hibák";
@ -1602,6 +1633,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat profile?" = "Törli a csevegési profilt?";
/* alert title */
"Delete chat with member?" = "Törli a taggal való csevegést?";
/* No comment provided by engineer. */
"Delete chat?" = "Törli a csevegést?";
@ -1777,7 +1811,7 @@ swipe action */
"different migration in the app/database: %@ / %@" = "különböző átköltöztetés az alkalmazásban/adatbázisban: %@ / %@";
/* No comment provided by engineer. */
"Different names, avatars and transport isolation." = "Különböző nevek, profilképek és átvitel-izoláció.";
"Different names, avatars and transport isolation." = "Különböző nevek, profilképek és átvitelizoláció.";
/* connection level description */
"direct" = "közvetlen";
@ -1872,7 +1906,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Ne maradjon le a fontos üzenetekről.";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Ne mutasd újra";
/* No comment provided by engineer. */
@ -2116,6 +2150,9 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Hiba történt a meghívási kérés elfogadásakor";
/* alert title */
"Error accepting member" = "Hiba a tag befogadásakor";
/* No comment provided by engineer. */
"Error adding member(s)" = "Hiba történt a tag(ok) hozzáadásakor";
@ -2131,7 +2168,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Hiba történt a szerepkör módosításakor";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Hiba történt a beállítás módosításakor";
/* No comment provided by engineer. */
@ -2170,26 +2207,29 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Hiba történt a fájl visszafejtésekor";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Hiba történt a csevegési adatbázis törlésekor";
/* alert title */
"Error deleting chat with member" = "Hiba a taggal való csevegés törlésekor";
/* No comment provided by engineer. */
"Error deleting chat!" = "Hiba történt a csevegés törlésekor!";
/* No comment provided by engineer. */
"Error deleting connection" = "Hiba történt a kapcsolat törlésekor";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Hiba történt az adatbázis törlésekor";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Hiba történt a régi adatbázis törlésekor";
/* No comment provided by engineer. */
"Error deleting token" = "Hiba történt a token törlésekor";
/* No comment provided by engineer. */
"Error deleting user profile" = "Hiba történt a felhasználó-profil törlésekor";
"Error deleting user profile" = "Hiba történt a felhasználói profil törlésekor";
/* No comment provided by engineer. */
"Error downloading the archive" = "Hiba történt az archívum letöltésekor";
@ -2203,13 +2243,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Hiba történt az adatbázis titkosításakor";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Hiba történt a csevegési adatbázis exportálásakor";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Hiba történt a téma exportálásakor: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Hiba történt a csevegési adatbázis importálásakor";
/* No comment provided by engineer. */
@ -2236,7 +2276,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Hiba történt az értesítések regisztrálásakor";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Hiba történt a tag eltávolításakor";
/* alert title */
@ -2491,7 +2531,7 @@ snd error text */
"For console" = "Konzolhoz";
/* No comment provided by engineer. */
"For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server." = "Például, ha a partnere egy SimpleX Chat-kiszolgálón keresztül fogadja az üzeneteket, akkor az Ön alkalmazása egy Flux-kiszolgálón keresztül fogja azokat kézbesíteni.";
"For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server." = "Például, ha a partnere egy SimpleX Chat kiszolgálón keresztül fogadja az üzeneteket, akkor az Ön alkalmazása egy Flux kiszolgálón keresztül fogja azokat kézbesíteni.";
/* No comment provided by engineer. */
"For me" = "Csak magamnak";
@ -2586,7 +2626,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "A csoport már létezik";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "A csoport már létezik!";
/* No comment provided by engineer. */
@ -2610,6 +2650,9 @@ snd error text */
/* No comment provided by engineer. */
"Group invitation is no longer valid, it was removed by sender." = "A csoportmeghívó már nem érvényes, a küldője eltávolította.";
/* No comment provided by engineer. */
"group is deleted" = "csoport törölve";
/* No comment provided by engineer. */
"Group link" = "Csoporthivatkozás";
@ -2956,10 +2999,10 @@ snd error text */
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Lehetővé teszi, hogy egyetlen csevegési profilon belül több névtelen kapcsolat legyen, anélkül, hogy megosztott adatok lennének közöttük.";
/* No comment provided by engineer. */
"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha Ön vagy a partnere régi adatbázis biztonsági mentést használt.";
"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha Ön vagy a partnere egy régi adatbázis biztonsági mentését használta.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült.";
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere egy régi adatbázis biztonsági mentését használta.\n3. A kapcsolat sérült.";
/* No comment provided by engineer. */
"It protects your IP address and connections." = "Védi az IP-címét és a kapcsolatait.";
@ -2982,22 +3025,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "csatlakozás mint %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Csatlakozás csoporthoz";
/* No comment provided by engineer. */
"Join group conversations" = "Csatlakozás csoportos beszélgetésekhez";
/* No comment provided by engineer. */
"Join group?" = "Csatlakozik a csoporthoz?";
/* No comment provided by engineer. */
"Join incognito" = "Csatlakozás inkognitóban";
/* No comment provided by engineer. */
"Join with current profile" = "Csatlakozás a jelenlegi profillal";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Csatlakozik a csoportjához?\nEz a saját hivatkozása a(z) %@ nevű csoporthoz!";
/* No comment provided by engineer. */
@ -3138,9 +3175,15 @@ snd error text */
/* profile update event chat item */
"member %@ changed to %@" = "%1$@ a következőre módosította a nevét: %2$@";
/* No comment provided by engineer. */
"Member admission" = "Tagbefogadás";
/* rcv group event chat item */
"member connected" = "kapcsolódott";
/* No comment provided by engineer. */
"member has old version" = "a tag régi verziót használ";
/* item status text */
"Member inactive" = "Inaktív tag";
@ -3162,6 +3205,9 @@ snd error text */
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "A tag el lesz távolítva a csoportból ez a művelet nem vonható vissza!";
/* alert message */
"Member will join the group, accept member?" = "A tag csatlakozni akar a csoporthoz, befogadja a tagot?";
/* No comment provided by engineer. */
"Members can add message reactions." = "A tagok reakciókat adhatnak hozzá az üzenetekhez.";
@ -3274,10 +3320,10 @@ snd error text */
"Messages were deleted after you selected them." = "Az üzeneteket törölték miután kijelölte őket.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.";
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.";
/* No comment provided by engineer. */
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.";
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.";
/* No comment provided by engineer. */
"Migrate device" = "Eszköz átköltöztetése";
@ -3432,6 +3478,9 @@ snd error text */
/* No comment provided by engineer. */
"New member role" = "Új tag szerepköre";
/* rcv group event chat item */
"New member wants to join the group." = "Új tag szeretne csatlakozni a csoporthoz.";
/* notification */
"new message" = "új üzenet";
@ -3471,6 +3520,9 @@ snd error text */
/* No comment provided by engineer. */
"No chats in list %@" = "Nincsenek csevegések a(z) %@ nevű listában";
/* No comment provided by engineer. */
"No chats with members" = "Nincsenek csevegések a tagokkal";
/* No comment provided by engineer. */
"No contacts selected" = "Nincs partner kijelölve";
@ -3508,7 +3560,7 @@ snd error text */
"No message" = "Nincs üzenet";
/* servers error */
"No message servers." = "Nincsenek üzenet-kiszolgálók.";
"No message servers." = "Nincsenek üzenetkiszolgálók.";
/* No comment provided by engineer. */
"No network connection" = "Nincs hálózati kapcsolat";
@ -3550,11 +3602,14 @@ snd error text */
"No unread chats" = "Nincsenek olvasatlan csevegések";
/* No comment provided by engineer. */
"No user identifiers." = "Nincsenek felhasználó-azonosítók.";
"No user identifiers." = "Nincsenek felhasználói azonosítók.";
/* No comment provided by engineer. */
"Not compatible!" = "Nem kompatibilis!";
/* No comment provided by engineer. */
"not synchronized" = "nincs szinkronizálva";
/* No comment provided by engineer. */
"Notes" = "Jegyzetek";
@ -3587,6 +3642,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "kikapcsolva";
@ -3599,7 +3655,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "ajánlotta: %1$@, ekkor: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Rendben";
/* No comment provided by engineer. */
@ -3615,13 +3673,13 @@ time to disappear */
"One-time invitation link" = "Egyszer használható meghívó";
/* No comment provided by engineer. */
"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Onion-kiszolgálók **szükségesek** a kapcsolódáshoz.\nKompatibilis VPN szükséges.";
"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Onion kiszolgálók **szükségesek** a kapcsolódáshoz.\nKompatibilis VPN szükséges.";
/* No comment provided by engineer. */
"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion-kiszolgálók használata, ha azok rendelkezésre állnak.\nVPN engedélyezése szükséges.";
"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion kiszolgálók használata, ha azok rendelkezésre állnak.\nVPN engedélyezése szükséges.";
/* No comment provided by engineer. */
"Onion hosts will not be used." = "Az onion-kiszolgálók nem lesznek használva.";
"Onion hosts will not be used." = "Az onion kiszolgálók nem lesznek használva.";
/* No comment provided by engineer. */
"Only chat owners can change preferences." = "Csak a csevegés tulajdonosai módosíthatják a csevegési beállításokat.";
@ -3692,9 +3750,12 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Feltételek megnyitása";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Csoport megnyitása";
/* alert title */
"Open link?" = "Megnyitja a hivatkozást?";
/* authentication reason */
"Open migration to another device" = "Átköltöztetés indítása egy másik eszközre";
@ -3797,6 +3858,9 @@ time to disappear */
/* No comment provided by engineer. */
"pending approval" = "jóváhagyásra vár";
/* No comment provided by engineer. */
"pending review" = "függőben lévő áttekintés";
/* No comment provided by engineer. */
"Periodic" = "Időszakos";
@ -3866,6 +3930,9 @@ time to disappear */
/* token info */
"Please try to disable and re-enable notfications." = "Próbálja meg letiltani és újra engedélyezni az értesítéseket.";
/* snd group event chat item */
"Please wait for group moderators to review your request to join the group." = "Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét.";
/* token info */
"Please wait for token activation to complete." = "Várjon, amíg a token aktiválása befejeződik.";
@ -4146,6 +4213,9 @@ swipe action */
/* No comment provided by engineer. */
"Reject contact request" = "Meghívási kérés elutasítása";
/* alert title */
"Reject member?" = "Elutasítja a tagot?";
/* No comment provided by engineer. */
"rejected" = "elutasítva";
@ -4153,10 +4223,10 @@ swipe action */
"rejected call" = "elutasított hívás";
/* No comment provided by engineer. */
"Relay server is only used if necessary. Another party can observe your IP address." = "A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címet.";
"Relay server is only used if necessary. Another party can observe your IP address." = "A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét.";
/* No comment provided by engineer. */
"Relay server protects your IP address, but it can observe the duration of the call." = "A továbbítókiszolgáló megvédi az Ön IP-címét, de megfigyelheti a hívás időtartamát.";
"Relay server protects your IP address, but it can observe the duration of the call." = "A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát.";
/* No comment provided by engineer. */
"Remove" = "Eltávolítás";
@ -4185,6 +4255,9 @@ swipe action */
/* profile update event chat item */
"removed contact address" = "eltávolította a kapcsolattartási címet";
/* No comment provided by engineer. */
"removed from group" = "eltávolítva a csoportból";
/* profile update event chat item */
"removed profile picture" = "eltávolította a profilképét";
@ -4200,18 +4273,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Újraegyezteti a titkosítást?";
/* No comment provided by engineer. */
"Repeat connection request?" = "Megismétli a meghívási kérést?";
/* No comment provided by engineer. */
"Repeat download" = "Letöltés ismét";
/* No comment provided by engineer. */
"Repeat import" = "Importálás ismét";
/* No comment provided by engineer. */
"Repeat join request?" = "Megismétli a meghívási kérést?";
/* No comment provided by engineer. */
"Repeat upload" = "Feltöltés ismét";
@ -4233,6 +4300,9 @@ swipe action */
/* No comment provided by engineer. */
"Report reason?" = "Jelentés indoklása?";
/* alert title */
"Report sent to moderators" = "A jelentés el lett küldve a moderátoroknak";
/* report reason */
"Report spam: only group moderators will see it." = "Kéretlen tartalom jelentése: csak a csoport moderátorai látják.";
@ -4248,6 +4318,9 @@ swipe action */
/* No comment provided by engineer. */
"Reports" = "Jelentések";
/* No comment provided by engineer. */
"request to join rejected" = "csatlakozási kérelem elutasítva";
/* chat list item title */
"requested to connect" = "Függőben lévő meghívási kérelem";
@ -4302,9 +4375,21 @@ swipe action */
/* chat item action */
"Reveal" = "Felfedés";
/* No comment provided by engineer. */
"review" = "áttekintés";
/* No comment provided by engineer. */
"Review conditions" = "Feltételek felülvizsgálata";
/* admission stage */
"Review members" = "Tagok áttekintése";
/* admission stage description */
"Review members before admitting (\"knocking\")." = "Tagok áttekintése a befogadás előtt (kopogtatás).";
/* No comment provided by engineer. */
"reviewed by admins" = "áttekintve a moderátorok által";
/* No comment provided by engineer. */
"Revoke" = "Visszavonás";
@ -4333,6 +4418,9 @@ chat item action */
/* alert button */
"Save (and notify contacts)" = "Mentés (és a partnerek értesítése)";
/* alert title */
"Save admission settings?" = "Elmenti a befogadási beállításokat?";
/* alert button */
"Save and notify contact" = "Mentés és a partner értesítése";
@ -4669,6 +4757,9 @@ chat item action */
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Beállítás a rendszer-hitelesítés helyett.";
/* No comment provided by engineer. */
"Set member admission" = "Tagbefogadás beállítása";
/* No comment provided by engineer. */
"Set message expiration in chats." = "Üzenetek eltűnési idejének módosítása a csevegésekben.";
@ -4830,7 +4921,7 @@ chat item action */
"SimpleX one-time invitation" = "Egyszer használható SimpleX-meghívó";
/* No comment provided by engineer. */
"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX Chat biztonsága a Trail of Bits által lett felülvizsgálva.";
"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX-protokollokat a Trail of Bits auditálta.";
/* No comment provided by engineer. */
"Simplified incognito mode" = "Egyszerűsített inkognitómód";
@ -4851,7 +4942,7 @@ chat item action */
"SMP server" = "SMP-kiszolgáló";
/* No comment provided by engineer. */
"SOCKS proxy" = "SOCKS-proxy";
"SOCKS proxy" = "SOCKS proxy";
/* blur media */
"Soft" = "Enyhe";
@ -5059,7 +5150,7 @@ report reason */
"The attempt to change database passphrase was not completed." = "Az adatbázis jelmondatának módosítására tett kísérlet nem fejeződött be.";
/* No comment provided by engineer. */
"The code you scanned is not a SimpleX link QR code." = "A beolvasott QR-kód nem egy SimpleX-QR-kód-hivatkozás.";
"The code you scanned is not a SimpleX link QR code." = "A beolvasott QR-kód nem egy SimpleX-hivatkozás.";
/* No comment provided by engineer. */
"The connection reached the limit of undelivered messages, your contact may be offline." = "A kapcsolat elérte a kézbesítetlen üzenetek számának határát, a partnere lehet, hogy offline állapotban van.";
@ -5100,9 +5191,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "A régi adatbázis nem lett eltávolítva az átköltöztetéskor, ezért törölhető.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "A profilja csak a partnereivel van megosztva.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Ugyanezek a feltételek lesznek elfogadva a következő üzemeltető számára is: **%@**.";
@ -5172,12 +5260,6 @@ report reason */
/* No comment provided by engineer. */
"This group no longer exists." = "Ez a csoport már nem létezik.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Ez a saját egyszer használható meghívója!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Ez a saját SimpleX-címe!";
/* No comment provided by engineer. */
"This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." = "Ez a hivatkozás újabb alkalmazásverziót igényel. Frissítse az alkalmazást vagy kérjen egy kompatibilis hivatkozást a partnerétől.";
@ -5218,7 +5300,7 @@ report reason */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Az IP-cím védelmének érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.";
/* No comment provided by engineer. */
"To protect your privacy, SimpleX uses separate IDs for each of your contacts." = "Adatainak védelme érdekében a SimpleX külön üzenet-azonosítókat használ minden egyes kapcsolatához.";
"To protect your privacy, SimpleX uses separate IDs for each of your contacts." = "Adatainak védelme érdekében a SimpleX külön azonosítókat használ minden egyes kapcsolatához.";
/* No comment provided by engineer. */
"To receive" = "A fogadáshoz";
@ -5263,7 +5345,7 @@ report reason */
"Total" = "Összes kapcsolat";
/* No comment provided by engineer. */
"Transport isolation" = "Átvitel-izoláció";
"Transport isolation" = "Átvitelelkülönítés";
/* No comment provided by engineer. */
"Transport sessions" = "Munkamenetek átvitele";
@ -5425,7 +5507,7 @@ report reason */
"Uploading archive" = "Archívum feltöltése";
/* No comment provided by engineer. */
"Use .onion hosts" = "Onion-kiszolgálók használata";
"Use .onion hosts" = "Onion kiszolgálók használata";
/* No comment provided by engineer. */
"Use %@" = "%@ használata";
@ -5433,7 +5515,7 @@ report reason */
/* No comment provided by engineer. */
"Use chat" = "SimpleX Chat használata";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Jelenlegi profil használata";
/* No comment provided by engineer. */
@ -5451,14 +5533,14 @@ report reason */
/* No comment provided by engineer. */
"Use iOS call interface" = "Az iOS hívási felületét használata";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Új inkognitóprofil használata";
/* No comment provided by engineer. */
"Use only local notifications?" = "Csak helyi értesítések használata?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett.";
"Use private routing with unknown servers when IP address is not protected." = "Használjon privát útválasztást az ismeretlen kiszolgálókkal, ha az IP-cím nem védett.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Használjon privát útválasztást ismeretlen kiszolgálókkal.";
@ -5473,10 +5555,10 @@ report reason */
"Use short links (BETA)" = "Rövid hivatkozások használata (béta)";
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "SimpleX Chat-kiszolgálók használata?";
"Use SimpleX Chat servers?" = "SimpleX Chat kiszolgálók használata?";
/* No comment provided by engineer. */
"Use SOCKS proxy" = "SOCKS-proxy használata";
"Use SOCKS proxy" = "SOCKS proxy használata";
/* No comment provided by engineer. */
"Use TCP port %@ when no port is specified." = "A következő TCP-port használata, amikor nincs port megadva: %@.";
@ -5500,7 +5582,7 @@ report reason */
"Username" = "Felhasználónév";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "SimpleX Chat-kiszolgálók használatban.";
"Using SimpleX Chat servers." = "SimpleX Chat kiszolgálók használatban.";
/* No comment provided by engineer. */
"v%@" = "v%@";
@ -5680,10 +5762,10 @@ report reason */
"With reduced battery usage." = "Csökkentett akkumulátor-használattal.";
/* No comment provided by engineer. */
"Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az Ön IP-címe látható lesz a fájlkiszolgálók számára.";
"Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára.";
/* alert message */
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az Ön IP-címe látható lesz a következő XFTP-továbbítókiszolgálók számára: %@.";
"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Érvénytelen adatbázis-jelmondat";
@ -5712,6 +5794,9 @@ report reason */
/* No comment provided by engineer. */
"You accepted connection" = "Kapcsolat létrehozása";
/* snd group event chat item */
"you accepted this member" = "Ön befogadta ezt a tagot";
/* No comment provided by engineer. */
"You allow" = "Ön engedélyezi";
@ -5724,25 +5809,22 @@ report reason */
/* No comment provided by engineer. */
"You are already connected with %@." = "Ön már kapcsolódva van vele: %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "A kapcsolódás már folyamatban van a következőhöz: %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "A kapcsolódás már folyamatban van ezen az egyszer használható meghívón keresztül!";
/* No comment provided by engineer. */
"You are already in group %@." = "Ön már a(z) %@ nevű csoport tagja.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "A csatlakozás már folyamatban van a(z) %@ nevű csoporthoz.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "A csatlakozás már folyamatban van a csoporthoz ezen a hivatkozáson keresztül!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "A csatlakozás már folyamatban van a csoporthoz ezen a hivatkozáson keresztül.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "A csatlakozás már folyamatban van a csoporthoz!\nMegismétli a meghívási kérést?";
/* No comment provided by engineer. */
@ -5823,6 +5905,9 @@ report reason */
/* alert message */
"You can view invitation link again in connection details." = "A meghívási hivatkozást újra megtekintheti a kapcsolat részleteinél.";
/* alert message */
"You can view your reports in Chat with admins." = "A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben.";
/* No comment provided by engineer. */
"You can't send messages!" = "Nem lehet üzeneteket küldeni!";
@ -5844,10 +5929,7 @@ report reason */
/* No comment provided by engineer. */
"You decide who can connect." = "Ön dönti el, hogy kivel beszélget.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Már küldött egy meghívási kérést ezen a címen keresztül!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Ön már küldött egy meghívási kérést!\nMegismétli a meghívási kérést?";
/* No comment provided by engineer. */
@ -5916,9 +5998,6 @@ report reason */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Az alkalmazás elindításához vagy 30 másodpercnyi háttérben töltött idő után, az alkalmazáshoz való visszatéréshez hitelesítésre lesz szükség.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Kapcsolódni fog a csoport összes tagjához.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Továbbra is kap hívásokat és értesítéseket a némított profiloktól, ha azok aktívak.";
@ -5992,14 +6071,14 @@ report reason */
"Your profile **%@** will be shared." = "A(z) **%@** nevű profilja meg lesz osztva.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva. A SimpleX-kiszolgálók nem láthatják a profilját.";
"Your profile is stored on your device and only shared with your contacts." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva. A SimpleX kiszolgálók nem láthatják a profilját.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "A profilja módosult. Ha elmenti, a profilfrissítés el lesz küldve a partnerei számára.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "A profilja, a partnerei és az elküldött üzenetei a saját eszközén vannak tárolva.";
/* No comment provided by engineer. */
"Your random profile" = "Véletlenszerű profil";

View file

@ -345,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Accetta";
/* alert action */
"Accept as member" = "Accetta come membro";
/* alert action */
"Accept as observer" = "Accetta come osservatore";
/* No comment provided by engineer. */
"Accept conditions" = "Accetta le condizioni";
@ -358,6 +364,12 @@ swipe action */
swipe action */
"Accept incognito" = "Accetta in incognito";
/* alert title */
"Accept member" = "Accetta membro";
/* rcv group event chat item */
"accepted %@" = "%@ accettato";
/* call status */
"accepted call" = "chiamata accettata";
@ -367,6 +379,9 @@ swipe action */
/* chat list item title */
"accepted invitation" = "invito accettato";
/* rcv group event chat item */
"accepted you" = "ti ha accettato/a";
/* No comment provided by engineer. */
"Acknowledged" = "Riconosciuto";
@ -463,6 +478,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "concordando la crittografia…";
/* member criteria value */
"all" = "tutti";
/* No comment provided by engineer. */
"All" = "Tutte";
@ -589,10 +607,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Già connesso/a?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Già in connessione!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Già in ingresso nel gruppo!";
/* pref value */
@ -905,8 +923,12 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Can't message member" = "Impossibile inviare un messaggio al membro";
/* No comment provided by engineer. */
"can't send messages" = "impossibile inviare messaggi";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Annulla";
/* No comment provided by engineer. */
@ -988,7 +1010,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "La chat esiste già";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "La chat esiste già!";
/* No comment provided by engineer. */
@ -1042,9 +1064,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "La chat verrà eliminata solo per te, non è reversibile!";
/* chat toolbar */
"Chat with admins" = "Chat con amministratori";
/* No comment provided by engineer. */
"Chat with member" = "Chatta con il membro";
/* No comment provided by engineer. */
"Chats" = "Chat";
/* No comment provided by engineer. */
"Chats with members" = "Chat con membri";
/* No comment provided by engineer. */
"Check messages every 20 min." = "Controlla i messaggi ogni 20 min.";
@ -1186,9 +1217,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Connetti automaticamente";
/* No comment provided by engineer. */
"Connect incognito" = "Connetti in incognito";
/* No comment provided by engineer. */
"Connect to desktop" = "Connetti al desktop";
@ -1198,25 +1226,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Connettiti più velocemente ai tuoi amici.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Connettersi a te stesso?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Connettersi a te stesso?\nQuesto è il tuo link una tantum!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Connettersi a te stesso?\nQuesto è il tuo indirizzo SimpleX!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Connettere via indirizzo del contatto";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Connetti via link";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Connetti via link una tantum";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Connettersi con %@";
/* No comment provided by engineer. */
@ -1333,9 +1358,15 @@ set passcode view */
/* No comment provided by engineer. */
"Contact already exists" = "Il contatto esiste già";
/* No comment provided by engineer. */
"contact deleted" = "contatto eliminato";
/* No comment provided by engineer. */
"Contact deleted!" = "Contatto eliminato!";
/* No comment provided by engineer. */
"contact disabled" = "contatto disattivato";
/* No comment provided by engineer. */
"contact has e2e encryption" = "il contatto ha la crittografia e2e";
@ -1354,6 +1385,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contact name" = "Nome del contatto";
/* No comment provided by engineer. */
"contact not ready" = "contatto non pronto";
/* No comment provided by engineer. */
"Contact preferences" = "Preferenze del contatto";
@ -1423,9 +1457,6 @@ set passcode view */
/* server test step */
"Create queue" = "Crea coda";
/* No comment provided by engineer. */
"Create secret group" = "Crea gruppo segreto";
/* No comment provided by engineer. */
"Create SimpleX address" = "Crea indirizzo SimpleX";
@ -1602,6 +1633,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat profile?" = "Eliminare il profilo di chat?";
/* alert title */
"Delete chat with member?" = "Eliminare la chat con il membro?";
/* No comment provided by engineer. */
"Delete chat?" = "Eliminare la chat?";
@ -1872,7 +1906,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Non perdere messaggi importanti.";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Non mostrare più";
/* No comment provided by engineer. */
@ -2116,6 +2150,9 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Errore nell'accettazione della richiesta di contatto";
/* alert title */
"Error accepting member" = "Errore di accettazione del membro";
/* No comment provided by engineer. */
"Error adding member(s)" = "Errore di aggiunta membro/i";
@ -2131,7 +2168,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Errore nel cambio di ruolo";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Errore nella modifica dell'impostazione";
/* No comment provided by engineer. */
@ -2170,19 +2207,22 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Errore decifrando il file";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Errore nell'eliminazione del database della chat";
/* alert title */
"Error deleting chat with member" = "Errore di eliminazione della chat con il membro";
/* No comment provided by engineer. */
"Error deleting chat!" = "Errore nell'eliminazione della chat!";
/* No comment provided by engineer. */
"Error deleting connection" = "Errore nell'eliminazione della connessione";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Errore nell'eliminazione del database";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Errore nell'eliminazione del database vecchio";
/* No comment provided by engineer. */
@ -2203,13 +2243,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Errore nella crittografia del database";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Errore nell'esportazione del database della chat";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Errore di esportazione del tema: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Errore nell'importazione del database della chat";
/* No comment provided by engineer. */
@ -2236,7 +2276,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Errore di registrazione per le notifiche";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Errore nella rimozione del membro";
/* alert title */
@ -2586,7 +2626,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Il gruppo esiste già";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Il gruppo esiste già!";
/* No comment provided by engineer. */
@ -2610,6 +2650,9 @@ snd error text */
/* No comment provided by engineer. */
"Group invitation is no longer valid, it was removed by sender." = "L'invito al gruppo non è più valido, è stato rimosso dal mittente.";
/* No comment provided by engineer. */
"group is deleted" = "il gruppo è eliminato";
/* No comment provided by engineer. */
"Group link" = "Link del gruppo";
@ -2982,22 +3025,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "entra come %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Entra nel gruppo";
/* No comment provided by engineer. */
"Join group conversations" = "Entra in conversazioni di gruppo";
/* No comment provided by engineer. */
"Join group?" = "Entrare nel gruppo?";
/* No comment provided by engineer. */
"Join incognito" = "Entra in incognito";
/* No comment provided by engineer. */
"Join with current profile" = "Entra con il profilo attuale";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Entrare nel tuo gruppo?\nQuesto è il tuo link per il gruppo %@!";
/* No comment provided by engineer. */
@ -3138,9 +3175,15 @@ snd error text */
/* profile update event chat item */
"member %@ changed to %@" = "il membro %1$@ è diventato %2$@";
/* No comment provided by engineer. */
"Member admission" = "Ammissione del membro";
/* rcv group event chat item */
"member connected" = "si è connesso/a";
/* No comment provided by engineer. */
"member has old version" = "il membro ha una versione vecchia";
/* item status text */
"Member inactive" = "Membro inattivo";
@ -3162,6 +3205,9 @@ snd error text */
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "Il membro verrà rimosso dal gruppo, non è reversibile!";
/* alert message */
"Member will join the group, accept member?" = "Il membro entrerà nel gruppo, accettarlo?";
/* No comment provided by engineer. */
"Members can add message reactions." = "I membri del gruppo possono aggiungere reazioni ai messaggi.";
@ -3432,6 +3478,9 @@ snd error text */
/* No comment provided by engineer. */
"New member role" = "Nuovo ruolo del membro";
/* rcv group event chat item */
"New member wants to join the group." = "Un nuovo membro vuole entrare nel gruppo.";
/* notification */
"new message" = "messaggio nuovo";
@ -3471,6 +3520,9 @@ snd error text */
/* No comment provided by engineer. */
"No chats in list %@" = "Nessuna chat nell'elenco %@";
/* No comment provided by engineer. */
"No chats with members" = "Nessuna chat con membri";
/* No comment provided by engineer. */
"No contacts selected" = "Nessun contatto selezionato";
@ -3555,6 +3607,9 @@ snd error text */
/* No comment provided by engineer. */
"Not compatible!" = "Non compatibile!";
/* No comment provided by engineer. */
"not synchronized" = "non sincronizzato";
/* No comment provided by engineer. */
"Notes" = "Note";
@ -3587,6 +3642,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "off";
@ -3599,7 +3655,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "offerto %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ok";
/* No comment provided by engineer. */
@ -3692,9 +3750,12 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Apri le condizioni";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Apri gruppo";
/* alert title */
"Open link?" = "Aprire il link?";
/* authentication reason */
"Open migration to another device" = "Apri migrazione ad un altro dispositivo";
@ -3797,6 +3858,9 @@ time to disappear */
/* No comment provided by engineer. */
"pending approval" = "in attesa di approvazione";
/* No comment provided by engineer. */
"pending review" = "in attesa di revisione";
/* No comment provided by engineer. */
"Periodic" = "Periodicamente";
@ -3866,6 +3930,9 @@ time to disappear */
/* token info */
"Please try to disable and re-enable notfications." = "Prova a disattivare e riattivare le notifiche.";
/* snd group event chat item */
"Please wait for group moderators to review your request to join the group." = "Attendi che i moderatori del gruppo revisionino la tua richiesta di entrare nel gruppo.";
/* token info */
"Please wait for token activation to complete." = "Attendi il completamento dell'attivazione del token.";
@ -4146,6 +4213,9 @@ swipe action */
/* No comment provided by engineer. */
"Reject contact request" = "Rifiuta la richiesta di contatto";
/* alert title */
"Reject member?" = "Rifiutare il membro?";
/* No comment provided by engineer. */
"rejected" = "rifiutato";
@ -4185,6 +4255,9 @@ swipe action */
/* profile update event chat item */
"removed contact address" = "indirizzo di contatto rimosso";
/* No comment provided by engineer. */
"removed from group" = "rimosso dal gruppo";
/* profile update event chat item */
"removed profile picture" = "immagine del profilo rimossa";
@ -4200,18 +4273,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Rinegoziare la crittografia?";
/* 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";
@ -4233,6 +4300,9 @@ swipe action */
/* No comment provided by engineer. */
"Report reason?" = "Motivo della segnalazione?";
/* alert title */
"Report sent to moderators" = "Segnalazione inviata ai moderatori";
/* report reason */
"Report spam: only group moderators will see it." = "Segnala spam: solo i moderatori del gruppo lo vedranno.";
@ -4248,6 +4318,9 @@ swipe action */
/* No comment provided by engineer. */
"Reports" = "Segnalazioni";
/* No comment provided by engineer. */
"request to join rejected" = "richiesta di entrare rifiutata";
/* chat list item title */
"requested to connect" = "richiesto di connettersi";
@ -4302,9 +4375,21 @@ swipe action */
/* chat item action */
"Reveal" = "Rivela";
/* No comment provided by engineer. */
"review" = "revisiona";
/* No comment provided by engineer. */
"Review conditions" = "Leggi le condizioni";
/* admission stage */
"Review members" = "Revisiona i membri";
/* admission stage description */
"Review members before admitting (\"knocking\")." = "Revisiona i membri prima di ammetterli (\"bussare\").";
/* No comment provided by engineer. */
"reviewed by admins" = "revisionato dagli amministratori";
/* No comment provided by engineer. */
"Revoke" = "Revoca";
@ -4333,6 +4418,9 @@ chat item action */
/* alert button */
"Save (and notify contacts)" = "Salva (e avvisa i contatti)";
/* alert title */
"Save admission settings?" = "Salvare le impostazioni di ammissione?";
/* alert button */
"Save and notify contact" = "Salva e avvisa il contatto";
@ -4669,6 +4757,9 @@ chat item action */
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Impostalo al posto dell'autenticazione di sistema.";
/* No comment provided by engineer. */
"Set member admission" = "Imposta l'ammissione del membro";
/* No comment provided by engineer. */
"Set message expiration in chats." = "Imposta la scadenza dei messaggi nelle chat.";
@ -5100,9 +5191,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Il database vecchio non è stato rimosso durante la migrazione, può essere eliminato.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Il profilo è condiviso solo con i tuoi contatti.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Le stesse condizioni si applicheranno all'operatore **%@**.";
@ -5172,12 +5260,6 @@ report reason */
/* No comment provided by engineer. */
"This group no longer exists." = "Questo gruppo non esiste più.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Questo è il tuo link una tantum!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Questo è il tuo indirizzo SimpleX!";
/* No comment provided by engineer. */
"This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." = "Questo link richiede una versione più recente dell'app. Aggiornala o chiedi al tuo contatto di inviare un link compatibile.";
@ -5433,7 +5515,7 @@ report reason */
/* No comment provided by engineer. */
"Use chat" = "Usa la chat";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Usa il profilo attuale";
/* No comment provided by engineer. */
@ -5451,7 +5533,7 @@ report reason */
/* No comment provided by engineer. */
"Use iOS call interface" = "Usa interfaccia di chiamata iOS";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Usa nuovo profilo in incognito";
/* No comment provided by engineer. */
@ -5712,6 +5794,9 @@ report reason */
/* No comment provided by engineer. */
"You accepted connection" = "Hai accettato la connessione";
/* snd group event chat item */
"you accepted this member" = "hai accettato questo membro";
/* No comment provided by engineer. */
"You allow" = "Lo consenti";
@ -5724,25 +5809,22 @@ report reason */
/* No comment provided by engineer. */
"You are already connected with %@." = "Sei già connesso/a con %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Ti stai già connettendo a %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Ti stai già connettendo tramite questo link una tantum!";
/* No comment provided by engineer. */
"You are already in group %@." = "Sei già nel gruppo %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Stai già entrando nel gruppo %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Stai già entrando nel gruppo tramite questo link!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Stai già entrando nel gruppo tramite questo link.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Stai già entrando nel gruppo!\nRipetere la richiesta di ingresso?";
/* No comment provided by engineer. */
@ -5823,6 +5905,9 @@ report reason */
/* alert message */
"You can view invitation link again in connection details." = "Puoi vedere di nuovo il link di invito nei dettagli di connessione.";
/* alert message */
"You can view your reports in Chat with admins." = "Puoi vedere le tue segnalazioni nella chat con gli amministratori.";
/* No comment provided by engineer. */
"You can't send messages!" = "Non puoi inviare messaggi!";
@ -5844,10 +5929,7 @@ report reason */
/* No comment provided by engineer. */
"You decide who can connect." = "Sei tu a decidere chi può connettersi.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Hai già richiesto la connessione tramite questo indirizzo!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Hai già richiesto la connessione!\nRipetere la richiesta di connessione?";
/* No comment provided by engineer. */
@ -5916,9 +5998,6 @@ report reason */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Dovrai autenticarti quando avvii o riapri l'app dopo 30 secondi in secondo piano.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Ti connetterai a tutti i membri del gruppo.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Continuerai a ricevere chiamate e notifiche da profili silenziati quando sono attivi.";
@ -5991,15 +6070,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Verrà condiviso il tuo profilo **%@**.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Il profilo è condiviso solo con i tuoi contatti.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti. I server di SimpleX non possono vedere il tuo profilo.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Il tuo profilo è stato cambiato. Se lo salvi, il profilo aggiornato verrà inviato a tutti i tuoi contatti.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Il tuo profilo, i contatti e i messaggi recapitati sono memorizzati sul tuo dispositivo.";
/* No comment provided by engineer. */
"Your random profile" = "Il tuo profilo casuale";

View file

@ -484,10 +484,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "すでに接続済みですか?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "既に接続中です!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "すでにグループに参加しています!";
/* pref value */
@ -647,7 +647,8 @@ swipe action */
"Can't invite contacts!" = "連絡先を招待できません!";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "中止";
/* feature offered item */
@ -807,9 +808,6 @@ set passcode view */
/* server test step */
"Connect" = "接続";
/* No comment provided by engineer. */
"Connect incognito" = "シークレットモードで接続";
/* No comment provided by engineer. */
"Connect to desktop" = "デスクトップに接続";
@ -819,10 +817,10 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "友達ともっと速くつながりましょう。";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "リンク経由で接続";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "ワンタイムリンクで接続";
/* No comment provided by engineer. */
@ -963,9 +961,6 @@ set passcode view */
/* server test step */
"Create queue" = "キューの作成";
/* No comment provided by engineer. */
"Create secret group" = "シークレットグループを作成する";
/* No comment provided by engineer. */
"Create SimpleX address" = "SimpleXアドレスの作成";
@ -1277,7 +1272,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "有効にしない";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "次から表示しない";
/* No comment provided by engineer. */
@ -1454,7 +1449,7 @@ swipe action */
/* No comment provided by engineer. */
"Error changing role" = "役割変更にエラー発生";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "設定変更にエラー発生";
/* No comment provided by engineer. */
@ -1475,7 +1470,7 @@ swipe action */
/* No comment provided by engineer. */
"Error decrypting file" = "ファイルの復号エラー";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "チャットデータベース削除にエラー発生";
/* No comment provided by engineer. */
@ -1484,10 +1479,10 @@ swipe action */
/* No comment provided by engineer. */
"Error deleting connection" = "接続の削除エラー";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "データベースの削除にエラー発生";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "古いデータベースを削除にエラー発生";
/* No comment provided by engineer. */
@ -1502,10 +1497,10 @@ swipe action */
/* No comment provided by engineer. */
"Error encrypting database" = "データベース暗号化ににエラー発生";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "チャットデータベースのエキスポートにエラー発生";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "チャットデータベースのインポートにエラー発生";
/* No comment provided by engineer. */
@ -1514,7 +1509,7 @@ swipe action */
/* alert title */
"Error receiving file" = "ファイル受信にエラー発生";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "メンバー除名にエラー発生";
/* No comment provided by engineer. */
@ -1969,7 +1964,7 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "%@ として参加";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "グループに参加";
/* No comment provided by engineer. */
@ -2295,6 +2290,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "オフ";
@ -2307,7 +2303,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "提供された %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "OK";
/* No comment provided by engineer. */
@ -3111,9 +3109,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "古いデータベースは移行時に削除されなかったので、削除することができます。";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "プロフィールは連絡先にしか共有されません。";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "長らくお待たせしました! ✅";
@ -3270,7 +3265,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "チャット";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "現在のプロファイルを使用する";
/* No comment provided by engineer. */
@ -3279,7 +3274,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "iOS通話インターフェースを使用する";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "新しいシークレットプロファイルを使用する";
/* No comment provided by engineer. */
@ -3592,10 +3587,10 @@ chat item action */
"Your profile **%@** will be shared." = "あなたのプロファイル **%@** が共有されます。";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "プロフィールはデバイスに保存され、連絡先とのみ共有されます。 SimpleX サーバーはあなたのプロファイルを参照できません。";
"Your profile is stored on your device and only shared with your contacts." = "プロフィールは連絡先にしか共有されません。";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "あなたのプロフィール、連絡先、送信したメッセージがご自分の端末に保存されます。";
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "プロフィールはデバイスに保存され、連絡先とのみ共有されます。 SimpleX サーバーはあなたのプロファイルを参照できません。";
/* No comment provided by engineer. */
"Your random profile" = "あなたのランダム・プロフィール";

View file

@ -345,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Accepteer";
/* alert action */
"Accept as member" = "Accepteren als lid";
/* alert action */
"Accept as observer" = "Accepteren als waarnemer";
/* No comment provided by engineer. */
"Accept conditions" = "Accepteer voorwaarden";
@ -358,6 +364,12 @@ swipe action */
swipe action */
"Accept incognito" = "Accepteer incognito";
/* alert title */
"Accept member" = "Lid accepteren";
/* rcv group event chat item */
"accepted %@" = "geaccepteerd %@";
/* call status */
"accepted call" = "geaccepteerde oproep";
@ -367,6 +379,9 @@ swipe action */
/* chat list item title */
"accepted invitation" = "geaccepteerde uitnodiging";
/* rcv group event chat item */
"accepted you" = "heb je geaccepteerd";
/* No comment provided by engineer. */
"Acknowledged" = "Erkend";
@ -463,6 +478,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "versleuteling overeenkomen…";
/* member criteria value */
"all" = "alle";
/* No comment provided by engineer. */
"All" = "alle";
@ -505,6 +523,9 @@ swipe action */
/* No comment provided by engineer. */
"All reports will be archived for you." = "Alle rapporten worden voor u gearchiveerd.";
/* No comment provided by engineer. */
"All servers" = "Alle servers";
/* No comment provided by engineer. */
"All your contacts will remain connected." = "Al uw contacten blijven verbonden.";
@ -586,10 +607,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Al verbonden?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Al bezig met verbinden!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Al lid van de groep!";
/* pref value */
@ -902,8 +923,12 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Can't message member" = "Kan geen bericht sturen naar lid";
/* No comment provided by engineer. */
"can't send messages" = "kan geen berichten versturen";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Annuleren";
/* No comment provided by engineer. */
@ -985,7 +1010,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "Chat bestaat al";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "Chat bestaat al!";
/* No comment provided by engineer. */
@ -1039,9 +1064,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "De chat wordt voor je verwijderd - dit kan niet ongedaan worden gemaakt!";
/* chat toolbar */
"Chat with admins" = "Chat met beheerders";
/* No comment provided by engineer. */
"Chat with member" = "Chat met lid";
/* No comment provided by engineer. */
"Chats" = "Chats";
/* No comment provided by engineer. */
"Chats with members" = "Chats met leden";
/* No comment provided by engineer. */
"Check messages every 20 min." = "Controleer uw berichten elke 20 minuten.";
@ -1183,9 +1217,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Automatisch verbinden";
/* No comment provided by engineer. */
"Connect incognito" = "Verbind incognito";
/* No comment provided by engineer. */
"Connect to desktop" = "Verbinden met desktop";
@ -1195,25 +1226,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Maak sneller verbinding met je vrienden.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Verbinding maken met jezelf?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Verbinding maken met jezelf?\nDit is uw eigen eenmalige link!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Verbinding maken met jezelf?\nDit is uw eigen SimpleX adres!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Verbinding maken via contactadres";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Maak verbinding via link";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Verbinden via een eenmalige link?";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Verbonden met %@";
/* No comment provided by engineer. */
@ -1330,9 +1358,15 @@ set passcode view */
/* No comment provided by engineer. */
"Contact already exists" = "Contact bestaat al";
/* No comment provided by engineer. */
"contact deleted" = "contact verwijderd";
/* No comment provided by engineer. */
"Contact deleted!" = "Contact verwijderd!";
/* No comment provided by engineer. */
"contact disabled" = "contact uitgeschakeld";
/* No comment provided by engineer. */
"contact has e2e encryption" = "contact heeft e2e-codering";
@ -1351,6 +1385,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contact name" = "Contact naam";
/* No comment provided by engineer. */
"contact not ready" = "contact niet klaar";
/* No comment provided by engineer. */
"Contact preferences" = "Contact voorkeuren";
@ -1420,9 +1457,6 @@ set passcode view */
/* server test step */
"Create queue" = "Maak een wachtrij";
/* No comment provided by engineer. */
"Create secret group" = "Maak een geheime groep aan";
/* No comment provided by engineer. */
"Create SimpleX address" = "Maak een SimpleX adres aan";
@ -1599,6 +1633,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat profile?" = "Chatprofiel verwijderen?";
/* alert title */
"Delete chat with member?" = "Chat met lid verwijderen?";
/* No comment provided by engineer. */
"Delete chat?" = "Chat verwijderen?";
@ -1869,7 +1906,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Mis geen belangrijke berichten.";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Niet meer weergeven";
/* No comment provided by engineer. */
@ -2113,6 +2150,9 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Fout bij het accepteren van een contactverzoek";
/* alert title */
"Error accepting member" = "Fout bij het accepteren van lid";
/* No comment provided by engineer. */
"Error adding member(s)" = "Fout bij het toevoegen van leden";
@ -2128,7 +2168,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Fout bij wisselen van rol";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Fout bij wijzigen van instelling";
/* No comment provided by engineer. */
@ -2167,19 +2207,22 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Fout bij het ontsleutelen van bestand";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Fout bij het verwijderen van de chat database";
/* alert title */
"Error deleting chat with member" = "Fout bij het verwijderen van chat met lid";
/* No comment provided by engineer. */
"Error deleting chat!" = "Fout bij verwijderen gesprek!";
/* No comment provided by engineer. */
"Error deleting connection" = "Fout bij verwijderen van verbinding";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Fout bij het verwijderen van de database";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Fout bij het verwijderen van de oude database";
/* No comment provided by engineer. */
@ -2200,13 +2243,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Fout bij het versleutelen van de database";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Fout bij het exporteren van de chat database";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Fout bij exporteren van thema: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Fout bij het importeren van de chat database";
/* No comment provided by engineer. */
@ -2233,7 +2276,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Fout bij registreren voor meldingen";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Fout bij verwijderen van lid";
/* alert title */
@ -2583,7 +2626,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Groep bestaat al";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Groep bestaat al!";
/* No comment provided by engineer. */
@ -2607,6 +2650,9 @@ snd error text */
/* No comment provided by engineer. */
"Group invitation is no longer valid, it was removed by sender." = "Groep uitnodiging is niet meer geldig, deze is verwijderd door de afzender.";
/* No comment provided by engineer. */
"group is deleted" = "groep is verwijderd";
/* No comment provided by engineer. */
"Group link" = "Groep link";
@ -2979,22 +3025,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "deelnemen als %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Word lid van groep";
/* No comment provided by engineer. */
"Join group conversations" = "Neem deel aan groepsgesprekken";
/* No comment provided by engineer. */
"Join group?" = "Deelnemen aan groep?";
/* No comment provided by engineer. */
"Join incognito" = "Doe incognito mee";
/* No comment provided by engineer. */
"Join with current profile" = "Word lid met huidig profiel";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Sluit u aan bij uw groep?\nDit is jouw link voor groep %@!";
/* No comment provided by engineer. */
@ -3135,9 +3175,15 @@ snd error text */
/* profile update event chat item */
"member %@ changed to %@" = "lid %1$@ gewijzigd in %2$@";
/* No comment provided by engineer. */
"Member admission" = "Toelating van leden";
/* rcv group event chat item */
"member connected" = "is toegetreden";
/* No comment provided by engineer. */
"member has old version" = "lid heeft oude versie";
/* item status text */
"Member inactive" = "Lid inactief";
@ -3159,6 +3205,9 @@ snd error text */
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "Lid wordt uit de groep verwijderd, dit kan niet ongedaan worden gemaakt!";
/* alert message */
"Member will join the group, accept member?" = "Lid zal toetreden tot de groep, lid accepteren?";
/* No comment provided by engineer. */
"Members can add message reactions." = "Groepsleden kunnen bericht reacties toevoegen.";
@ -3429,6 +3478,9 @@ snd error text */
/* No comment provided by engineer. */
"New member role" = "Nieuwe leden rol";
/* rcv group event chat item */
"New member wants to join the group." = "Nieuw lid wil zich bij de groep aansluiten.";
/* notification */
"new message" = "nieuw bericht";
@ -3468,6 +3520,9 @@ snd error text */
/* No comment provided by engineer. */
"No chats in list %@" = "Geen chats in lijst %@";
/* No comment provided by engineer. */
"No chats with members" = "Geen chats met leden";
/* No comment provided by engineer. */
"No contacts selected" = "Geen contacten geselecteerd";
@ -3552,6 +3607,9 @@ snd error text */
/* No comment provided by engineer. */
"Not compatible!" = "Niet compatibel!";
/* No comment provided by engineer. */
"not synchronized" = "niet gesynchroniseerd";
/* No comment provided by engineer. */
"Notes" = "Notities";
@ -3584,6 +3642,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "uit";
@ -3596,7 +3655,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "voorgesteld %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "OK";
/* No comment provided by engineer. */
@ -3689,9 +3750,12 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Open voorwaarden";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Open groep";
/* alert title */
"Open link?" = "Link openen?";
/* authentication reason */
"Open migration to another device" = "Open de migratie naar een ander apparaat";
@ -3794,6 +3858,9 @@ time to disappear */
/* No comment provided by engineer. */
"pending approval" = "in afwachting van goedkeuring";
/* No comment provided by engineer. */
"pending review" = "in afwachting van beoordeling";
/* No comment provided by engineer. */
"Periodic" = "Periodiek";
@ -3863,6 +3930,9 @@ time to disappear */
/* token info */
"Please try to disable and re-enable notfications." = "Probeer meldingen uit en weer in te schakelen.";
/* snd group event chat item */
"Please wait for group moderators to review your request to join the group." = "Wacht totdat de moderators van de groep uw verzoek tot lidmaatschap van de groep hebben beoordeeld.";
/* token info */
"Please wait for token activation to complete." = "Wacht tot de tokenactivering voltooid is.";
@ -4143,6 +4213,9 @@ swipe action */
/* No comment provided by engineer. */
"Reject contact request" = "Contactverzoek afwijzen";
/* alert title */
"Reject member?" = "Lid afwijzen?";
/* No comment provided by engineer. */
"rejected" = "afgewezen";
@ -4182,6 +4255,9 @@ swipe action */
/* profile update event chat item */
"removed contact address" = "contactadres verwijderd";
/* No comment provided by engineer. */
"removed from group" = "verwijderd uit de groep";
/* profile update event chat item */
"removed profile picture" = "profielfoto verwijderd";
@ -4197,18 +4273,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Heronderhandelen over versleuteling?";
/* 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";
@ -4230,6 +4300,9 @@ swipe action */
/* No comment provided by engineer. */
"Report reason?" = "Reden melding?";
/* alert title */
"Report sent to moderators" = "Rapport verzonden naar moderators";
/* report reason */
"Report spam: only group moderators will see it." = "Spam melden: alleen groepsmoderators kunnen het zien.";
@ -4245,6 +4318,9 @@ swipe action */
/* No comment provided by engineer. */
"Reports" = "Rapporten";
/* No comment provided by engineer. */
"request to join rejected" = "verzoek tot toetreding afgewezen";
/* chat list item title */
"requested to connect" = "verzocht om verbinding te maken";
@ -4299,9 +4375,21 @@ swipe action */
/* chat item action */
"Reveal" = "Onthullen";
/* No comment provided by engineer. */
"review" = "beoordeling";
/* No comment provided by engineer. */
"Review conditions" = "Voorwaarden bekijken";
/* admission stage */
"Review members" = "Leden beoordelen";
/* admission stage description */
"Review members before admitting (\"knocking\")." = "Controleer de leden voordat u ze toelaat ('knocking').";
/* No comment provided by engineer. */
"reviewed by admins" = "beoordeeld door beheerders";
/* No comment provided by engineer. */
"Revoke" = "Intrekken";
@ -4330,6 +4418,9 @@ chat item action */
/* alert button */
"Save (and notify contacts)" = "Bewaar (en informeer contacten)";
/* alert title */
"Save admission settings?" = "Toegangsinstellingen opslaan?";
/* alert button */
"Save and notify contact" = "Opslaan en Contact melden";
@ -4666,6 +4757,9 @@ chat item action */
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Stel het in in plaats van systeemverificatie.";
/* No comment provided by engineer. */
"Set member admission" = "Toegang voor leden instellen";
/* No comment provided by engineer. */
"Set message expiration in chats." = "Stel de berichtvervaldatum in chats in.";
@ -4739,6 +4833,9 @@ chat item action */
/* No comment provided by engineer. */
"Share with contacts" = "Delen met contacten";
/* No comment provided by engineer. */
"Short link" = "Korte link";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Toon → bij berichten verzonden via privéroutering.";
@ -4781,6 +4878,9 @@ chat item action */
/* No comment provided by engineer. */
"SimpleX address or 1-time link?" = "SimpleX adres of eenmalige link?";
/* simplex link type */
"SimpleX channel link" = "SimpleX channel link";
/* No comment provided by engineer. */
"SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "Simplex-chat en flux hebben een overeenkomst gemaakt om door flux geëxploiteerde servers in de app op te nemen.";
@ -5091,9 +5191,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "De oude database is niet verwijderd tijdens de migratie, deze kan worden verwijderd.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Het profiel wordt alleen gedeeld met uw contacten.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Dezelfde voorwaarden gelden voor operator **%@**.";
@ -5164,10 +5261,7 @@ report reason */
"This group no longer exists." = "Deze groep bestaat niet meer.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Dit is uw eigen eenmalige link!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Dit is uw eigen SimpleX adres!";
"This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." = "Voor deze link is een nieuwere app-versie vereist. Werk de app bij of vraag je contactpersoon om een compatibele link te sturen.";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Deze link is gebruikt met een ander mobiel apparaat. Maak een nieuwe link op de desktop.";
@ -5361,6 +5455,9 @@ report reason */
/* swipe action */
"Unread" = "Ongelezen";
/* No comment provided by engineer. */
"Unsupported connection link" = "Niet-ondersteunde verbindingslink";
/* No comment provided by engineer. */
"Up to 100 last messages are sent to new members." = "Er worden maximaal 100 laatste berichten naar nieuwe leden verzonden.";
@ -5418,7 +5515,7 @@ report reason */
/* No comment provided by engineer. */
"Use chat" = "Gebruik chat";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Gebruik het huidige profiel";
/* No comment provided by engineer. */
@ -5436,7 +5533,7 @@ report reason */
/* No comment provided by engineer. */
"Use iOS call interface" = "De iOS-oproepinterface gebruiken";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Gebruik een nieuw incognitoprofiel";
/* No comment provided by engineer. */
@ -5454,6 +5551,9 @@ report reason */
/* No comment provided by engineer. */
"Use servers" = "Gebruik servers";
/* No comment provided by engineer. */
"Use short links (BETA)" = "Gebruik korte links (BETA)";
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "SimpleX Chat servers gebruiken?";
@ -5463,6 +5563,9 @@ report reason */
/* No comment provided by engineer. */
"Use TCP port %@ when no port is specified." = "Gebruik TCP-poort %@ als er geen poort is opgegeven.";
/* No comment provided by engineer. */
"Use TCP port 443 for preset servers only." = "Gebruik TCP-poort 443 alleen voor vooraf ingestelde servers.";
/* No comment provided by engineer. */
"Use the app while in the call." = "Gebruik de app tijdens het gesprek.";
@ -5691,6 +5794,9 @@ report reason */
/* No comment provided by engineer. */
"You accepted connection" = "Je hebt de verbinding geaccepteerd";
/* snd group event chat item */
"you accepted this member" = "je hebt dit lid geaccepteerd";
/* No comment provided by engineer. */
"You allow" = "Jij staat toe";
@ -5703,25 +5809,22 @@ report reason */
/* No comment provided by engineer. */
"You are already connected with %@." = "U bent al verbonden met %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "U maakt al verbinding met %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Je maakt al verbinding via deze eenmalige link!";
/* No comment provided by engineer. */
"You are already in group %@." = "Je zit al in groep %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Je bent al lid van de groep %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Je wordt al lid van de groep via deze link!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Je wordt al lid van de groep via deze link.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Je sluit je al aan bij de groep!\nDeelnameverzoek herhalen?";
/* No comment provided by engineer. */
@ -5802,6 +5905,9 @@ report reason */
/* alert message */
"You can view invitation link again in connection details." = "U kunt de uitnodigingslink opnieuw bekijken in de verbindingsdetails.";
/* alert message */
"You can view your reports in Chat with admins." = "U kunt uw rapporten bekijken in Chat met beheerders.";
/* No comment provided by engineer. */
"You can't send messages!" = "Je kunt geen berichten versturen!";
@ -5823,10 +5929,7 @@ report reason */
/* No comment provided by engineer. */
"You decide who can connect." = "Jij bepaalt wie er verbinding mag maken.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "U heeft al een verbinding aangevraagd via dit adres!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Je hebt al verbinding aangevraagd!\nVerbindingsverzoek herhalen?";
/* No comment provided by engineer. */
@ -5895,9 +5998,6 @@ report reason */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "U moet zich authenticeren wanneer u de app na 30 seconden op de achtergrond start of hervat.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Je maakt verbinding met alle leden.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "U ontvangt nog steeds oproepen en meldingen van gedempte profielen wanneer deze actief zijn.";
@ -5970,15 +6070,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Uw profiel **%@** wordt gedeeld.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Het profiel wordt alleen gedeeld met uw contacten.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten. SimpleX servers kunnen uw profiel niet zien.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Je profiel is gewijzigd. Als je het opslaat, wordt het bijgewerkte profiel naar al je contacten verzonden.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Uw profiel, contacten en afgeleverde berichten worden op uw apparaat opgeslagen.";
/* No comment provided by engineer. */
"Your random profile" = "Je willekeurige profiel";

View file

@ -583,10 +583,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Już połączony?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Już połączony!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Już dołączono do grupy!";
/* pref value */
@ -888,7 +888,8 @@ marked deleted chat item preview text */
"Can't message member" = "Nie można wysłać wiadomości do członka";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Anuluj";
/* No comment provided by engineer. */
@ -967,7 +968,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "Czat już istnieje";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "Czat już istnieje!";
/* No comment provided by engineer. */
@ -1141,9 +1142,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Łącz automatycznie";
/* No comment provided by engineer. */
"Connect incognito" = "Połącz incognito";
/* No comment provided by engineer. */
"Connect to desktop" = "Połącz do komputera";
@ -1153,25 +1151,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Szybciej łącz się ze znajomymi.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Połączyć się ze sobą?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Połączyć się ze sobą?\nTo jest twój jednorazowy link!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Połączyć się ze sobą?\nTo jest twój własny adres SimpleX!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Połącz przez adres kontaktowy";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Połącz się przez link";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Połącz przez jednorazowy link";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Połącz z %@";
/* No comment provided by engineer. */
@ -1354,9 +1349,6 @@ set passcode view */
/* server test step */
"Create queue" = "Utwórz kolejkę";
/* No comment provided by engineer. */
"Create secret group" = "Utwórz tajną grupę";
/* No comment provided by engineer. */
"Create SimpleX address" = "Utwórz adres SimpleX";
@ -1761,7 +1753,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Nie włączaj";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Nie pokazuj ponownie";
/* No comment provided by engineer. */
@ -2002,7 +1994,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Błąd zmiany roli";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Błąd zmiany ustawienia";
/* No comment provided by engineer. */
@ -2032,7 +2024,7 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Błąd odszyfrowania pliku";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Błąd usuwania bazy danych czatu";
/* No comment provided by engineer. */
@ -2041,10 +2033,10 @@ chat item action */
/* No comment provided by engineer. */
"Error deleting connection" = "Błąd usuwania połączenia";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Błąd usuwania bazy danych";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Błąd usuwania starej bazy danych";
/* No comment provided by engineer. */
@ -2065,13 +2057,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Błąd szyfrowania bazy danych";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Błąd eksportu bazy danych czatu";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Błąd eksportowania motywu: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Błąd importu bazy danych czatu";
/* No comment provided by engineer. */
@ -2092,7 +2084,7 @@ chat item action */
/* No comment provided by engineer. */
"Error reconnecting servers" = "Błąd ponownego łączenia serwerów";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Błąd usuwania członka";
/* No comment provided by engineer. */
@ -2385,7 +2377,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Grupa już istnieje";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Grupa już istnieje!";
/* No comment provided by engineer. */
@ -2739,22 +2731,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "dołącz jako %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Dołącz do grupy";
/* No comment provided by engineer. */
"Join group conversations" = "Dołącz do grupowej rozmowy";
/* No comment provided by engineer. */
"Join group?" = "Dołączyć do grupy?";
/* No comment provided by engineer. */
"Join incognito" = "Dołącz incognito";
/* No comment provided by engineer. */
"Join with current profile" = "Dołącz z obecnym profilem";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Dołączyć do twojej grupy?\nTo jest twój link do grupy %@!";
/* No comment provided by engineer. */
@ -3236,6 +3222,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "wyłączony";
@ -3248,7 +3235,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "zaoferował %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ok";
/* No comment provided by engineer. */
@ -3326,7 +3315,7 @@ time to disappear */
/* authentication reason */
"Open chat console" = "Otwórz konsolę czatu";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Grupa otwarta";
/* authentication reason */
@ -3774,18 +3763,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Renegocjować szyfrowanie?";
/* 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";
@ -4556,9 +4539,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Stara baza danych nie została usunięta podczas migracji, można ją usunąć.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Profil jest udostępniany tylko Twoim kontaktom.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Drugi tik, który przegapiliśmy! ✅";
@ -4613,12 +4593,6 @@ chat item action */
/* No comment provided by engineer. */
"This group no longer exists." = "Ta grupa już nie istnieje.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "To jest twój jednorazowy link!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "To jest twój własny adres SimpleX!";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Ten link dostał użyty z innym urządzeniem mobilnym, proszę stworzyć nowy link na komputerze.";
@ -4841,7 +4815,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "Użyj czatu";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Użyj obecnego profilu";
/* No comment provided by engineer. */
@ -4853,7 +4827,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "Użyj interfejsu połączeń iOS";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Użyj nowego profilu incognito";
/* No comment provided by engineer. */
@ -5099,25 +5073,22 @@ chat item action */
/* No comment provided by engineer. */
"You are already connected to %@." = "Jesteś już połączony z %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Już się łączysz z %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Już jesteś połączony z tym jednorazowym linkiem!";
/* No comment provided by engineer. */
"You are already in group %@." = "Już jesteś w grupie %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Już dołączasz do grupy %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Już dołączasz do grupy przez ten link!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Już dołączasz do grupy przez ten link.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Już dołączasz do grupy!\nPowtórzyć prośbę dołączenia?";
/* No comment provided by engineer. */
@ -5213,10 +5184,7 @@ chat item action */
/* No comment provided by engineer. */
"You decide who can connect." = "Ty decydujesz, kto może się połączyć.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Już prosiłeś o połączenie na ten adres!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Już prosiłeś o połączenie!\nPowtórzyć prośbę połączenia?";
/* No comment provided by engineer. */
@ -5282,9 +5250,6 @@ chat item action */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Uwierzytelnienie będzie wymagane przy uruchamianiu lub wznawianiu aplikacji po 30 sekundach w tle.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Zostaniesz połączony ze wszystkimi członkami grupy.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Nadal będziesz otrzymywać połączenia i powiadomienia z wyciszonych profili, gdy są one aktywne.";
@ -5354,15 +5319,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Twój profil **%@** zostanie udostępniony.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Profil jest udostępniany tylko Twoim kontaktom.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Twój profil jest przechowywany na urządzeniu i udostępniany tylko Twoim kontaktom. Serwery SimpleX nie mogą zobaczyć Twojego profilu.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Twój profil został zmieniony. Jeśli go zapiszesz, zaktualizowany profil zostanie wysłany do wszystkich kontaktów.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Twój profil, kontakty i dostarczone wiadomości są przechowywane na Twoim urządzeniu.";
/* No comment provided by engineer. */
"Your random profile" = "Twój losowy profil";

View file

@ -164,7 +164,7 @@
"%d file(s) were not downloaded." = "%d файлов не было загружено.";
/* time interval */
"%d hours" = "%d ч.";
"%d hours" = "%d час.";
/* alert title */
"%d messages not forwarded" = "%d сообщений не переслано";
@ -345,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Принять";
/* alert action */
"Accept as member" = "Принять в группу";
/* alert action */
"Accept as observer" = "Принять как читателя";
/* No comment provided by engineer. */
"Accept conditions" = "Принять условия";
@ -358,6 +364,12 @@ swipe action */
swipe action */
"Accept incognito" = "Принять инкогнито";
/* alert title */
"Accept member" = "Принять члена";
/* rcv group event chat item */
"accepted %@" = "принят %@";
/* call status */
"accepted call" = "принятый звонок";
@ -367,6 +379,9 @@ swipe action */
/* chat list item title */
"accepted invitation" = "принятое приглашение";
/* rcv group event chat item */
"accepted you" = "Вы приняты";
/* No comment provided by engineer. */
"Acknowledged" = "Подтверждено";
@ -463,6 +478,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "шифрование согласовывается…";
/* member criteria value */
"all" = "все";
/* No comment provided by engineer. */
"All" = "Все";
@ -484,6 +502,9 @@ swipe action */
/* No comment provided by engineer. */
"All group members will remain connected." = "Все члены группы останутся соединены.";
/* feature role */
"all members" = "все члены";
/* No comment provided by engineer. */
"All messages and files are sent **end-to-end encrypted**, with post-quantum security in direct messages." = "Все сообщения и файлы отправляются с **end-to-end шифрованием**, с постквантовой безопасностью в прямых разговорах.";
@ -502,6 +523,9 @@ swipe action */
/* No comment provided by engineer. */
"All reports will be archived for you." = "Все сообщения о нарушениях будут заархивированы для вас.";
/* No comment provided by engineer. */
"All servers" = "Все серверы";
/* No comment provided by engineer. */
"All your contacts will remain connected." = "Все контакты, которые соединились через этот адрес, сохранятся.";
@ -583,10 +607,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Соединение уже установлено?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Уже соединяется!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Вступление в группу уже начато!";
/* pref value */
@ -899,8 +923,12 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Can't message member" = "Не удаётся отправить сообщение члену группы";
/* No comment provided by engineer. */
"can't send messages" = "нельзя отправлять";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Отменить";
/* No comment provided by engineer. */
@ -982,7 +1010,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "Разговор уже существует";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "Разговор уже существует!";
/* No comment provided by engineer. */
@ -1036,9 +1064,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "Разговор будет удален для Вас - это действие нельзя отменить!";
/* chat toolbar */
"Chat with admins" = "Чат с админами";
/* No comment provided by engineer. */
"Chat with member" = "Чат с членом группы";
/* No comment provided by engineer. */
"Chats" = "Чаты";
/* No comment provided by engineer. */
"Chats with members" = "Чаты с членами группы";
/* No comment provided by engineer. */
"Check messages every 20 min." = "Проверять сообщения каждые 20 минут.";
@ -1180,9 +1217,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Соединяться автоматически";
/* No comment provided by engineer. */
"Connect incognito" = "Соединиться Инкогнито";
/* No comment provided by engineer. */
"Connect to desktop" = "Подключиться к компьютеру";
@ -1192,25 +1226,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Соединяйтесь с друзьями быстрее.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Соединиться с самим собой?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Соединиться с самим собой?\nЭто ваша собственная одноразовая ссылка!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Соединиться с самим собой?\nЭто ваш собственный адрес SimpleX!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Соединиться через адрес";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Соединиться через ссылку";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Соединиться через одноразовую ссылку";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Соединиться с %@";
/* No comment provided by engineer. */
@ -1327,9 +1358,15 @@ set passcode view */
/* No comment provided by engineer. */
"Contact already exists" = "Существующий контакт";
/* No comment provided by engineer. */
"contact deleted" = "контакт удален";
/* No comment provided by engineer. */
"Contact deleted!" = "Контакт удален!";
/* No comment provided by engineer. */
"contact disabled" = "контакт выключен";
/* No comment provided by engineer. */
"contact has e2e encryption" = "у контакта есть e2e шифрование";
@ -1348,6 +1385,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contact name" = "Имена контактов";
/* No comment provided by engineer. */
"contact not ready" = "контакт не готов";
/* No comment provided by engineer. */
"Contact preferences" = "Предпочтения контакта";
@ -1417,9 +1457,6 @@ set passcode view */
/* server test step */
"Create queue" = "Создание очереди";
/* No comment provided by engineer. */
"Create secret group" = "Создать скрытую группу";
/* No comment provided by engineer. */
"Create SimpleX address" = "Создать адрес SimpleX";
@ -1596,6 +1633,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat profile?" = "Удалить профиль?";
/* alert title */
"Delete chat with member?" = "Удалить чат с членом группы?";
/* No comment provided by engineer. */
"Delete chat?" = "Удалить разговор?";
@ -1782,6 +1822,9 @@ swipe action */
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this chat." = "Личные сообщения запрещены в этой группе.";
/* No comment provided by engineer. */
"Direct messages between members are prohibited." = "Прямые сообщения между членами запрещены.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Выключить (кроме исключений)";
@ -1836,6 +1879,9 @@ swipe action */
/* No comment provided by engineer. */
"Do it later" = "Отложить";
/* No comment provided by engineer. */
"Do not send history to new members." = "Не отправлять историю новым членам.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Не отправлять сообщения напрямую, даже если сервер получателя не поддерживает конфиденциальную доставку.";
@ -1860,7 +1906,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Не пропустите важные сообщения.";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Не показывать";
/* No comment provided by engineer. */
@ -1933,6 +1979,9 @@ chat item action */
/* No comment provided by engineer. */
"Enable camera access" = "Включить доступ к камере";
/* No comment provided by engineer. */
"Enable Flux in Network & servers settings for better metadata privacy." = "Включите Flux в настройках Сеть и серверы для лучшей конфиденциальности метаданных.";
/* No comment provided by engineer. */
"Enable for all" = "Включить для всех";
@ -2101,6 +2150,12 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Ошибка при принятии запроса на соединение";
/* alert title */
"Error accepting member" = "Ошибка вступления члена группы";
/* No comment provided by engineer. */
"Error adding member(s)" = "Ошибка при добавлении членов группы";
/* alert title */
"Error adding server" = "Ошибка добавления сервера";
@ -2113,7 +2168,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Ошибка при изменении роли";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Ошибка при изменении настройки";
/* No comment provided by engineer. */
@ -2137,6 +2192,9 @@ chat item action */
/* alert title */
"Error creating list" = "Ошибка создания списка";
/* No comment provided by engineer. */
"Error creating member contact" = "Ошибка при создании контакта";
/* No comment provided by engineer. */
"Error creating message" = "Ошибка создания сообщения";
@ -2149,19 +2207,22 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Ошибка расшифровки файла";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Ошибка при удалении данных чата";
/* alert title */
"Error deleting chat with member" = "Ошибка при удалении чата с членом группы";
/* No comment provided by engineer. */
"Error deleting chat!" = "Ошибка при удалении чата!";
/* No comment provided by engineer. */
"Error deleting connection" = "Ошибка при удалении соединения";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Ошибка при удалении данных чата";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Ошибка при удалении предыдущей версии данных чата";
/* No comment provided by engineer. */
@ -2182,13 +2243,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Ошибка при шифровании";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Ошибка при экспорте архива чата";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Ошибка экспорта темы: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Ошибка при импорте архива чата";
/* No comment provided by engineer. */
@ -2215,6 +2276,9 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Ошибка регистрации для уведомлений";
/* alert title */
"Error removing member" = "Ошибка при удалении члена группы";
/* alert title */
"Error reordering lists" = "Ошибка сортировки списков";
@ -2251,6 +2315,9 @@ chat item action */
/* No comment provided by engineer. */
"Error sending email" = "Ошибка отправки email";
/* No comment provided by engineer. */
"Error sending member contact invitation" = "Ошибка при отправке приглашения члену";
/* No comment provided by engineer. */
"Error sending message" = "Ошибка при отправке сообщения";
@ -2451,6 +2518,9 @@ snd error text */
/* No comment provided by engineer. */
"Fix not supported by contact" = "Починка не поддерживается контактом";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Починка не поддерживается членом группы.";
/* No comment provided by engineer. */
"For all moderators" = "Для всех модераторов";
@ -2529,6 +2599,9 @@ snd error text */
/* No comment provided by engineer. */
"Full name (optional)" = "Полное имя (не обязательно)";
/* No comment provided by engineer. */
"Fully decentralized visible only to members." = "Группа полностью децентрализована она видна только членам.";
/* No comment provided by engineer. */
"Fully re-implemented - work in background!" = "Полностью обновлены - работают в фоне!";
@ -2553,7 +2626,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Группа уже существует";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Группа уже существует!";
/* No comment provided by engineer. */
@ -2577,6 +2650,9 @@ snd error text */
/* No comment provided by engineer. */
"Group invitation is no longer valid, it was removed by sender." = "Приглашение в группу больше не действительно, оно было удалено отправителем.";
/* No comment provided by engineer. */
"group is deleted" = "группа удалена";
/* No comment provided by engineer. */
"Group link" = "Ссылка группы";
@ -2595,12 +2671,18 @@ snd error text */
/* No comment provided by engineer. */
"Group profile" = "Профиль группы";
/* No comment provided by engineer. */
"Group profile is stored on members' devices, not on the servers." = "Профиль группы хранится на устройствах членов, а не на серверах.";
/* snd group event chat item */
"group profile updated" = "профиль группы обновлен";
/* No comment provided by engineer. */
"Group welcome message" = "Приветственное сообщение группы";
/* No comment provided by engineer. */
"Group will be deleted for all members - this cannot be undone!" = "Группа будет удалена для всех членов - это действие нельзя отменить!";
/* No comment provided by engineer. */
"Group will be deleted for you - this cannot be undone!" = "Группа будет удалена для Вас - это действие нельзя отменить!";
@ -2637,6 +2719,9 @@ snd error text */
/* No comment provided by engineer. */
"History" = "История";
/* No comment provided by engineer. */
"History is not sent to new members." = "История не отправляется новым членам.";
/* time unit */
"hours" = "часов";
@ -2871,6 +2956,9 @@ snd error text */
/* No comment provided by engineer. */
"Invite friends" = "Пригласить друзей";
/* No comment provided by engineer. */
"Invite members" = "Пригласить членов группы";
/* No comment provided by engineer. */
"Invite to chat" = "Пригласить в разговор";
@ -2937,22 +3025,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "вступить как %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Вступить в группу";
/* No comment provided by engineer. */
"Join group conversations" = "Присоединяйтесь к разговорам в группах";
/* No comment provided by engineer. */
"Join group?" = "Вступить в группу?";
/* No comment provided by engineer. */
"Join incognito" = "Вступить инкогнито";
/* No comment provided by engineer. */
"Join with current profile" = "Вступить с активным профилем";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Вступить в вашу группу?\nЭто ваша ссылка на группу %@!";
/* No comment provided by engineer. */
@ -3084,15 +3166,75 @@ snd error text */
/* blur media */
"Medium" = "Среднее";
/* member role */
"member" = "член группы";
/* No comment provided by engineer. */
"Member" = "Член группы";
/* profile update event chat item */
"member %@ changed to %@" = "член %1$@ изменился на %2$@";
/* No comment provided by engineer. */
"Member admission" = "Приём членов в группу";
/* rcv group event chat item */
"member connected" = "соединен(а)";
/* No comment provided by engineer. */
"member has old version" = "член имеет старую версию";
/* item status text */
"Member inactive" = "Член неактивен";
/* chat feature */
"Member reports" = "Сообщения о нарушениях";
/* No comment provided by engineer. */
"Member role will be changed to \"%@\". All chat members will be notified." = "Роль участника будет изменена на \"%@\". Все участники разговора получат уведомление.";
/* No comment provided by engineer. */
"Member role will be changed to \"%@\". All group members will be notified." = "Роль члена будет изменена на \"%@\". Все члены группы получат уведомление.";
/* No comment provided by engineer. */
"Member role will be changed to \"%@\". The member will receive a new invitation." = "Роль члена будет изменена на \"%@\". Будет отправлено новое приглашение.";
/* No comment provided by engineer. */
"Member will be removed from chat - this cannot be undone!" = "Член будет удален из разговора - это действие нельзя отменить!";
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "Член группы будет удален - это действие нельзя отменить!";
/* alert message */
"Member will join the group, accept member?" = "Участник хочет присоединиться к группе. Принять?";
/* No comment provided by engineer. */
"Members can add message reactions." = "Члены могут добавлять реакции на сообщения.";
/* No comment provided by engineer. */
"Members can irreversibly delete sent messages. (24 hours)" = "Члены могут необратимо удалять отправленные сообщения. (24 часа)";
/* No comment provided by engineer. */
"Members can report messsages to moderators." = "Члены группы могут пожаловаться модераторам.";
/* No comment provided by engineer. */
"Members can send direct messages." = "Члены могут посылать прямые сообщения.";
/* No comment provided by engineer. */
"Members can send disappearing messages." = "Члены могут посылать исчезающие сообщения.";
/* No comment provided by engineer. */
"Members can send files and media." = "Члены могут слать файлы и медиа.";
/* No comment provided by engineer. */
"Members can send SimpleX links." = "Члены могут отправлять ссылки SimpleX.";
/* No comment provided by engineer. */
"Members can send voice messages." = "Члены могут отправлять голосовые сообщения.";
/* No comment provided by engineer. */
"Mention members 👋" = "Упоминайте участников 👋";
/* No comment provided by engineer. */
"Menus" = "Меню";
@ -3114,6 +3256,9 @@ snd error text */
/* item status text */
"Message forwarded" = "Сообщение переслано";
/* item status description */
"Message may be delivered later if member becomes active." = "Сообщение может быть доставлено позже, если член группы станет активным.";
/* No comment provided by engineer. */
"Message queue info" = "Информация об очереди сообщений";
@ -3330,6 +3475,12 @@ snd error text */
/* No comment provided by engineer. */
"New media options" = "Новые медиа-опции";
/* No comment provided by engineer. */
"New member role" = "Роль члена группы";
/* rcv group event chat item */
"New member wants to join the group." = "Новый участник хочет присоединиться к группе.";
/* notification */
"new message" = "новое сообщение";
@ -3369,6 +3520,9 @@ snd error text */
/* No comment provided by engineer. */
"No chats in list %@" = "Нет чатов в списке %@";
/* No comment provided by engineer. */
"No chats with members" = "Нет чатов с членами группы";
/* No comment provided by engineer. */
"No contacts selected" = "Контакты не выбраны";
@ -3453,6 +3607,9 @@ snd error text */
/* No comment provided by engineer. */
"Not compatible!" = "Несовместимая версия!";
/* No comment provided by engineer. */
"not synchronized" = "не синхронизирован";
/* No comment provided by engineer. */
"Notes" = "Заметки";
@ -3477,11 +3634,15 @@ snd error text */
/* alert title */
"Notifications status" = "Статус уведомлений";
/* No comment provided by engineer. */
"Now admins can:\n- delete members' messages.\n- disable members (\"observer\" role)" = "Теперь админы могут:\n- удалять сообщения членов.\n- приостанавливать членов (роль наблюдатель)";
/* member role */
"observer" = "читатель";
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "нет";
@ -3494,7 +3655,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "предложил(a) %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Ок";
/* No comment provided by engineer. */
@ -3587,9 +3750,12 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Открыть условия";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Открыть группу";
/* alert title */
"Open link?" = "Открыть ссылку?";
/* authentication reason */
"Open migration to another device" = "Открытие миграции на другое устройство";
@ -3665,6 +3831,9 @@ time to disappear */
/* No comment provided by engineer. */
"Password to show" = "Пароль чтобы раскрыть";
/* past/unknown group member */
"Past member %@" = "Бывший член %@";
/* No comment provided by engineer. */
"Paste desktop address" = "Вставить адрес компьютера";
@ -3689,6 +3858,9 @@ time to disappear */
/* No comment provided by engineer. */
"pending approval" = "ожидает утверждения";
/* No comment provided by engineer. */
"pending review" = "ожидает одобрения";
/* No comment provided by engineer. */
"Periodic" = "Периодически";
@ -3758,6 +3930,9 @@ time to disappear */
/* token info */
"Please try to disable and re-enable notfications." = "Попробуйте выключить и снова включить уведомления.";
/* snd group event chat item */
"Please wait for group moderators to review your request to join the group." = "Пожалуйста, подождите, пока модераторы группы рассмотрят ваш запрос на вступление.";
/* token info */
"Please wait for token activation to complete." = "Пожалуйста, дождитесь завершения активации токена.";
@ -3857,6 +4032,9 @@ time to disappear */
/* No comment provided by engineer. */
"Prohibit reporting messages to moderators." = "Запретить жаловаться модераторам группы.";
/* No comment provided by engineer. */
"Prohibit sending direct messages to members." = "Запретить посылать прямые сообщения членам группы.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Запретить посылать исчезающие сообщения.";
@ -4035,6 +4213,9 @@ swipe action */
/* No comment provided by engineer. */
"Reject contact request" = "Отклонить запрос";
/* alert title */
"Reject member?" = "Отклонить участника?";
/* No comment provided by engineer. */
"rejected" = "отклонён";
@ -4056,6 +4237,12 @@ swipe action */
/* No comment provided by engineer. */
"Remove image" = "Удалить изображение";
/* No comment provided by engineer. */
"Remove member" = "Удалить члена группы";
/* No comment provided by engineer. */
"Remove member?" = "Удалить члена группы?";
/* No comment provided by engineer. */
"Remove passphrase from keychain?" = "Удалить пароль из Keychain?";
@ -4068,6 +4255,9 @@ swipe action */
/* profile update event chat item */
"removed contact address" = "удалён адрес контакта";
/* No comment provided by engineer. */
"removed from group" = "удален из группы";
/* profile update event chat item */
"removed profile picture" = "удалена картинка профиля";
@ -4083,18 +4273,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Пересогласовать шифрование?";
/* 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" = "Повторить загрузку";
@ -4116,6 +4300,9 @@ swipe action */
/* No comment provided by engineer. */
"Report reason?" = "Причина сообщения?";
/* alert title */
"Report sent to moderators" = "Жалоба отправлена модераторам";
/* report reason */
"Report spam: only group moderators will see it." = "Пожаловаться на спам: увидят только модераторы группы.";
@ -4131,6 +4318,9 @@ swipe action */
/* No comment provided by engineer. */
"Reports" = "Сообщения о нарушениях";
/* No comment provided by engineer. */
"request to join rejected" = "запрос на вступление отклонён";
/* chat list item title */
"requested to connect" = "запрошено соединение";
@ -4185,9 +4375,21 @@ swipe action */
/* chat item action */
"Reveal" = "Показать";
/* No comment provided by engineer. */
"review" = "рассмотрение";
/* No comment provided by engineer. */
"Review conditions" = "Посмотреть условия";
/* admission stage */
"Review members" = "Одобрять членов";
/* admission stage description */
"Review members before admitting (\"knocking\")." = "Одобрять членов для вступления в группу.";
/* No comment provided by engineer. */
"reviewed by admins" = "одобрен админами";
/* No comment provided by engineer. */
"Revoke" = "Отозвать";
@ -4216,9 +4418,15 @@ chat item action */
/* alert button */
"Save (and notify contacts)" = "Сохранить (и уведомить контакты)";
/* alert title */
"Save admission settings?" = "Сохранить настройки вступления?";
/* alert button */
"Save and notify contact" = "Сохранить и уведомить контакт";
/* No comment provided by engineer. */
"Save and notify group members" = "Сохранить и уведомить членов группы";
/* No comment provided by engineer. */
"Save and reconnect" = "Сохранить и переподключиться";
@ -4411,6 +4619,9 @@ chat item action */
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Отправьте из галереи или из дополнительных клавиатур.";
/* No comment provided by engineer. */
"Send up to 100 last messages to new members." = "Отправить до 100 последних сообщений новым членам.";
/* alert message */
"Sender cancelled file transfer." = "Отправитель отменил передачу файла.";
@ -4546,6 +4757,9 @@ chat item action */
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Установите код вместо системной аутентификации.";
/* No comment provided by engineer. */
"Set member admission" = "Приём членов в группу";
/* No comment provided by engineer. */
"Set message expiration in chats." = "Установите срок хранения сообщений в чатах.";
@ -4564,6 +4778,9 @@ chat item action */
/* No comment provided by engineer. */
"Set passphrase to export" = "Установите пароль";
/* No comment provided by engineer. */
"Set the message shown to new members!" = "Установить сообщение для новых членов группы!";
/* No comment provided by engineer. */
"Set timeouts for proxy/VPN" = "Установить таймауты для прокси/VPN";
@ -4616,6 +4833,9 @@ chat item action */
/* No comment provided by engineer. */
"Share with contacts" = "Поделиться с контактами";
/* No comment provided by engineer. */
"Short link" = "Короткая ссылка";
/* No comment provided by engineer. */
"Show → on messages sent via private routing." = "Показать → на сообщениях доставленных конфиденциально.";
@ -4658,6 +4878,9 @@ chat item action */
/* No comment provided by engineer. */
"SimpleX address or 1-time link?" = "Адрес SimpleX или одноразовая ссылка?";
/* simplex link type */
"SimpleX channel link" = "SimpleX ссылка канала";
/* No comment provided by engineer. */
"SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "SimpleX Chat и Flux заключили соглашение добавить серверы под управлением Flux в приложение.";
@ -4954,10 +5177,19 @@ report reason */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "Неправильный ID предыдущего сообщения (меньше или равен предыдущему).\nЭто может произойти из-за ошибки программы, или когда соединение компроментировано.";
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Предыдущая версия данных чата не удалена при перемещении, её можно удалить.";
"The message will be deleted for all members." = "Сообщение будет удалено для всех членов группы.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Ваш профиль храниться на Вашем устройстве и отправляется только контактам.";
"The message will be marked as moderated for all members." = "Сообщение будет помечено как удаленное для всех членов группы.";
/* No comment provided by engineer. */
"The messages will be deleted for all members." = "Сообщения будут удалены для всех членов группы.";
/* No comment provided by engineer. */
"The messages will be marked as moderated for all members." = "Сообщения будут помечены как удаленные для всех членов группы.";
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Предыдущая версия данных чата не удалена при перемещении, её можно удалить.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Те же самые условия будут приняты для оператора **%@**.";
@ -5022,14 +5254,14 @@ report reason */
/* No comment provided by engineer. */
"This display name is invalid. Please choose another name." = "Ошибка имени профиля. Пожалуйста, выберите другое имя.";
/* No comment provided by engineer. */
"This group has over %lld members, delivery receipts are not sent." = "В этой группе более %lld членов, отчёты о доставке не отправляются.";
/* No comment provided by engineer. */
"This group no longer exists." = "Эта группа больше не существует.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Это ваша собственная одноразовая ссылка!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Это ваш собственный адрес SimpleX!";
"This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." = "Эта ссылка требует новую версию. Обновите приложение или попросите Ваш контакт прислать совместимую ссылку.";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Эта ссылка была использована на другом мобильном, пожалуйста, создайте новую ссылку на компьютере.";
@ -5142,6 +5374,15 @@ report reason */
/* No comment provided by engineer. */
"Unblock for all" = "Разблокировать для всех";
/* No comment provided by engineer. */
"Unblock member" = "Разблокировать члена группы";
/* No comment provided by engineer. */
"Unblock member for all?" = "Разблокировать члена для всех?";
/* No comment provided by engineer. */
"Unblock member?" = "Разблокировать члена группы?";
/* rcv group event chat item */
"unblocked %@" = "%@ разблокирован";
@ -5214,6 +5455,12 @@ report reason */
/* swipe action */
"Unread" = "Не прочитано";
/* No comment provided by engineer. */
"Unsupported connection link" = "Ссылка не поддерживается";
/* No comment provided by engineer. */
"Up to 100 last messages are sent to new members." = "До 100 последних сообщений отправляются новым членам.";
/* No comment provided by engineer. */
"Update" = "Обновить";
@ -5268,7 +5515,7 @@ report reason */
/* No comment provided by engineer. */
"Use chat" = "Использовать чат";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Использовать активный профиль";
/* No comment provided by engineer. */
@ -5286,7 +5533,7 @@ report reason */
/* No comment provided by engineer. */
"Use iOS call interface" = "Использовать интерфейс iOS для звонков";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Использовать новый Инкогнито профиль";
/* No comment provided by engineer. */
@ -5304,6 +5551,9 @@ report reason */
/* No comment provided by engineer. */
"Use servers" = "Использовать серверы";
/* No comment provided by engineer. */
"Use short links (BETA)" = "Короткие ссылки (БЕТА)";
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Использовать серверы предосталенные SimpleX Chat?";
@ -5313,6 +5563,9 @@ report reason */
/* No comment provided by engineer. */
"Use TCP port %@ when no port is specified." = "Использовать TCP-порт %@, когда порт не указан.";
/* No comment provided by engineer. */
"Use TCP port 443 for preset servers only." = "Использовать TCP-порт 443 только для серверов по умолчанию.";
/* No comment provided by engineer. */
"Use the app while in the call." = "Используйте приложение во время звонка.";
@ -5541,6 +5794,9 @@ report reason */
/* No comment provided by engineer. */
"You accepted connection" = "Вы приняли приглашение соединиться";
/* snd group event chat item */
"you accepted this member" = "Вы приняли этого члена";
/* No comment provided by engineer. */
"You allow" = "Вы разрешаете";
@ -5553,25 +5809,22 @@ report reason */
/* No comment provided by engineer. */
"You are already connected with %@." = "Вы уже соединены с %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Вы уже соединяетесь с %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Вы уже соединяетесь по этой одноразовой ссылке!";
/* No comment provided by engineer. */
"You are already in group %@." = "Вы уже состоите в группе %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Вы уже вступаете в группу %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Вы уже вступаете в группу по этой ссылке!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Вы уже вступаете в группу по этой ссылке.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Вы уже вступаете в группу!\nПовторить запрос на вступление?";
/* No comment provided by engineer. */
@ -5631,6 +5884,9 @@ report reason */
/* No comment provided by engineer. */
"You can set lock screen notification preview via settings." = "Вы можете установить просмотр уведомлений на экране блокировки в настройках.";
/* No comment provided by engineer. */
"You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it." = "Вы можете поделиться ссылкой или QR кодом - через них можно присоединиться к группе. Вы сможете удалить ссылку, сохранив членов группы, которые через нее соединились.";
/* No comment provided by engineer. */
"You can share this address with your contacts to let them connect with **%@**." = "Вы можете поделиться этим адресом с Вашими контактами, чтобы они могли соединиться с **%@**.";
@ -5649,6 +5905,9 @@ report reason */
/* alert message */
"You can view invitation link again in connection details." = "Вы можете увидеть ссылку-приглашение снова открыв соединение.";
/* alert message */
"You can view your reports in Chat with admins." = "Вы можете найти Ваши жалобы в Чате с админами.";
/* No comment provided by engineer. */
"You can't send messages!" = "Вы не можете отправлять сообщения!";
@ -5670,10 +5929,7 @@ report reason */
/* No comment provided by engineer. */
"You decide who can connect." = "Вы определяете, кто может соединиться.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Вы уже запросили соединение через этот адрес!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Вы уже запросили соединение!\nПовторить запрос?";
/* No comment provided by engineer. */
@ -5685,6 +5941,9 @@ report reason */
/* No comment provided by engineer. */
"You joined this group" = "Вы вступили в эту группу";
/* No comment provided by engineer. */
"You joined this group. Connecting to inviting group member." = "Вы вступили в эту группу. Устанавливается соединение с пригласившим членом группы.";
/* snd group event chat item */
"you left" = "Вы покинули группу";
@ -5811,15 +6070,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Будет отправлен Ваш профиль **%@**.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Ваш профиль храниться на Вашем устройстве и отправляется только контактам.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам. SimpleX серверы не могут получить доступ к Вашему профилю.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ваш профиль был изменен. Если вы сохраните его, обновленный профиль будет отправлен всем вашим контактам.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.";
/* No comment provided by engineer. */
"Your random profile" = "Случайный профиль";

View file

@ -485,7 +485,8 @@ swipe action */
"Can't invite contacts!" = "ไม่สามารถเชิญผู้ติดต่อได้!";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "ยกเลิก";
/* feature offered item */
@ -630,7 +631,7 @@ set passcode view */
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "เชื่อมต่อกับนักพัฒนา SimpleX Chat";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "เชื่อมต่อผ่านลิงก์";
/* No comment provided by engineer. */
@ -738,9 +739,6 @@ set passcode view */
/* server test step */
"Create queue" = "สร้างคิว";
/* No comment provided by engineer. */
"Create secret group" = "สร้างกลุ่มลับ";
/* No comment provided by engineer. */
"Create SimpleX address" = "สร้างที่อยู่ SimpleX";
@ -1028,7 +1026,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "อย่าเปิดใช้งาน";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "ไม่ต้องแสดงอีก";
/* No comment provided by engineer. */
@ -1199,7 +1197,7 @@ swipe action */
/* No comment provided by engineer. */
"Error changing role" = "เกิดข้อผิดพลาดในการเปลี่ยนบทบาท";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "เกิดข้อผิดพลาดในการเปลี่ยนการตั้งค่า";
/* No comment provided by engineer. */
@ -1214,7 +1212,7 @@ swipe action */
/* No comment provided by engineer. */
"Error creating profile!" = "เกิดข้อผิดพลาดในการสร้างโปรไฟล์!";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "เกิดข้อผิดพลาดในการลบฐานข้อมูลแชท";
/* No comment provided by engineer. */
@ -1223,10 +1221,10 @@ swipe action */
/* No comment provided by engineer. */
"Error deleting connection" = "เกิดข้อผิดพลาดในการลบการเชื่อมต่อ";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "เกิดข้อผิดพลาดในการลบฐานข้อมูล";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "เกิดข้อผิดพลาดในการลบฐานข้อมูลเก่า";
/* No comment provided by engineer. */
@ -1244,10 +1242,10 @@ swipe action */
/* No comment provided by engineer. */
"Error encrypting database" = "เกิดข้อผิดพลาดในการ encrypt ฐานข้อมูล";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "เกิดข้อผิดพลาดในการส่งออกฐานข้อมูลแชท";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "เกิดข้อผิดพลาดในการนำเข้าฐานข้อมูลแชท";
/* No comment provided by engineer. */
@ -1256,7 +1254,7 @@ swipe action */
/* alert title */
"Error receiving file" = "เกิดข้อผิดพลาดในการรับไฟล์";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "เกิดข้อผิดพลาดในการลบสมาชิก";
/* No comment provided by engineer. */
@ -1705,7 +1703,7 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "เข้าร่วมเป็น %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "เข้าร่วมกลุ่ม";
/* No comment provided by engineer. */
@ -2016,6 +2014,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "ปิด";
@ -2028,7 +2027,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "เสนอแล้ว %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "ตกลง";
/* No comment provided by engineer. */
@ -2829,9 +2830,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "ฐานข้อมูลเก่าไม่ได้ถูกลบในระหว่างการย้ายข้อมูล แต่สามารถลบได้";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "โปรไฟล์นี้แชร์กับผู้ติดต่อของคุณเท่านั้น";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "ขีดที่สองที่เราพลาด! ✅";
@ -3292,10 +3290,10 @@ chat item action */
"Your privacy" = "ความเป็นส่วนตัวของคุณ";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้";
"Your profile is stored on your device and only shared with your contacts." = "โปรไฟล์นี้แชร์กับผู้ติดต่อของคุณเท่านั้น";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ";
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้";
/* No comment provided by engineer. */
"Your random profile" = "โปรไฟล์แบบสุ่มของคุณ";

View file

@ -178,6 +178,9 @@
/* time interval */
"%d sec" = "%d saniye";
/* delete after time */
"%d seconds(s)" = "%d saniye(ler)";
/* integrity error chat item */
"%d skipped message(s)" = "%d okunmamış mesaj(lar)";
@ -283,6 +286,9 @@ time interval */
time interval */
"1 week" = "1 hafta";
/* delete after time */
"1 year" = "1 yıl";
/* No comment provided by engineer. */
"1-time link" = "tek kullanımlık bağlantı";
@ -339,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Kabul et";
/* alert action */
"Accept as member" = "Üye olarak kabul et";
/* alert action */
"Accept as observer" = "Gözlemci olarak kabul et";
/* No comment provided by engineer. */
"Accept conditions" = "Koşulları kabul et";
@ -352,6 +364,9 @@ swipe action */
swipe action */
"Accept incognito" = "Takma adla kabul et";
/* alert title */
"Accept member" = "Üyeyi kabul et";
/* call status */
"accepted call" = "kabul edilen arama";
@ -364,6 +379,9 @@ swipe action */
/* No comment provided by engineer. */
"Acknowledgement errors" = "Onay hataları";
/* token status text */
"Active" = "Aktif";
/* No comment provided by engineer. */
"Active connections" = "Aktif bağlantılar";
@ -373,6 +391,9 @@ swipe action */
/* No comment provided by engineer. */
"Add friends" = "Arkadaş ekle";
/* No comment provided by engineer. */
"Add list" = "Liste ekle";
/* No comment provided by engineer. */
"Add profile" = "Profil ekle";
@ -388,6 +409,9 @@ swipe action */
/* No comment provided by engineer. */
"Add to another device" = "Başka bir cihaza ekle";
/* No comment provided by engineer. */
"Add to list" = "Listeye ekle";
/* No comment provided by engineer. */
"Add welcome message" = "Karşılama mesajı ekleyin";
@ -445,6 +469,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "şifreleme kabul ediliyor…";
/* No comment provided by engineer. */
"All" = "Hepsi";
/* No comment provided by engineer. */
"All app data is deleted." = "Tüm uygulama verileri silinir.";
@ -556,10 +583,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Zaten bağlandı?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Zaten bağlanılıyor!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Zaten gruba bağlanılıyor!";
/* pref value */
@ -834,7 +861,8 @@ marked deleted chat item preview text */
"Can't message member" = "Üyeye mesaj gönderilemiyor";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "İptal et";
/* No comment provided by engineer. */
@ -913,7 +941,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "Sohbet zaten mevcut";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "Sohbet zaten mevcut!";
/* No comment provided by engineer. */
@ -1096,9 +1124,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "Otomatik olarak bağlan";
/* No comment provided by engineer. */
"Connect incognito" = "Gizli bağlan";
/* No comment provided by engineer. */
"Connect to desktop" = "Bilgisayara bağlan";
@ -1108,25 +1133,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Arkadaşlarınıza daha hızlı bağlanın.";
/* No comment provided by engineer. */
"Connect to yourself?" = "Kendine mi bağlanacaksın?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Kendine mi bağlanacaksın?\nBu senin kendi tek kullanımlık bağlantın!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "Kendine mi bağlanacaksın?\nBu senin kendi SimpleX adresin!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Kişi adresi aracılığıyla bağlan";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Bağlantı aracılığıyla bağlan";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Tek kullanımlık bağlantı aracılığıyla bağlan";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "%@ ile bağlan";
/* No comment provided by engineer. */
@ -1315,9 +1337,6 @@ set passcode view */
/* server test step */
"Create queue" = "Sıra oluştur";
/* No comment provided by engineer. */
"Create secret group" = "Gizli grup oluştur";
/* No comment provided by engineer. */
"Create SimpleX address" = "SimpleX adresi oluştur";
@ -1740,7 +1759,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Etkinleştirme";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "Yeniden gösterme";
/* No comment provided by engineer. */
@ -1990,7 +2009,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Rol değiştirilirken hata oluştu";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Ayar değiştirilirken hata oluştu";
/* No comment provided by engineer. */
@ -2020,7 +2039,7 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "Dosya şifresi çözülürken hata oluştu";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "Sohbet veritabanı silinirken sorun oluştu";
/* No comment provided by engineer. */
@ -2029,10 +2048,10 @@ chat item action */
/* No comment provided by engineer. */
"Error deleting connection" = "Bağlantı silinirken hata oluştu";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Veritabanı silinirken hata oluştu";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Eski veritabanı silinirken hata oluştu";
/* No comment provided by engineer. */
@ -2053,13 +2072,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Veritabanı şifrelemesi çözülürken hata oluştu";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Sohbet veritabanı dışa aktarılırken hata oluştu";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Tema dışa aktarılırken hata oluştu: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Sohbet veritabanı içe aktarılırken hata oluştu";
/* No comment provided by engineer. */
@ -2083,7 +2102,7 @@ chat item action */
/* No comment provided by engineer. */
"Error reconnecting servers" = "Hata sunuculara yeniden bağlanılıyor";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "Kişiyi silerken sorun oluştu";
/* No comment provided by engineer. */
@ -2400,7 +2419,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Grup çoktan mevcut";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Grup çoktan mevcut!";
/* No comment provided by engineer. */
@ -2766,22 +2785,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "%@ olarak katıl";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Gruba katıl";
/* No comment provided by engineer. */
"Join group conversations" = "Grup sohbetlerine katıl";
/* No comment provided by engineer. */
"Join group?" = "Gruba katılınsın mı?";
/* No comment provided by engineer. */
"Join incognito" = "Gizli katıl";
/* No comment provided by engineer. */
"Join with current profile" = "Şu anki profille katıl";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Bu gruba katılınsın mı?\nBu senin grup için bağlantın %@!";
/* No comment provided by engineer. */
@ -3272,6 +3285,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "kapalı";
@ -3284,7 +3298,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "%1$@: %2$@ teklif etti";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Tamam";
/* No comment provided by engineer. */
@ -3362,7 +3378,7 @@ time to disappear */
/* authentication reason */
"Open chat console" = "Sohbet konsolunu aç";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Grubu aç";
/* authentication reason */
@ -3810,18 +3826,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Şifreleme yeniden müzakere edilsin mi?";
/* 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";
@ -4601,9 +4611,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Eski veritabanı geçiş sırasında kaldırılmadı, silinebilir.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Profil sadece kişilerinle paylaşılacak.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Özlediğimiz ikinci tik! ✅";
@ -4658,12 +4665,6 @@ chat item action */
/* No comment provided by engineer. */
"This group no longer exists." = "Bu grup artık mevcut değildir.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Bu senin kendi tek kullanımlık bağlantın!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Bu senin kendi SimpleX adresin!";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Bu bağlantı başka bir mobil cihazda kullanıldı, lütfen masaüstünde yeni bir bağlantı oluşturun.";
@ -4886,7 +4887,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "Sohbeti kullan";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Şu anki profili kullan";
/* No comment provided by engineer. */
@ -4898,7 +4899,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "iOS arama arayüzünden kullan";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Yeni gizli profilden kullan";
/* No comment provided by engineer. */
@ -5144,25 +5145,22 @@ chat item action */
/* No comment provided by engineer. */
"You are already connected to %@." = "Zaten %@'a bağlısınız.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Zaten %@'a bağlanıyorsunuz.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Bu tek seferlik bağlantı üzerinden zaten bağlanıyorsunuz!";
/* No comment provided by engineer. */
"You are already in group %@." = "Zaten %@ grubundasın.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Zaten %@ grubuna katılıyorsunuz.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Bu bağlantı üzerinden gruba zaten katılıyorsunuz!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Gruba zaten bu bağlantı üzerinden katılıyorsunuz.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Gruba zaten katılıyorsunuz!\nKatılma isteği tekrarlansın mı?";
/* No comment provided by engineer. */
@ -5258,10 +5256,7 @@ chat item action */
/* No comment provided by engineer. */
"You decide who can connect." = "Kimin bağlanabileceğine siz karar verirsiniz.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Bu adres üzerinden zaten bağlantı talebinde bulundunuz!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Zaten bağlantı isteğinde bulundunuz!\nBağlantı isteği tekrarlansın mı?";
/* No comment provided by engineer. */
@ -5327,9 +5322,6 @@ chat item action */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Arka planda 30 saniye kaldıktan sonra uygulamayı başlattığınızda veya devam ettirdiğinizde kimlik doğrulaması yapmanız gerekecektir.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Bütün grup üyelerine bağlanacaksın.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Aktif olduklarında sessize alınmış profillerden arama ve bildirim almaya devam edersiniz.";
@ -5399,15 +5391,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Profiliniz **%@** paylaşılacaktır.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Profil sadece kişilerinle paylaşılacak.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır. SimpleX sunucuları profilinizi göremez.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Profiliniz değiştirildi. Kaydederseniz, güncellenmiş profil tüm kişilerinize gönderilecektir.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Profiliniz, kişileriniz ve gönderilmiş mesajlar cihazınızda saklanır.";
/* No comment provided by engineer. */
"Your random profile" = "Rasgele profiliniz";

View file

@ -178,6 +178,9 @@
/* time interval */
"%d sec" = "%d сек";
/* delete after time */
"%d seconds(s)" = "%d секунд(и)";
/* integrity error chat item */
"%d skipped message(s)" = "%d пропущено повідомлення(ь)";
@ -283,6 +286,9 @@ time interval */
time interval */
"1 week" = "1 тиждень";
/* delete after time */
"1 year" = "1 рік";
/* No comment provided by engineer. */
"1-time link" = "Одноразове посилання";
@ -339,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Прийняти";
/* alert action */
"Accept as member" = "Прийняти як учасника";
/* alert action */
"Accept as observer" = "Прийняти як спостерігача";
/* No comment provided by engineer. */
"Accept conditions" = "Прийняти умови";
@ -352,6 +364,9 @@ swipe action */
swipe action */
"Accept incognito" = "Прийняти інкогніто";
/* alert title */
"Accept member" = "Прийняти учасника";
/* call status */
"accepted call" = "прийнято виклик";
@ -367,6 +382,9 @@ swipe action */
/* No comment provided by engineer. */
"Acknowledgement errors" = "Помилки підтвердження";
/* token status text */
"Active" = "Активний";
/* No comment provided by engineer. */
"Active connections" = "Активні з'єднання";
@ -376,6 +394,9 @@ swipe action */
/* No comment provided by engineer. */
"Add friends" = "Додайте друзів";
/* No comment provided by engineer. */
"Add list" = "Додати список";
/* No comment provided by engineer. */
"Add profile" = "Додати профіль";
@ -391,6 +412,9 @@ swipe action */
/* No comment provided by engineer. */
"Add to another device" = "Додати до іншого пристрою";
/* No comment provided by engineer. */
"Add to list" = "Додати до списку";
/* No comment provided by engineer. */
"Add welcome message" = "Додати вітальне повідомлення";
@ -448,12 +472,18 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "узгодження шифрування…";
/* No comment provided by engineer. */
"All" = "Всі";
/* No comment provided by engineer. */
"All app data is deleted." = "Всі дані програми видаляються.";
/* No comment provided by engineer. */
"All chats and messages will be deleted - this cannot be undone!" = "Всі чати та повідомлення будуть видалені - це неможливо скасувати!";
/* alert message */
"All chats will be removed from the list %@, and the list deleted." = "Всі чати будуть видалені з списку %@, і список буде видалений.";
/* No comment provided by engineer. */
"All data is erased when it is entered." = "Всі дані стираються при введенні.";
@ -481,6 +511,12 @@ swipe action */
/* profile dropdown */
"All profiles" = "Всі профілі";
/* No comment provided by engineer. */
"All reports will be archived for you." = "Всі скарги будуть заархівовані для вас.";
/* No comment provided by engineer. */
"All servers" = "Всі сервери";
/* No comment provided by engineer. */
"All your contacts will remain connected." = "Всі ваші контакти залишаться на зв'язку.";
@ -526,6 +562,9 @@ swipe action */
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages. (24 hours)" = "Дозволяє безповоротно видаляти надіслані повідомлення. (24 години)";
/* No comment provided by engineer. */
"Allow to report messsages to moderators." = "Дозволити надсилати скаргу на повідомлення модераторам.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Дозволяє надсилати файли та медіа.";
@ -559,10 +598,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "Вже підключено?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "Вже підключаємось!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "Вже приєднуємося до групи!";
/* pref value */
@ -580,6 +619,9 @@ swipe action */
/* No comment provided by engineer. */
"and %lld other events" = "та %lld інших подій";
/* report reason */
"Another reason" = "Інша причина";
/* No comment provided by engineer. */
"Answer call" = "Відповісти на дзвінок";
@ -595,6 +637,9 @@ swipe action */
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "Додаток шифрує нові локальні файли (крім відео).";
/* No comment provided by engineer. */
"App group:" = "Група застосунків:";
/* No comment provided by engineer. */
"App icon" = "Іконка програми";
@ -622,12 +667,30 @@ swipe action */
/* No comment provided by engineer. */
"Apply to" = "Звертатися до";
/* No comment provided by engineer. */
"Archive" = "Архівувати";
/* No comment provided by engineer. */
"Archive %lld reports?" = "Архівувати %lld скарг?";
/* No comment provided by engineer. */
"Archive all reports?" = "Архівувати всі скарги?";
/* No comment provided by engineer. */
"Archive and upload" = "Архівування та завантаження";
/* No comment provided by engineer. */
"Archive contacts to chat later." = "Архівуйте контакти, щоб поспілкуватися пізніше.";
/* No comment provided by engineer. */
"Archive report" = "Архівувати скаргу";
/* No comment provided by engineer. */
"Archive report?" = "Архівувати скаргу?";
/* swipe action */
"Archive reports" = "Архівувати скарги";
/* No comment provided by engineer. */
"Archived contacts" = "Архівні контакти";
@ -709,6 +772,9 @@ swipe action */
/* No comment provided by engineer. */
"Better groups" = "Кращі групи";
/* No comment provided by engineer. */
"Better groups performance" = "Краща продуктивність груп";
/* No comment provided by engineer. */
"Better message dates." = "Кращі дати повідомлень.";
@ -721,6 +787,9 @@ swipe action */
/* No comment provided by engineer. */
"Better notifications" = "Кращі сповіщення";
/* No comment provided by engineer. */
"Better privacy and security" = "Краща конфіденційність і безпека";
/* No comment provided by engineer. */
"Better security ✅" = "Краща безпека ✅";
@ -794,9 +863,15 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Business chats" = "Ділові чати";
/* No comment provided by engineer. */
"Businesses" = "Бізнеси";
/* No comment provided by engineer. */
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Через профіль чату (за замовчуванням) або [за з'єднанням](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
/* No comment provided by engineer. */
"By using SimpleX Chat you agree to:\n- send only legal content in public groups.\n- respect other users no spam." = "Використовуючи SimpleX Chat, ви погоджуєтеся:\n- надсилати лише легальний контент у публічних групах.\n- поважати інших користувачів - без спаму.";
/* No comment provided by engineer. */
"call" = "дзвонити";
@ -837,7 +912,8 @@ marked deleted chat item preview text */
"Can't message member" = "Не можу надіслати повідомлення користувачеві";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "Скасувати";
/* No comment provided by engineer. */
@ -864,6 +940,9 @@ alert button */
/* No comment provided by engineer. */
"Change" = "Зміна";
/* alert title */
"Change automatic message deletion?" = "Змінити автоматичне видалення повідомлень?";
/* authentication reason */
"Change chat profiles" = "Зміна профілів користувачів";
@ -877,7 +956,7 @@ alert button */
"Change member role?" = "Змінити роль учасника?";
/* authentication reason */
"Change passcode" = "Змінити пароль";
"Change passcode" = "Змінити код доступу";
/* No comment provided by engineer. */
"Change receiving address" = "Змінити адресу отримання";
@ -916,7 +995,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "Чат вже існує";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "Чат вже існує!";
/* No comment provided by engineer. */
@ -970,9 +1049,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "Чат буде видалено для вас - цю дію неможливо скасувати!";
/* chat toolbar */
"Chat with admins" = "Чат з адміністраторами";
/* No comment provided by engineer. */
"Chat with member" = "Чат з учасником";
/* No comment provided by engineer. */
"Chats" = "Чати";
/* No comment provided by engineer. */
"Chats with members" = "Чати з учасниками";
/* No comment provided by engineer. */
"Check messages every 20 min." = "Перевіряйте повідомлення кожні 20 хв.";
@ -1012,6 +1100,12 @@ set passcode view */
/* No comment provided by engineer. */
"Clear conversation?" = "Відверта розмова?";
/* No comment provided by engineer. */
"Clear group?" = "Очистити групу?";
/* No comment provided by engineer. */
"Clear or delete group?" = "Очистити чи видалити групу?";
/* No comment provided by engineer. */
"Clear private notes?" = "Чисті приватні нотатки?";
@ -1027,6 +1121,9 @@ set passcode view */
/* No comment provided by engineer. */
"colored" = "кольоровий";
/* report reason */
"Community guidelines violation" = "Порушення правил спільноти";
/* server test step */
"Compare file" = "Порівняти файл";
@ -1063,6 +1160,9 @@ set passcode view */
/* No comment provided by engineer. */
"Configure ICE servers" = "Налаштування серверів ICE";
/* No comment provided by engineer. */
"Configure server operators" = "Налаштувати операторів сервера";
/* No comment provided by engineer. */
"Confirm" = "Підтвердити";
@ -1093,15 +1193,15 @@ set passcode view */
/* No comment provided by engineer. */
"Confirm upload" = "Підтвердити завантаження";
/* token status text */
"Confirmed" = "Підтверджений";
/* server test step */
"Connect" = "Підключіться";
/* No comment provided by engineer. */
"Connect automatically" = "Підключення автоматично";
/* No comment provided by engineer. */
"Connect incognito" = "Підключайтеся інкогніто";
/* No comment provided by engineer. */
"Connect to desktop" = "Підключення до комп'ютера";
@ -1111,25 +1211,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "Швидше спілкуйтеся з друзями.";
/* No comment provided by engineer. */
"Connect to yourself?" = "З'єднатися з самим собою?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "Підключитися до себе? \nЦе ваше власне одноразове посилання!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "З'єднатися з самим собою? \nЦе ваша власна SimpleX-адреса!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "Підключіться за контактною адресою";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "Підключіться за посиланням";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "Під'єднатися за одноразовим посиланням";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "Підключитися до %@";
/* No comment provided by engineer. */
@ -1192,6 +1289,9 @@ set passcode view */
/* No comment provided by engineer. */
"Connection and servers status." = "Стан з'єднання та серверів.";
/* No comment provided by engineer. */
"Connection blocked" = "Підключення заблоковано";
/* No comment provided by engineer. */
"Connection error" = "Помилка підключення";
@ -1201,12 +1301,21 @@ set passcode view */
/* chat list item title (it should not be shown */
"connection established" = "з'єднання встановлене";
/* No comment provided by engineer. */
"Connection is blocked by server operator:\n%@" = "Підключення заблоковано оператором сервера:\n%@";
/* No comment provided by engineer. */
"Connection not ready." = "Підключення не готове.";
/* No comment provided by engineer. */
"Connection notifications" = "Сповіщення про підключення";
/* No comment provided by engineer. */
"Connection request sent!" = "Запит на підключення відправлено!";
/* No comment provided by engineer. */
"Connection requires encryption renegotiation." = "Підключення вимагає повторного узгодження шифрування.";
/* No comment provided by engineer. */
"Connection security" = "Безпека з'єднання";
@ -1267,6 +1376,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Контакти можуть позначати повідомлення для видалення; ви зможете їх переглянути.";
/* blocking reason */
"Content violates conditions of use" = "Вміст порушує умови використання";
/* No comment provided by engineer. */
"Continue" = "Продовжуйте";
@ -1309,6 +1421,9 @@ set passcode view */
/* No comment provided by engineer. */
"Create link" = "Створити посилання";
/* No comment provided by engineer. */
"Create list" = "Створити список";
/* No comment provided by engineer. */
"Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" = "Створіть новий профіль у [desktop app](https://simplex.chat/downloads/). 💻";
@ -1318,9 +1433,6 @@ set passcode view */
/* server test step */
"Create queue" = "Створити чергу";
/* No comment provided by engineer. */
"Create secret group" = "Створити секретну групу";
/* No comment provided by engineer. */
"Create SimpleX address" = "Створіть адресу SimpleX";
@ -1488,12 +1600,18 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat" = "Видалити чат";
/* No comment provided by engineer. */
"Delete chat messages from your device." = "Видалити повідомлення чату з вашого пристрою.";
/* No comment provided by engineer. */
"Delete chat profile" = "Видалити профіль чату";
/* No comment provided by engineer. */
"Delete chat profile?" = "Видалити профіль чату?";
/* alert title */
"Delete chat with member?" = "Видалити чат з учасником?";
/* No comment provided by engineer. */
"Delete chat?" = "Видалити чат?";
@ -1542,6 +1660,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete link?" = "Видалити посилання?";
/* alert title */
"Delete list?" = "Видалити список?";
/* No comment provided by engineer. */
"Delete member message?" = "Видалити повідомлення учасника?";
@ -1572,6 +1693,9 @@ swipe action */
/* server test step */
"Delete queue" = "Видалити чергу";
/* No comment provided by engineer. */
"Delete report" = "Видалити скаргу";
/* No comment provided by engineer. */
"Delete up to 20 messages at once." = "Видаляйте до 20 повідомлень одночасно.";
@ -1680,6 +1804,12 @@ swipe action */
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Вимкнути (зберегти перевизначення)";
/* alert title */
"Disable automatic message deletion?" = "Вимкнути автоматичне видалення повідомлень?";
/* alert button */
"Disable delete messages" = "Вимкнути видалення повідомлень";
/* No comment provided by engineer. */
"Disable for all" = "Вимкнути для всіх";
@ -1740,6 +1870,9 @@ swipe action */
/* No comment provided by engineer. */
"Do NOT use SimpleX for emergency calls." = "НЕ використовуйте SimpleX для екстрених викликів.";
/* No comment provided by engineer. */
"Documents:" = "Документи:";
/* No comment provided by engineer. */
"Don't create address" = "Не створювати адресу";
@ -1747,8 +1880,14 @@ swipe action */
"Don't enable" = "Не вмикати";
/* No comment provided by engineer. */
"Don't miss important messages." = "Не пропускайте важливі повідомлення.";
/* alert action */
"Don't show again" = "Більше не показувати";
/* No comment provided by engineer. */
"Done" = "Готово";
/* No comment provided by engineer. */
"Downgrade and open chat" = "Пониження та відкритий чат";
@ -1816,6 +1955,9 @@ chat item action */
/* No comment provided by engineer. */
"Enable camera access" = "Увімкніть доступ до камери";
/* No comment provided by engineer. */
"Enable Flux in Network & servers settings for better metadata privacy." = "Увімкніть Flux у налаштуваннях мережі та серверів для кращої конфіденційності метаданих.";
/* No comment provided by engineer. */
"Enable for all" = "Увімкнути для всіх";
@ -1927,6 +2069,9 @@ chat item action */
/* chat item text */
"encryption re-negotiation required for %@" = "для %@ потрібне повторне узгодження шифрування";
/* No comment provided by engineer. */
"Encryption renegotiation in progress." = "Виконується повторне узгодження шифрування.";
/* No comment provided by engineer. */
"ended" = "закінчився";
@ -1981,6 +2126,9 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Помилка при прийнятті запиту на контакт";
/* alert title */
"Error accepting member" = "Помилка при прийомі учасника";
/* No comment provided by engineer. */
"Error adding member(s)" = "Помилка додавання користувача(ів)";
@ -1996,12 +2144,15 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "Помилка зміни ролі";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "Помилка зміни налаштування";
/* No comment provided by engineer. */
"Error changing to incognito!" = "Помилка переходу на інкогніто!";
/* No comment provided by engineer. */
"Error checking token status" = "Помилка перевірки статусу токена";
/* No comment provided by engineer. */
"Error connecting to forwarding server %@. Please try later." = "Помилка підключення до сервера переадресації %@. Спробуйте пізніше.";
@ -2014,6 +2165,9 @@ chat item action */
/* No comment provided by engineer. */
"Error creating group link" = "Помилка створення посилання на групу";
/* alert title */
"Error creating list" = "Помилка при створенні списку";
/* No comment provided by engineer. */
"Error creating member contact" = "Помилка при створенні контакту користувача";
@ -2024,21 +2178,27 @@ chat item action */
"Error creating profile!" = "Помилка створення профілю!";
/* No comment provided by engineer. */
"Error decrypting file" = "Помилка розшифрування файлу";
"Error creating report" = "Помилка при створенні скарги";
/* No comment provided by engineer. */
"Error decrypting file" = "Помилка розшифрування файлу";
/* alert title */
"Error deleting chat database" = "Помилка видалення бази даних чату";
/* alert title */
"Error deleting chat with member" = "Помилка при видаленні чату з учасником";
/* No comment provided by engineer. */
"Error deleting chat!" = "Помилка видалення чату!";
/* No comment provided by engineer. */
"Error deleting connection" = "Помилка видалення з'єднання";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "Помилка видалення бази даних";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "Помилка видалення старої бази даних";
/* No comment provided by engineer. */
@ -2059,13 +2219,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "Помилка шифрування бази даних";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "Помилка експорту бази даних чату";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "Помилка експорту теми: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "Помилка імпорту бази даних чату";
/* No comment provided by engineer. */
@ -2089,12 +2249,21 @@ chat item action */
/* No comment provided by engineer. */
"Error reconnecting servers" = "Помилка перепідключення серверів";
/* No comment provided by engineer. */
/* alert title */
"Error registering for notifications" = "Помилка під час реєстрації для отримання сповіщень";
/* alert title */
"Error removing member" = "Помилка видалення учасника";
/* alert title */
"Error reordering lists" = "Помилка при переупорядкуванні списків";
/* No comment provided by engineer. */
"Error resetting statistics" = "Статистика скидання помилок";
/* alert title */
"Error saving chat list" = "Помилка під час збереження списку чатів";
/* No comment provided by engineer. */
"Error saving group profile" = "Помилка збереження профілю групи";
@ -2146,6 +2315,9 @@ chat item action */
/* No comment provided by engineer. */
"Error synchronizing connection" = "Помилка синхронізації з'єднання";
/* No comment provided by engineer. */
"Error testing server connection" = "Помилка під час перевірки з'єднання з сервером";
/* No comment provided by engineer. */
"Error updating group link" = "Помилка оновлення посилання на групу";
@ -2199,6 +2371,9 @@ snd error text */
/* No comment provided by engineer. */
"expired" = "закінчився";
/* token status text */
"Expired" = "Термін дії закінчився";
/* No comment provided by engineer. */
"Export database" = "Експорт бази даних";
@ -2223,12 +2398,21 @@ snd error text */
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Швидко і без очікування, поки відправник буде онлайн!";
/* No comment provided by engineer. */
"Faster deletion of groups." = "Швидше видалення груп.";
/* No comment provided by engineer. */
"Faster joining and more reliable messages." = "Швидше приєднання та надійніші повідомлення.";
/* No comment provided by engineer. */
"Faster sending messages." = "Швидше надсилання повідомлень.";
/* swipe action */
"Favorite" = "Улюблений";
/* No comment provided by engineer. */
"Favorites" = "Вибране";
/* file error alert title */
"File error" = "Помилка файлу";
@ -2310,6 +2494,9 @@ snd error text */
/* No comment provided by engineer. */
"Fix not supported by group member" = "Виправлення не підтримується учасником групи";
/* No comment provided by engineer. */
"For all moderators" = "Для всіх модераторів";
/* servers error */
"For chat profile %@:" = "Для профілю чату %@:";
@ -2319,6 +2506,9 @@ snd error text */
/* No comment provided by engineer. */
"For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server." = "Наприклад, якщо ваш контакт отримує повідомлення через сервер SimpleX Chat, ваш додаток доставлятиме їх через сервер Flux.";
/* No comment provided by engineer. */
"For me" = "Для мене";
/* No comment provided by engineer. */
"For private routing" = "Для приватної маршрутизації";
@ -2391,6 +2581,9 @@ snd error text */
/* No comment provided by engineer. */
"Further reduced battery usage" = "Подальше зменшення використання акумулятора";
/* No comment provided by engineer. */
"Get notified when mentioned." = "Отримуйте сповіщення, коли вас згадують.";
/* No comment provided by engineer. */
"GIFs and stickers" = "GIF-файли та наклейки";
@ -2406,7 +2599,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "Група вже існує";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "Група вже існує!";
/* No comment provided by engineer. */
@ -2463,9 +2656,15 @@ snd error text */
/* No comment provided by engineer. */
"Group will be deleted for you - this cannot be undone!" = "Група буде видалена для вас - це не може бути скасовано!";
/* No comment provided by engineer. */
"Groups" = "Групи";
/* No comment provided by engineer. */
"Help" = "Довідка";
/* No comment provided by engineer. */
"Help admins moderating their groups." = "Допоможіть адміністраторам модерувати їхні групи.";
/* No comment provided by engineer. */
"Hidden" = "Приховано";
@ -2502,6 +2701,9 @@ snd error text */
/* No comment provided by engineer. */
"How it helps privacy" = "Як це захищає приватність";
/* alert button */
"How it works" = "Як це працює";
/* No comment provided by engineer. */
"How SimpleX works" = "Як працює SimpleX";
@ -2589,6 +2791,12 @@ snd error text */
/* No comment provided by engineer. */
"inactive" = "неактивний";
/* report reason */
"Inappropriate content" = "Невідповідний вміст";
/* report reason */
"Inappropriate profile" = "Невідповідний профіль";
/* No comment provided by engineer. */
"Incognito" = "Інкогніто";
@ -2655,6 +2863,21 @@ snd error text */
/* No comment provided by engineer. */
"Interface colors" = "Кольори інтерфейсу";
/* token status text */
"Invalid" = "Недійсний";
/* token status text */
"Invalid (bad token)" = "Недійсний (неправильний токен)";
/* token status text */
"Invalid (expired)" = "Недійсний (термін дії закінчився)";
/* token status text */
"Invalid (unregistered)" = "Недійсний (незареєстрований)";
/* token status text */
"Invalid (wrong topic)" = "Недійсний (неправильна тема)";
/* invalid chat data */
"invalid chat" = "недійсний чат";
@ -2772,22 +2995,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "приєднатися як %@";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "Приєднуйтесь до групи";
/* No comment provided by engineer. */
"Join group conversations" = "Приєднуйтесь до групових розмов";
/* No comment provided by engineer. */
"Join group?" = "Приєднатися до групи?";
/* No comment provided by engineer. */
"Join incognito" = "Приєднуйтесь інкогніто";
/* No comment provided by engineer. */
"Join with current profile" = "Приєднатися з поточним профілем";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "Приєднатися до групи?\nЦе ваше посилання на групу %@!";
/* No comment provided by engineer. */
@ -2856,6 +3073,12 @@ snd error text */
/* No comment provided by engineer. */
"Linked desktops" = "Пов'язані робочі столи";
/* swipe action */
"List" = "Список";
/* No comment provided by engineer. */
"List name and emoji should be different for all lists." = "Назва списку та емодзі повинні бути різними для всіх списків.";
/* No comment provided by engineer. */
"LIVE" = "НАЖИВО";
@ -3317,6 +3540,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "вимкнено";
@ -3329,7 +3553,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "запропонував %1$@: %2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "Гаразд";
/* No comment provided by engineer. */
@ -3416,7 +3642,7 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "Відкриті умови";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "Відкрита група";
/* authentication reason */
@ -3882,18 +4108,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Переузгодьте шифрування?";
/* 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" = "Повторне завантаження";
@ -4721,9 +4941,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Стара база даних не була видалена під час міграції, її можна видалити.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Профіль доступний лише вашим контактам.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Такі ж умови діятимуть і для оператора **%@**.";
@ -4790,12 +5007,6 @@ chat item action */
/* No comment provided by engineer. */
"This group no longer exists." = "Цієї групи більше не існує.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Це ваше власне одноразове посилання!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Це ваша власна SimpleX-адреса!";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Це посилання було використано з іншого мобільного пристрою, будь ласка, створіть нове посилання на робочому столі.";
@ -5036,7 +5247,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "Використовуйте чат";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "Використовувати поточний профіль";
/* No comment provided by engineer. */
@ -5054,7 +5265,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "Використовуйте інтерфейс виклику iOS";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "Використовуйте новий профіль інкогніто";
/* No comment provided by engineer. */
@ -5315,25 +5526,22 @@ chat item action */
/* No comment provided by engineer. */
"You are already connected with %@." = "Ви вже підключені до %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "Ви вже з'єднані з %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "Ви вже підключаєтеся до %@.Ви вже підключаєтеся за цим одноразовим посиланням!";
/* No comment provided by engineer. */
"You are already in group %@." = "Ви вже перебуваєте в групі %@.";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "Ви вже приєдналися до групи %@.";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "Ви вже приєдналися до групи за цим посиланням!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "Ви вже приєдналися до групи за цим посиланням.";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "Ви вже приєдналися до групи!\nПовторити запит на приєднання?";
/* No comment provided by engineer. */
@ -5435,10 +5643,7 @@ chat item action */
/* No comment provided by engineer. */
"You decide who can connect." = "Ви вирішуєте, хто може під'єднатися.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Ви вже надсилали запит на підключення за цією адресою!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "Ви вже надіслали запит на підключення!\nПовторити запит на підключення?";
/* No comment provided by engineer. */
@ -5504,9 +5709,6 @@ chat item action */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Вам потрібно буде пройти автентифікацію при запуску або відновленні програми після 30 секунд роботи у фоновому режимі.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Ви з'єднаєтеся з усіма учасниками групи.";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "Ви все одно отримуватимете дзвінки та сповіщення від вимкнених профілів, якщо вони активні.";
@ -5579,15 +5781,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Ваш профіль **%@** буде опублікований.";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "Профіль доступний лише вашим контактам.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ваш профіль зберігається на вашому пристрої і доступний лише вашим контактам. Сервери SimpleX не бачать ваш профіль.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ваш профіль було змінено. Якщо ви збережете його, оновлений профіль буде надіслано всім вашим контактам.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Ваш профіль, контакти та доставлені повідомлення зберігаються на вашому пристрої.";
/* No comment provided by engineer. */
"Your random profile" = "Ваш випадковий профіль";

View file

@ -586,10 +586,10 @@ swipe action */
/* No comment provided by engineer. */
"Already connected?" = "已连接?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already connecting!" = "已经在连接了!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Already joining the group!" = "已经加入了该群组!";
/* pref value */
@ -900,7 +900,8 @@ marked deleted chat item preview text */
"Can't message member" = "无法向成员发送消息";
/* alert action
alert button */
alert button
new chat action */
"Cancel" = "取消";
/* No comment provided by engineer. */
@ -982,7 +983,7 @@ set passcode view */
/* No comment provided by engineer. */
"Chat already exists" = "聊天已存在";
/* No comment provided by engineer. */
/* new chat sheet title */
"Chat already exists!" = "聊天已存在!";
/* No comment provided by engineer. */
@ -1180,9 +1181,6 @@ set passcode view */
/* No comment provided by engineer. */
"Connect automatically" = "自动连接";
/* No comment provided by engineer. */
"Connect incognito" = "在隐身状态下连接";
/* No comment provided by engineer. */
"Connect to desktop" = "连接到桌面";
@ -1192,25 +1190,22 @@ set passcode view */
/* No comment provided by engineer. */
"Connect to your friends faster." = "更快地与您的朋友联系。";
/* No comment provided by engineer. */
"Connect to yourself?" = "连接到你自己?";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own one-time link!" = "与自己建立联系?\n这是您自己的一次性链接";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect to yourself?\nThis is your own SimpleX address!" = "与自己建立联系?\n这是您自己的 SimpleX 地址!";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via contact address" = "通过联系地址连接";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via link" = "通过链接连接";
/* No comment provided by engineer. */
/* new chat sheet title */
"Connect via one-time link" = "通过一次性链接连接";
/* No comment provided by engineer. */
/* new chat action */
"Connect with %@" = "与 %@连接";
/* No comment provided by engineer. */
@ -1417,9 +1412,6 @@ set passcode view */
/* server test step */
"Create queue" = "创建队列";
/* No comment provided by engineer. */
"Create secret group" = "创建私密群组";
/* No comment provided by engineer. */
"Create SimpleX address" = "创建 SimpleX 地址";
@ -1866,7 +1858,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "不错过重要消息。";
/* No comment provided by engineer. */
/* alert action */
"Don't show again" = "不再显示";
/* No comment provided by engineer. */
@ -2125,7 +2117,7 @@ chat item action */
/* No comment provided by engineer. */
"Error changing role" = "更改角色错误";
/* No comment provided by engineer. */
/* alert title */
"Error changing setting" = "更改设置错误";
/* No comment provided by engineer. */
@ -2161,7 +2153,7 @@ chat item action */
/* No comment provided by engineer. */
"Error decrypting file" = "解密文件时出错";
/* No comment provided by engineer. */
/* alert title */
"Error deleting chat database" = "删除聊天数据库错误";
/* No comment provided by engineer. */
@ -2170,10 +2162,10 @@ chat item action */
/* No comment provided by engineer. */
"Error deleting connection" = "删除连接错误";
/* No comment provided by engineer. */
/* alert title */
"Error deleting database" = "删除数据库错误";
/* No comment provided by engineer. */
/* alert title */
"Error deleting old database" = "删除旧数据库错误";
/* No comment provided by engineer. */
@ -2194,13 +2186,13 @@ chat item action */
/* No comment provided by engineer. */
"Error encrypting database" = "加密数据库错误";
/* No comment provided by engineer. */
/* alert title */
"Error exporting chat database" = "导出聊天数据库错误";
/* No comment provided by engineer. */
"Error exporting theme: %@" = "导出主题时出错: %@";
/* No comment provided by engineer. */
/* alert title */
"Error importing chat database" = "导入聊天数据库错误";
/* No comment provided by engineer. */
@ -2227,7 +2219,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "注册消息推送出错";
/* No comment provided by engineer. */
/* alert title */
"Error removing member" = "删除成员错误";
/* alert title */
@ -2577,7 +2569,7 @@ snd error text */
/* No comment provided by engineer. */
"Group already exists" = "群组已存在";
/* No comment provided by engineer. */
/* new chat sheet title */
"Group already exists!" = "群已存在!";
/* No comment provided by engineer. */
@ -2973,22 +2965,16 @@ snd error text */
/* No comment provided by engineer. */
"join as %@" = "以 %@ 身份加入";
/* No comment provided by engineer. */
/* new chat sheet title */
"Join group" = "加入群组";
/* No comment provided by engineer. */
"Join group conversations" = "加入群对话";
/* No comment provided by engineer. */
"Join group?" = "加入群组?";
/* No comment provided by engineer. */
"Join incognito" = "加入隐身聊天";
/* No comment provided by engineer. */
"Join with current profile" = "使用当前档案加入";
/* No comment provided by engineer. */
/* new chat action */
"Join your group?\nThis is your link for group %@!" = "加入您的群组?\n这是您组 %@ 的链接!";
/* No comment provided by engineer. */
@ -3575,6 +3561,7 @@ snd error text */
/* enabled status
group pref value
member criteria value
time to disappear */
"off" = "关闭";
@ -3587,7 +3574,9 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "已提供 %1$@%2$@";
/* alert button */
/* alert action
alert button
new chat action */
"Ok" = "好的";
/* No comment provided by engineer. */
@ -3680,7 +3669,7 @@ time to disappear */
/* No comment provided by engineer. */
"Open conditions" = "打开条款";
/* No comment provided by engineer. */
/* new chat action */
"Open group" = "打开群";
/* authentication reason */
@ -4137,18 +4126,12 @@ swipe action */
/* No comment provided by engineer. */
"Renegotiate encryption?" = "重新协商加密?";
/* 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" = "重复上传";
@ -4922,9 +4905,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "旧数据库在迁移过程中没有被移除,可以删除。";
/* No comment provided by engineer. */
"Your profile is stored on your device and only shared with your contacts." = "该资料仅与您的联系人共享。";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "我们错过的第二个\"√\"!✅";
@ -4976,12 +4956,6 @@ chat item action */
/* No comment provided by engineer. */
"This group no longer exists." = "该群组已不存在。";
/* No comment provided by engineer. */
"This is your own one-time link!" = "这是你自己的一次性链接!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "这是你自己的 SimpleX 地址!";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "此链接已在其他移动设备上使用,请在桌面上创建新链接。";
@ -5198,7 +5172,7 @@ chat item action */
/* No comment provided by engineer. */
"Use chat" = "使用聊天";
/* No comment provided by engineer. */
/* new chat action */
"Use current profile" = "使用当前配置文件";
/* No comment provided by engineer. */
@ -5210,7 +5184,7 @@ chat item action */
/* No comment provided by engineer. */
"Use iOS call interface" = "使用 iOS 通话界面";
/* No comment provided by engineer. */
/* new chat action */
"Use new incognito profile" = "使用新的隐身配置文件";
/* No comment provided by engineer. */
@ -5450,25 +5424,22 @@ chat item action */
/* No comment provided by engineer. */
"You are already connected to %@." = "您已经连接到 %@。";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting to %@." = "您已连接到 %@。";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already connecting via this one-time link!" = "你已经在通过这个一次性链接进行连接!";
/* No comment provided by engineer. */
"You are already in group %@." = "您已在组 %@ 中。";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group %@." = "您已加入组 %@。";
/* No comment provided by engineer. */
"You are already joining the group via this link!" = "您已经通过此链接加入群组!";
/* No comment provided by engineer. */
/* new chat sheet message */
"You are already joining the group via this link." = "你已经在通过此链接加入该群。";
/* No comment provided by engineer. */
/* new chat sheet title */
"You are already joining the group!\nRepeat join request?" = "您已经加入了这个群组!\n重复加入请求";
/* No comment provided by engineer. */
@ -5564,10 +5535,7 @@ chat item action */
/* No comment provided by engineer. */
"You decide who can connect." = "你决定谁可以连接。";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "你已经请求通过此地址进行连接!";
/* No comment provided by engineer. */
/* new chat sheet title */
"You have already requested connection!\nRepeat connection request?" = "您已经请求连接了!\n重复连接请求";
/* No comment provided by engineer. */
@ -5633,9 +5601,6 @@ chat item action */
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "当您启动应用或在应用程序驻留后台超过30 秒后,您将需要进行身份验证。";
/* No comment provided by engineer. */
"You will connect to all group members." = "你将连接到所有群成员。";
/* No comment provided by engineer. */
"You will still receive calls and notifications from muted profiles when they are active." = "当静音配置文件处于活动状态时,您仍会收到来自静音配置文件的电话和通知。";
@ -5697,10 +5662,10 @@ chat item action */
"Your profile **%@** will be shared." = "您的个人资料 **%@** 将被共享。";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "您的资料存储在您的设备上并仅与您的联系人共享。 SimpleX 服务器无法看到您的资料。";
"Your profile is stored on your device and only shared with your contacts." = "该资料仅与您的联系人共享。";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "您的资料、联系人和发送的消息存储在您的设备上。";
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "您的资料存储在您的设备上并仅与您的联系人共享。 SimpleX 服务器无法看到您的资料。";
/* No comment provided by engineer. */
"Your random profile" = "您的随机资料";

View file

@ -101,13 +101,13 @@ actual fun GrayU8.toImageBitmap(): ImageBitmap = ConvertBitmap.grayToBitmap(this
actual fun ImageBitmap.hasAlpha(): Boolean = hasAlpha
actual fun ImageBitmap.addLogo(): ImageBitmap = asAndroidBitmap().applyCanvas {
val radius = (width * 0.16f) / 2
actual fun ImageBitmap.addLogo(size: Float): ImageBitmap = asAndroidBitmap().applyCanvas {
val radius = (width * size) / 2
val paint = android.graphics.Paint()
paint.color = android.graphics.Color.WHITE
drawCircle(width / 2f, height / 2f, radius, paint)
val logo = androidAppContext.resources.getDrawable(R.drawable.icon_foreground_android_common, null).toBitmap()
val logoSize = (width * 0.24).toInt()
val logoSize = (width * size * 1.5).toInt()
translate((width - logoSize) / 2f, (height - logoSize) / 2f)
drawBitmap(logo, null, android.graphics.Rect(0, 0, logoSize, logoSize), null)
}.asImageBitmap()

View file

@ -91,7 +91,7 @@ fun UserPickerUserBox(
ProfileImageForActiveCall(size = USER_PICKER_IMAGE_SIZE, image = userInfo.user.profile.image, color = MaterialTheme.colors.secondaryVariant)
if (userInfo.unreadCount > 0 && !userInfo.user.activeUser) {
unreadBadge(userInfo.unreadCount, userInfo.user.showNtfs, false)
userUnreadBadge(userInfo.unreadCount, userInfo.user.showNtfs, false)
}
}
val user = userInfo.user

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